Emacs で SQL バッファから sql-mysql バッファに 4k を超えるクエリを送信するにはどうすればよいでしょうか? 質問する

Emacs で SQL バッファから sql-mysql バッファに 4k を超えるクエリを送信するにはどうすればよいでしょうか? 質問する

Emacs のモードで頻繁に問題に遭遇しますsql-mysqlが、解決策やよりよい回避策を知っている人はいませんか。バッファからsql-modeアクティブな SQL プロセス バッファにクエリを送信しようとすると、そのクエリは 4k を超えることはできません。4k を超えると、何らかのブレーク (おそらく改行) が挿入され、mysql インタープリタが次の行でエラーをスローするようになります。

sql-mysqlは によって実装されsql.el、 関数を使用して、sql-send-regionクエリ領域 (またはバッファ全体) を選択された SQL プロセス バッファに送信します。sql-send-regionは を呼び出しcomint-send-region、次に が呼び出されますprocess-send-region。は、 Emacs ソース内の の両方でprocess-send-regionを呼び出す C 関数です。send_processsrc/process.c

これは、IPC パイプの 4k バッファによって生じる制限である可能性があります。このサイズを変更するにはカーネル ハッキングが必要であると思われるため、これはあまり良い答えではありません。

私が不思議に思うのは、パイプを介して送信された SQL が 4k より大きい場合、なぜ MySQL クライアントによって適切に再構成されないのかということです。何かアイデアはありますか?

Emacs バージョン: GNU Emacs 23.3.1 (x86_64-pc-linux-gnu、GTK+ バージョン 2.24.10)、2012-03-25、Allspice 版、Debian による修正

mysql -V: mysql Ver 14.14 Distrib 5.5.24、debian-linux-gnu (x86_64) 用、readline 6.2 使用

Sql Mysql オプション: -A -C -n (注: -n (バッファなし) ありとなしの両方を試しましたが、どちらもこの問題は解決しませんでした)

ベストアンサー1

原因は、comintがプロセスと通信するために PTY を割り当てる Emacs のプロセス通信コードではないかと考えています。これらはジョブ制御を可能にするため対話型作業には便利ですが、改行を挟まずに 1 つのチャンクで転送できるデータ量には制限があります。Emacs はパイプを使用するように指示することもできますが、パイプにはこの制限はありません。

これをテストするには、新しい Emacs を起動し、 を評価してM-: (setq process-connection-type nil)を起動しますsql-mysql。問題が解決した場合、これが原因です。その場合は、次のようなコマンドを使用します。

(add-hook 'sql-mysql-mode-hook
          (lambda ()
            (set (make-local-variable 'process-connection-type) nil)))

process-connection-typeMySQL 対話バッファ内でのみリセットされることを確認します。


編集

によるとhttp://tinyurl.com/car439o/Emacs は、長い PTY 出力を改行 + EOF のペアで中断しなくなりました。コミットは 2010-04-13 のものですが、2012 年にリリースされた Emacs 24 でのみ発生しました。これにより、問題が 24.2.1 で再現されない理由が説明されます。24 より前の Emacs を使用している場合は、アップグレードしてみてください。

おすすめ記事