MSYS2 ucrt64 Sqlite3 Interactive

 2025/11/25, 2025/11/25 -  ~

MSYS2 UCRT64 のシェルから sqlite3 コマンドを起動すると、対話モードにならない。 というか、入力した文字列は認識されているが、表示されていないようなので、その問題を調査した。

結論としては、configure 時に、--disable-readline としてビルドすれば入力した文字は 表示された。この時、sqlite3 コマンドは、readline を使わず、内蔵している簡易編集機能で動作する。(カーソルなどで履歴を辿れる)

ビルド方法

  1. MSYS2 Packages から mingw-w64-ucrt-x86_64-sqlite3   パッケージの Source-Only Tarball   をダウンロードする。
  2. 展開する
  3. 展開したフォルダに PKGBUILD ファイルがあるので、そのファイルを以下のように修正する。
    --enable-readline → --disable-readline
    
  4. makepkg -sCLf
  5. mingw-w64-ucrt-x86_64-sqlite3-3.51.0-1-any.pkg.tar.zst ができるので、pacman -U mingw-w64-ucrt-x86_64-sqlite3-3.51.0-1-any.pkg.tar.zst でインストール

原因(突き止めたところまで)

fprintf を入れてどこで表示ができなくなるのか調べてみた。

sqlite3_fputs 内で _set_mode 関数を呼び出している。初回、この関数を呼び出した後、stdout には何も出力されなくなるようだ。当然な気はする。

一方、readline は stdout 経由で出力しているのだろうか?そこまでは追えていない。

disable-readline すると、sqlite3_* 関数が使われるようになって表示されるようになるのではないかと推測する。

おまけ

MSYS2 の sqlite3 を使えばよい、という話はある。

sqlite3 のソースが変わってるなと思ったのは、コンパイル時に二つの C ソース(見た感じ、CLI部分と、エンジン部分)にまとめてコンパイルしている点。ソース全体をコンパイラに入れると最適化が効いて5% 以上高速化されるそうな。

Performance improvements of 5% or more are commonly seen when SQLite is compiled as a single translation unit.

すごいですね。