SQLite 3.44.0 发布!

SQLite 开发团队于 2023 年 11 月 01 日发布了 SQLite 3.44.0 版本,带来了一些 SQL 和优化器增强,本文给大家做一个简要分分析。

新增 concat() 函数

新版本增加了两个连接字符串的函数:concat() 以及 concat_ws()。它们可以兼容 PostgreSQL、SQLServer 以及 MySQL,例如:

sql 复制代码
sqlite> select concat('sql', 'ite');
sqlite
sqlite> select concat_ws('-','S', 'Q', 'L');
S-Q-L

新增 string_agg() 函数

SQLite 提供了实现字符串聚合的 group_concat 函数,新版本为其增加了一个别名函数 string_agg(),目的是为了兼容 PostgreSQL 以及 SQL Server 语法。例如:

sql 复制代码
sqlite> create table test(pid int, val text);
sqlite> insert into test values(1, 'S'),(1,'Q'),(1,'L');
sqlite> select pid, string_agg(val,'-')
   ...> from test
   ...> group by pid;
1|S-Q-L

聚合函数 ORDER BY 子句

新版本支持在聚合函数中使用 ORDER BY 子句,指定数据在聚合函数中处理的顺序。这个参数对于某些聚合函数没有实际意义,例如 max();但是对于某些聚合函数,比如 string_agg() 以及 json_group_array(),该参数将会影响最终的结果。例如:

sql 复制代码
sqlite> select pid, string_agg(val,'-' order by val)
   ...> from test
   ...> group by pid;
1|L-Q-S

strftime() 新增参数

strftime() 函数增加了以下格式参数:

  • %e,返回月份中的第几天:0-31;
  • %F,ISO-8601 格式日期:YYYY-MM-DD;
  • %I,12小时制对应的小时:01-12;
  • %k,24 小时制对应的小时:0-24;
  • %l,12小时制对应的小时:1-12;
  • %p,代表上午和下午的"AM"和"PM";
  • %P,代表上午和下午的"am"和"pm";
  • %R,ISO-8601 格式时间:HH:MM;
  • %T,ISO-8601 格式时间:HH:MM:SS;
  • %u,一周中的第几天,1 代表星期一。

查询优化器

对于部分索引扫描,如果 WHERE 子句包含一个字段的常量值,那么可以用该常量替换该字段。这种优化增加了部分索引成为覆盖索引的可能性。

禁用了 3.42.0 版本增加的视图扫描优化,因为它导致了成倍的性能下降。

其他改进

新增了两个 C 语言 API:sqlite3_get_clientdata() 以及 sqlite3_set_clientdata()。

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 操作符时会导致数据库被 PRAGMA integrity_check 损坏的报告。

当使用 Microsoft C 编译器时,默认启用 SQLITE_USE_SEH(结构化异常处理)。该选项可以使用 -DSQLITE_USE_SEH=0 禁用。

SQLite 在运行时检查底层硬件是否支持精度大于"double"的"long double"类型,并且基于检查结果使用相应的浮点数程序。

如果系统支持,Windows 命令行接口(CLI)默认使用 UTF-8 编码进行输入输出。使用 --no-utf8 选项启动可以禁用 UTF8 支持。

相关推荐
这个DBA有点耶8 分钟前
库内计算推理:一条SQL背后的算子融合,和外挂方案差了几次网络往返
数据库·人工智能·sql
这个DBA有点耶2 小时前
函数索引的“完全一致”有多苛刻:写法、字符集、类型,差一处就失效
数据库·mysql·代码规范
星恒随风2 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
Alluxio3 小时前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
数据库急诊室_阿哲7 小时前
一次加索引建议的复核记录:从报告到签字
数据库·ai数据库
青瓦梦滋7 小时前
Redis主从复制
服务器·数据库·redis·缓存·bootstrap
慧都小妮子8 小时前
Wyn商业智能国产数据库适配:数据接入、分析缓存与审计日志验证清单
数据库·数据分析·数据可视化·审计日志·商业智能
Joy T9 小时前
Redis Lua 原子限流:Lua 脚本、竞态条件与并发控制
数据库·redis·lua·限流·竞态条件·redis scripting
杨凯凡9 小时前
MySQL 死锁怎么排查?InnoDB 锁等待与 Spring Boot 整事务重试实战
数据库·spring boot·mysql
Aloudata9 小时前
Claude 做数据分析的这两年:一份复盘与发展线索
大数据·数据库·人工智能·数据挖掘·数据分析·dataagent