MoteDB v0.18 发布

💡 原文中文,约2900字,阅读约需7分钟。
📝

内容提要

MoteDB 是纯 Rust 编写的嵌入式多模态数据库,面向具身智能,支持向量、全文、时序、空间索引及 SQL 与 ACID。0.18 版新增连续视图、列重命名与逻辑删列、多进程共享只读。核心工作是统一 SQL 比较语义:先写特征测试锁定现状,再用九条执行路径差分对拍,发现 7 个旧分歧,并以 CI 棘轮限制裸比较。另修复向量召回与 CTE 旧缺陷,测试提速至约 30 分钟。

🔎

延伸解读

比较语义统一:从分散实现到单一语义层

文章指出,0.17 版本发现四轮“同一谓词不同路径不同结果”的缺陷都源于 SQL 比较语义分散在 11 个实现中。0.18 新建 semantics.rs 作为唯一语义层,先写特征测试锁定现状,再用九条执行路径差分对拍,发现 7 个旧分歧。这提示读者:当同一逻辑在多处重复实现时,统一语义层和差分测试是有效的治理手段。

差分测试揭示隐藏缺陷,甚至抓出测试工具自身问题

差分测试不仅揪出 7 个预先存在的跨路径分歧,还发现测试工具自身的 bug:UPDATE 探针用 a = a + 1000 探测,忘了 NULL + 1000 = NULL,导致行原样留下被误报为分歧。这说明差分对拍能暴露预期外的行为,包括测试代码的疏漏。文章强调“差分对拍 > 特征测试”,冲突时信差分,对开发者有借鉴意义。

CI 棘轮机制:防止裸比较回潮

0.18 将 src/sql 中裸值比较点从 49 处收编到清单化,门禁脚本统计违规数,上限写在单独文件(当前 50),只许降不许升,行内注释可豁免。这种“棘轮”式约束能防止开发者再手写 == 绕过统一语义层。对于需要长期维护一致性的项目,这是一种可复用的工程实践。

新功能成为老代码的压力测试

连续视图的开发中,把视图物化结果注册进 CTE map 后,连环揪出三个预存在的 CTE bug,例如 WITH x AS (...) SELECT COUNT(*) FROM x 此前会硬报 Table not found。文章总结“新功能是老代码的压力测试”,建议给新功能写测试时顺手把相邻老路径也拍一遍。这提醒读者:新特性测试可以成为发现旧缺陷的契机。

❓

Q&A

MoteDB 是什么?它主要用在哪些场景?

MoteDB 是一个纯 Rust 编写的嵌入式多模态数据库,面向具身智能(如机器人、AR、边缘设备)。它支持向量(DiskANN)、全文(BM25+jieba)、时序、空间四类索引,以及列存、ACID 和 SQL,单进程嵌入式零依赖,采用 MIT 协议。

MoteDB v0.18 有哪些新功能?

v0.18 新增了连续视图(CREATE CONTINUOUS VIEW)、列重命名与逻辑删列(ALTER TABLE ... RENAME/DROP COLUMN),以及多进程共享只读(Database::open_shared_readonly)。

MoteDB 如何解决 SQL 比较语义不一致的问题?

MoteDB 通过三步解决:1)先写特征测试锁定现状(38 行类型对 × 8 算子的矩阵测试和 12 个探针);2)用差分测试对拍九条执行路径,发现 7 个旧分歧;3)引入 CI 棘轮,将裸值比较点清单化并限制只降不升。

多进程共享只读功能有什么限制和保证?

多进程共享只读允许一个写者和多个读者进程同时挂载活动目录(使用 flock SH/EX)。写者持 EX 锁时读者会明确报错;脏目录(WAL 非空或未干净关闭)会被拒绝打开,因为只读者永不修复,修复是写者的职责。只读会话零字节落盘,通过目录字节指纹验收。

MoteDB 的列删除是如何实现的?为什么不能物理收窄列宽?

DROP COLUMN 是逻辑删除:列段按位置存储,物理宽度绝不能收窄,被删除的槽位写 NULL 占位。因为 bincode 序列化位置敏感,物理收窄会导致旧目录损坏,所以通过目录镜像链(modern→V017→V013)保证跨版本兼容。

MoteDB v0.18 在测试和发布工程上做了哪些优化?

全量门禁 4300+ 测试从约 2.5 小时提速到约 30 分钟(通过独立 release-test profile 关闭 LTO);EXPLAIN 改为决策点实录(thread-local trace 重放执行);文档版本单源并 CI 校验;Release 页由 tag 自动生成;发版前用 cargo package --list 核验排除未跟踪文件。

🏷️

标签

➡️

继续阅读