【免费下载链接】pgmicro
An in-process reimplementation of PostgreSQL, backed by a SQLite-compatible storage engine
pgmicro 是一个用 Rust 编写的进程内 PostgreSQL 兼容实现,底层采用与 SQLite 兼容的存储引擎。要回答"如何保证 100% 兼容",答案不在营销文案里,而在testing/目录下的多层测试体系中:从 SQL 合规测试、官方测试套件移植,到以 SQLite 为基准的差分测试,再到混沌测试,形成了一套层层递进的正确性防线。
一、先立规矩:兼容性保证写进文档
在讲测试之前,pgmicro 先把"兼容"的边界定义清楚。项目根目录下的 COMPAT.md 开宗明义:
任何偏离标准行为、且未显式文档化为可选扩展的情况,都视为 bug(bug)。
核心承诺包括:
- ✅ 完整支持 SQLite 文件格式(可直接打开原数据库)
- ✅ 任何不兼容特性都必须"显式选择开启",且尽可能保留回退路径
- ✅ 兼容性通过对 SQLite 的差分测试+跑通完整官方测试套件来验证
这意味着"100% 兼容"不是口号,而是一组可以被 CI 反复执行的断言。
二、第一道防线:.sqltest 合规测试框架
pgmicro 自带一套声明式 SQL 合规测试框架,位于 testing/sqltests/。测试用例是.sqltest文件(一种自研 DSL),框架把它解析成 AST、执行、再与实际输出逐行比对。
一个典型用例长这样(见 testing/sqltests/examples/basic.sqltest):
@setup users test select-filtered { SELECT name FROM users WHERE age > 28 ORDER BY name; } expect { Alice Charlie }它的工程化程度很高:
- 快照测试:
testing/sqltests/tests/下有 200+ 个.sqltest用例与 300+ 个.snap快照文件,覆盖 SELECT、JOIN、窗口函数、触发器、事务、MVCC 等特性; - 多后端可插拔:框架通过
SqlBackend特质抽象执行目标(CLI、各语言 SDK),同一套用例可复用于多个绑定实现,架构细节见 testing/sqltests/docs/architecture.md; - 扩展特性单独成册:PostgreSQL 风格的扩展(数组、物化视图、向量、FTS、MVCC 等)集中在 testing/sqltests/turso-tests/,共 40+ 个专项用例。
三、金标准:移植 SQLite 官方 TCL 合规测试
差分测试解决"结果对不对",合规测试解决"行为像不像"。pgmicro 直接移植了 SQLite 官方测试套件,放在 testing/conformance/sqlite3/:
- 52 个官方
.test文件,按 SQL 特性切分:select1~selectH、join.test、insert.test、func.test、alter.test等 - 通过一个原生 TCL 扩展
libturso_tcl(C 源码见 bindings/tcl/turso_tcl.c),把项目自身的查询引擎注册为 TCL 环境里的sqlite3命令,从而原封不动地执行官方用例
跑通全部官方用例(./all.test)是兼容性验收的硬指标,任何一条do_execsql_test断言失败都会暴露语义差异。
四、核心引擎:以 SQLite 为基准的差分测试
差分测试(Differential Testing)是 pgmicro 兼容性的"主力引擎",代码在 testing/differential-oracle/,风格上借鉴了 SQLancer:
- 随机生成 SQL:
sql_gen/sql_gen_prop模块随机生成建表语句与查询,覆盖类型转换、表达式、子查询等组合空间; - 双库执行:同一条 SQL 同时投递给 pgmicro 引擎和 SQLite;
- Oracle 裁决:testing/differential-oracle/fuzzer/oracle.rs 中的
DifferentialOracle对两份结果做语义级比对(OracleResult分为Pass/Warning/Fail三态),任何行序、值、错误信息的差异都会被捕获。
CLI 入口 testing/differential-oracle/fuzzer/main.rs 提供了实用选项:--seed保证失败可复现、loop子命令无限轮转随机种子、--mvcc开启实验性 MVCC 差分模式、--coverage输出覆盖报告以指导生成器探索更多分支。
五、向外延伸:模糊测试与混沌测试
差分与合规测试之外,还有三个"找茬"工具:
- SQLRight 模糊测试:基于覆盖引导的 SQL 模糊器(testing/sqlright/),用 TLP、INDEX 等多种 Oracle 策略挖逻辑 bug 与崩溃;
- 确定性模拟器:按随机配置生成"交互计划"(查询序列 + 属性断言),循环执行并校验不变量,还支持
--differential双跑比对(见 docs/testing.md); - Antithesis 混沌测试:在真实分布式故障注入环境中验证持久化正确性,测试用例位于 testing/antithesis/,包括银行账本一致性与多压力工作负载。
六、对 PostgreSQL 用户意味着什么
pgmicro 的 PostgreSQL 兼容层(如 core/pg_catalog.rs 提供的系统目录、cli/pg_server.rs 的 PG wire 协议服务)构建在这套测试体系之上:底层存储与 SQL 语义先对标 SQLite 打牢地基,上层再补齐 PG 风格特性。上图展示的 MVCC 事务版本链,正是由testing/sqltests/turso-tests/mvcc_*.sqltest系列用例逐项约束的。
想亲手验证?从仓库根目录执行:
make test再按 testing/conformance/sqlite3/README.md 构建libturso_tcl后运行./all.test,即可体验完整合规检查流程。
小结:pgmicro 用"承诺文档 → 合规用例 → 官方套件 → 差分测试 → 模糊/混沌"五层结构,把"100% 兼容"拆成了可执行、可复现、可追溯的工程问题。对于想深入的用户,建议按 docs/testing.md 与 testing/sqltests/docs/ 的文档顺序逐层阅读。
【免费下载链接】pgmicro
An in-process reimplementation of PostgreSQL, backed by a SQLite-compatible storage engine
相关推荐
cn 如何做到与 tailwind-merge 100% 兼容?35 万+ 差异测试与语法模糊验证体系完整剖析
cn 如何做到与 tailwind merge 100% 兼容?35 万+ 差异测试与语法模糊验证体系完整剖析 cn 是一个面向 Tailwind 类名合并与冲
如何证明100%兼容?neomacs以GNU Emacs为测试Oracle的等价性测试体系
如何证明100%兼容?neomacs以GNU Emacs为测试Oracle的等价性测试体系 neomacs 是一个用 Rust 重写、面向 GPU 的现代 Em
Basenji模型深度解析:革命性DNA序列调控活性预测工具的核心原理
Basenji模型深度解析:革命性DNA序列调控活性预测工具的核心原理 Basenji是一款基于深度卷积神经网络的革命性DNA序列调控活性预测工具,能够从长DN
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考