docs: PLAN 追加 v0.8.0 实施进度日志(附录 F)—— 已完成 8 项提交 / 待完成清单 / 实施中的额外发现
This commit is contained in:
@@ -692,3 +692,55 @@ async generator 按块读取。这一改动可**一次性删掉引擎层全部 7
|
||||
另有 SQL 层(tokens/lexer/parser/params)与 core/支撑层(core/table/transaction/plugin/
|
||||
connection-manager/integrations/migration)两份完整报告,以及测试质量与 CI 审计报告,
|
||||
内容已全部并入本方案的 §3 根因与 §5 总账。
|
||||
|
||||
---
|
||||
|
||||
## 附录 F · v0.8.0 实施进度日志
|
||||
|
||||
> 本附录记录**实际落地情况**(与 §4 的方案对照)。按提交顺序,每条都可 `git show` 复核。
|
||||
|
||||
### 已完成
|
||||
|
||||
| 提交 | 范围 | 关键结果 |
|
||||
|---|---|---|
|
||||
| `0dba1ab` | **工作流 C 基座 + 工程门禁** | 故障注入基座(TransactionalFileStore / FaultyBackend / 忠实 OPFS mock);覆盖率口径修正(移除吞掉 AriaEngine 的 `!src/**/index.ts`)+ coverageThreshold;`tsconfig.test.json` 并修复 **103 个测试类型错误**;lint 清零;CI 增加 tests 类型检查 / 覆盖率门禁 / lint 阻断 / dist 同步校验;版本 0.8.0 三处一致 + 版本契约测试 |
|
||||
| `83c5aa0` | **A11** AND/OR 优先级 | parser 三层分层 `or → and → simple`;`a=1 OR a=2 AND b=3` 从返回 1 行修正为 3 行(与显式括号一致) |
|
||||
| `7526951` | **A19/A20/A21/A2(词法)** | 双引号 → `QUOTED_IDENTIFIER`(可引用保留字列名);未闭合块注释报错(此前 `DELETE ... /*` 照常执行);注释跳过去递归(消除栈溢出);移除 MySQL 方言反斜杠转义(与绑定器字符串边界统一) |
|
||||
| `752bdea` | **A5/A6/A7/A16/A18/A24/A28** | LIMIT/OFFSET 从"应用两次"修正为下推安全判定 + 只应用一次(10 种查询形态验证);**queryStream 与 query 在 16 形态 × 4 引擎下逐值相等**;MIN/MAX 改单次归约(消除 20 万行栈溢出);空集聚合返回 NULL;未知列抛 `COLUMN_NOT_FOUND`;INSERT arity 校验;`__proto__` 列名防护统一 |
|
||||
| `074afd3` | **A8 + LSM 读自洽** | 行所有权写进 `IStorageEngine` 契约(读返副本/写收副本)+ `cloneRow`;Memory/KVStore/Hybrid/Aria 全部生效(改返回值不再改库、索引不再失配);**LSM 读取自洽**:未命中即回源 + CRC 校验,消除"缓存未命中 = 静默丢数据"(实测小缓存下 300 行只回 59 行);缓存上限语义修正(超大 SSTable 常驻) |
|
||||
| `89243ef` | **A3/A4 SAVEPOINT** | 新增 `SAVEPOINT_ROLLBACK` WAL 记录(复用 `data` 字段,格式不变);恢复按**事务内**下标窗口重放 → 已回滚的行不再复活;事务结束清空 savepoint 并校验归属 → 陈旧 savepoint 不再静默吞写入 |
|
||||
| `765df80` | **A1/A2 约束** | UPDATE 阶段 1 增加批内新主键互查(四引擎)→ 不再静默丢行;ALTER ADD UNIQUE 真正建索引并做存量校验(复用 `createIndex`),Memory 侧"重启静默丢行"随之消失 |
|
||||
|
||||
**测试规模**:1304 → **1334 通过 / 79 套件**;新增 `tests/v080-savepoint.test.ts`、`tests/v080-atomicity.test.ts`、`tests/version-contract.test.ts`、`tests/helpers/storage-harness.test.ts`。
|
||||
|
||||
**验证状态**:`typecheck`(src + tests)、`lint` 全部为零错误。
|
||||
|
||||
### 实施过程中的额外发现(方案未列出,已一并修复)
|
||||
|
||||
1. **`SELECT 1 AS one FROM t` 返回 `[{}]`** —— parser 数字常量分支提前 return 吞掉别名;裸 `SELECT 1` 也未处理匿名常量列。现按 SQLite 语义以表达式原文为键。
|
||||
2. **`SELECT 0` 类查询的常量列投影**、`TRUE/FALSE/NULL AS alias` 同样修正。
|
||||
3. **`async` 回调判定** —— 原 `constructor.name === 'AsyncFunction'` 对"普通函数返回 Promise"完全失效;现双条件识别并走物化 + await。
|
||||
4. **`queryStream` 不受 `maxRowsPerQuery` 约束、不触发钩子** —— 现与物化路径一致。
|
||||
5. **缓存上限契约不可满足** —— 原测试断言"缓存字节数 ≤ 上限",但单文件大于上限时驱逐它等价于丢数据;已改为断言"数据完整"这一真正不变量,并明确上限 = `cacheLimit` + 单个最大 SSTable。
|
||||
6. **测试直接读私有字段**(`lsm.cacheSize` / `cacheLimitBytes`)—— 那是 TS 错误,只因测试不做类型检查才没暴露;已补公开访问器。
|
||||
|
||||
### 待完成(下一轮继续)
|
||||
|
||||
| 优先级 | 项目 | 状态 |
|
||||
|---|---|---|
|
||||
| P0 | A9 `subscribe()` 对本地写入不触发 | 待做 |
|
||||
| P0 | A10 `t.x = t.y` 与关联 `IN (SELECT ...)` 静默空结果 | 待做 |
|
||||
| P1 | A12 `maxLength`/`min`/`max` 在 memory/disk/hybrid 失效(PB-1 统一校验) | 待做 |
|
||||
| P1 | A13/A14 自引用外键失效、ON UPDATE CASCADE 只一层 | 待做 |
|
||||
| P1 | A15 三值逻辑(PB-2 统一 `sqlEquals/sqlCompare`) | 待做 |
|
||||
| P1 | A17 INSERT 未知列静默丢弃 | 待做 |
|
||||
| P1 | A22/A23/A25/A26/A27/A29 查询层剩余项 | 待做 |
|
||||
| P1 | A35/A36/A37 JOIN NULL 键、派生表别名、未限定列名 | 待做 |
|
||||
| P1 | A38/A39 `compression` 被 pageStorage 遮蔽、`compressLZ4` O(n²) | 待做 |
|
||||
| P1 | A40/A41 Aria `close()` 活跃事务守卫、`dropTable` DDL 原子性 | 待做 |
|
||||
| P0 | **PB-6 存储单一提交点(manifest)** | 待做 |
|
||||
| — | PC-2 e2e 真崩溃注入(CDP `Page.crash`) | 待做 |
|
||||
| — | PC-4/PC-5 契约测试 + 属性测试 | 部分(跨引擎参数化已用于 A1/A2) |
|
||||
| — | PG 文档与站点全量同步 | 待做 |
|
||||
|
||||
**下一步建议**:A9/A10(静默错误结果,P0)→ PB-1/PB-2(统一校验与三值逻辑,一次消除 A12/A15/A35 整类)→ PB-4(统一表达式求值,消除 A10 与"未解析即 false"整类)→ 存储层 A38~A41 → PB-6 → PC-2 → PG。
|
||||
|
||||
Reference in New Issue
Block a user