SQLite版本更新录(202x)
2022-11-21 13:30:28 阿炯

本文是从SQLite的产品主页分离出来的,专门用于该发行版本的更新记录,截止到2030年之前。SQLite 是一个 C 语言库,实现了一个小型、快速、独立、高可靠性、全功能的 SQL 数据库引擎。它是世界上使用最多的数据库引擎,其源代码属于公共领域,每个人都可以免费使用,用于任何目的。近年来相关的不完全中文更新可参考此处。

最新版本:3.12
该版本最值得关注的就是增加对内存映射 I/O 的支持,该特性可潜在提升两倍的性能,同时降低内存的使用。增加新的函数 xFetch() 和 xUnfetch() 可在内存映射 I/O 激活时自动被调用,用于映射数据到内存。由于一些开发者认为该技术有一些不足,在某些测试案例下性能并没有变化,因此该特性默认关闭。主要的性能提升是通过重构 B-Tree 重整逻辑来避免不必要的 memcpy() 操作。新特性包括 PRAGMA data_version 状态,可以访问一个 VALUES clause,不限制任意行数。此外还解决了一些 Mac 上的编译错误和多线程问题。修复一个 3.12.0 和 3.12.1 中的回归兼容问题:列声名为 "INTEGER" 主键(用引号括起数据类型关键字)不会被识别为 整形主键,导致数据库文件不兼容。
修复一个 PRAGMA reverse_unordered_selects 打开时导致 DELETE 操作丢失行的问题(从 3.9.0 开始出现)。
修复一个导致代码生成器结果不正确问题,如果两个或多个 虚表 连接并且在 IN 操作 约束连接的外循环中使用虚表。
修正当使用 cache size 排序大量数据时“PRAGMA cache_size”值无效的问题。

在此将介绍 SQLite 在 2018 年新增加的 SQL 功能,也就是从版本 3.22 到 3.26 所新增加的 SQL 功能,具体内容包括:
布尔字面量和判断
窗口函数
Filter子句
Insert … on conflict ("Upsert")
重命名列

布尔变量和判断

SQLite支持“假”布尔值:它接受Boolean作为类型的名称,但它将其当作整数看待(这一点非常类似于MySQL)。真值true和false分别由数值1和0表示(这一点和C语言一样)。从版本3.23.0开始,SQLite将关键字true和false分别用数字1和0表示,并支持is [not] true | false的判断语句。现在,它不再支持关键字unknown。开发者可以使用空值null来代替,因为unknown和null的布尔值是一样的。在INSERT和UPDATE语句中,字面量true和false可以大大提高values和set子句的可读性。

is [not] true | false这个判断语句很有用,它与比较操作的含义不一样:
来比较一下
WHERE c <> FALSE
WHERE c IS NOT FALSE

在上面的例子中,如果c是null, 那么c <> false的结果是unknown。

这是因为WHERE子句只接受结果为true的值,它会过滤掉结果为false或unknown的值。这样,它就会把对应的行从结果中去掉。

与此相对应,如果c是null,那么c is not false的判断结果是true。因此第二个WHERE子句也将包含c是null的行。

要达到同样的效果,可以采用的另外一种方法是增加单独处理null值的子句。也就是使用语句:
WHERE c <> FALSE OR c IS NULL

这种形式的语句更长并且有一些冗余语句(c被使用了两次)。长话短说,可以使用is not false判断来替代这个or…is-null的语句。更详细的内容,请参考“Binary Decisions Based on Three-Valued Results”。

SQLite中对布尔字面量和布尔判断的支持现在和其他开源数据库接近,唯一的差距是SQLite不支持is[not] unknown(你可以使用is [not] null来代替)。有趣的是,这些功能在下面提到的商用产品中还不可用。


0:只支持true,false.不支持notknown,如果需要,用null代替
1:不支持is [not] unknown,如果需要,用is [not] null代替

窗口函数

3.25.0引入了窗口函数。如果你知道窗口函数,那么也知道这是一件大事。如果你不了解窗口功能,请你自己学习如何使用。这篇文章不会具体解释窗口函数,但请相信:它是最重要的“现代”SQL特性。

SQLite对over子句的支持与其他数据库非常接近。唯一值得注意的限制是range语句不支持数字或间隔距离(仅支持current row和unbounded preceding|following)。在发布sqlite 3.25.0时,SQL Server和PostgreSQL具有同样的限制。PostgreSQL 11消除了这一限制。


0:没有变化

1:Range范围定义不支持datetime类型

2:Range范围不接受关键字 (只支持unbounded和current row)

SQLite对于窗口函数的支持在业界是领先的。它不支持的功能在其他一些主要产品中也同样不支持(在聚合中语句中的distinct,width_bucket, respect|ignore nulls和from first|last等语句)。


0:同样没有ORDER BY 语句

1:不允许负偏移量,nulls的特定处理:lead(, 'IGNORE NULLS'),这里是字符串参数

2:没有缺省值(第三个参数),不支持respect|ignore nulls语句

3:不允许负偏移量,不支持ignore nulls语句

4:不允许负偏移量

5:不支持respect|ignore nulls语句

6:不允许负偏移量,不支持respect|ignore nulls语句

7:nulls的特定处理:first_value(, 1, null, 'IGNORE NULLS') ,这里是字符串参数。

8:不支持ignore nulls语句

9:不支持ignore nulls语句和from last语句

过滤语句

虽然filter语句只是语法糖——你也可以很容易地使用表达式来获得相同的结果——我认为它也是必不可少的语法糖,因为它能使人们更加容易地学习和理解SQL语句。看看如下的select子句,觉得哪一个更容易理解?

SELECT SUM(revenue) total_revenue , SUM(CASE WHEN product = 1 THEN revenue END ) prod1_revenue ...

SELECT SUM(revenue) total_revenue , SUM(revenue) FILTER(WHERE product = 1) prod1_revenue ...

此示例很好地总结了filter子句的作用:它是聚合函数的后缀,可以在进行聚合之前根据特定条件,过滤掉相应的行。pivot技术是filter子句最常见的用例。这包括将实体属性值(EAV)模型中的属性转换为表格的列,如果想了解更多的内容,可以参考链接“filter-Selective Aggregates”。

SQLite 从版本3.25.0开始,在使用over子句的聚合函数中支持了filter子句,但是在使用group by子句的聚合函数中还不支持。不幸的是,这意味着您仍然无法在SQLite中使用filter语句来处理上述情况。你必须像以前一样使用case表达式。我真的希望SQLite在这一点上能尽快做到。


