如何从SQL缓冲区向Emacs中的sql-mysql缓冲区发送大于4k的查询?

Rya*_*n M 23 mysql linux emacs buffer ipc

我经常在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.process-send-region是调用一个C函数send_process,无论是在src/process.c在Emacs的源.

看起来这可能只是IPC管道上4k缓冲区产生的限制.由于看起来内核黑客攻击是改变这个大小所必需的,所以这不是一个好的答案.

我想我很困惑的是,如果mysql客户端大于4k,那么通过管道发送的SQL没有被mysql客户端正确地重新组装.有任何想法吗?

Emacs版本:2012-03-25关于allspice的GNU Emacs 23.3.1(x86_64-pc-linux-gnu,GTK +版本2.24.10),由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(无缓冲)并且都没有修复此问题)

use*_*342 5

我怀疑罪魁祸首是Emacs的进程通信代码,用于comint分配PTY与进程通信.虽然这些对于交互式工作很有用,因为它们允许作业控制,但它们也可以在一个块中传输多少数据,而无需插入新行.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)))
Run Code Online (Sandbox Code Playgroud)

确保process-connection-type仅在MySQL交互缓冲区中重置.


编辑

根据http://tinyurl.com/car439o/,Emacs不再需要使用换行符+ EOF对来中断长PTY输出.虽然提交时间是2010年4月13日,但它只出现在2012年发布的Emacs 24中.这可以解释为什么问题在24.2.1中显然不可复制.如果您在24之前使用Emacs,请尝试升级.