Commit Graph
3 Commits
Author SHA1 Message Date
张胜宇 39ca52449a fix(W29-c): nl2sql_yc 的 GROUP BY 拼装缺陷(会签组 6)+ 更正一处误判
## 更正:上一个提交里有一句话是错的

docs/49 组 5 与 D2.1 §1.6 原写「nl2sql_yc.py 同样缺写意图守卫」—— 该表述有误。
立组 6 时按纪律**先取证、再立单**,实测 8 条写意图问句对它 **8/8 已被拒绝**
(它没有宽泛关键词路由:「删除所有客户的持仓记录」不命中它的「当前持仓」
⇒ 计划落 unknown ⇒ 被 _validate_plan 拒绝)⇒ **它不需要写意图守卫**。

三处文档的错误表述已当日更正并**保留更正痕迹**(docs/49 组 5 的更正块、
D2.1 §1.6 的更正块),不静默抹掉。取证日志见报告 §10.1。

## 顺带量出的真缺陷:GROUP BY 拼装

取证同时发现一条**完全正常**的只读问句直接报错:

    查询近30天净值 -> status=error
    (pymysql.err.OperationalError) (1055, "Expression #3 of SELECT list is not in
     GROUP BY clause and contains nonaggregated column 'jr_agent.n.nav'
     ... incompatible with sql_mode=only_full_group_by")

根因(_compile_sql):SELECT 里既有 dimensions(已进 GROUP BY)又有 metrics,
而 metrics 里的**非聚合**列(n.nav / m.close_price / h.market_value …)**没进 GROUP BY**。

修法(仅 +24 / −1 行,守住会签单的「最小化边界」):
① 没有聚合函数就不加 GROUP BY;② 有聚合时把**所有非聚合 select 列**一并纳入,
而不是只放 dimensions(漏掉非聚合 metric 正是 1055 的成因)。

## 影响面

踩:_mock_plan 的 4 条路由(收盘/行情、净值(已实证)、当前持仓、账户余额);
不踩:SUM / COUNT 聚合路由,以及 _offsite_mock_plan 全部 5 条(均无 dimensions)。
=> 场外主链路不受影响;受影响的是通用兜底路由的 4 类问句(演示与离线联调走的正是这条)。

## 验证

- 实测(真连库):净值/行情查询由 error 转 success;资金流水(SUM)GROUP BY 语义不变;error 归零
- 新增测试 5 条:**断言 SQL 结构而非「跑得通」** —— 缺陷只在真实 MySQL 的
  only_full_group_by 下现形,而单测跑在 sqlite(不做该检查);断言"能跑"在修复前后
  都是绿的,等于没测。其中一条是**通用不变量**:有 GROUP BY 时 SELECT 里每个非聚合列
  都必须在组内 —— 将来往 metric_map 加非聚合指标时会**先红**,而不是等真实库冒 1055
- offsite 相关 13 passed;全量 2545 passed / 3 skipped / 0 failed(2540 + 5)
- 金标 55 条与 W27 基线判分逐项零差异
- ruff:新文件 0 告警;nl2sql_yc.py **零新增告警**
  (既存 39 条 E501/F601/UP035/F401/B905 未清理 —— 不在会签单「最小化边界」内)

会签:docs/49(A-10)组 6 · 会签 19(☑ 2026-09-22 受理);白名单已登记 docs/48 类 3 表。
2026-09-22 10:31:24 +08:00
yuancong_0626 fd9598efdf 袁聪的第二次提交,项目已完整 2026-09-11 16:57:47 +08:00
yuancong_0626 5907fcd6d2 袁聪的第一次提交,包含nl2sql,行情数据,场外申购 2026-09-10 09:23:22 +08:00