Insert … on conflict (“Upsert”)

SQLite 从版本3.24.0开始,引入了“upsert”概念:它是一个insert语句,可以优雅地处理主键和唯一约束的冲突。您可以选择忽略这些冲突(在on conflict语句中什么都不做)或者更新当前行(在on conflict语句中执行更新操作)。

这是一个特有的SQL扩展,即它不是标准SQL的一部分,因此在下面的矩阵中是灰色的。但是,SQLite遵守与PostgreSQL相同的语法来实现此功能0。该标准提供了对merge语句的支持。与PostgreSQL不同,SQLite在以下语句中存在问题。

INSERT INTO target SELECT * FROM source ON CONFLICT (id) DO UPDATE SET val = excluded.val

根据说明文档,这是因为解析器无法判断关键字ON是SELECT语句的连接约束还是upsert子句的开头。你可以通过向查询中添加子句来解决,例如where true。

INSERT INTO target SELECT * FROM source WHERE true ON CONFLICT (id) DO UPDATE SET val = excluded.val


0:同样记录insert、update、delete和merge操作的错误信息 (“DML error logging”)

1:On conflict语句不能紧挨查询的from语句,如果需要,可以添加 where true语句来分隔。

重命名列

SQLite引入的另一个特有功能是重命名基准数据库表中的列1。标准的SQL不支持此类功能2。其遵循其他产品常用的语法来重命名列:
ALTER TABLE … RENAME COLUMN … TO


0:请查阅 sp_rename.

其他消息

在2018年,SQLite除了在SQL语法上的变化,还有一些应用程序接口(API)的变化。可以查阅sqlite官网上的新闻部分来了解更详细的消息。

脚标:
0:SQLite通常遵循PostgreSQL语法,Richard Hipp将此称为PostgreSQL会怎么做(WWPD)。
1:基准数据库表是指用Create table语句创建的数据库表。派生的数据库表(如Select语句返回的查询结果集)中的列名可以通过SELECT语句、FROM语句或WITH语句来进行改变
2:据我所知,也许可以通过可更新视图或派生的列来模拟该功能。

最新版本:3.28
此版本更新内容包括:
新增 sqlite3_stmt_isexplain(S) 接口,用于确定预准备语句是否为 EXPLAIN。
增强 VACUUM INTO,用于只读数据库,一些查询优化。
增强 window function、增强 TCL 接口、CLI 增强。
添加 fossildelta.c 扩展,可以创建、应用和解析 RBU 扩展使用的 Fossil DVCS 文件增量格式。
为 sqlite3_db_config() 接口添加了 SQLITE_DBCONFIG_WRITABLE_SCHEMA 谓词,它在不使用 SQL 解析器的情况下执行与 PRAGMA writable_schema 相同的工作。
新增 sqlite3_value_frombind() API,用于确定 SQL 函数的参数是否来自绑定参数。
fts3_tokenizer() 安全性与兼容性增强。
提高了健壮性,防止数据库文件损坏。
其它性能增强。
详情查看更新说明

最新版本:3.34
v3.34.0于2020年12月上旬正式发布,此版本更新内容包括:
添加了 sqlite3_txn_state() 接口,用于报告数据库连接的当前事务状态。
像 SQL Server 一样,增强递归公用表表达式以支持两个或多个递归术语,因为这有助于使针对图的查询更易于编写和执行。
改进了有关 CHECK 约束失败的错误消息。

CLI enhancements:
现在,.read dot-command 除了文件名外还接受管道。
在 .dump dot-command 中添加了 --data-only 和 --nosys 选项。
在 .schema dot-command 中添加了 --nosys 选项。
Table name quoting 在 .import dot-command 中可以正确使用。
generate_series(START、END、STEP)表值函数扩展现在已经内置到 CLI 中。
.databases dot-command 现在显示了由 sqlite3_db_readonly() 和 sqlite3_txn_state() 决定的每个数据库文件的状态。
添加了 --tabs 命令行选项,该选项可设置 .mode tabs。
如果无法打开以其参数命名的文件,则 --init 选项将报告错误。--init 选项现在也支持 --bail 选项。

Query planner 改进:
改进了运行 DISTINCT 运算符的成本估算。
当使用多列索引执行 UPDATE 或 DELETE 时,如果索引中只有前面的几列对索引查找有用,则要推迟到所有 WHERE 子句约束条件被评估后再做主表查找,以防这些约束条件可以被索引后面未使用的条款覆盖,从而避免不必要的主表查找。
当后面的列受 IN 运算符约束时,新的 OP_SeekScan 操作码可用于提高多列索引查找的性能。
现在,即使一个或多个附加数据库文件是只读的,BEGIN IMMEDIATE 和 BEGIN EXCLUSIVE 命令也可以使用。
增强了 FTS5,以支持 trigram indexes。
在有数百个连接都一次访问同一数据库文件的情况下,WAL 模式 locking primitives 的性能得到了改善。
增强了 carray() table-valued 函数,以包含一个单参数形式,该形式使用辅助的 sqlite3_carray_bind() 接口进行绑定。
为了与 SQL Server 兼容,现在也可以将 substr() SQL 函数称为“substring()”。
syntax diagrams 现在以 Pikchr 脚本的形式实现,并以 SVG 的形式呈现,以提高可读性和便于维护。

1.添加了sqlite3_txn_state()接口,用于报告数据库连接的当前事务状态。
2.像SQL Server一样,增强递归公用表表达式以支持两个或多个递归术语,因为这有助于使 针对图的查询更易于编写和执行。
3.改进了有关CHECK约束失败的错误消息。
4.CLI增强功能:
4.1.现在,.read点命令除了文件名外还接受管道。
4.2.在.dump点命令中添加了--data-only和--nosys选项。
4.3.在.schema点命令中添加了--nosys选项。
4.4.表名引用对于.import点命令正确起作用。
4.5.该generate_series(START,END,STEP)表值函数扩展现在内置的CLI。
4.6.所述.databases DOT-命令现在显示的每个数据库文件作为所确定的状态sqlite3_db_readonly()和 ()sqlite3_txn_state。
4.7.添加了--tabs命令行选项,该选项可设置.mode tabs。
4.8.如果无法打开以其参数命名的文件,则--init选项将报告错误。--init选项现在也支持--bail选项。

