MSYS2 UCRT64 のシェルから sqlite3 コマンドを起動すると、対話モードになりません。 というか、入力した文字列は認識されていますが、表示されていないようなので、その問題を調査しました。
結論としては、configure 時に、--disable-readline としてビルドすれば入力した文字は
表示されました。この時、sqlite3 コマンドは、readline を使わず、内蔵している簡易編集機能で動作します。(カーソルなどで履歴を辿れる)
ビルド方法
- MSYS2 Packages から mingw-w64-ucrt-x86_64-sqlite3 パッケージのSource-Only Tarball をダウンロードします。
- 展開します
- 展開したフォルダに PKGBUILD ファイルがあるので、そのファイルを以下のように修正します。
--enable-readline → --disable-readline - makepkg -sCLf
- 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.
すごいですね。