Quirks, Caveats, and Gotchas In SQLite のまとめと、Cloudflare D1の挙動 | Memory ice cubes https://leaysgur.github.io/posts/2023/09/08/161314/
この記事でも少しだけ調べてて、外部キーが有効なのはわかったけど、なんというか全部ドキュメントしておいてくれ・・って気持ちで終わってた。
そんなときに、workerd
のPRの中にそれらしいトピックのものを見つけたという経緯。
BUILD.sqlite3
workerd
のコードベースの中に、SQLiteをビルドしてるズバリな設定ファイルがあった。
なのでこれを見れば、どういうオプションでコンパイルされたSQLiteなのかがやっとわかるってわけ。
現時点では、以下の設定になってた。
"SQLITE_MAX_ALLOCATION_SIZE=16777216", # 16MB
"SQLITE_PRINTF_PRECISION_LIMIT=100000",
"SQLITE_ENABLE_FTS5",
"SQLITE_ENABLE_NORMALIZE",
"SQLITE_ENABLE_MATH_FUNCTIONS",
"SQLITE_DEFAULT_FOREIGN_KEYS=1",
SQLiteのコンパイルオプション
Compile-time Options https://www.sqlite.org/compile.html
ここと照らしてみるに、
- SQLITE_MAX_ALLOCATION_SIZE: SQLiteの各動作で扱える最大メモリ
- SQLITE_PRINTF_PRECISION_LIMIT:
printf()
で扱える最大幅・精度 - SQLITE_ENABLE_FTS5: FTS5の拡張を有効にする
- FTS5は、全文検索のための仮想テーブルモジュールとのこと
- https://www.sqlite.org/fts5.html
- SQLITE_ENABLE_NORMALIZE:
sqlite3_normalized_sql()
を有効にする - SQLITE_ENABLE_MATH_FUNCTIONS:
floor()
やsin()
などのビルトインの数学関数を有効にする - SQLITE_DEFAULT_FOREIGN_KEYS: 外部キー制約を有効にする
なるほど。
setupSecurity()
そのほか、コンパイルとは別のタイミングで制限を追加してるものもある。
SQL文の長さ制限や、プレースホルダにできる?
が100まで制限なんかはココに書かれてる。