5.查询计划程序的改进:
5.1.改进了运行DISTINCT运算符的成本估算。
5.2当使用多列索引执行UPDATE或DELETE时,其中只有少数索引的较早列可用于索引查找,请延迟执行主表查找,直到评估完所有WHERE子句约束后为止(如果这些约束)可以由未使用的索引后期条款覆盖,从而避免不必要的主表查找。
5.3当后面的列受IN运算符约束时,新的OP_SeekScan操作码用于提高多列索引查找的性能。

6.现在,即使一个或多个附加数据库文件是只读的,BEGIN IMMEDIATE和BEGIN EXCLUSIVE命令也可以使用。
7.增强的FTS5支持三字母索引。
8.在有数百个连接都一次访问同一数据库文件的情况下,WAL模式锁定原语的性能得到了改善。
9.增强了carray()表值函数的功能,以包括使用辅助sqlite3_carray_bind()接口绑定的单参数形式。
10.现在,也可以将substr() SQL函数称为“ substring()”,以与SQL Server兼容。
11.在语法图现在实现为 Pikchr脚本,并呈现为SVG改进的易读性和易于维护。

最新版本:3.35
v3.35.0 版本于2021年3月中旬发布,该版本增加了多个 SQL 语句以及查询优化器相关的一些新特性,大致内容如下:

支持内置的 SQL 数学函数
SQLite 3.35.0 在核心源代码中增加内置的 SQL 数学函数支持,我们只需要在编译时使用-DSQLITE_ENABLE_MATH_FUNCTIONS选项,而且默认的编译配置中已经启用。也就是说,我们不再需要通过编译 extension-functions.c 文件获得这些数学函数。目前支持的数学函数包括:
acos(X)、acosh(X)、asin(X)、asinh(X)、atan(X)、atan2(X,Y)、atanh(X)
ceil(X)、ceiling(X)、cos(X)、cosh(X)
degrees(X)、exp(X)、floor(X)
ln(X)、log(B,X)、log(X)、log10(X)、log2(X)
mod(X,Y)、pi()、pow(X,Y)、power(X,Y)
radians(X)、sin(X)、sinh(X)、sqrt(X)
tan(X)、tanh(X)、trunc(X)

这些函数的参数可以是整数、浮点数或者可以转换为整数或实数的字符串或二进制串。如果任何参数为 NULL,或者无法转换为数字的字符串或二进制串,函数将会返回 NULL。另外,如果存在数值域错误,例如计算负数的平方根或者计算大于 1.0 或小于 -1.0 数值的反余弦值,函数也会返回 NULL。

sqlite> select sqlite_version();
3.35.0
sqlite> .nullvalue [NULL]
sqlite> select sqrt(null), sqrt(-1);
[NULL]|[NULL]

另外,这些函数的返回值通常是近似结果。例如,函数 pi() function 的返回结果为 3.141592653589793115997963468544185161590576171875,比实际在大概小了 1.22465e-16 ,但这是 IEEE754 双精度浮点数中最接近 Pi 的数值。关于这些数学函数的具体介绍可以参考官方文档

支持 ALTER TABLE DROP COLUMN 语句
SQLite 新版本增加了 ALTER TABLE DROP COLUMN 语句,可以用于删除表中的已有字段。该命令将会删除表中指定名称的字段,并且重新写入表的内容以清除该字段的数据。例如:
sqlite> create table t(id int, col1 int);
sqlite> insert into t values(1,1);
sqlite> alter table t drop column col1;
sqlite> select * from t;

该命令只能删除没有被其他对象引用的字段,同时也不能删除 PRIMARY KEY 字段或者 UNIQUE 约束字段。以下情况可能会导致该命令执行失败:
被删除字段是 PRIMARY KEY 或者主键的一部分。
被删除字段用于 UNIQUE 约束
被删除字段存在索引。
被删除字段出现在某个部分索引的 WHERE 子句中。
被删除字段出现在表级 CHECK 约束或者其他字段的 CHECK 约束中。
被删除字段被外键约束引用。
被删除字段被用于生成列的表达式中。
被删除字段被用于触发器或者视图中。

关于 ALTER TABLE DROP COLUMN 语句的实现原理,可以参考官方文档

扩展 UPSERT 的功能
新版本的 SQLite 在以下两个方面对 UPSERT 语句进行了增强:
允许多个 ON CONFLICT 子句,它们按照顺序进行判断;
最后的 ON CONFLICT 子句可以忽略冲突的目标,仍然使用 DO UPDATE 命令进行更新操作。

例如:
sqlite> create table t(id int primary key, col1 int unique, col2 text);
sqlite> insert into t values (1, 1, 'sqlite');
sqlite> insert into t values (2, 1, 'sqlite3')
   ...> on conflict(id) do nothing
   ...> on conflict(col1) do update set col2 = excluded.col2;
sqlite> select * from t;
1|1|sqlite3

关于 UPSERT 功能的详细介绍,可以参考官方文档

DML 语句支持 RETURNING 子句
SQLite 新版本为 INSERT、UPDATE 以及 DELETE 语句提供了 RETURNING 子句,可以返回插入、更新后或者删除的数据。这个扩展功能来自 PostgreSQL。例如:
CREATE TABLE t0(
  a INTEGER PRIMARY KEY,
  b DATE DEFAULT CURRENT_TIMESTAMP,
  c INTEGER
);
sqlite> INSERT INTO t0(c)
   ...> VALUES(random()),(random()),(random())
   ...> RETURNING *;
1|2021-03-15 19:50:08|-2232026377363516485
2|2021-03-15 19:50:08|-6973867001075546289
3|2021-03-15 19:50:08|-2021925416820049180

在以上 INSERT 语句中,SQLite 为所有字段生成了默认的数值。RETURNING 子句可以将这些值返回给应用程序,避免了应用再次查询数据库的操作。

对于 INSERT 和 UPDATE 语句,RETURNING 子句返回的是修改之后的数据。对于 DELETE 语句,RETURNING 子句返回的是删除之前的数据。例如:
sqlite> UPDATE t0
   ...> SET c = 20
   ...> WHERE a = 2
   ...> RETURNING a, c;
2|20

sqlite> DELETE FROM t0
   ...> WHERE a = 1
   ...> RETURNING c;
-2232026377363516485

关于 RETURNING 子句的详细介绍和注意事项,可以参考官方文档

VACUUM 优化
对于包含超大型 TEXT 或者 BLOB 文本的数据库,运行 VACUUM 清理命令时所需的内存更小。SQLite 不再需要将整个 TEXT 或者 BLOB 文本一次性加载到内存中。关于 VACUUM 命令的介绍,可以参考官方文档

