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 相关代码。
修复了一些代码缺陷。