plan-label.spec.ts
6.42 KB
-
fix(矩阵): 补回 JOIN patients —— 线上 500 修复(missing FROM-clause "p") · a0a86b94
3aa69952 上线后矩阵整页 500:`missing FROM-clause entry for table "p"`。 原因:标签预计算后我判断"年龄已烘进标签、用不到 patients 了",把 `JOIN patients p` 删了。但 `poolBaseSql` 在 **scope.sourceUnits 非空**时会拼 `AND p.source_unit IN (...)`(多品牌隔离) —— 别名没了,SQL 直接失效。
🔴 为什么本地全绿还是漏到线上 —— 三层防线**同时**失守,每一层都是我自己造的: 1. **基准脚本硬编 `sourceUnits: []`** ⇒ 永远走不到那一支,测了个假场景。 本地那台 host 恰好也没配品牌,连真实调用都碰不到。 2. **单测把 bug 固化成了断言**:写着 `expect(sql).not.toMatch(/JOIN patients/)` —— 它不但没拦住,反而会**保护**这个错误。⚠ ️ 断言写的是"我以为的",不是"必须成立的"。 3. tsc / jest / eslint 全绿 —— 这类 SQL 别名闭合问题它们天生看不见。 修复与加固: · 补回 `JOIN patients p`(注释写明它是被 poolBaseSql 引用的,⛔ 别再删) · 基准脚本改为**两支都跑**:sourceUnits=[] 与真实品牌列表各跑一遍。⚠ ️ 已做变异校验:删掉 JOIN 后基准立刻报 missing FROM-clause。 · 新增单测《poolBaseSql 用到的别名,查询里必须都在 FROM 里》—— 含一条**通用的别名闭合检查**(扫出 SQL 里所有 `x.` 前缀,逐个确认在 FROM/JOIN 里声明过), 不连库、jest 里就红。⚠ ️ 同样做了变异校验:删 JOIN 立刻 3 条红。 · 删掉那条错的断言,换成断言**真正变了的事**:查询里不再出现按年龄推标签的 CASE。 验证:tsc 通过;jest 86 套 1345 例全过;eslint 干净; 基准两支都跑通(15,884 plan 的诊所 137ms,磁盘读 0)。luoqi committed