通用表表达式优化
新版本支持创建通用表表达式(common table expression)时指定 MATERIALIZED 或者 NOT MATERIALIZED 提示选项。


AS MATERIALIZED 和 AS NOT MATERIALIZED 关键字同样来自 PostgreSQL,它们的作用是提示查询计划器如何实现 CTE。

如果指定了 MATERIALIZED,select-stmt 很可能会产生一个内存或者磁盘临时表,然后将该临时表用于随后的 SQL 语句中。由于 select-stmt 的这种立即执行方式,无法获得子查询展开或者查询条件下推等优化。

如果指定了 NOT MATERIALIZED,select-stmt 以子查询的方式出现在所有引用该 CTE 的子句中。这种方式可以获得子查询展开或者查询条件下推等优化。尽管如此,NOT MATERIALIZED 并不会阻止物化临时表的使用。查询计划器仍然可能基于判断使用临时表实现 CTE。NOT MATERIALIZED 的真正含义更接近于“像任何普通视图或子查询一样处理”。

如果没有指定任何提示选项,SQLite 3.35.0 (2021-03-12) 以及更高版本对于被多次使用的 CTE 默认为 MATERIALIZED,对于只被引用一次的 CTE 默认为 NOT MATERIALIZED。在之前的版本中,所有的 CTE 默认行为和 NOT MATERIALIZED 一致。通过 CTE 被引用的次数来决定 MATERIALIZED 或者 NOT MATERIALIZED 是一种探索行为,如果将来查询计划策略有了改进,这种方式也会跟着改变。无论如何,这些改变只对性能产生影响,最终查询的结果不会改变。

关于通用表表达式的更多介绍,可以参考官方文档

TEMP 触发器和视图
新版本对 SQLITE_DBCONFIG_ENABLE_TRIGGER 和 SQLITE_DBCONFIG_ENABLE_VIEW 配置选项进行了修改,现在它们只会影响主数据库或者附加数据库中的触发器和视图,不会对 TEMP 模式中的触发器和视图产生影响。TEMP 触发器和视图永远不会被禁用。

查询优化器增强
v3.35.0 对查询计划器/优化器进行了以下改进:
进一步增强了 min/max 优化,使得它比之前版本更好地和 IN 运算符一起使用,同时增强了 OP_SeekScan 优化。
在可能进行转换并提高性能的情况下,尝试将 WHERE 子句中的 EXISTS 运算符转换为 IN 运算符。
允许 UNION ALL 子查询的展开,即使父查询是一个连接查询。
即使禁用了 STAT4,在合适的情况下仍然使用索引优化 WHERE 子句中的 IS NOT NULL 表达式。
如果字段 x 上存在 NOT NULL 约束并且不是出现在外连接查询中,x IS NULL 或者 x IS NOT NULL 形式的表达式可能会转换为简单 FALSE 或者 TRUE。
如果 UPDATE 语句没有修改任何于外键关联的字段,不再检查外键约束。
只要 WHERE 条件项完全由常量和所有窗口函数中 PARTITION BY 子句内的表达式构成,允许 WHERE 条件项下推到包含窗口函数的子查询中。

CLI 增强
v3.35.0 对命令行工具进行了以下增强:
.stats 支持新的参数 stmt 和 vmstep,分别用于显示语句准备阶段统计和仅显示虚拟机步骤计数。
增加了 .filectrl data_version 命令,用于显示数据文件页的版本号。
增强了 .once 和 .output 命令,如果目标参数以 | 开头(表示输出结果重定向到管道),参数不需要使用引号包含。

缺陷修复
新版本还修复了以下缺陷:
修改了潜在的 NULL 指针间接引用,当系统处理包含关联 WHERE 子句和 HAVING 0 子句的错误 SELECT 语句时可能出现这种问题(SQLite 3.34.1 补丁版本同步修改了该缺陷)。
修复了 SQLite 3.33.0 版本引入的 IN 运算符优化可能导致的错误结果。
修复了 LIKE 运算符以 % 结尾且包含 ESCAPE ‘_’ 子句时的错误结果。

最新版本:3.36
SQLite 3.36.0 于2021年6月中旬发布了,此版本更新内容包括:
对 EXPLAIN QUERY PLAN 输出的改进,使其更容易理解。
token 开始的字节顺序标记被跳过,就像它们是空白的一样。
在试图访问一个 VIEW 或子查询的 rowid 时,会产生一个错误。以前一个 VIEW 的 rowid 是不确定的,而且经常是 NULL。-DSQLITE_ALLOW_ROWID_IN_VIEW 编译时选项可用于恢复需要它的应用程序的传统行为。
sqlite3_deserialize() 和 sqlite3_serialize() 接口现在被默认启用。不再需要 -DSQLITE_ENABLE_DESERIALIZE 编译时选项了。取而代之的是一个新的 -DSQLITE_OMIT_DESERIALIZE 编译时选项来省略这些接口。
"memdb"VFS 现在允许同一进程中的多个数据库连接共享同一个内存数据库,只要数据库名称以"/"开头。
取消了 EXISTS-to-IN 优化(SQLite 3.35.0 变更日志中的第 8b 项),因为发现它降低了查询速度,而不是加快了查询速度。
改进 constant-propagation 优化,使其适用于非连接查询。
REGEXP 扩展现在包含在 CLI 构建中。

最新版本:3.38
3.38.0 现已于2022年2月下旬发布。主要变化如下:
添加了 -> 和 ->> 运算符以便于处理 JSON。新的运算符与 MySQL 和 PostgreSQL 兼容。JSON 函数现在是内置的。不再需要使用 -DSQLITE_ENABLE_JSON1 编译时选项来启用 JSON 支持。默认情况下启用 JSON。使用新的 -DSQLITE_OMIT_JSON 编译时选项禁用 JSON 接口。
日期和时间功能的增强:
添加了 unixepoch() 函数。
添加了 auto 修饰符和 julianday 修饰符。

将 printf() SQL 函数重命名为 format() 以获得更好的兼容性。保留原始 printf() 名称作为别名以实现向后兼容性。
添加了 sqlite3_error_offset() 接口,有时可以帮助将 SQL error 定位到输入 SQL 文本中的特定字符,以便应用程序可以提供更好的错误消息。
增强了 virtual tables 的接口如下:
添加了 sqlite3_vtab_distinct() 接口。
添加了 sqlite3_vtab_rhs_value() 接口。
添加了新的 operator 类型 SQLITE_INDEX_CONSTRAINT_LIMIT 和 SQLITE_INDEX_CONSTRAINT_OFFSET。
添加了 sqlite3_vtab_in() 接口(及相关接口)以使 virtual table 能够一次处理所有 IN operator 约束,而不是单独处理 IN operator 右侧的每个值。

