🧊

Cloudflare D1が、SQLiteのビルドオプションをどう設定しているか

Quirks, Caveats, and Gotchas In SQLite のまとめと、Cloudflare D1の挙動 | Memory ice cubes https://leaysgur.github.io/posts/2023/09/08/161314/

この記事でも少しだけ調べてて、外部キーが有効なのはわかったけど、なんというか全部ドキュメントしておいてくれ・・って気持ちで終わってた。

そんなときに、workerdのPRの中にそれらしいトピックのものを見つけたという経緯。

BUILD.sqlite3

https://github.com/cloudflare/workerd/blob/4ac08fec7355d09f0f91c3e2bd443d2646184a9d/build/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の拡張を有効にする
  • SQLITE_ENABLE_NORMALIZE: sqlite3_normalized_sql()を有効にする
  • SQLITE_ENABLE_MATH_FUNCTIONS: floor()sin()などのビルトインの数学関数を有効にする
  • SQLITE_DEFAULT_FOREIGN_KEYS: 外部キー制約を有効にする

なるほど。

setupSecurity()

https://github.com/cloudflare/workerd/blob/fae4178326fb9709dea737f51337cda1d1551f25/src/workerd/util/sqlite.c%2B%2B#L713

そのほか、コンパイルとは別のタイミングで制限を追加してるものもある。

SQL文の長さ制限や、プレースホルダにできる?が100まで制限なんかはココに書かれてる。