docs: PLAN 附录 F 更新至 B-1/B-3/B-6 与查询层 8 项修复(测试规模 1686/87)

This commit is contained in:
thzxx
2026-09-15 00:35:02 +08:00
parent 68e4731788
commit a753c7ff55
+31 -13
View File
@@ -712,6 +712,11 @@ connection-manager/integrations/migration)两份完整报告,以及测试质
| `765df80` | **A1/A2 约束** | UPDATE 阶段 1 增加批内新主键互查(四引擎)→ 不再静默丢行;ALTER ADD UNIQUE 真正建索引并做存量校验(复用 `createIndex`),Memory 侧"重启静默丢行"随之消失 |
| `674da6b` | **A9/A10** | `ChangeNotifierEngine` 引擎装饰器:INSERT/UPDATE/DELETE/CLEAR/DDL 统一派发变更事件,`db.subscribe` 对本地写入生效(此前只在跨标签页广播时触发);关联子查询的 `$col` 绑定补上外层别名剥离与**递归进入子查询**(`WHERE id IN (SELECT ... WHERE o.user_id = u.id)` 此前静默空结果) |
| `4ab04df` | **A15 三值逻辑(PB-2** | 见下节"三值逻辑根治" |
| `2a109ef` | **B-1 统一校验 choke point** | 新增 `src/table/validation.ts``compileValidator`)作为**唯一**行校验定义,消除三份分叉实现(memory 缺 maxLength/min/max);四个引擎新增 `validatePayload` 契约,Executor 在任何副作用前校验;未知列由静默丢弃改为 `COLUMN_NOT_FOUND`(A17);外键级联写入也过校验;NaN/±Infinity 显式拒绝(JSON 无法表示,落盘会变 null) |
| `841db2e` | **A22/A23/A25/A26/A27/A29/A30/A36** | 查询层 8 项:GROUP BY 别名、HAVING 未选中聚合、带前缀聚合参数、UNION 尾部子句归属、DISTINCT 作用于输出列、`maxRowsPerQuery` 不再静默截断写入、INSERT 值多于列、派生表别名引用。连带根治"同步抛错穿过 async 边界"与"缺列的行形状不一致" |
| `b20d47b` | **B-3 单管线** | QueryBuilder 只产出 AST、执行一律经 Executor(删除无 JOIN 时直通 `engine.find` 的快路);钩子改为由 `Table` 注入、顺序与传参不变;删除引擎层 4 处"未解析标记 → NOT_SUPPORTED"的过时防御 |
| `edd9f1d` | **B-6 ①②(两处 P0** | ① `open()` 遇损坏日志尾部不再**清空整库**(新增 `truncateLogTo(keepBytes)`,与 `repair()` 同口径);② 自动 checkpoint 失败不再让**已确认写入**报错(WAL 已持久化),改为记 `lastBackgroundError` 并由下一次显式 `checkpoint()` 报告 |
| `68e4731` | **B-6 ③ + 测试介质** | ③ meta 增加 `owner`,陈旧实例 `checkpoint()``STALE_INSTANCE` 拒绝覆盖新实例的写入(实测修复前会**静默**抹掉);同时修复 `SharedMemoryBackend` 的跨实例可见性缺陷(私有拼接缓存使介质退化为"每实例一份快照",此前所有多实例用例都跑在错误介质上) |
### 三值逻辑根治(A15 / PB-2,提交 `4ab04df`
@@ -753,10 +758,17 @@ connection-manager/integrations/migration)两份完整报告,以及测试质
**验证**:新增 `tests/v080-sql-three-valued.test.ts` —— 26 条 SQL 语义矩阵 ×
4 引擎(memory/disk/hybrid/aria+ UPDATE/DELETE 写路径,共 **104 断言**
**测试规模**1304 → **1458 通过 / 83 套件**;新增 `tests/v080-savepoint.test.ts`
`tests/v080-atomicity.test.ts``tests/v080-subscribe.test.ts`
`tests/v080-correlated.test.ts``tests/v080-sql-three-valued.test.ts`
`tests/version-contract.test.ts``tests/helpers/storage-harness.test.ts`
**测试规模**1304 → **1686 通过 / 87 套件**;新增
`tests/v080-savepoint.test.ts``tests/v080-atomicity.test.ts`
`tests/v080-subscribe.test.ts``tests/v080-correlated.test.ts`
`tests/v080-sql-three-valued.test.ts``tests/v080-unified-validation.test.ts`
`tests/v080-query-layer.test.ts``tests/v080-single-pipeline.test.ts`
`tests/v080-kvstore-commit-point.test.ts``tests/version-contract.test.ts`
`tests/helpers/storage-harness.test.ts`
**关键修复均做过变异验证**:把修复回退到修复前的行为,对应用例必须失败
(例:KVStore ①2 项、②3 项)。这是"测试真的能拦住回归"与"测试只是陪跑"的
分界线,后续新增回归套件都按此执行。
**验证状态**`typecheck`src + tests)、`lint` 全部为零错误;Aria 生产负载
10 万行 / OPFS / KV 后端崩溃恢复)全绿。
@@ -777,18 +789,24 @@ connection-manager/integrations/migration)两份完整报告,以及测试质
| ~~P0~~ | ~~A9 `subscribe()` 对本地写入不触发~~ | ✅ `674da6b` |
| ~~P0~~ | ~~A10 `t.x = t.y` 与关联 `IN (SELECT ...)` 静默空结果~~ | ✅ `674da6b` + `4ab04df`enginePreFilter |
| ~~P1~~ | ~~A15 三值逻辑(PB-2 统一 `sqlCompare`~~ | ✅ `4ab04df` |
| P1 | A12 `maxLength`/`min`/`max` 在 memory/disk/hybrid 失效(PB-1 统一校验) | 待做 |
| ~~P1~~ | ~~A12 `maxLength`/`min`/`max` 在 memory/disk/hybrid 失效(PB-1 统一校验)~~ | ✅ `2a109ef` |
| ~~P1~~ | ~~A17 INSERT 未知列静默丢弃~~ | ✅ `2a109ef` |
| ~~P1~~ | ~~A22/A23/A25/A26/A27/A29/A30/A36 查询层~~ | ✅ `841db2e` |
| ~~P0~~ | ~~**B-3 单管线**builder 只产出 AST~~ | ✅ `b20d47b` |
| ~~P0~~ | ~~**B-6 KVStore 三处止血**~~ | ✅ `edd9f1d` + `68e4731` |
| P1 | A13/A14 自引用外键失效、ON UPDATE CASCADE 只一层 | 待做 |
| P1 | A17 INSERT 未知列静默丢弃 | 待做 |
| P1 | A22/A23/A25/A26/A27/A29 查询层剩余项 | 待做 |
| P1 | A35/A36/A37 JOIN NULL 键、派生表别名、未限定列名 | 待做 |
| P1 | A35/A37 JOIN NULL 键(已修)、未限定列名(PARSE_ERROR 显式拒绝) | 部分 ✅ |
| P1 | A38/A39 `compression` 被 pageStorage 遮蔽、`compressLZ4` O(n²) | 待做 |
| P1 | A40/A41 Aria `close()` 活跃事务守卫、`dropTable` DDL 原子性 | 待做 |
| P0 | **PB-6 存储单一提交点(manifest** | 待做 |
| P0 | **B-6 存储单一提交点(manifest** | 部分(KVStore 已完成;Aria 见 A40/A41 |
| P1 | **B-4 统一表达式求值器**(CASE 正则切分、聚合表达式、列引用) | 待做(A25 已先修其载体) |
| P1 | **B-5 结构化 AST 表达式节点 + 输出列序号** | 待做 |
| — | PC-2 e2e 真崩溃注入(CDP `Page.crash` | 待做 |
| — | PC-4/PC-5 契约测试 + 属性测试 | 部分(跨引擎参数化已用于 A1/A2/A15) |
| — | PC-4/PC-5 契约测试 + 属性测试 | 部分(跨引擎参数化已用于 A1/A2/A15/B-1/B-3 |
| — | PG 文档与站点全量同步 | 待做 |
**下一步建议**PB-1 统一校验 choke point(一次消除 A12/A17 与 A1 剩余分支)→
A35/A36/A37JOIN 与派生表,同属"未限定/未解析即静默"一整类)→ 查询层剩余
A22~A29 → 存储层 A38~A41 → PB-6 → PC-2 → PG。
**下一步建议**PC-2 真崩溃注入(e2e 通过 CDP `Page.crash`,覆盖"写入未 await
即崩溃 / checkpoint 中途崩溃 / WAL 半写"三个窗口)—— 这是**验证**已完成的
崩溃语义声称的关键一步,目前所有崩溃结论都来自单元级故障注入;
随后 B-4(统一表达式求值,消除 CASE 正则切分整类)→ A13/A14(外键传递闭包)
→ A38~A41(存储层剩余)→ B-5 → PG。