MSYS2 ucrt64 Sqlite3 Interactive

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.

すごいですね。

1969年生まれ。大学卒業後から15年以上にわたり、通信、カードリーダ、セキュリティ業界においてソフトウェア開発に従事。その後、2012年5月に当社を設立。電力、交通、車載向けの組み込み系システム、旅行業界向けの WEB システム開発、音声合成システム、消防向けのシステム開発等に参画。
低コストかつシンプルで安定稼働するシステムの実現を目指し、アーキテクチャ設計に取り組んでいます。
会社情報と代表者守屋のプロフィール詳細