CLI enhancement:
Columnar output modes 得到增强,可以正确处理嵌入在文本中的制表符和换行符。
在 Columnar output modes 中添加了“--wrap N”、“--wordwrap on”和“--quote”等选项。
添加了 .mode qbox 别名。
.import 命令自动消除列名的歧义。
使用新的 sqlite3_error_offset() 接口提供更好的错误消息。

Query planner enhancements:
使用 Bloom filter 来加速大型分析查询。
使用 balanced merge tree 来评估具有 ORDER BY 子句的 UNION 或 UNION ALL 复合 SELECT 语句。

ALTER TABLE 语句更改为静默忽略 sqlite_schema 表中在时不解析的条目。改变了 ALTER TABLE 语句,当 PRAGMA writable_schema=ON 时,静默忽略 sqlite_schema table 中没有解析的条目。

最新版本:3.40
SQLite 3.40 于2022年11月中旬正式发布,更新内容如下:
增加对将 SQLite 编译为 WASM 和在网络浏览器中运行的支持
增加恢复扩展,可能能够从损坏的数据库文件中恢复一些内容
查询规划器的增强
增加了一个名为 sqlite3_filename 的新类型定义,用来表示数据库文件的名称。
增加了 sqlite3_value_encoding() 接口。
安全性增强:增强了 SQLITE_DBCONFIG_DEFENSIVE,以禁止改变 schema_version
增强了 PRAGMA integrity_check 语句
增强 VACUUM INTO 语句,使其遵守 PRAGMA 的同步设置
增强了 sqlite3_strglob() 和 sqlite3_strlike() API,使它们能够为字符串参数接受 NULL 指针,并且仍然产生一个合理的结果。
提供新的 SQLITE_MAX_ALLOCATION_SIZE 编译时选项来限制内存分配的大小。
将 SQLite 内置的伪随机数生成器(PRNG)使用的算法从 RC4 改为 Chacha20。
允许两个或多个索引具有相同的名称,只要它们都在不同的模式中
其他性能优化使典型工作负载中使用的 CPU 周期减少约 1%

更多详情可查看此处

3.42.0 正式于2023年5月中旬发布,更新内容如下:
增加 FTS5 secure-delete 命令。当内容被删除时,这个选项会使所有取证分析从 FTS5 的倒置索引中被删除。
增强 JSON SQL 函数以支持 JSON5 扩展。
现在允许对 sqlite3_config () 的 SQLITE_CONFIG_LOG 和 SQLITE_CONFIG_PCACHE_HDRSZ 调用发生在 sqlite3_initialize () 之后。
新增了 sqlite3_db_config () 选项: SQLITE_DBCONFIG_STMT_SCANSTATUS 和 SQLITE_DBCONFIG_REVERSE_SCANORDER。

查询计划器的改进:
默认启用 "count-of-view" 优化。
避免在子查询中计算未使用的列。

对下推优化的改进
对 CLI 的改进:
增加 --unsafe-testing 命令行选项。如果没有这个选项,一些点状命令(例如:".testctrl")现在被禁用,因为这些命令只用于测试,可能会导致故障误用。
允许命令 .log on 和 .log off,即使在 --safe 模式下。
-- 作为一个命令行参数意味着所有以 - 开头的后续参数都被解释为普通的非选项参数。
Magic 参数 :inf 和 :nan 分别与浮点字元 Infinity 和 NaN 绑定。
--utf8 命令行选项在交互式会话中省略了所有与 Windows 控制台的 MBCS 的转换,并在这种会话中为 UTF-8 I/O 设置控制台代码页。--utf8 选项在所有其他平台上都是无用的。
增加应用程序定义的 SQL 函数与连接关键字同名的能力:CROSS, FULL, INNER, LEFT, NATURAL, OUTER, 或 RIGHT。

增强 PRAGMA integrity_check 的功能:
当 NaN 值被存储在 NOT NULL 列中时,检测并引发一个错误。
改进了错误信息输出,当在 b-tree 中发现错误时,可以识别 b-tree 的根页面。
允许对会话扩展进行配置,以捕获缺乏明确 ROWID 的表的变化。
为日期和时间函数添加了 subsecond 修改器。
传入 sqlite3_sleep () 的负值从此被解释为 0。
JSON 数组和对象的最大递归深度从 2000 降低到 1000。
扩展了内置的 printf () 函数,因此除了整数转换外,逗号选项现在也可以用于浮点转换。

更多详情可查看此处

用 Rust 编写的 SQLite 压缩扩展 sqlite-zstd

为 SQLite 提供透明的基于字典的行级压缩,于2022年11月发布。将允许压缩 SQLite 数据库中的条目,就像压缩整个数据库文件一样,但同时保留了随机访问。根据不同的数据,这可以将数据库的大小减少 80%,同时保持大部分的性能不变(甚至可以提高性能,因为从磁盘上读取的数据更小)。该项目可以以两种模式构建:作为 Rust 库;作为纯 SQLite 扩展。


可以从 GitHub Release 中获取 SQLite 扩展二进制文件,或者可以手动构建扩展:
cargo build --release --features build_extension
# should give you target/release/libsqlite_zstd.so

可以将此库作为 SQLite 扩展或作为 Rust 库加载。请注意 sqlite 扩展不是持久的,因此每次连接数据库时都需要加载它。

Sqlite CLI
在 REPL 中加载它:
$ sqlite3 file.db
SQLite version 3.34.0 2020-12-01 16:14:00
sqlite> .load .../libsqlite_zstd.so
[2020-12-23T21:30:02Z INFO  sqlite_zstd::create_extension] [sqlite-zstd] initialized
sqlite>
或者:
sqlite3 -cmd '.load libsqlite_zstd.so' 'select * from foo'

C API
int success = sqlite3_load_extension(db, "libsqlite_zstd.so", NULL, NULL);

Rust
推荐的方法是添加 sqlite_zstd 作为项目的依赖项,然后使用
let conn: rusqlite::Connection;
sqlite_zstd::load(&conn)?;

或者也可以像任何其他扩展一样加载扩展:
let conn: rusqlite::Connection;
conn.load_extension("libsqlite_zstd.so", None)?;

