docs: site 站点全量同步 v0.7.4 — 首页徽章/统计(1304测试 76套件 90.1%)+ 流式真惰性说明、API 文档补写语句子查询与 DROP INDEX UNIQUE 语义 + v0.7.4 里程碑、错误码表补 COLUMN_NOT_FOUND/INDEX_NOT_FOUND、演示/基准版本标注、README 已知限制章节、dist 重建(VERSION 0.7.4)
CI / test (20.x) (push) Successful in 15m36s
CI / test (18.x) (push) Successful in 1m23s
CI / test (24.x) (push) Successful in 1m9s
CI / e2e (push) Successful in 56s
CI / test (22.x) (push) Successful in 1m16s

This commit is contained in:
thzxx
2026-08-15 15:08:38 +08:00
parent d4a3f4acd2
commit 2844a0617c
15 changed files with 1110 additions and 204 deletions
+66
View File
@@ -2,6 +2,72 @@
All notable changes to MetonaSqlark will be documented in this file.
## [0.7.4] - 2026-08-15
### 写语句子查询 / 约束硬化 / 真惰性流式
> 深度审计第七阶段:修复 UPDATE/DELETE WHERE 子查询静默 0 行(P1,四引擎)、
> 主键 NULL 静默入库(P1)、DROP INDEX 解除建表 UNIQUE 约束(P2)等 8 项正确性问题;
> Aria findStream 迭代器化落地"真惰性"宣称;REINDEX 单次扫描性能优化。
### Fixed
- **UPDATE/DELETE WHERE 子查询静默 0 行(P1,四引擎)** — `executeUpdate/executeDelete`
直接 compileStatement 调引擎,`$subquery` 未解析:引擎层 matchWhere 的 `$in/$nin`
遇对象恒 false → 所有行不匹配,写语句静默影响 0 行(与 v0.7.3 修的 queryStream
同类)。executor 写路径先 `resolveWriteWhere` 解析非关联子查询(IN 列表/标量),
EXPLAIN 的 estimatedRows 同步修复;关联引用($col / 关联 EXISTS)显式
`NOT_SUPPORTED`(写语句无法逐行绑定外层上下文);QueryBuilder 直通引擎路径
由引擎层 `containsUnresolvedSubqueries` 防御(Memory/Aria 双引擎)
- **主键 NULL/undefined 静默入库(P1,四引擎)** — 主键列缺失/置 null 时
`String(undefined)``"undefined"``String(null)``"null"` 作为主键落库。
validateRow 层强制主键非空(SQL 语义 PK 隐含 NOT NULL)抛 `VALIDATION_ERROR`
default 值生效时仍可省略主键(语义不变)
- **DROP INDEX 解除建表 UNIQUE 约束(P2** — `dropIndex` 此前 `colDef.unique = false`
静默解除建表约束(aria 侧 persistSchemas 后重启约束永久消失)。现在建表 UNIQUE
列 DROP INDEX 抛 `NOT_SUPPORTED`(对齐 SQLite:需重建表解除);仅
`CREATE UNIQUE INDEX` 添加的约束可随索引删除(引擎内 `uniqueIndexCols` 跟踪来源,
重启后 schema 中的 unique 一律按建表约束保护)
- **GROUP BY 把 null 与字符串 'null' 合并(P2** — 分组键 `String(row[col] ?? 'null')`
使两类值合并为一组;DISTINCT/UNION 去重键 `String(v ?? '\0')` 同类吞并。
统一类型安全编码(类型前缀),仅同类型同值合并(与 where-matcher 的 === 语义一致)
- **UPDATE 未知列静默写入存储行(P2)** — `SET nonexistent = ...` 的脏列残留在行内
并随持久化落盘。预检阶段显式 `COLUMN_NOT_FOUND`SQL + Table API 双路径,
Memory/Aria 双引擎)
- **queryStream 多语句语义不一致(P2** — `parseAll(sql)[0]` 静默忽略后续语句:
可流式时不执行(如 DELETE),不可流式时回退 query() 却执行全部语句。
多语句显式 `PARSE_ERROR`(流式 API 要求单条 SELECT
- **KVStore lastBackgroundError 跨生命周期残留(P3** — close/open 未清理,
重开后首次 checkpoint 抛出上一次生命周期的旧错误。open/close 统一清零
- **Hybrid beginTransaction 部分成功泄漏(P3** — 内存 begin 成功 + 磁盘 begin
抛错 → 内存快照泄漏(后续事务永久 TX_ACTIVE)。磁盘失败补偿回滚内存
- **MemTable RB-Tree 删除双黑修复边界(P3)** — 两子节点删除时 successor 右子
为 null 的占位 parent 传 null → fixDelete 直接跳过修复(树失衡)。
修复 parent 传递(直接右子传 successor,间接右子传 successor 原父)
- **死代码清理** — 移除 LSM.getAllEntries(无调用者;其 frozen 遍历顺序与 `get()`
相反属死代码路径)
### Changed
- **Aria findStream 真惰性(宣称落地)** — 此前 `rangeScanLazy` 内部
`mergeIter.drain()` 全量物化,与"流式不物化"宣称不符。重写为真惰性:
MemTable 红黑树显式栈生成器 + SSTableReader 块级生成器 + GeneratorEntrySource
接入 MergeIterator 逐条拉取;callback 返回 false 提前终止(limit 达成时
未消费块/子树不再解析),大表流式内存 O(1)
- **REINDEX 单次全表扫描(性能)** — `reindexTableInternal` 此前每个索引列一次
getAllRowsN 列 × M 行 + 每列一次 drainChain),改为单次扫描重建全部索引列
- VERSION 0.7.3 → **0.7.4**
### Changed(测试)
- 测试 1256 → **1304**76 套件,+48 个 v0.7.4 回归);新增 `tests/v074-fixes.test.ts`
(写语句子查询 ×10 / 关联引用 ×3 / EXPLAIN ×1 / 主键非空 ×8 / DROP INDEX unique ×5 /
分组键编码 ×4 / 未知列 ×4 / queryStream ×2 / KVStore 生命周期 ×1 / Hybrid 补偿 ×1 /
真惰性流式 ×2 / REINDEX ×2);VERSION 断言同步
- 行覆盖率 90.0% → **90.1%**
---
## [0.7.3] - 2026-08-14
### INSERT 语句级原子性补全 / 索引一致性 / 流式查询回退安全