立卡门 ①:有具名落点与复现的产品缺陷。finding 类别 a。reach: 公开入口实测。
动手的读者:分诊定级。"未被选中的排序键是什么意思"可能需要一个裁决(见方向),所以由分诊决定是直接定方向,还是转决策箱。service-analytics 属 domain:services。
查重:mcp__github__search_issues 查 "analytics native sql order by unselected member 500 ORDER BY output alias must appear in GROUP BY",4 条命中(含 closed),都不是本题。最近的是 #21249(基表列二义,与本卡同门不同句)和 #6401(GroupByNode.alias,closed)。
来源
#21249 的 dev 报告(PR #21266,out_of_scope_findings[0]),在该 PR 合入之后的形态上实测,SQLite 与 PostgreSQL 16.14 都测了;ObjectQL 面每一行都是 200。
reach:
POST /api/v1/analytics/query,原生 SQL 面:
| 查询 |
SQLite |
PostgreSQL |
dimensions: [owner.email],order: { note: asc }(cube 未声明 join,关联对象也声明了 note) |
500 |
500(42702,note 二义) |
dimensions: [note],order: { amount: asc }(未 join) |
200,但按任意一行的值排序 |
500(42803,must appear in GROUP BY) |
order: { owner.email: asc },而 owner.email 未被选中 |
500 |
500(42703,column does not exist) |
落点(源码读)
packages/services/service-analytics/src/strategies/native-sql-strategy.ts 的 ORDER BY 生成器(PR #21266 之后位于 assembleStatement):它把请求里的键原样写成带引号的标识符;只有在该成员被选中时,这个标识符才恰好是一个输出别名。仅仅给它加上表限定也修不好,因为 PostgreSQL 仍会报 42803。
方向(供分诊参考,不是裁决)
一个未被选中的排序键该是什么含义,需要先定下来:
- (a) 在门上响亮拒收:排序键必须是本次查询选中的维度或度量,
400 INVALID_FIELD,两个面一致;
- (b) 按 ObjectQL 面现在的行为对齐(需要先测它到底做了什么)。
防 AI 犯错这一轴倾向 (a)。
Pins: 上表三行在两个驱动上都给出同一个声明过的答案;选中成员的排序作为对照,保持不变。
承接
本卡与 PR #21266 同文件,在其落地后进行。
Generated by Claude Code · domain:services seat 2 (#21118) · session_01DiCSbmJrkzNhuEAier4VoJ · https://claude.ai/code/session_01DiCSbmJrkzNhuEAier4VoJ
立卡门 ①:有具名落点与复现的产品缺陷。
finding类别 a。reach:公开入口实测。动手的读者:分诊定级。"未被选中的排序键是什么意思"可能需要一个裁决(见方向),所以由分诊决定是直接定方向,还是转决策箱。
service-analytics属domain:services。查重:
mcp__github__search_issues查 "analytics native sql order by unselected member 500 ORDER BY output alias must appear in GROUP BY",4 条命中(含 closed),都不是本题。最近的是 #21249(基表列二义,与本卡同门不同句)和 #6401(GroupByNode.alias,closed)。来源
#21249 的 dev 报告(PR #21266,
out_of_scope_findings[0]),在该 PR 合入之后的形态上实测,SQLite 与 PostgreSQL 16.14 都测了;ObjectQL 面每一行都是200。reach:POST /api/v1/analytics/query,原生 SQL 面:dimensions: [owner.email],order: { note: asc }(cube 未声明 join,关联对象也声明了note)500500(42702,note二义)dimensions: [note],order: { amount: asc }(未 join)200,但按任意一行的值排序500(42803,must appear in GROUP BY)order: { owner.email: asc },而owner.email未被选中500500(42703,column does not exist)落点(源码读)
packages/services/service-analytics/src/strategies/native-sql-strategy.ts的 ORDER BY 生成器(PR #21266 之后位于assembleStatement):它把请求里的键原样写成带引号的标识符;只有在该成员被选中时,这个标识符才恰好是一个输出别名。仅仅给它加上表限定也修不好,因为 PostgreSQL 仍会报 42803。方向(供分诊参考,不是裁决)
一个未被选中的排序键该是什么含义,需要先定下来:
400 INVALID_FIELD,两个面一致;防 AI 犯错这一轴倾向 (a)。
Pins: 上表三行在两个驱动上都给出同一个声明过的答案;选中成员的排序作为对照,保持不变。
承接
本卡与 PR #21266 同文件,在其落地后进行。
Generated by Claude Code ·
domain:servicesseat 2 (#21118) ·session_01DiCSbmJrkzNhuEAier4VoJ· https://claude.ai/code/session_01DiCSbmJrkzNhuEAier4VoJ