最新版本:3.43
v3.43 已于2023年8月下旬正式发布。主要变化
添加对 Contentless-Delete FTS5 索引的支持。这是 FTS5 全文搜索索引的变体,它省略了存储正在索引的内容,同时支持删除记录
- Contentless-Delete 表支持 DELETE 和 "INSERT OR REPLACE INTO" 语句
- Contentless-Delete 表支持 UPDATE 语句,但前提是为 fts5 表的所有用户定义列提供了新的值
- Contentless-Delete 表不支持 FTS5 删除命令

增强日期和时间函数:
添加了 ±YYYY-MM-DD HH:MM:SS.SSS 形式的新版时间位移修饰符 (time shift modifiers)
新增 timediff() SQL 函数
新增 octet_length(X) SQL 函数
新增 sqlite3_stmt_explain() API
增强 JSON 处理性能,大型 JSON 字符串某些类型处理的性能提升了 2 倍
增强 Query planner 性能
更多详情查看发行公告

最新版本:3.44
3.44.0 现已于2023年10月下旬发布,更新内容如下:
聚合函数现在可以在其最后一个参数后包含 ORDER BY 子句。函数的参数按照指定的顺序进行处理。这对于 string_agg () 和 json_group_array() 等函数非常重要 。
添加对 concat () 和 concat_ws() 标量 SQL 函数的支持,与 PostgreSQL、SQLServer 和 MySQL 兼容。
添加对 string_agg () 聚合 SQL 函数的支持,兼容 PostgreSQL 和 SQLServer。
strftime () SQL 函数上的新转换字母:%e %F %I %k %l %p %P %R %T %u
添加新的 C 语言 API: sqlite3_get_clientdata() 和 sqlite3_set_clientdata()。
现在,当运行 CREATE TABLE 语句本身时,会引发许多与 CREATE TABLE 相关的错误,而不是推迟到第一次实际使用表时。
PRAGMA integrity_check 命令现在使用新的 xIntegrity 方法验证各种内置虚拟表中内容的一致性。这适用于 FTS3、FTS4、FTS5、RTREE 和 GEOPOLY 扩展。
SQLITE_DBCONFIG_DEFENSIVE 设置现在可防止打开 PRAGMA writable_schema 。以前可以打开 writable_schema,但实际上不允许模式可写。现在则根本无法开启。
将内置 FTS3、FTS4、FTS5、RTREE 和 GEOPOLY 虚拟表标记为 SQLITE_VTAB_INNOCUOUS,以便它们可以在高安全性部署中的触发器内部使用。
PRAGMA case_sensitive_like 语句已弃用,因为当模式包含 LIKE 运算符时使用它可能会导致 PRAGMAintegrity_check 报告数据库损坏。
现在,只要使用 Microsoft C 编译器构建 SQLite,就会默认启用 SQLITE_USE_SEH (结构化异常处理)。可以使用 -DSQLITE_USE_SEH=0 禁用它
Query planner 优化:
    在部分索引扫描中,如果 WHERE 子句暗示表列的常量值,则用该常量替换该表列的出现。这增加了部分索引作为覆盖索引的可能性。
    禁用视图扫描优化(在版本 3.42.0 中添加 - item 1c),因为它会导致多个性能下降。取而代之的是,将 DISTINCT 子查询的估计行数减少 8 倍。
SQLite 现在执行运行时检测,检测底层硬件是否支持精度大于 “double” 的 “long double”,并根据检测结果使用适当的浮点例程。
Windows CLI 现在默认在支持 UTF-8 的平台上使用 UTF-8 进行输入和输出。--no-utf8 选项可用于禁用 UTF8 支持。

重写 JSON 函数并推出 JSONB

SQLite 于2023年12月上旬宣布推出 JSONB,这是对 SQLite JSON 函数的重写,宣称比现有 JSON 函数 “快几倍”。在过去几年中,SQLite 开发者为改进 JSON 数据与该 SQL 数据库的库集成做了大量工作,最新的工作是已合并的 JSONB。JSONB 对 SQLite JSON 函数进行了重写,将 JSON 的内部使用从二进制表示形式更改改为连续的字节数组,可以作为 SQL BLOB 读取或写入。JSONB 有助于降低解析 JSON 文本和表示用于存储时的开销。此外 JSONB 保留所有旧功能,并且所有 JSON 函数也可以接受 JSONB 二进制内容。如需了解有关 SQLite JSONB 功能及其更快性能潜力的更多信息可查看此处

SQLite 3.45 已于2024年1月下旬发布。新版本重写了所有 JSON 函数,改为新的内部解析树格式 JSONB。该JSON格式可以序列化并存储在数据库中,避免在使用 JSON 值时,还需要进行不必要的重复解析。因此通过支持 JSONB,SQLite 在处理 JSON 数据时能够更高效灵活。此外,JSONB 保留所有旧功能,并且所有 JSON 函数也可以接受 JSONB 二进制内容。官方承诺其生成的 JSONB 格式良好,但是由于 JSONB 本质上就是一个 BLOB,因此可能存在格式不正确的 JSONB,而 SQLite 在处理格式不正确的 JSONB,就可能出现不同行为,从而发生错误。不过 SQLite 也保证格式错误的 JSONB 永远不会导致内存错误或是类似问题,也不会出现系统漏洞。3.45.3 现已于2024年4月中旬发布,更新内容如下:
修复一个长期存在的错误(可追溯到版本 3.24.0),如果 UPDATE 触发器触发 UPSERT,该错误可能(很少)导致该触发器的 "old.*" 值不正确。
修复 sum() 中的一个错误,该错误可能导致它在应该返回 Infinity 时返回 NULL。
自上一个补丁发布以来出现的其他琐碎更正和编译器警告修复。

最新版本:3.46
v3.46.0现已于2024年5月下旬发布,更新内容如下:
1.通过多种方式增强 PRAGMA 优化,使其更易于使用:
PRAGMA optimize 会自动执行临时分析限制,以防止大型数据库上的运行时间过长。
添加了新的 0x10000 位掩码选项来检查所有表的更新。
自动重新分析没有 sqlite_stat1 条目的表。

2.增强 date and time functions:
strftime() SQL 函数现在支持 %G、%g、%U 和 %V。
新的修饰符 “ceiling” 和 “floor”,可控制在以整数月份和/或年份移动日期时用于解决模糊日期的算法。
如果 SQLite 知道时间已经是 UTC 或本地时间,则 “utc” 和 “localtime” 修饰符现在无效。

3.添加对数字文字中数字之间的下划线(“_”)字符的支持。

