#5298 第一棒成本清单(2026-08-06)的结构性副产品,按事实记录,unassigned、交分诊定级。维护者在 PM 会话确认「值得记账」。
事实
同一个 FilterCondition 语义,今天由 5 个互不继承的编译/求值器各自实现:
| # |
面 |
位置 |
服务的读路径 |
| 1 |
driver-sql(+wasm/turso-local 继承) |
sql-driver.ts |
CRUD |
| 2 |
turso RemoteTransport |
remote-transport.ts buildWhereSQL |
CRUD(remote 模式) |
| 3 |
service-analytics read-scope-sql |
read-scope-sql.ts |
RLS 读侧(analytics) |
| 4 |
service-analytics filter-normalizer |
filter-normalizer.ts |
Cube/dashboard |
| 5 |
formula matchesFilterCondition |
matches-filter.ts |
RLS 写侧 check / 内存求值 |
(第六个半:objectql having-filter.ts,见 #5905。driver-memory/mongodb 另有各自实现,现冻结。)
为什么是结构性问题
建议方向(不代裁决,供调查程序评估)
关联:#5298(成本清单 §1)、#5903、#5905、#5146、#5326、#5335、#5239/#5240。
#5298 第一棒成本清单(2026-08-06)的结构性副产品,按事实记录,unassigned、交分诊定级。维护者在 PM 会话确认「值得记账」。
事实
同一个
FilterCondition语义,今天由 5 个互不继承的编译/求值器各自实现:sql-driver.tsremote-transport.tsbuildWhereSQLread-scope-sql.tsfilter-normalizer.tsmatches-filter.ts(第六个半:objectql
having-filter.ts,见 #5905。driver-memory/mongodb 另有各自实现,现冻结。)为什么是结构性问题
$not的语义在 driver-sql 与 driver-memory / formula 之间分叉:NULL 行的去留相反,$not: {}一个是 TRUE 一个是 FALSE #5146($not NULL-safe)当时漏了面 2 → 变成 drivers(turso): remote 模式没有继承 #5146 的$notNULL-safe —— 同一个 TursoDriver,local 返回 NULL 行、remote 不返回(实测,origin/main) #5903;非否定路径上的$ne/$nin/$notContains:driver-sql 排除 NULL 行,driver-memory / formula 返回它们(#5146 只裁定了$not) #5298(非否定 NULL-safe)要动 1/3/4,2 并入 drivers(turso): remote 模式没有继承 #5146 的$notNULL-safe —— 同一个 TursoDriver,local 返回 NULL 行、remote 不返回(实测,origin/main) #5903;fix(service-analytics): read scope 的{ $not: {} }不再整表放行,$not改为 NULL-safe (#5297) #5326/fix(service-analytics)!: 作者的where也 NULL-safe ——$not下推守卫、{$not:{}}为零行、{}析取项吸收$or(#5325) #5335 各花一轮把 3/4 对齐 $not——同一支税反复交。建议方向(不代裁决,供调查程序评估)
$ne/$nin/$notContains:driver-sql 排除 NULL 行,driver-memory / formula 返回它们(#5146 只裁定了$not) #5298 的 §1 可作模板)。关联:#5298(成本清单 §1)、#5903、#5905、#5146、#5326、#5335、#5239/#5240。