☰
如何保证PostgreSQL 100%兼容?pgmicro的差分测试与SQL合规测试体系剖析
2026/10/14 15:08:57 网站建设 项目流程

【免费下载链接】pgmicro

An in-process reimplementation of PostgreSQL, backed by a SQLite-compatible storage engine

项目地址:https://gitcode.com/gh_mirrors/pg/pgmicro
点击查看免费下载

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:

  1. 随机生成 SQL:sql_gen/sql_gen_prop模块随机生成建表语句与查询,覆盖类型转换、表达式、子查询等组合空间;
  2. 双库执行:同一条 SQL 同时投递给 pgmicro 引擎和 SQLite;
  3. 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

项目地址:https://gitcode.com/gh_mirrors/pg/pgmicro
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询