Skip to content

service-analytics 的 where 门把 undefined 值的键整个丢掉 —— 单键 where 退化成「无过滤器」,方向是加宽(#6125 五面表漏记的第六、七种读法) #6386

Description

@os-zhuang

出自 #6125 的实施(PR 见下)。#6125 的裁决只派了 read-scope-sql 一格;实施中在同一个包的另一扇门上实测出同一形状的两种新读法,按 Prime Directive #10 另立单、不指派、不扩大那张 PR 的 diff。

⚠️ 这两格不在 #6125 正文的五面表里。 那张表把 service-analytics 记作一行(read-scope-sql),但本包有两扇独立的门:调用方自己写的 wherestrategies/filter-normalizer.tsINVALID_FILTER / 400,#5352),平台编译出来的 read scope 走 read-scope-sql.tsREAD_SCOPE_COMPILE_FAILED / 500)。#6125 只实测了后者。

实测(origin/main @ d8e8d9cbc,直接调 normalizeAnalyticsFilterTree({ where })

where 归一化结果 读法
{d: undefined} null 整条 where 被丢弃 → 查询无过滤器运行
{stage:'won', d: undefined} 只剩 stage equals 'won' d 这一合取项静默消失
{$not: {d: undefined}} NOT (d set),即 d IS NULL 作者没写过的谓词
{d: {$eq: undefined}} d equals [null] 值比较(零行),不是 $eq: nullnotSet
{d: {$gt: undefined}} d gt [null] 同上
{d: {$in: [undefined]}} d in [null] 同上
{d: {$ne: undefined}} d notSet OR d notEquals [null] 同上

对照组(null 比较数)正常:{d: null} / {$eq: null}notSet{$ne: null}set

为什么这是缺陷而不是「可接受的读法」

前两行的方向是加宽,不是 fail-closed:

#6050 裁决的关系

#6050 于 2026-08-07 裁 B 案:比较数位置的 undefined 一律拒收。实施面按裁决只覆盖 driver-sql / driver-turso#6125 的裁决又把 read-scope-sql 一格推平(PR 见下)。这扇 where 门从未被任何一次裁决点名,它今天的处置(丢键 + 归一成 null)与 B 案相反。

要不要把 B 案推到这扇门上,是本单要问的;信封现成(INVALID_FILTER / 400,与 #6050 同码同状态,因为这扇门收的确实是调用方输入)。⚠️ 但前四行里至少「$eq: undefined vs $eq: null 含义不同」这一条与 #5526 / #5332 的既有决定相邻,改动前请确认不会顺手改掉那两次裁决的结论。

触达性(判严重度需要的那一半)

undefined 过不了 JSON,所以 REST 的 /analytics/dataset/query 请求体带不进来 —— 这一格只能从进程内AnalyticsService.query({ where }) 的代码来。要找的形状与 #6050 完全同款:

await analytics.query({ where: { owner_id: ctx.user?.id } });   // id 缺失 → 整条 where 消失

本单未证实今天有生产调用方这样拼 where(未逐个审 dashboard / report 编译路径)。如实记的是「未证实触达」,不是「不会发生」。⚠️ 但请注意方向差异:#6125 那一格是 fail-closed(匹配零行),这一格是加宽(前两行),与 #6050 判 P0 的那格同向。严重度请分诊自己判 —— #5347 的先例是立单时的定级两个方向都不可靠。

关联

会话:session_01WyvqvKMG6asi9aXjKE6xtx#6125 实施过程中发现,未指派)

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions