【问题标题】:sqlite3.exe: How to stop a long-running SQL statementsqlite3.exe:如何停止长时间运行的 SQL 语句
【发布时间】:2015-03-04 09:56:17
【问题描述】:

如何停止在 Windows 上运行的 sqlite3.exe 中长时间运行的 SQL 语句?

http://www.sqlite.org/cli.html 的文档说明如下

您可以通过键入您的系统来终止 sqlite3 程序 文件结尾字符(通常是 Control-D)。使用中断 字符(通常是 Control-C)来停止长时间运行的 SQL 语句。

但在 Windows 上,Control-D 什么都不做,并且 Control-C 终止 sqlite3 程序。

我也尝试过与 Control-C 相同的 Break(即 Control-Pause)

有什么想法吗?

【问题讨论】:

  • 技术上 Ctrl+C 确实 停止了查询,然后。
  • 谢谢,我还没来得及检查你的补丁,但你的分析看起来很可靠,我相信它会解决我的问题。如果您将其作为 SQLite 维护人员的错误提出来,那就太好了。将您的答案标记为已接受并立即奖励赏金:)
  • 谢谢,我已经向 SQLite 邮件列表发送了一条消息,并使用我发送给他们的改进补丁更新了下面的答案。

标签: windows sqlite


【解决方案1】:

这似乎只是 Windows 上的错误。

查看来自 SQLite download pageC source code as an amalgamation, version 3.8.8.3. 中的代码,我看到在 shell.c 中,如果 SIGINT 是,则注册了 SIGINT 的处理程序(对应于 Windows 上的 Control-C)定义:

#ifdef SIGINT
  signal(SIGINT, interrupt_handler);
#endif

SIGINT 是在signal.h 中定义的,但在 Windows 上被故意排除在外:

#if !defined(_WIN32) && !defined(WIN32)
# include <signal.h>
# if !defined(__RTP__) && !defined(_WRS_KERNEL)
#  include <pwd.h>
# endif
# include <unistd.h>
# include <sys/types.h>
#endif

包含signal.h 会导致信号处理程序被注册,并且我确实得到了中断(没有进程终止!)到使用 Control-C 的长时间运行的 SQL 命令。

但这对于后续的 Control-C 事件并不可靠(例如,如果您想在会话中中断第二个长时间运行的命令),对于 MSDN 上的 Win32 应用程序,signal(SIGINT,...)documented as unsupported

使用特定于 Windows 的 SetConsoleCtrlHandler 而不是 signal(SIGINT,...) 来注册中断处理程序可以可靠地处理后续的 Control-C 事件。

这里是 shell.c 与使用 SetConsoleCtrlHandler 提到的源版本的差异:

757c757
< #ifdef SIGINT
---
> #if defined(SIGINT) || defined(_WIN32) || defined(WIN32)
766a767,782
> 
> #if defined(_WIN32) || defined(WIN32)
> /*
> ** Windows event handler
> */
> BOOL WINAPI CtrlHandler(DWORD dwType){ 
>   switch( dwType ){
>     case CTRL_C_EVENT: 
>       interrupt_handler(0);
>       return TRUE;
>  
>     default: 
>       return FALSE; 
>   } 
> }
> #endif
4207a4224,4225
> #elif defined(WIN32) || defined(_WIN32)
>   SetConsoleCtrlHandler(CtrlHandler, TRUE);

可以通过将合并中的所有源文件添加到 Visual Studio C++ 控制台项目来轻松构建 shell(除了构建所需的标准/系统头文件之外,没有外部依赖项)。

我已经向 SQLite 用户邮件列表发送了一条消息,通知他们该错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    相关资源
    最近更新 更多