Skip to content

🐛 fix(mcp): 强制查询工具遵守结果上限 - #113

Merged
ZhaoXingPeng merged 1 commit into
mainfrom
fix/111-query-limit
Sep 7, 2026
Merged

🐛 fix(mcp): 强制查询工具遵守结果上限#113
ZhaoXingPeng merged 1 commit into
mainfrom
fix/111-query-limit

Conversation

@ZhaoXingPeng

Copy link
Copy Markdown
Owner

背景

db_query_execute 接受 limit 参数,但原实现只在 SQL 没有顶层 LIMIT 时追加限制;用户传入更大的 LIMIT 或 LIMIT ALL 时,数据库仍可能执行超出接口上限的查询,服务端最后才截断数组。

变更

  • 识别顶层数字 LIMIT,并将其收紧到原限制与请求 limit 的较小值。
  • 支持 LIMIT ALL 和 LIMIT offset,count 形式的收紧。
  • 忽略字符串字面量和嵌套查询中的 LIMIT,继续保持单语句只读校验。
  • 增加已有大/小 LIMIT、LIMIT ALL 和 offset 形式回归测试。

验证

  • 完整单元测试:656 passed。
  • Ruff 检查和 diff 检查通过。

实验

请求 limit=10 时,SELECT ... LIMIT 1000 被发送为 LIMIT 10;LIMIT 3 保持不变;LIMIT ALL 被替换为 LIMIT 10;字符串中的 LIMIT 不改变追加逻辑。

风险与边界

仅影响 db_query_execute 的顶层结果上限,不改变查询过滤或排序;复杂方言特有 LIMIT 语法未扩展。未建立可比性能基准,性能数据未测量。

Closes #111

@ZhaoXingPeng

Copy link
Copy Markdown
Owner Author

问题复现:请求 limit=10 时,原实现对已有 LIMIT 1000 的 SQL 不做修改,只在响应阶段切片;数据库工作量和接口上限因此不一致。

@ZhaoXingPeng

Copy link
Copy Markdown
Owner Author

实现记录:新增顶层 LIMIT 扫描与收紧逻辑,屏蔽字符串字面量,支持数字、ALL 和 offset,count 形式;嵌套查询保持独立。

@ZhaoXingPeng

Copy link
Copy Markdown
Owner Author

实验结果:LIMIT 1000 -> LIMIT 10,LIMIT 3 保持不变,LIMIT ALL -> LIMIT 10,LIMIT 20, 100 -> LIMIT 20, 10。

@ZhaoXingPeng

Copy link
Copy Markdown
Owner Author

测试记录:查询安全定向测试 17 项通过,完整单元测试 656 项通过,Ruff 检查与 diff 检查通过。

@ZhaoXingPeng

Copy link
Copy Markdown
Owner Author

边界说明:复杂方言特有 LIMIT 语法未扩展;本次未建立可比性能基准,性能数据未测量。

@ZhaoXingPeng
ZhaoXingPeng merged commit 3733f88 into main Sep 7, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

🐛 fix(mcp): 强制查询工具遵守结果上限

1 participant