You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// A roots-permissive env: parsing is purely syntactic (we read `.ast`, never
// `.check()`/`.evaluate()`), so any identifier or method call parses. Built once.
let parseEnv: Environment | undefined;
function getParseEnv(): Environment {
if (!parseEnv) {
parseEnv = new Environment({ unlistedVariablesAreDyn: true, enableOptionalTypes: true });
}
return parseEnv;
}
范围外发现,出自 #4812 / PR #6130(把
packages/lint的解析收敛到parseCelToAst)。按 Prime Directive #10 记录,不指派。事实(
origin/mainbc67c28e2基线,静态对读 + 实测)#4812 收敛掉的是 lint 那个自建 env。但
packages/formula内部还有一个,与被收敛掉的那个逐字同构:packages/formula/src/cel-to-filter.ts:88-95与 lint 改前那份选项完全相同:没有
limits,没有 stdlib,没有rewriteNullableTernary。消费它的是两个导出入口:compileCelToFilter(:123)与isPushdownableCel(:143),都是getParseEnv().parse(source).ast。于是
DEFAULT_LIMITS这一格上的分歧原样保留 —— 实测(同 PR #6130 用的探针):cel-to-filter的 envcelEngine.compile()Exceeded maxAstNodes (256)Exceeded maxDepth (32)Exceeded maxListElements (64)即:一条超过平台边界的谓词,
celEngine直接拒绝,而 pushdown 编译器照常把它降成 SQL 过滤并下推。为什么按
finding记(不代 triage 定级)可达性我没有量化。 消费
compileCelToFilter/isPushdownableCel的是 RLS / sharing 下推路径(ADR-0058),那条路径前面还有isSupportedRlsExpression等形状闸门,一条 256 节点以上的 RLS 谓词在真实部署里是否写得出来、写出来会不会先被别的闸门拦掉,我没有测。所以按「观察类 / 未被行使的漂移」记,不因为「看着小」就压着不报 —— 定级请按 triage,不代表我判断它低。需要一并注意的是方向:这一面比
celEngine更宽松,而它的产物是安全谓词下推的 SQL。宽松的一侧产出的是"多编译了一条引擎本会拒绝的谓词",不是"漏掉一条" —— 但两个入口对同一条源码给不同答案,本身就是 #4812 要消灭的形状。为什么 PR #6130 没顺手改
刻意留下,理由记在这里免得被当成遗漏:
packages/formula新增入口 +packages/lint改调"。把compileCelToFilter的解析 env 换成带DEFAULT_LIMITS的那条,是在安全敏感路径上改变行为(超界谓词从"下推成过滤"变成parse-error,而parse-error在该路径上是 fail-closed 拒绝),风险画像与一次 refactor 完全不同,应当单独裁、单独测。rewriteNullableTernary会改变喂给lowerCelAst的 AST 形状(三元分支会多一层dyn(...)包裹),lowerCondition对此的反应需要单独验证 —— 三元本来就不可下推,但"不可下推的理由从 A 变成 B"仍然是行为变化。建议
改走 #4812 落地的
parseCelToAst,或明确裁定"下推面按纯语法解析另算"并把理由写进cel-to-filter.ts文件头 —— 两条都行,别默认它不存在。若选前者,需要一并回答:超界谓词在 RLS 下推路径上应当 fail-closed 拒绝,还是应当继续下推?这是裁决,不是重构。关联
#4812(本体裁决 / PR #6130)、ADR-0058(一个 AST 两个后端)、ADR-0056 D4(RLS 谓词形状闸门)。