- 新增三个 demo 工程(demo-eslint / demo-sqlfluff / demo-stylelint):各含 src/ 样例代码与覆盖率映射(run-coverage.mjs、coverage_map.json、stylelint_line_map.json) - 归档各 demo 的插件实测导出报告(reports/): - demo-eslint:common.js / esm-demo.js / legacysyntax.cjs / typescript.ts 审查报告 + 覆盖率报告(292/292 条零偏差,126 种规则全覆盖) - demo-sqlfluff:11 个 SQL 样例审查报告 + 覆盖率报告(113/113 条零偏差,57 种规则全覆盖,含 JJ01 行号缺陷修复后的复测验证) - demo-stylelint:common.css / empty-source.css 审查报告 + 覆盖率报告(145/145 条零偏差,68 种规则全覆盖)
61 lines
4.4 KiB
Markdown
61 lines
4.4 KiB
Markdown
# 代码审查报告
|
|
|
|
**文件:** `data\demo-sqlfluff\src\02_ambiguity.sql`
|
|
**语言:** sql
|
|
**耗时:** 182.4s
|
|
**分析工具:** sqlfluff
|
|
|
|
---
|
|
|
|
总计: 13 | 错误: 10 | 警告: 2 | 建议: 1
|
|
|
|
静态分析 · 10 个问题
|
|
|
|
- 🔴 `sqlfluff:AM01` L6
|
|
第 6 行:在带有 GROUP BY 的 SELECT 语句中使用 DISTINCT 含义模糊。
|
|
建议: 去掉 DISTINCT 或 GROUP BY 中的一个。若只需按 dept、region 去重,可保留 GROUP BY 并去掉 DISTINCT;若不需要分组聚合,则保留 DISTINCT 并去掉 GROUP BY。
|
|
- 🔴 `sqlfluff:AM02` L20
|
|
第 20 行:建议使用 UNION DISTINCT 或 UNION ALL,而不是裸 UNION。
|
|
建议: 根据语义选择:若希望保留所有重复行,把 UNION 改为 UNION ALL;若希望去重,改为 UNION DISTINCT(需方言支持,如 ansi/bigquery/mysql)。
|
|
- 🔴 `sqlfluff:AM03` L32
|
|
第 32 行:ORDER BY 子句含义模糊;ORDER BY 应对所有列都指定排序方向,或所有列都不指定。
|
|
建议: 若只想让 a 升序、b 降序,显式写为 ORDER BY a ASC, b DESC;如果想让两列都降序,则写为 ORDER BY a DESC, b DESC。
|
|
- 🔴 `sqlfluff:AM05` L42
|
|
第 42 行:JOIN 子句应使用完整限定形式。
|
|
建议: 将 JOIN 改为 INNER JOIN(或根据语义使用 LEFT/RIGHT/FULL JOIN),明确连接类型。
|
|
- 🔴 `sqlfluff:LT02` L43
|
|
第 43 行:'ON' 前应有换行,且 'ON' 前不要有缩进。
|
|
建议: 把 ON 子句放到新行,并确保 ON 前没有额外缩进,例如:JOIN
|
|
other_table AS b
|
|
ON a.id = b.id;
|
|
- 🔴 `sqlfluff:AM06` L54
|
|
第 54 行:GROUP BY 与 ORDER BY 中的列引用方式不一致。
|
|
建议: 统一引用方式:要么都使用列名(GROUP BY a, b 和 ORDER BY a, b),要么都使用序号(GROUP BY 1, 2 和 ORDER BY 1, 2);推荐使用列名,避免 SELECT 列表变化时失效。
|
|
- 🔴 `sqlfluff:AM05` L63
|
|
第 63 行:JOIN 子句应使用完整限定形式。
|
|
建议: 若确实要交叉连接,显式写 CROSS JOIN;若本意是内连接,请补充 ON 条件并写 INNER JOIN。
|
|
- 🔴 `sqlfluff:AM08` L63
|
|
第 63 行:检测到隐式交叉连接(JOIN 缺少 ON 条件)。
|
|
建议: 如果意图是笛卡尔积,请显式写 CROSS JOIN;如果本意是按某列关联,请补上 ON 连接条件。
|
|
- 🔴 `sqlfluff:AL05` L64
|
|
第 64 行:别名 'b' 在 SELECT 语句中从未被使用。
|
|
建议: 移除未使用的别名 b;若后续需要引用 other_table 的列,请使用 b.列名。
|
|
- 🔴 `sqlfluff:LT12` L65
|
|
第 65 行:文件必须以单个尾随换行符结束。
|
|
建议: 在文件末尾保留且仅保留一个换行符,不要有多余空行或缺少换行。
|
|
|
|
AI 审查 · 3 条建议
|
|
|
|
- 🟡 [AI] [design] `dialect-dependent-lint-config` L2
|
|
**AM02 规则受方言门控,默认配置下会漏报**
|
|
顶部注释说明 AM02 仅对 ansi/bigquery/mysql 等支持 UNION DISTINCT 的方言生效,默认方言 oracle 不在白名单。如果 CI 使用默认 SQLFluff 配置,即使启用所有规则也不会报告第 20 行的裸 UNION,可能造成本地与 CI 的检查结果不一致。
|
|
建议: 在项目 .sqlfluff 中显式设置目标方言(例如 ansi),并确保本地与 CI 使用同一配置;如果目标方言确为 oracle,应关闭或忽略 AM02。
|
|
- 🟡 [AI] [bug] `unnecessary-cartesian-join` L63
|
|
**最终查询的交叉连接可能完全是多余连接,产生重复和错误结果**
|
|
第 59-64 行 SELECT a.id 只引用了 my_table 的别名 a,却对 other_table 做无 ON 条件的 JOIN(隐式交叉连接)。只要 other_table 非空,每个 a.id 会被重复 other_table 行数次;若 other_table 为空,查询反而返回空集。这通常不是预期语义,也会带来不必要的笛卡尔积开销。
|
|
建议: 如果只想返回 my_table 的所有 id,直接删除 JOIN other_table;如果只想返回在 other_table 中有匹配的 id,应使用 INNER JOIN ... ON 并配合 SELECT DISTINCT 或 EXISTS,避免重复。
|
|
- 🔵 [AI] [design] `stale-rule-comments` L14
|
|
**修复后示例注释将与 SQL 语义不一致**
|
|
代码中的 -- AM01、-- AM02 等注释标记的是静态分析规则样例。一旦按上述建议应用修复(例如删除 DISTINCT、把 UNION 改为 UNION ALL、把 JOIN 改为 INNER JOIN/CROSS JOIN),这些注释就不再准确,会误导后续阅读者。
|
|
建议: 在应用修复后同步更新或删除对应注释;或将原始违规样例与修复后样例分开存放,并注明预期触发的规则。
|