4.添加 json_pretty() SQL 函数。

5.Query planner 改进:
a.“VALUES-as-coroutine” 优化使 VALUES 子句中包含数千行的 INSERT 语句的解析和运行时间缩短了约一半,内存使用量也减少了约一半。
b.允许对诸如 “SELECT count (DISTINCT col) FROM ...” 之类的查询使用索引,即使索引记录不小于表记录。
c.改进了对 SQL 函数的值是常数的情况的识别,因为其所有参数都是常数。
d.增强 WHERE 子句下推优化,使其能够下推包含不相关子查询的 WHERE 子句项。

6.如果 SQL 解析器堆栈溢出,则从堆中为其分配额外的内存,而不是报告 “解析器堆栈溢出” 错误。

7.JSON 更改:
允许 JSON5 字符串文字内使用 ASCII 控制字符。
修复 -> 和 ->> operators,以便当右侧操作数是一个看起来像整数的字符串时,它仍然被视为字符串,因为 PostgreSQL 就是这么做的。

8.允许将大十六进制文字用作表列的默认值。

更多详情可查看发行说明

v3.46.1 现已于2024年8月中旬发布,更新内容如下:
在解析 FTS5 中的 tokenize= 参数时提高了稳健性。
增强了查询规划器中的覆盖索引预测。添加对覆盖索引过度预测的早期检测,以便 sqlite3_prepare() 返回错误,而不仅仅是生成错误的字节码。
即使 VALUES clause 因包含 double-quoted string literals 而看似变量的元素,也不要让 VALUES clause 的项数受到 SQLITE_LIMIT_COMPOUND_SELECT 的限制。
修复 group_concat() 的 window function 版本,使其在有一个或多个空字符串输入时返回空字符串。
在 FTS5 secure-delete 模式下,修复有关损坏索引的误报完整性检查报告。
ALTER TABLE 中的语法错误应始终返回 SQLITE_ERROR。在某些情况下,它们以前返回 SQLITE_INTERNAL。
JavaScript/WASM:修复 JavaScript “opfs” VFS 中导致损坏的错误;解决几个特定于浏览器的 OPFS quirks。
以及其他小修复。

最新版本:3.47
v3.47.0 现已于2024年10月下旬发布,更新内容如下:
1.允许在 RAISE function 的第二个参数中使用任意表达式。
2.如果 RHS of the ->> operator 为负数,则从右侧计数访问数组元素。
3.修复很少使用的 unix-dotfile VFS 中回滚热日志文件的问题。
4.即使 FTS5 表使用未注册的非标准 tokenizer,现在也可以删除。
5.修复 group_concat () 聚合函数,使其在收到一个空字符串输入值时返回一个空字符串,而不是 NULL。
6.增强 generate_series() 表值函数,使其能够识别并使用其输出值的约束。
7.预更新 hooks 现在可以识别由 ALTER TABLE ADD COLUMN 添加的列何时具有非空默认值。
8.性能优化:
改进了与 IN 运算符相关的子查询的重用,尤其是当 IN 运算符由于谓词下推而出现重复时。
对 IN 运算符右侧的子查询使用 Bloom 过滤器,以提高性能。
确保诸如 “ SELECT func (a) FROM tab GROUP BY 1” 之类的查询每行仅调用一次 func () 函数。
不会尝试在已知为非选择性的列上创建自动索引,因为该列已在已分析的其他索引中使用。
对查询计划器进行调整,以便它能为具有大量维度表的星型查询生成更好的计划。
添加 “order-by-subquery” 优化,如果所需的顺序是通过子查询中的 ORDER BY 子句自然获得的,则尝试禁用外部查询中的排序操作。
只要查询规划器能证明表达式的 subtype 永远不会被使用,“indexed-subtype-expr” 优化就会力求使用作为索引一部分的表达式,而不是根据表值重新计算表达式。
进行各种编码调整以加快运行速度。
9.SQLite 相关命令行程序的增强:
添加实验性的 sqlite3_rsync 程序。
向 CLI 添加扩展函数 median()、percentile()、percentile_cont() 和 percentile_disc()。
将 .www dot-command 添加到 CLI。
sqlite3_analyzer 实用程序现在可为 WITHOUT ROWID 提供细分统计信息。
如果第二个参数不存在,sqldiff 实用程序将避免创建空数据库。
10.增强 sqlite_dbpage 表值函数,使得可以使用 INSERT 来增加或减少数据库文件的大小。
11.不再使用 “long double” 数据类型,因为 long double 的硬件支持越来越少,并且 long double 给某些编译器工具链带来了挑战。取而代之的是,SQLite 在需要扩展精度时使用 Dekker 算法。
12.SQLite 的 TCL 接口支持 TCL9。
13.JavaScript/WASM:
修复 JavaScript “opfs” VFS 中导致损坏的错误。
纠正 “opfs” VFS 的 "mode=ro" handling。
解决几个特定于浏览器的 OPFS quirks。
14.FTS5 Changes:
添加 fts5_tokenizer_v2 API 和 locale=1 选项。
添加 contentless_unindexed=1 选项,用于创建无内容的 fts5 表,将任何 UNINDEXED 列的值持久存储在数据库中。
即使 FTS5 表使用的 custom tokenizer 实现不可用,也允许将其删除。

小结

触发器增强
v3.47 版本开始,触发器函数 RAISE() 的 error-message 参数可以支持任意 SQL 表达式。在此之前,该参数只能是字符串常量。


新版本的函数可以输出更加灵活有用的错误信息。

JSON运算符
新版本的 JSON 运算符 ->> 支持从数组右侧开始计算元素下标,例如:
sqlite> select '[1,2,3,4]' ->> 1;
2
sqlite> select '[1,2,3,4]' ->> -1;
4

当表达式右侧参数为负数时,表示从右侧开始开始计算元素位置。

SQL函数
新版本改进了聚合函数 group_concat(),当输入参数只有一行空字符串时返回空字符串而不是 NULL。
sqlite> CREATE TABLE t(cid int, val varchar(10));
sqlite> INSERT INTO t values(1, 'S'),(1, 'Q'),(1, 'L');
sqlite> INSERT INTO t values(2, '');
sqlite> INSERT INTO t values(3, null);
sqlite>
sqlite> .nullvalue 'None'
sqlite> SELECT group_concat(val)
   ...> FROM t
   ...> GROUP BY cid;
S,Q,L

新版本增强了表值函数 generate_series(),可以识别并且使用基于返回结果值的约束。

