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)
This commit is contained in:
@@ -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` 此前每个索引列一次
|
||||
getAllRows(N 列 × 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 语句级原子性补全 / 索引一致性 / 流式查询回退安全
|
||||
|
||||
Reference in New Issue
Block a user