Bootstrap

SQLite 3.48.0 发布,有哪些更新?

SQLite 开发团队于 2025 年 1 月 14 日发布了 SQLite 3.48.0 版本,我们来解读一下新版本的改进功能。

EXPLAIN QUERY PLAN

SQLite 使用 EXPLAIN QUERY PLAN 命令获取查询语句的执行计划,新版本改进了执行计划输出结果中的覆盖索引优化信息:

sqlite> create table t1(id int, name text, price int, desc text);
sqlite> create index idx_t1_np on t1(name, price);
sqlite> explain query plan select name, price from t1 where name = 'apple';
QUERY PLAN
`--SEARCH t1 USING COVERING INDEX idx_t1_np (name=?)

iif 函数

iif(X,Y,Z) 函数在 X 参数为真时返回 Y 的值,否则返回 Z 的值。

SQLite 3.48.0 支持忽略参数 Z,相当于指定了 NULL。例如:

sqlite> select iif(1=1, 'Y', 'N');
Y
sqlite> select iif(1=2, 'Y', 'N');
N
sqlite> select iif(1=2, 'Y');

sqlite> select if(1=2, 'Y', 'N');
N

命令行工具

SQLite 3.48.0 版本命令行工具增加了一个新的命令 .dbtotxt,用于导出数据库的十六进制内容:

sqlite> .dbtotxt
| size 12288 pagesize 4096 filename unk.db
| page 1 offset 4096
|      0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00   SQLite format 3.
|     16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 03   .....@  ........
|     32: 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 04   ................
|     48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00   ................
|     96: 00 00 00 00 0d 00 00 00 02 0f 74 00 0f b6 0f 74   ..........t....t
|   3952: 00 00 00 00 40 02 06 17 1f 11 01 5f 69 6e 64 65   ....@......_inde
|   3968: 78 69 64 78 5f 74 31 5f 6e 70 74 31 03 43 52 45   xidx_t1_npt1.CRE
|   3984: 41 54 45 20 49 4e 44 45 58 20 69 64 78 5f 74 31   ATE INDEX idx_t1
|   4000: 5f 6e 70 20 6f 6e 20 74 31 28 6e 61 6d 65 2c 20   _np on t1(name,
|   4016: 70 72 69 63 65 29 48 01 06 17 11 11 01 7d 74 61   price)H.......ta
|   4032: 62 6c 65 74 31 74 31 02 43 52 45 41 54 45 20 54   blet1t1.CREATE T
|   4048: 41 42 4c 45 20 74 31 28 69 64 20 69 6e 74 2c 20   ABLE t1(id int,
|   4064: 6e 61 6d 65 20 74 65 78 74 2c 20 70 72 69 63 65   name text, price
|   4080: 20 69 6e 74 2c 20 64 65 73 63 20 74 65 78 74 29    int, desc text)
| page 2 offset 8192
|      0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00   ................
| page 3 offset 12288
|      0: 0a 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00   ................
| end unk.db

这个命令通常用于 SQLite 内核开发和测试。

C 语言接口

新版本还更新了一些 C 语言 API,包括:

  • sqlite3_io_methods 对象的 xDeviceCharacteristics 方法增加了 SQLITE_IOCAP_SUBPAGE_READ 属性,支持非整页读取数据库文件;
  • sqlite3_prepare_v3 接口增加了 SQLITE_PREPARE_DONT_LOG 选项,可以避免 SQL 编译错误发送到全局错误日志文件,方便调试;
  • xFileControl 方法增加了 SQLITE_FCNTL_NULL_IO 操作码,用于设置 sqlite3_file 对象不再读写数据库文件。

其他更新

新版本重构了从源码构建 SQLite 运行库的配置脚本,修复了缺陷、改进了性能、增加了可维护性。

运行时参数 SQLITE_LIMIT_LENGTH 的最小值从 1 增加到 30。

扩展了 FTS5 辅助接口 xInstToken(),支持通过 insttoken 配置选项或者 SQL 函数 fts5_insttoken() 执行前缀搜索。

SQL 函数最大参数个数从 127 增加到 1000。

清除了 SQLITE_USER_AUTHENTICATION 相关代码。

修复了一些代码缺陷。

;