性能优化
1.优化了 IN 运算符中的子查询重用,尤其是存在谓词下推导致的 IN 运算符重用。
2.针对 IN 运算符中的子查询,在可能带来优化性能的场景时使用布隆过滤器。
3.对于类似“SELECT func(a) FROM tab GROUP BY 1”的查询,确保每行数据只调用一次 func() 函数。
4.如果已知某个字段的选择性很低(通过分析该字段参与的其他索引获得),基于该字段的查询不会尝试创建自动索引(查询时索引)。
5.针对涉及大量维度表的星型查询优化了查询计划。
6.增加了排序子查询(order-by-subquery)优化功能,当查询最终的排序结果和子查询中的 ORDER BY 结果一致时,可以避免最终的排序操作。
7.针对表达式索引,如果查询计划器可以确认不会使用表达式的子类型,indexed-subtype-expr 优化就会尽量使用作为索引一部分的表达式的数值,而不会基于表中的数据重新计算表达式。
8.其他优化运行速度的代码调整。

命令行工具
v3.47.0 增加了一个试验性质的命令行工具 sqlite3_rsync,它可以用于实现 SQLite 主从复制。显然这是一个非常重要的功能,可以完成 SQLite 原生一致性复制,期待正式版本。

命令行工具默认增加了扩展聚合/窗口函数 median()、percentile()、percentile_cont() 以及 percentile_disc()。增加了一个元命令 .www,它等价于“.once -w”,可以将查询结果以 HTML 表格形式在浏览器中显示。

sqlite3_analyzer 工具可以获取 WITHOUT ROWID 数据表的详细统计信息。当数据库比较工具 sqldiff 第二个参数指定的数据库不存在时,不再创建一个空白数据库。

其他改进
修复了非主流 unix-dotfile VFS 回滚热日志文件时存在的一个问题。
即使使用了没有注册的非标准分词器,也可以删除 FTS5 数据表。
通过 ALTER TABLE ADD COLUMN 语句新增非空且存在默认值的字段时,可以识别更新前的钩子程序。
增强了 sqlite_dbpage 虚拟表,INSERT 语句可以用于增加或者减少数据库文件大小。
SQLite 不在使用 long double 数据类型,因为支持该类型的硬件越来越少,而且一些编译工具链无法支持。
新版本支持的 TCL 接口升级为 TCL 9。虽然 TCL 8.5 以及更高版本可能正常工作,但是不能保证,建议升级到 TCL9。
新版本还修复了 JavaScript/WASM 相关的一些问题。同时还改进了 FTS5 相关功能。

完整的发行说明可以参考发行文档

最新版本:3.48
v3.48.0 现已于2025年1月中旬发布,更新内容如下:
重构用于帮助从 canonical sources 构建 SQLite 的 “configure"” 脚本,以修复错误、提高性能并使代码更易于维护。
这不会影响 sqlite3-autoconf-NNNNNNN.tar.gz "amalgamation tarball" 中的 “configure” 脚本,只会影响 canonical sources。amalgamation tarball 的构建系统保持不变。如果你正在使用 amalgamation tarball,则此更改日志条目对你没有任何影响。
这里的关键创新在于,现在使用的是 Autosetup 而不是 GNU Autoconf。这似乎是一个很大的变化,但实际上只是一个实施细节。./configure 脚本的编码方式非常不同,但工作原理应该与以前一样。
新 configure 的一个优点是,你不再需要安装 TCL 就能构建大多数 SQLite 目标。运行测试或构建使用 TCL 的附属程序(如 sqlite3_analyzer)时仍需要 TCL,但大多数常见目标不需要它。因此,从此版本开始,编译只需依赖 C 编译器和 “make” 或 “nmake”。
改进了 EXPLAIN QUERY PLAN output for covering indexe。
允许使用 iif () SQL function 的双参数版本。还允许使用 if() 作为 iif() 的替代拼写。
将 “.dbtotxt” 命令添加到 CLI。
将 SQLITE_IOCAP_SUBPAGE_READ 属性添加到 sqlite3_io_methods 对象的 xDeviceCharacteristics 方法。
将 SQLITE_PREPARE_DONT_LOG 选项添加到 sqlite3_prepare_v3(),以防止在 SQL 格式不正确时向 error log 发送警告信息。这允许使用 sqlite3_prepare_v3 () 对 SQL 进行测试编译以检查其有效性,而不会用错误信息污染错误日志。
将 SQLITE_LIMIT_LENGTH 的最小允许值从 1 增加到 30。
添加了 SQLITE_FCNTL_NULL_IO 文件控制。
扩展 FTS5 auxiliary  API xInstToken () 以通过 insttoken 配置选项和 fts5_insttoken() SQL 函数处理前缀查询。
将 SQL 函数的最大参数数量 从 127 增加到 1000。
删除 SQLITE_USER_AUTHENTICATION 的残留痕迹。
修复了各种小错误。

最新版本:3.49
v3.49.0 现已于2025年2月上旬发布,更新内容如下:
1.查询计划器的增强功能:
改进查询时间索引优化,使其适用于 WITHOUT ROWID 表。
改进大型 star-query 连接的查询计划。修复了 SQLite 论坛上报告的三种不同的性能回归问题。
当两个或多个查询具有相同的估计成本时,使用每行字节数较少的查询。

2.增强 iif() SQL 函数,使其能够接受大于或等于二的任意数量的参数。

3.增强会话扩展,使其能在使用生成列的数据库上运行。

4.忽略 SQLITE_USE_STDIO_FOR_CONSOLE 编译时选项,该选项未正确实现且从未正常工作。取而代之的是 SQLITE_USE_W32_FOR_CONSOLE_IO 编译时选项。此选项仅适用于 CLI 等命令行工具,而不适用于 SQLite core。它导致 Win32 API 用于控制台 I/O 而不是 stdio。此选项仅影响 Windows 版本。

5.sqlite3_db_config() 有三个新选项。全部默认为 “开启”。
SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE
SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE
SQLITE_DBCONFIG_ENABLE_COMMENTS

6.将预编译的合并 tarball 中使用的配置脚本的 Autotools 替换 为 Autosetup。在之前的版本 (3.48.0) 中,规范源代码的配置脚本已更改为 Autosetup。只有合并 tarball 中的主要 SQLite 配置脚本发生了更改。合并 tarball 的 TEA 子目录使用的 (已弃用的) 配置脚本仍然依赖于 Autotools。

7.针对 3.48.0 版本中出现的问题进行各种小修补和修复。