- 新增三个 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 种规则全覆盖)
108 lines
5.2 KiB
Markdown
108 lines
5.2 KiB
Markdown
# 代码审查报告
|
||
|
||
**文件:** `data\demo-sqlfluff\src\03_caps.sql`
|
||
**语言:** sql
|
||
**耗时:** 190.8s
|
||
**分析工具:** sqlfluff
|
||
|
||
---
|
||
|
||
总计: 29 | 错误: 25 | 警告: 2 | 建议: 2
|
||
|
||
静态分析 · 25 个问题
|
||
|
||
- 🔴 `sqlfluff:CP01` L11
|
||
第11行:关键字必须一律小写。
|
||
建议: 将 SELECT 改为小写 select。
|
||
- 🔴 `sqlfluff:CP02` L12
|
||
第12行:未加引号的标识符必须一律小写。
|
||
建议: 将 colA 改为小写 cola,并确保其他位置的同一标识符也统一小写。
|
||
- 🔴 `sqlfluff:CP01` L14
|
||
第14行:关键字必须一律小写。
|
||
建议: 将 FROM 改为小写 from。
|
||
- 🔴 `sqlfluff:CP01` L16
|
||
第16行:关键字必须一律小写。
|
||
建议: 将 WHERE 改为小写 where。
|
||
- 🔴 `sqlfluff:CP02` L17
|
||
第17行:未加引号的标识符必须一律小写。
|
||
建议: 将 coLa 改为小写 cola,与第12行的 colA 统一。
|
||
- 🔴 `sqlfluff:CP01` L20
|
||
第20行:关键字必须一律小写。
|
||
建议: 将 SELECT 改为小写 select。
|
||
- 🔴 `sqlfluff:AL03` L21
|
||
第21行:列表达式缺少别名。请使用显式 AS 子句。
|
||
建议: 为 SUM(amount) 添加别名,例如:SUM(amount) AS total_amount。
|
||
- 🔴 `sqlfluff:AL03` L22
|
||
第22行:列表达式缺少别名。请使用显式 AS 子句。
|
||
建议: 为 sum(quantity) 添加别名,例如:sum(quantity) AS total_quantity。
|
||
- 🔴 `sqlfluff:CP03` L22
|
||
第22行:函数名必须一律大写。
|
||
建议: 将 sum 改为 SUM,与第21行的 SUM 保持一致。
|
||
- 🔴 `sqlfluff:CP01` L23
|
||
第23行:关键字必须一律小写。
|
||
建议: 将 FROM 改为小写 from。
|
||
- 🔴 `sqlfluff:CP01` L27
|
||
第27行:关键字必须一律小写。
|
||
建议: 将 SELECT 改为小写 select。
|
||
- 🔴 `sqlfluff:CP01` L29
|
||
第29行:关键字必须一律小写。
|
||
建议: 将 FROM 改为小写 from。
|
||
- 🔴 `sqlfluff:CP01` L31
|
||
第31行:关键字必须一律小写。
|
||
建议: 将 WHERE 改为小写 where。
|
||
- 🔴 `sqlfluff:CP01` L32
|
||
第32行:关键字必须一律小写。
|
||
建议: 将 flag IS NULL 中的 IS 改为 is。
|
||
- 🔴 `sqlfluff:CP01` L32
|
||
第32行:关键字必须一律小写。
|
||
建议: 将 OR 改为 or。
|
||
- 🔴 `sqlfluff:CP01` L32
|
||
第32行:关键字必须一律小写。
|
||
建议: 将 other_flag IS null 中的 IS 改为 is。
|
||
- 🔴 `sqlfluff:CP04` L32
|
||
第32行:布尔/null 字面量必须一律大写。
|
||
建议: 将小写 null 改为 NULL。
|
||
- 🔴 `sqlfluff:CP01` L35
|
||
第35行:关键字必须一律小写。
|
||
建议: 将 SELECT 改为小写 select。
|
||
- 🔴 `sqlfluff:AL03` L36
|
||
第36行:列表达式缺少别名。请使用显式 AS 子句。
|
||
建议: 为 CAST(id AS VARCHAR) 添加别名,例如:CAST(id AS VARCHAR) AS id_string。
|
||
- 🔴 `sqlfluff:CP01` L36
|
||
第36行:关键字必须一律小写。
|
||
建议: 将 AS 改为小写 as。
|
||
- 🔴 `sqlfluff:AL03` L37
|
||
第37行:列表达式缺少别名。请使用显式 AS 子句。
|
||
建议: 为 CAST(amount AS varchar) 添加别名,例如:CAST(amount AS varchar) AS amount_string。
|
||
- 🔴 `sqlfluff:CP01` L37
|
||
第37行:关键字必须一律小写。
|
||
建议: 将 AS 改为小写 as。
|
||
- 🔴 `sqlfluff:CP05` L37
|
||
第37行:数据类型必须一律大写。
|
||
建议: 将 varchar 改为 VARCHAR,与第36行的 VARCHAR 保持一致。
|
||
- 🔴 `sqlfluff:CP01` L38
|
||
第38行:关键字必须一律小写。
|
||
建议: 将 FROM 改为小写 from。
|
||
- 🔴 `sqlfluff:LT12` L40
|
||
第40行:文件必须以单个尾部换行结束。
|
||
建议: 在文件末尾添加一个换行符,并确保没有多余的空行。
|
||
|
||
AI 审查 · 4 条建议
|
||
|
||
- 🟡 [AI] [bug] `or-condition-maybe-and` L32
|
||
**OR 条件可能将意图的 AND 写成 OR,导致结果范围扩大**
|
||
第32行 `flag IS NULL OR other_flag IS null` 会返回只要任一标志为 NULL 的行;如果业务意图是查找两个标志都为 NULL 的行,应使用 AND。请确认实际语义。
|
||
建议: 若意图是同时为 NULL,请将 OR 改为 AND。
|
||
- 🟡 [AI] [bug] `cast-without-length` L36
|
||
**CAST 未指定目标长度,可能导致数据截断**
|
||
第36行和第37行的 CAST 将列转换为 VARCHAR 时未指定长度。不同数据库对无长度 VARCHAR 的默认行为不同(如 SQL Server 默认 30,Oracle 要求必须指定),若 id/amount 超出默认长度将产生静默截断。
|
||
建议: 为 CAST 指定明确的长度,例如 CAST(id AS VARCHAR(20))、CAST(amount AS VARCHAR(20)),或根据业务使用更合适的类型。
|
||
- 🔵 [AI] [bug] `sum-may-return-null` L21
|
||
**聚合函数 SUM 在无行时返回 NULL,可能影响下游计算**
|
||
第21、22行的 SUM(amount) 和 sum(quantity) 如果没有匹配行,将返回 NULL 而非 0。如果业务逻辑期望数值 0,应使用 COALESCE 或 IFNULL 包裹。
|
||
建议: 使用 COALESCE(SUM(amount), 0) 和 COALESCE(SUM(quantity), 0) 以避免空值。
|
||
- 🔵 [AI] [performance] `or-condition-index-performance` L32
|
||
**WHERE 中使用 OR 可能阻止索引使用**
|
||
第32行对两个可空字段使用 OR 条件,这类谓词通常难以利用索引,在数据量大时容易导致全表扫描。
|
||
建议: 若两个条件的选择性都较低,可考虑改写为 UNION ALL 以分别利用索引(注意重复行问题),或在应用层拆分查询。如果数据量不大,保持 OR 也可接受。
|