编译SQLite 3.51源码并体验新功能

11月4日,SQLite 3.51发布了,第一时间下载体验,Linux上预编译的只有AMD64版本,而且依赖高版本C动态库,不方便使用,所以按编译说明,手工编译。

我下载的是 amalgamation版本,解压缩后只有4个文件,

复制代码
root@6ae32a5ffcde:/par/sqlite351# ls -l
total 10912
-rwxrwxrwx 1 root root 1068027 Nov  5 12:18 shell.c
-rwxrwxrwx 1 root root 9385376 Nov  5 12:18 sqlite3.c
-rwxrwxrwx 1 root root  671792 Nov  5 12:18 sqlite3.h
-rwxrwxrwx 1 root root   38632 Nov  5 12:18 sqlite3ext.h


root@6ae32a5ffcde:/par/sqlite351# gcc -Os -I. -DSQLITE_THREADSAFE=0 -DSQLITE_ENABLE_FTS4 \
   -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 \
   -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_EXPLAIN_COMMENTS \
   -DHAVE_READLINE \
   shell.c sqlite3.c -ldl -lm -lreadline -lncurses -o sqlite351 -O3

编译过程有一些警告,但没有错误,生成了sqlite351 文件。发版说明写到,

sql 复制代码
root@6ae32a5ffcde:/par/sqlite351# ls
shell.c  sqlite351  sqlite3.c  sqlite3.h  sqlite351  sqlite3ext.h
root@6ae32a5ffcde:/par/sqlite351# ./sqlite351
SQLite version 3.51.0 2025-11-04 19:38:17
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .mode box
sqlite> select 1 a, '中文' b;
┌───┬──────┐
│ a │  b   │
├───┼──────┤
│ 1 │ 中文 │
└───┴──────┘

作为对比,再次编译了上一个版本3.50.4版源码,旧版本的源码到github镜像获取,结果如下:

sql 复制代码
root@6ae32a5ffcde:/par/sqlite3504# ./sqlite3504
SQLite version 3.50.4 2025-07-30 19:33:53
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .mode box
sqlite> select 1 a, '中文' b;
┌───┬────┐
│ a │ b  │
├───┼────┤
│ 1 │ 中 │
└───┴────┘
sqlite>

这么明显的问题,不知为何到现在才解决,也许用SQLite作为前台的少,大部分都是在后台调用。

2.对于当前时间戳的支持

sql 复制代码
sqlite> create table test as select now()ts;
Parse error: no such function: now
  create table test as select now()ts;
                error here ---^
sqlite> create table test as select current_timestamp() ts;
Parse error: near "(": syntax error
  create table test as select current_timestamp() ts;
                                 error here ---^
sqlite> create table test as select current_timestamp ts;
sqlite> select * from test;
┌─────────────────────┐
│         ts          │
├─────────────────────┤
│ 2025-11-05 13:06:28 │
└─────────────────────┘

只能用不带括号的current_timestamp来查询。

  1. .timer计时精确到毫秒
sql 复制代码
sqlite> select sum(value) from generate_series(1,100000);
┌────────────┐
│ sum(value) │
├────────────┤
│ 5000050000 │
└────────────┘
Run Time: real 0.004330 user 0.004000 sys 0.000000



-- 再试一个高难度数独
WITH RECURSIVE
  input(sud) AS (
    VALUES('.....1..7....6..2.8..9..3...954....3..3...4..4......8......7..6.1..2....5..3..9..')
  ),
  digits(z, lp) AS (
    VALUES('1', 1)
    UNION ALL SELECT
    CAST(lp+1 AS TEXT), lp+1 FROM digits WHERE lp<9
  ),
  x(s, ind) AS (
    SELECT sud, instr(sud, '.') FROM input
    UNION ALL
    SELECT
      substr(s, 1, ind-1) || z || substr(s, ind+1),
      instr( substr(s, 1, ind-1) || z || substr(s, ind+1), '.' )
     FROM x, digits AS z
    WHERE ind>0
      AND NOT EXISTS (
            SELECT 1
              FROM digits AS lp
             WHERE z.z = substr(s, ((ind-1)/9)*9 + lp, 1)
                OR z.z = substr(s, ((ind-1)%9) + (lp-1)*9 + 1, 1)
                OR z.z = substr(s, (((ind-1)/3) % 3) * 3
                        + ((ind-1)/27) * 27 + lp
                        + ((lp-1) / 3) * 6, 1)
         )
  )
SELECT s FROM x WHERE ind=0;
┌──────────────────────────────────────────────────────────────┐
│                              s                               │
├──────────────────────────────────────────────────────────────┤
│ 346251897759863124821974365195486273683712459472539681238197 │
│ 546914625738567348912                                        │
└──────────────────────────────────────────────────────────────┘
Run Time: real 10.579288 user 10.548000 sys 0.032000

--旧版
sqlite> select sum(value) from generate_series(1,100000);
┌────────────┐
│ sum(value) │
├────────────┤
│ 5000050000 │
└────────────┘
Run Time: real 0.003 user 0.004000 sys 0.000000
相关推荐
冷雨夜中漫步8 小时前
SQLite 深度解析:在 Java/Spring 中的使用与H2、Derby对比
java·spring·sqlite
En^_^Joy9 小时前
Django开发:基本入门指南
python·django·sqlite
测试员周周1 天前
【Appium 系列】第18节-重试与容错 — 移动端测试的稳定性保障
人工智能·python·功能测试·ui·单元测试·appium·测试用例
测试员周周1 天前
【Appium 系列】第17节-XMind用例转换 — 从思维导图到 YAML
java·服务器·人工智能·单元测试·appium·测试用例·xmind
一路往蓝-Anbo1 天前
第五章:如何对 HAL 库本身进行单元测试?
网络·数据结构·stm32·单片机·嵌入式硬件·单元测试·tdd
计算机安禾1 天前
【c++面向对象编程】第49篇:面向对象的单元测试:用GoogleTest测试类
开发语言·c++·单元测试
DarkAthena1 天前
【DuckDB】一条 SQL 同时连接 Oracle 和 GaussDB
oracle·gaussdb·duckdb
测试员周周1 天前
【Appium 系列】第20节-测试项目结构设计 — 从脚本到工程
人工智能·数据挖掘·回归·单元测试·appium·测试用例·测试覆盖率
数字供应链安全产品选型1 天前
2025年Gartner中国安全技术成熟度曲线解读:软件供应链安全从“过热”到“落地”的演进之路
人工智能·web安全·单元测试·软件供应链安全
测试员周周2 天前
【Appium 系列】第14节-断言与验证 — Validator 的设计
android·人工智能·python·功能测试·ios·单元测试·appium