代码 SQLite 3.53.0:WAL-reset 损坏 bug 修复,CLI 表格改用 Unicode 框线

2026-09-11 21:02:04

SQLite 3.53.0:WAL-reset 损坏 bug 修复,CLI 表格改用 Unicode 框线

信源:SQLite Release History3.53.0 发布说明

版本节奏:3.53.0 于 2026-04-09 发布;3.53.2(2026-06-03)、3.53.4(2026-07-24)为同系列维护版。3.54.0 计划 2026-10-15。

修复:WAL-reset 导致的数据库损坏

3.53.0 修掉了一个 WAL-reset 引发数据库损坏的 bug。对长期跑 WAL 模式、又依赖 checkpoint 收缩 wal 文件的服务来说,这一条可以直接对应到升级动机。

QRF:查询结果的等宽屏格式化

新增 Query Result Formatter(QRF)库,目标是在等宽字体屏幕上把查询结果排成人能直接读的样式。TCL 接口新增 format 方法;CLI 的结果格式化改由 QRF 承担。

SQL 语言层新增

  • ALTER TABLE 增强:支持增加和移除 NOT NULLCHECK 约束。
  • REINDEX EXPRESSIONS:重建表达式索引,用于修复失效的表达式索引。
  • TEMP 触发器的 body 现在可以修改或查询 main schema 中的表。
  • VACUUM INTO 增强:如果目标使用 URI 文件名并带 reserve=N(N 取值 0–255),副本的 reserve 量设为 N。

新增函数:json_array_insert()jsonb_array_insert()

CLI 改造

  • .mode 命令大改。
  • 结果格式化改进,数值默认右对齐。
  • 交互式 CLI 默认输出模式改用 QRF,用 Unicode 框线画表格;批处理 CLI 仍用旧格式以保持兼容。
  • 位于 dot-command 末尾的裸(未加引号的)分号被静默忽略——潜在不兼容点,脚本里靠分号分隔的写法要检查。
  • 修复 .testcase.check 命令。
  • 匹配 *.sql*.txt 且为非空文件名的命令行参数,会被读作 SQL 脚本 / dot-commands。
  • .timer 参数可为 "once"
  • .progress 新增 --timeout S
  • .indexesPATTERN 现在匹配索引名,而非被索引的表名——这是语义变更,同样属于不兼容点。

C 接口

新增 sqlite3_str_truncate()sqlite3_str_free()sqlite3_carray_bind_v2()sqlite3_prepare_v3() 新增 SQLITE_PREPARE_FROM_DDL 选项;新增 SQLITE_UTF8_ZT 常量。sqlite3_limit() 新增 SQLITE_LIMIT_PARSER_DEPTHsqlite3_db_config() 新增 SQLITE_DBCONFIG_FP_DIGITS

查询规划器

  • EXCEPT / INTERSECT / UNION 相关改动:改用 index 而非哈希表。
  • 星型 schema 的多表 join 顺序选择改进。
  • 增强 EXISTS-to-JOIN 优化。
  • 增强 omit-noop-join 优化。
  • GROUP BY e1 ORDER BY e2(e1/e2 仅 ASC/DESC 不同)可用单个索引完成优化。
  • 虚拟表对 DISTINCT 的优化。

其他改动

  • session 扩展新增逐个加改动的接口(sqlite3changegroup_change 等)。
  • 浮点↔文本转换:实现重构提速;默认四舍五入到 17 位有效数字(此前所有版本为 15 位),可用 SQLITE_DBCONFIG_FP_DIGITS 调整。需要跨版本比对文本输出的场景注意这一变化。
  • 新增 self-healing index 特性,处理失效表达式索引的问题。
  • sqlite3_rsync 新增 -p|--port 选项。
  • 停止支持 Windows RT。

3.54.0(计划 2026-10-15)draft 要点

  • 停止支持 Windows XP 及更早版本(含 CE),要求 Vista+。
  • 新增可选 diskused() 扩展与 .diskused dot-command,取代 sqlite3_analyzer
  • CLI 列头默认总显示;提示符可用 SQLITE_PS1 / SQLITE_PS2;尊重 NO_COLOR
  • printf() / format() 新增 %J / %j
  • 日期时间函数新增 "weekday -N""end of" 修饰符。
  • sqlite3_limit() 新增 SQLITE_LIMIT_SCHEMA

从 3.53 的两个版本号语义变更(dot-command 裸分号、.indexes 的 PATTERN)看,升级前值得先跑一遍现有 CLI 脚本;二进制嵌入场景则重点确认 WAL 修复与浮点输出位数变化是否影响既有断言。

复制全文 生成海报 SQLite 数据库 WAL CLI 升级

推荐文章

程序员茄子在线接单