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

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions