Skip to content

[17.0-rc2验收] analytics: 不存在的 dimension 500(泄漏 SQL / SQLITE_ERROR)而不是 400 指名字段 —— #4437 只给 measure 加了闸门,dimension 侧对称缺口仍在 #5520

Description

@yinlianghui

现象

analytics 查询里,一个引用了不存在字段的 dimension 会一路走到 SQL,被驱动以 no such column 打回,调用方拿到 500 —— 裸 driver 错误码上线,dataset 面还把生成的 SQL 原文回显给调用方。这正是 #4437measure 修好的那个 ADR-0112 违背("a driver error class should never be the error.code for a caller-shaped mistake"),但 #4437 的修复只覆盖了 measure,dimension 侧的对称缺口从未被堵

对照组(同一类错误,measure 侧)已经被 #4437 修成 400 INVALID_FIELD 并指名字段 —— 所以这是一个纯粹的不对称:同样是"查询里点名了对象没有的字段",measure 得到干净的 400,dimension 掉进 500。

复现(hotcrm@0899b4f + @objectstack 17.0.0-rc.2,SQLite file 驱动)

TOKEN=... # admin@objectos.ai

# ① 裸 cube 路 /analytics/query —— 不存在的 DIMENSION
curl -s -XPOST localhost:4095/api/v1/analytics/query -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"cube":"account_metrics","measures":["account_count"],"dimensions":["bogus_dim"]}'
# → 500 {"success":false,"error":{"code":"SQLITE_ERROR","message":"Internal server error","httpStatus":500}}

# ② 对照组:同一条路,不存在的 MEASURE(#4437 已修)
curl ... -d '{"cube":"account_metrics","measures":["bogus_measure"]}'
# → 400 {"success":false,"error":{"code":"INVALID_FIELD","message":"Measure 'bogus_measure' ... which object 'crm_account' does not have. Valid measures: account_count, annual_revenue_sum. ..."}}

# ③ dataset 路 /analytics/dataset/query —— 不存在的 DIMENSION(HotCRM 所有 dashboard/report 走的就是这条路)
curl ... -d '{"datasetName":"account_metrics","selection":{"measures":["account_count"],"dimensions":["bogus_dim"]}}'
# → 500 {"code":"ANALYTICS_QUERY_FAILED",
#        "error":"SELECT bogus_dim AS \"bogus_dim\", COUNT(*) AS \"account_count\" FROM \"crm_account\" GROUP BY bogus_dim - no such column: bogus_dim"}
#   注意:整条生成的 SQL(表名/列名)被回显给调用方。

两次复现一致。①②③ 均稳定。

期望 vs 实际

落点分析(读源码 /home/user/objectstack @ cd2efe6,已领先 rc.2)

查重

严重度

建议 p2。无数字影响(所有 dataset/dashboard/report 的聚合数字在 rc.2 上对账全部正确);HotCRM 出厂 metadata 由 pnpm validate(ADR-0021)静态兜住,生产 dashboard 运行时不会撞上。真正会撞的是 Studio 预览、手写查询、外部 API 调用方 —— 他们拿到的是 500 + 泄漏的 SQL,而不是一句指名 dimension 的 400。

环境行:hotcrm@0899b4f + @objectstack 17.0.0-rc.2;落点源码 @objectstack cd2efe6(领先 rc.2,缺口在该 commit 仍在)。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions