23

我经常在 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+ Version 2.24.10) of 2012-03-25 on allspice,由 Debian 修改

mysql -V:mysql Ver 14.14 Distrib 5.5.24,适用于使用 readline 6.2 的 debian-linux-gnu (x86_64)

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

4

1 回答 1

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)))

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


编辑

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

于 2012-09-10T20:52:19.120 回答