sql-linter — SQL 语法检查工具
多方言 SQL 语法校验器,用于 Text2SQL Agent 流水线中 Agent6 的语法层检查。
快速使用
python scripts/sql_linter.py '{"sql": "SELECT * FROM t ORDER BY id", "dialect": "opensearch-ha3"}'
或作为 Python 模块:
import sys; sys.path.insert(0, 'scripts')
from sql_linter import lint_sql
result = lint_sql("SELECT * FROM t ORDER BY id", "opensearch-ha3")
# {"status": "fail", "issues": [{"type": "syntax", "severity": "high", ...}]}
Resources
scripts/sql_linter.py
可执行的 Python 脚本,提供 lint_sql(sql, dialect) 函数。支持命令行 JSON 输入输出,可直接注册为 QwenPaw 工具。
输入格式
{
"sql": "SELECT * FROM users WHERE id = 1",
"dialect": "mysql|opensearch-ha3|hologres|lindorm|postgresql"
}
输出格式(与 AGENTS.md Agent6 issue 格式兼容)
{
"status": "pass|fail",
"issues": [
{
"type": "syntax|logic",
"severity": "high|medium|low",
"detail": "具体问题描述",
"location": null,
"fix": "修复建议(可选)"
}
]
}
检查层次
| 层次 | 内容 | 示例 |
|------|------|------|
| Layer 1: 基础语法 | 括号/引号平衡、关键字拼写、尾部逗号 | SLECT → SELECT |
| Layer 2: 子句完整性 | JOIN 缺 ON、HAVING 缺 GROUP BY、SELECT 缺 FROM | JOIN u 缺 ON |
| Layer 3: 方言特定 | 各引擎特有语法规则 | 见下方矩阵 |
方言支持矩阵
OpenSearch-HA3
| 规则 | 严重度 | 说明 |
|------|--------|------|
| ORDER BY 必须配 LIMIT | high | ORDER BY id → 需加 LIMIT N |
| 用 ha_in() 替代 IN | high | IN (1,2) → ha_in(1,2) |
| 字符串常量用单引号 | medium | "value" → 'value' |
| UNNEST 需 SCAN_ATTR hint | high | 主子表查询缺少 hint |
| 时间条件用 QUERY() | medium | date = '2024' → QUERY('date', '2024', '=') |
| CTE 功能受限 | low | 确认版本支持 |
| UNION ALL 数量限制 | low | 不建议超过 5 个 |
Hologres
| 规则 | 严重度 | 说明 | |------|--------|------| | 建表指定 DISTRIBUTED BY | low | 建议指定分布键 | | 窗口函数版本差异 | low | 确认引擎版本 |
Lindorm (Phoenix SQL)
| 规则 | 严重度 | 说明 |
|------|--------|------|
| 用 UPSERT 替代 INSERT | medium | Phoenix 覆盖写入语义 |
| 建表需 PRIMARY KEY | medium | Row Key 设计 |
| 函数兼容性检查 | medium | NOW() → CURRENT_DATE() |
MySQL / PostgreSQL
通用检查 + 引擎特定提示(反引号/双引号约定、标识符大小写等)。
在 QwenPaw 中部署
在 QwenPaw 中将 scripts/sql_linter.py 注册为工具,工具名为 sql_linter,Agent6 的 task 中声明:
【可用工具】
你只能使用以下工具:sql_linter
状态判定规则
- 有任一
high严重度 →status: "fail" - 全
medium或low→status: "pass"(仅记录 issues) - 无 issues →
status: "pass"
Scan to join WeChat group