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

我经常在Emacs的sql-mysql模式中遇到一个烦恼,我想知道是否有人有解决scheme或更好的解决方法。 任何时候我尝试从sql-mode缓冲区发送查询到活动的SQL进程缓冲区,该查询不能大于4k。 如果它大于4k,则会插入某种中断(也许是换行符),这会导致mysql解释器在下一行中引发错误。

sql-mysqlsql.el实现,并使用函数sql-send-region将查询区域(或整个缓冲区)发送到选定的SQL进程缓冲区。 sql-send-region调用comint-send-region ,后者又调用process-send-regionprocess-send-region是一个C函数,它调用了send_process ,都在Emacs源代码的src/process.c中。

看起来这可能只是由IPCpipe道上的4k缓冲区产生的限制。 由于内核黑客攻击似乎是必要的,所以这不是一个好的答案。

我猜我感到困惑的是,为什么通过pipe道发送的SQL没有正确地重新由mysql客户端重新组装,如果它大于4K。 有任何想法吗?

Emacs版本:2012年3月25日,在所有spsp上的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,用于使用readline 6.2的debian-linux-gnu(x86_64)

Sql Mysql选项:-A -C -n(NB我已经尝试使用和不使用-n(无缓冲),并没有解决这个问题)

我怀疑是Emacs的进程通信代码的罪魁祸首,由comint ,分配PTYs与进程交谈。 虽然这些功能对于交互式工作非常有用,因为它们允许控制作业,但它们也限制了可以在一个块中传输多少数据,而不需要插入新行。 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))) 

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


编辑

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