- 新增三个 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 种规则全覆盖)
6.0 KiB
6.0 KiB
代码审查报告
文件: data\demo-sqlfluff\src\07_structure.sql
语言: sql
耗时: 226.0s
分析工具: sqlfluff
总计: 30 | 错误: 29 | 警告: 1 | 建议: 0
静态分析 · 28 个问题
- 🔴
sqlfluff:LT05L1 L1: 行过长(97 > 80)。 建议: 将该行注释拆分为多行或精简文字,使长度不超过 80 个字符。 - 🔴
sqlfluff:ST01L3 L3: 不要在 CASE WHEN 语句中指定 'ELSE NULL'(冗余)。 建议: 删除ELSE NULL分支;当条件不满足时 CASE 会自然返回 NULL。 - 🔴
sqlfluff:ST02L13 L13: 不必要的 CASE 语句,建议改用 COALESCE 函数。 建议: 改为COALESCE(amount > 0, FALSE) AS positive,效果与当前 CASE 一致。 - 🔴
sqlfluff:ST03L20 L20: 查询定义了 CTE "unused_cte" 但未使用。 建议: 删除未使用的 CTEWITH unused_cte AS (...),直接从SELECT开始查询。 - 🔴
sqlfluff:LT08L23 L23: CTE 结束括号之后应有空行,但未找到。 建议: 在 CTE 的闭合括号)与后续SELECT之间插入一个空行。 - 🔴
sqlfluff:ST04L32 L32: ELSE 子句中的嵌套 CASE 语句可以展平。 建议: 合并为一个 CASE:CASE WHEN a = 1 THEN b WHEN c = 1 THEN d END AS result。 - 🔴
sqlfluff:RF04L35 L35: 不应将关键字用作标识符。 建议: 将别名result改为非关键字名称,例如result_value。 - 🔴
sqlfluff:AL08L42 L42: 列别名 'id' 与第 41 行的列名重复。 建议: 为sub.id指定唯一别名,例如AS sub_id,避免结果集列名冲突。 - 🔴
sqlfluff:AM05L45 L45: JOIN 子句应使用全限定名。 建议: 明确使用INNER JOIN,并确保 ON 条件中的列均带表别名限定。 - 🔴
sqlfluff:ST05L46 L46: select_statement 子句中不应包含子查询,应改用 CTE。 建议: 将 JOIN 中的派生表提取为 CTE:WITH sub AS (SELECT id FROM other_table) SELECT ... JOIN sub ON ...。 - 🔴
sqlfluff:LT02L46 L46: 应在 'ON' 前换行,且 'ON' 前不应有缩进。 建议: 将 ON 子句放到新行,放在与 JOIN 同一层级:(SELECT ...) AS sub ON a.id = sub.id; - 🔴
sqlfluff:ST06L49 L49: SELECT 中应先写通配符和简单目标,再写计算与聚合。 建议: 将*移到最前,再写普通列,最后写SUM(amount),并给聚合结果命名。注意当前查询还缺少 GROUP BY 或窗口函数。 - 🔴
sqlfluff:AL03L50 L50: 列表达式没有别名,请使用显式AS子句。 建议: 为SUM(amount)添加别名:SUM(amount) AS total_amount。 - 🔴
sqlfluff:AM05L62 L62: JOIN 子句应使用全限定名。 建议: 将USING (id)改写为带表别名限定的 ON 条件,并可加上INNER。 - 🔴
sqlfluff:LT02L63 L63: 应在 'USING' 前换行,且不应缩进。 建议: 将USING (id)移到新行(若改写为 ON 也保持换行)。 - 🔴
sqlfluff:ST07L63 L63: 发现 USING 语句,应只使用 ON 语句。 建议: 将USING (id)改写为ON a.id = b.id。 - 🔴
sqlfluff:LT10L66 L66: 'SELECT' 修饰符(如 'DISTINCT')必须与 'SELECT' 在同一行。 建议: 将DISTINCT移到SELECT同一行:SELECT DISTINCT id。 - 🔴
sqlfluff:LT02L67 L67: 该行不应缩进。 建议: 将DISTINCT移到SELECT同一行,消除缩进。 - 🔴
sqlfluff:LT01L67 L67: 'DISTINCT' 关键字与左括号 '(' 之间应有单个空格。 建议: 不要使用函数式写法;最好是去掉括号写成DISTINCT id。 - 🔴
sqlfluff:ST08L67 L67: 'DISTINCT' 不能与括号一起使用。 建议: 去掉括号:SELECT DISTINCT id。 - 🔴
sqlfluff:AM05L77 L77: JOIN 子句应使用全限定名。 建议: 明确写出INNER JOIN,并保持 ON 条件使用表别名限定。 - 🔴
sqlfluff:LT02L78 L78: 应在 'ON' 前换行,且不应缩进。 建议: 将ON子句放到新行:other_table AS b ON b.id = a.id; - 🔴
sqlfluff:ST09L78 L78: JOIN 条件应把先出现的表放在前面。 建议: 将ON b.id = a.id调整为ON a.id = b.id。 - 🔴
sqlfluff:ST10L86 L86: 冗余常量表达式。 建议: 删除WHERE子句,或改为WHERE TRUE;如果动态生成条件,请不要保留恒真条件。 - 🔴
sqlfluff:ST11L94 L94: JOIN 表 'other_table AS b' 未在查询其他位置引用。 建议: 若确实不需要该表,删除整个 LEFT JOIN;若只想判断存在性,请改用 EXISTS 子查询。 - 🔴
sqlfluff:LT02L94 L94: 应在 'ON' 前换行,且不应缩进。 建议: 将ON子句放到新行:other_table AS b ON a.id = b.id; - 🔴
sqlfluff:ST12L100 L100: 检测到连续分号(计数 2)。 建议: 删除多余的分号,只保留一个;。 - 🔴
sqlfluff:LT12L101 L101: 文件必须以单个尾随换行符结束。 建议: 确保文件末尾恰好有一个换行符,不要多出空行或缺少换行。
AI 审查 · 2 条建议
- 🔴 [AI] [bug]
aggregate-without-group-byL49 聚合函数与未分组列/通配符混用 第49行的 SELECT 将SUM(amount)与id、*放在同一个 SELECT 列表中,但没有 GROUP BY,也没有把SUM改为窗口函数。在大多数 SQL 引擎中这是非法查询;即使某些引擎允许,也会随机返回非聚合列的任意行,结果不可预测。 建议: 如果希望保留每一行并附带总额,使用窗口函数SUM(amount) OVER () AS total_amount;如果希望做聚合,则需要列出所有非聚合列并加GROUP BY,或显式只保留聚合结果。 - 🟡 [AI] [bug]
unused-left-join-cardinalityL94 未使用的 LEFT JOIN 可能使结果行数倍增 第93-94行的 LEFT JOIN 虽然未在 SELECT 或 WHERE 中引用other_table AS b,但 SQL 仍会执行关联;若other_table.id有重复值,每条匹配都会复制左表行,导致结果集意外膨胀。静态规则只报告了表未被引用,但没有强调行数变化风险。 建议: 完全移除该 LEFT JOIN;若需要检查是否存在匹配,使用WHERE EXISTS (SELECT 1 FROM other_table b WHERE b.id = a.id)。