SQLite 3.51:jsonb_each()/jsonb_tree() 返回 JSONB,carray/percentile 编进 amalgamation
SQLite 3.51.0 发布于 2025-11-04,随后 3.51.1、3.51.2、3.51.3 分别修掉优化回归和 WAL-reset 数据损坏。变更日志:3.51.0、3.51.3。
3.51.0:宏与 JSON
sqlite3.h 新增三个宏:
SQLITE_SCM_BRANCH:分支名。SQLITE_SCM_TAGS:check-in 上空格分隔的标签。SQLITE_SCM_DATETIME:check-in 的 ISO-8601 日期/时间。
新增两个 JSON 函数 jsonb_each() 和 jsonb_tree()。它们与 json_each()、json_tree() 行为相同,区别是当 type 为 'array' 或 'object' 时,value 列返回 JSONB。
carray 与 percentile 编进 amalgamation
carray 和 percentile 扩展现在编进 amalgamation,但默认关闭,必须在编译期开启:
-DSQLITE_ENABLE_CARRAY
-DSQLITE_ENABLE_PERCENTILE
两个选项可以单独使用,也可以同时使用。
TCL 与 CLI
TCL 接口:
eval命令新增-asdict标志。- 用户定义函数可以
break,返回 SQL NULL。
CLI:
.timer精度到微秒。box/column格式化支持双宽字符。.imposter命令提供只读 imposter 表,可与VACUUM一起工作,且不需要--unsafe-testing。- CLI 和
.open命令新增--ifexists选项。 .width限制为不超过 30000。
性能
- 提交读事务占用更少 CPU 周期。
- 更早检测不返回行的连接。
- 如果标量子查询的结果不会改变整体表达式,则避免求值。
- 窗口函数使用
BETWEEN :x FOLLOWING AND :y FOLLOWING且:y较大时更快。
PRAGMA、API 与 session
新增 PRAGMA wal_checkpoint=NOOP,以及 sqlite3_wal_checkpoint_v2() 的 SQLITE_CHECKPOINT_NOOP 参数。
新增 sqlite3_set_errmsg() API,供扩展使用。
新增 sqlite3_db_status64() API,类似 sqlite3_db_status(),但返回 64 位结果。
sqlite3_db_status() 和 sqlite3_db_status64() 新增 SQLITE_DBSTATUS_TEMPBUF_SPILL 选项。
session 扩展新增 sqlite3changeset_apply_v3()。
printf、FTS5、STRICT、WASM 与 POSIX 锁
printf()/format():当 + 标志省略、# 标志存在,且所有显示数字都是 '0' 时,负浮点数省略前导 -,避免显示 -0.00,改为显示 0.00。例如输出 0.00 而不是 -0.00。
FTS5 错误消息改进。
STRICT 对计算列强制类型。
JavaScript/WASM 现在支持 64-bit WASM。canonical builds 仍是 32-bit,但 make builds 是 64-bit。
改进对数据库损坏的抵抗能力:应用使用 close() 破坏 POSIX advisory locks 时,SQLite 能更好地应对。
3.51.1 / 3.51.2 / 3.51.3 修复
3.51.1(2025-11-28):
- 修复嵌套
EXISTS查询因 item 6b 优化产生的错误结果。 - 修复
fts5vocab虚拟表的潜在 bug,该 bug 由新优化暴露。
3.51.2(2026-01-09):
- 修复新的 broken-posix-lock 检测逻辑中的 obscure deadlock(item 17)。
- 修复 EXISTS-to-JOIN 优化(item 6b)的多个问题。
3.51.3(2026-03-13):
- 修复 WAL-reset 数据库损坏 bug。
- 其他小 bug 修复。
来源:https://www.sqlite.org/releaselog/3_51_0.html 和 https://www.sqlite.org/releaselog/3_51_3.html。