Repository navigation
Commit 2cca98b
`read-scope-sql.ts` 是 RLS / 租户 read scope 降解成 SQL 的唯一通道(ADR-0021
D-C),它以空字符串表示布尔常量 TRUE。两处忘掉「空串是一个值」的地方,正是本单
要修的两条分叉。
分叉二(要害):`compileNode({})` 返回空串 → `if (inner)` 为假 → 整条 `$not` 不
产出子句 → `compileScopedFilterToSql` 返回 '' → `applyReadScope` 的
`if (!sql) return;` 接手 → 生成的 SQL 里没有 WHERE。语义为 `NOT TRUE ≡ FALSE`
(什么都不给看)的 read scope,实际整表放行。同一段循环里 `$and` / `$or` 的空数组
一直是 fail-closed 抛错的,只漏了 `$not` 这一格。现在编译为恒假子句 `1 = 0`,与
driver-sql 在 #5134 / PR #5243 上的口径一致。
同源、方向相反的一处一并修正:`$or` 的空析取项 `{}` 以前被 `.filter(s.length > 0)`
丢掉,`{ $or: [{}, { a: 1 }] }` 收紧成 `a = 1`。`{}` 是 TRUE 析取项,TRUE 吸收整个
析取,现在整条 `$or` 为 TRUE。被丢弃分支的绑定值随之丢弃 —— 每个子节点先编译进自己
的 params 缓冲、存活了才提交,否则 `params` 里会留下没有 `?` 消费的值,把后面每一个
占位符错位到别人的值上(一条绑错租户 id 的 read scope 比一条过宽的更糟)。
分叉一:`$not` 改为 NULL-safe。语义由 #5146 拍板,PR #5296 已在 driver-sql 落地;
本文件此前是仓内最后一个按三值逻辑回答 `$not` 的 SQL 家族实现。操作数在取反前先被
改写成全域谓词(`nullSafeNegationOperand`),守卫按算子极性下推到叶子而不是挂在
`NOT` 旁边 —— 操作数一嵌套,顶层的 `OR col IS NULL` 会把 JS 家族排除的行重新放进来。
极性表与 driver-sql 逐条对齐,两处刻意的差异写在 TSDoc 里:`$null` / `$exists` 按本
文件 emitter 的真值性读取(driver-sql 的 emitter 按与 false 的恒等读取),以及本文件
多出的 `$between` 走正向比较的默认值。
`$not` 路径以外一个字符未动,fail-closed 的全部保证原封不动 —— 未知算子、嵌套关系
值、裸数组、不安全标识符、非 filter 节点的操作数,以及 `$and: []` / `$or: []` 的空
组合子(#5322 的独立裁定)统统照旧抛错。
测试:`read-scope-not-null-safe.test.ts` 是本单自带的 pin。既有的
`read-scope-sql-conformance.test.ts` 跑的 `FILTER_LOGIC_CASES` 刻意不含 null 行、
也不含布尔单位元,两条缺陷因此都在现有门禁下绿着。新用例在 sql.js 上执行取行,
`{$not:{}}` 一条断言到 `NativeSQLStrategy.generateSql` 这一层 —— 缺陷正在编译器与
`applyReadScope` 的接缝处,只测 `compileNode` 抓不到。
Claude-Session: https://claude.ai/code/session_01Pbu27iNUfQCHeuS551Rqo7
Co-authored-by: Claude <noreply@anthropic.com>
1 parent 04fab5e commit 2cca98b
3 files changed
Lines changed: 739 additions & 11 deletions
File tree
- .changeset
- packages/services/service-analytics/src
- __tests__
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
0 commit comments