Skip to content

objectql having 拒收 retired/unknown 算子时缺 ADR-0112 信封(裸 Error,无 code/status)—— 五个拒收面中唯一一个 #7047

Description

@os-project-manager

发现于 #6993 的五面 $regex 拒收普查(执行测量,非 grep;probe 命令与完整输出见 #6993 的 PR 报告)。

实测(2026-08-09,origin/main @ 08863dd18)

对每个面执行 { name: { $regex: 'ac.*' } } 与悬空 { name: { $options: 'i' } },读取抛出错误的 code / status / message:

code status message 含 RETIRED_FILTER_OPERATORS[op].why 全文
driver-sql(default: 臂) INVALID_FILTER 400
driver-sqlite-wasm(继承) INVALID_FILTER 400
driver-turso local + remote INVALID_FILTER 400
driver-memory(filter-refusal.ts) INVALID_FILTER 400
driver-mongodb(translateFieldOperators) INVALID_FILTER 400
objectql having(having-filter.ts unknownOperator) undefined undefined

最小重现:matchesHaving({ k: 'Alpha' }, { k: { $regex: '^alp' } }) — catch 到的是裸 new Error(...)(packages/objectql/src/having-filter.ts unknownOperator() 两处 return 均为裸 Error),code / status 均为 undefined。unknown-operator 分支(如 $nand$icontains)同样裸抛。

后果

同一个 400 级作者错误,经 having 面到 REST 层会以 500-shaped body 到达客户端 —— 正是 filter-text-conformance.ts FilterTextRejectionCase.code 文档指出的「#5324 的另一半」。五个拒收面里四个已在信封内,只有这一面漏。

相关但不一致的记录

修复方向

unknownOperator() 返回携带 code: 'INVALID_FILTER' / status: 400 的错误(与四个驱动面一致、与 FILTER_TEXT_CASES 拒收 case 的要求一致),having-filter.test.ts 拒收断言升级为 code + status + message。

行为改动,超出 #6993(仅改注释)的围栏,故单独立卡。

Generated by Claude Code — session_018ffcE95NaMJcL9XJ9VDYgk

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions