From 441b0e8816173c19b4cdc4c1b984742bbc3e0ca4 Mon Sep 17 00:00:00 2001 From: Leon Zhang Date: Wed, 31 Jul 2019 12:42:35 +0800 Subject: [PATCH] fix #213 fix #213 CLA.001 NO WHERE CONDITION fix PRIMARY key append to multi column index --- advisor/heuristic.go | 8 +- advisor/index.go | 29 +++- ..._Check_Max_Join_Table_Count_Default.golden | 10 +- ...Check_Max_Join_Table_Count_Overflow.golden | 10 +- .../test_Check_soar_for_pipe_input.golden | 120 +++------------- ...est_Check_soar_query_for_input_file.golden | 120 +++------------- test/fixture/test_Run_all_test_cases.golden | 130 +++--------------- 7 files changed, 84 insertions(+), 343 deletions(-) diff --git a/advisor/heuristic.go b/advisor/heuristic.go index 3bfc81c..06345e3 100644 --- a/advisor/heuristic.go +++ b/advisor/heuristic.go @@ -329,7 +329,7 @@ func (idxAdv *IndexAdvisor) RuleImplicitConversion() Rule { continue } - c := fmt.Sprintf("%s表中列%s的定义是 %s 而不是 %s", + c := fmt.Sprintf("%s表中列%s的定义是 %s 而不是 %s。", colList[0].Table, colList[0].Name, colList[0].DataType, typNameMap[val.Type]) common.Log.Debug("Implicit data type conversion: %s", c) @@ -356,6 +356,12 @@ func (q *Query4Audit) RuleNoWhere() Rule { err := sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { switch n := node.(type) { case *sqlparser.Select: + for _, f := range n.From { + switch f.(type) { + case *sqlparser.JoinTableExpr: + return false, nil + } + } if n.Where == nil && sqlparser.String(n.From) != "dual" { rule = HeuristicRules["CLA.001"] return false, nil diff --git a/advisor/index.go b/advisor/index.go index 318b0a2..57d1b8d 100644 --- a/advisor/index.go +++ b/advisor/index.go @@ -283,31 +283,31 @@ func (idxAdv *IndexAdvisor) IndexAdvise() IndexAdvises { // 有Where条件的先分析 等值条件 for _, index := range idxAdv.whereEQ { // 对应列在前面已经按散粒度由大到小排序好了 - mergeIndex(indexList, index) + idxAdv.mergeIndex(indexList, index) } // 若存在非等值查询条件,可以给第一个非等值条件添加索引 if len(idxAdv.whereINEQ) > 0 { - mergeIndex(indexList, idxAdv.whereINEQ[0]) + idxAdv.mergeIndex(indexList, idxAdv.whereINEQ[0]) } // 有WHERE条件,但 WHERE 条件未能给出索引建议就不能再加 GROUP BY 和 ORDER BY 建议了 if len(ignore) == 0 { // 没有非等值查询条件时可以再为 GroupBy 和 OrderBy 添加索引 for _, index := range idxAdv.groupBy { - mergeIndex(indexList, index) + idxAdv.mergeIndex(indexList, index) } // OrderBy // 没有 GroupBy 时可以为 OrderBy 加索引 if len(idxAdv.groupBy) == 0 { for _, index := range idxAdv.orderBy { - mergeIndex(indexList, index) + idxAdv.mergeIndex(indexList, index) } } } } else { // 未指定 Where 条件的,只需要 GroupBy 和 OrderBy 的索引建议 for _, index := range idxAdv.groupBy { - mergeIndex(indexList, index) + idxAdv.mergeIndex(indexList, index) } // OrderBy @@ -628,7 +628,7 @@ func (idxAdv *IndexAdvisor) buildJoinIndex(meta common.Meta) []IndexInfo { // 如果该列的库表为join condition中需要添加索引的库表 indexColsList := make(map[string]map[string][]*common.Column) for _, col := range IndexCols { - mergeIndex(indexColsList, col) + idxAdv.mergeIndex(indexColsList, col) } if common.Config.TestDSN.Disable || common.Config.OnlineDSN.Disable { @@ -722,7 +722,7 @@ func (idxAdv *IndexAdvisor) buildIndexWithNoEnv(indexList map[string]map[string] } // mergeIndex 将索引用到的列去重后合并到一起 -func mergeIndex(idxList map[string]map[string][]*common.Column, column *common.Column) { +func (idxAdv *IndexAdvisor) mergeIndex(idxList map[string]map[string][]*common.Column, column *common.Column) { // 散粒度低于阈值将不会添加索引 if common.Config.MinCardinality/100 > column.Cardinality { return @@ -744,6 +744,21 @@ func mergeIndex(idxList map[string]map[string][]*common.Column, column *common.C exist = true } } + + // 将 DB 替换成 vEnv 中的数据库名称 + dbInVEnv := db + if _, ok := idxAdv.vEnv.DBRef[db]; ok { + dbInVEnv = idxAdv.vEnv.DBRef[db] + } + indexMeta := idxAdv.IndexMeta[dbInVEnv][tb] + // 主键列不需要追加 + pr := indexMeta.FindIndex(database.IndexKeyName, "PRIMARY") + for _, c := range pr { + if c.ColumnName == column.Name { + exist = true + } + } + if !exist { idxList[db][tb] = append(idxList[db][tb], column) } diff --git a/test/fixture/test_Check_Max_Join_Table_Count_Default.golden b/test/fixture/test_Check_Max_Join_Table_Count_Default.golden index 1a3dd38..a14d79e 100644 --- a/test/fixture/test_Check_Max_Join_Table_Count_Default.golden +++ b/test/fixture/test_Check_Max_Join_Table_Count_Default.golden @@ -1,6 +1,6 @@ # Query: E813EA038141E9CE -★ ★ ★ ★ ☆ 80分 +★ ★ ★ ★ ★ 100分 ```sql @@ -12,11 +12,5 @@ FROM JOIN d ``` -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 +## OK diff --git a/test/fixture/test_Check_Max_Join_Table_Count_Overflow.golden b/test/fixture/test_Check_Max_Join_Table_Count_Overflow.golden index b2feb33..e2cef34 100644 --- a/test/fixture/test_Check_Max_Join_Table_Count_Overflow.golden +++ b/test/fixture/test_Check_Max_Join_Table_Count_Overflow.golden @@ -1,6 +1,6 @@ # Query: E813EA038141E9CE -★ ★ ★ ☆ ☆ 70分 +★ ★ ★ ★ ☆ 90分 ```sql @@ -12,14 +12,6 @@ FROM JOIN d ``` -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## 减少 JOIN 的数量 * **Item:** JOI.005 diff --git a/test/fixture/test_Check_soar_for_pipe_input.golden b/test/fixture/test_Check_soar_for_pipe_input.golden index a4bd3db..2c1f7dc 100644 --- a/test/fixture/test_Check_soar_for_pipe_input.golden +++ b/test/fixture/test_Check_soar_for_pipe_input.golden @@ -954,7 +954,7 @@ ORDER BY # Query: 4ECCA9568BE69E68 -★ ★ ★ ☆ ☆ 75分 +★ ★ ★ ★ ☆ 95分 ```sql @@ -973,14 +973,6 @@ FROM * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## 不建议使用 SELECT * 类型查询 * **Item:** COL.001 @@ -991,7 +983,7 @@ FROM # Query: 485D56FC88BBBDB9 -★ ★ ★ ☆ ☆ 75分 +★ ★ ★ ★ ☆ 95分 ```sql @@ -1010,14 +1002,6 @@ FROM * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## 不建议使用 SELECT * 类型查询 * **Item:** COL.001 @@ -1028,7 +1012,7 @@ FROM # Query: 0D0DABACEDFF5765 -★ ★ ★ ☆ ☆ 75分 +★ ★ ★ ★ ☆ 95分 ```sql @@ -1047,14 +1031,6 @@ FROM * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## 不建议使用 SELECT * 类型查询 * **Item:** COL.001 @@ -1143,7 +1119,7 @@ WHERE # Query: 17D5BCF21DC2364C -★ ★ ★ ☆ ☆ 65分 +★ ★ ★ ★ ☆ 85分 ```sql @@ -1168,14 +1144,6 @@ FROM * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## 不建议使用 SELECT * 类型查询 * **Item:** COL.001 @@ -1241,7 +1209,7 @@ WHERE # Query: 3FF20E28EC9CBEF9 -★ ★ ★ ★ ☆ 80分 +★ ★ ★ ★ ★ 100分 ```sql @@ -1252,17 +1220,11 @@ FROM JOIN country ``` -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 +## OK # Query: 5C547F08EADBB131 -★ ★ ★ ★ ☆ 80分 +★ ★ ★ ★ ★ 100分 ```sql @@ -1273,17 +1235,11 @@ FROM LEFT JOIN country ``` -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 +## OK # Query: AF0C1EB58B23D2FA -★ ★ ★ ★ ☆ 80分 +★ ★ ★ ★ ★ 100分 ```sql @@ -1294,17 +1250,11 @@ FROM RIGHT JOIN country ``` -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 +## OK # Query: 626571EAE84E2C8A -★ ★ ★ ★ ☆ 80分 +★ ★ ★ ★ ★ 100分 ```sql @@ -1322,14 +1272,6 @@ FROM * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - # Query: 50F2AB4243CE2071 ★ ★ ★ ☆ ☆ 60分 @@ -1374,7 +1316,7 @@ FROM # Query: 584CCEC8069B6947 -★ ★ ☆ ☆ ☆ 40分 +★ ★ ★ ☆ ☆ 60分 ```sql @@ -1397,14 +1339,6 @@ ORDER BY city DESC ``` -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## 同一张表被连接两次 * **Item:** JOI.002 @@ -1929,7 +1863,7 @@ LIMIT # Query: 16CB4628D2597D40 -★ ★ ★ ☆ ☆ 65分 +★ ★ ★ ★ ☆ 85分 ```sql @@ -1954,14 +1888,6 @@ FROM * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## 不建议使用 SELECT * 类型查询 * **Item:** COL.001 @@ -2084,7 +2010,7 @@ WHERE # Query: 1E8B70E30062FD13 -★ ★ ★ ★ ☆ 80分 +★ ★ ★ ★ ★ 100分 ```sql @@ -2094,17 +2020,11 @@ FROM customer STRAIGHT_JOIN address ON customer. address_id= address. address_id ``` -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 +## OK # Query: E48A20D0413512DA -★ ☆ ☆ ☆ ☆ 30分 +★ ★ ☆ ☆ ☆ 50分 ```sql @@ -2136,14 +2056,6 @@ ORDER BY * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## ORDER BY 语句对多个不同条件使用不同方向的排序无法使用索引 * **Item:** CLA.007 diff --git a/test/fixture/test_Check_soar_query_for_input_file.golden b/test/fixture/test_Check_soar_query_for_input_file.golden index a4bd3db..2c1f7dc 100644 --- a/test/fixture/test_Check_soar_query_for_input_file.golden +++ b/test/fixture/test_Check_soar_query_for_input_file.golden @@ -954,7 +954,7 @@ ORDER BY # Query: 4ECCA9568BE69E68 -★ ★ ★ ☆ ☆ 75分 +★ ★ ★ ★ ☆ 95分 ```sql @@ -973,14 +973,6 @@ FROM * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## 不建议使用 SELECT * 类型查询 * **Item:** COL.001 @@ -991,7 +983,7 @@ FROM # Query: 485D56FC88BBBDB9 -★ ★ ★ ☆ ☆ 75分 +★ ★ ★ ★ ☆ 95分 ```sql @@ -1010,14 +1002,6 @@ FROM * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## 不建议使用 SELECT * 类型查询 * **Item:** COL.001 @@ -1028,7 +1012,7 @@ FROM # Query: 0D0DABACEDFF5765 -★ ★ ★ ☆ ☆ 75分 +★ ★ ★ ★ ☆ 95分 ```sql @@ -1047,14 +1031,6 @@ FROM * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## 不建议使用 SELECT * 类型查询 * **Item:** COL.001 @@ -1143,7 +1119,7 @@ WHERE # Query: 17D5BCF21DC2364C -★ ★ ★ ☆ ☆ 65分 +★ ★ ★ ★ ☆ 85分 ```sql @@ -1168,14 +1144,6 @@ FROM * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## 不建议使用 SELECT * 类型查询 * **Item:** COL.001 @@ -1241,7 +1209,7 @@ WHERE # Query: 3FF20E28EC9CBEF9 -★ ★ ★ ★ ☆ 80分 +★ ★ ★ ★ ★ 100分 ```sql @@ -1252,17 +1220,11 @@ FROM JOIN country ``` -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 +## OK # Query: 5C547F08EADBB131 -★ ★ ★ ★ ☆ 80分 +★ ★ ★ ★ ★ 100分 ```sql @@ -1273,17 +1235,11 @@ FROM LEFT JOIN country ``` -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 +## OK # Query: AF0C1EB58B23D2FA -★ ★ ★ ★ ☆ 80分 +★ ★ ★ ★ ★ 100分 ```sql @@ -1294,17 +1250,11 @@ FROM RIGHT JOIN country ``` -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 +## OK # Query: 626571EAE84E2C8A -★ ★ ★ ★ ☆ 80分 +★ ★ ★ ★ ★ 100分 ```sql @@ -1322,14 +1272,6 @@ FROM * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - # Query: 50F2AB4243CE2071 ★ ★ ★ ☆ ☆ 60分 @@ -1374,7 +1316,7 @@ FROM # Query: 584CCEC8069B6947 -★ ★ ☆ ☆ ☆ 40分 +★ ★ ★ ☆ ☆ 60分 ```sql @@ -1397,14 +1339,6 @@ ORDER BY city DESC ``` -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## 同一张表被连接两次 * **Item:** JOI.002 @@ -1929,7 +1863,7 @@ LIMIT # Query: 16CB4628D2597D40 -★ ★ ★ ☆ ☆ 65分 +★ ★ ★ ★ ☆ 85分 ```sql @@ -1954,14 +1888,6 @@ FROM * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## 不建议使用 SELECT * 类型查询 * **Item:** COL.001 @@ -2084,7 +2010,7 @@ WHERE # Query: 1E8B70E30062FD13 -★ ★ ★ ★ ☆ 80分 +★ ★ ★ ★ ★ 100分 ```sql @@ -2094,17 +2020,11 @@ FROM customer STRAIGHT_JOIN address ON customer. address_id= address. address_id ``` -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 +## OK # Query: E48A20D0413512DA -★ ☆ ☆ ☆ ☆ 30分 +★ ★ ☆ ☆ ☆ 50分 ```sql @@ -2136,14 +2056,6 @@ ORDER BY * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## ORDER BY 语句对多个不同条件使用不同方向的排序无法使用索引 * **Item:** CLA.007 diff --git a/test/fixture/test_Run_all_test_cases.golden b/test/fixture/test_Run_all_test_cases.golden index 9d37c63..dda503e 100644 --- a/test/fixture/test_Run_all_test_cases.golden +++ b/test/fixture/test_Run_all_test_cases.golden @@ -2098,7 +2098,7 @@ ORDER BY # Query: 4ECCA9568BE69E68 -★ ★ ★ ☆ ☆ 75分 +★ ★ ★ ★ ☆ 95分 ```sql @@ -2139,14 +2139,6 @@ FROM * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## 不建议使用 SELECT * 类型查询 * **Item:** COL.001 @@ -2157,7 +2149,7 @@ FROM # Query: 485D56FC88BBBDB9 -★ ★ ★ ☆ ☆ 75分 +★ ★ ★ ★ ☆ 95分 ```sql @@ -2198,14 +2190,6 @@ FROM * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## 不建议使用 SELECT * 类型查询 * **Item:** COL.001 @@ -2216,7 +2200,7 @@ FROM # Query: 0D0DABACEDFF5765 -★ ★ ★ ☆ ☆ 75分 +★ ★ ★ ★ ☆ 95分 ```sql @@ -2257,14 +2241,6 @@ FROM * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## 不建议使用 SELECT * 类型查询 * **Item:** COL.001 @@ -2431,7 +2407,7 @@ WHERE # Query: 17D5BCF21DC2364C -★ ★ ★ ☆ ☆ 65分 +★ ★ ★ ★ ☆ 85分 ```sql @@ -2485,14 +2461,6 @@ FROM * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## 不建议使用 SELECT * 类型查询 * **Item:** COL.001 @@ -2615,7 +2583,7 @@ WHERE # Query: 3FF20E28EC9CBEF9 -★ ★ ★ ★ ☆ 80分 +★ ★ ★ ★ ★ 100分 ```sql @@ -2652,17 +2620,9 @@ FROM * **Using where**: WHERE条件用于筛选出与下一个表匹配的数据然后返回给客户端. 除非故意做的全表扫描, 否则连接类型是ALL或者是index, 且在Extra列的值中没有Using Where, 则该查询可能是有问题的. -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - # Query: 5C547F08EADBB131 -★ ★ ★ ★ ☆ 80分 +★ ★ ★ ★ ★ 100分 ```sql @@ -2699,17 +2659,9 @@ FROM * **Using where**: WHERE条件用于筛选出与下一个表匹配的数据然后返回给客户端. 除非故意做的全表扫描, 否则连接类型是ALL或者是index, 且在Extra列的值中没有Using Where, 则该查询可能是有问题的. -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - # Query: AF0C1EB58B23D2FA -★ ★ ★ ★ ☆ 80分 +★ ★ ★ ★ ★ 100分 ```sql @@ -2746,17 +2698,9 @@ FROM * **Using where**: WHERE条件用于筛选出与下一个表匹配的数据然后返回给客户端. 除非故意做的全表扫描, 否则连接类型是ALL或者是index, 且在Extra列的值中没有Using Where, 则该查询可能是有问题的. -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - # Query: 626571EAE84E2C8A -★ ★ ★ ★ ☆ 80分 +★ ★ ★ ★ ★ 100分 ```sql @@ -2800,14 +2744,6 @@ FROM * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - # Query: 50F2AB4243CE2071 ★ ★ ★ ☆ ☆ 60分 @@ -2878,7 +2814,7 @@ FROM # Query: 584CCEC8069B6947 -★ ☆ ☆ ☆ ☆ 30分 +★ ★ ☆ ☆ ☆ 50分 ```sql @@ -2948,14 +2884,6 @@ ORDER BY -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## 同一张表被连接两次 * **Item:** JOI.002 @@ -3836,7 +3764,7 @@ LIMIT # Query: 16CB4628D2597D40 -★ ★ ★ ☆ ☆ 65分 +★ ★ ★ ★ ☆ 85分 ```sql @@ -3888,14 +3816,6 @@ FROM * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## 不建议使用 SELECT * 类型查询 * **Item:** COL.001 @@ -3941,7 +3861,7 @@ GROUP BY | id | select\_type | table | partitions | type | possible_keys | key | key\_len | ref | rows | filtered | scalability | Extra | |---|---|---|---|---|---|---|---|---|---|---|---|---| -| 1 | SIMPLE | *actor* | NULL | ref | idx\_actor\_last\_name | idx\_actor\_last\_name | 137 | const | 2 | 14.29% | O(log n) | Using where; Using temporary | +| 1 | SIMPLE | *actor* | NULL | ref | idx\_actor\_last\_name | idx\_actor\_last\_name | 137 | const | 2 | 25.00% | O(log n) | Using where; Using temporary | @@ -4087,7 +4007,7 @@ WHERE # Query: 1E8B70E30062FD13 -★ ★ ★ ★ ☆ 80分 +★ ★ ★ ★ ★ 100分 ```sql @@ -4123,17 +4043,9 @@ FROM * **Using index**: 只需通过索引就可以从表中获取列的信息, 无需额外去读取真实的行数据. 如果查询使用的列值仅仅是一个简单索引的部分值, 则会使用这种策略来优化查询. -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - # Query: E48A20D0413512DA -★ ☆ ☆ ☆ ☆ 20分 +★ ★ ☆ ☆ ☆ 40分 ```sql @@ -4224,14 +4136,6 @@ ORDER BY * **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。 -## 最外层 SELECT 未指定 WHERE 条件 - -* **Item:** CLA.001 - -* **Severity:** L4 - -* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。 - ## ORDER BY 语句对多个不同条件使用不同方向的排序无法使用索引 * **Item:** CLA.007 @@ -4703,7 +4607,7 @@ create table hello. t (id int unsigned) # Query: 291F95B7DCB74C21 -★ ★ ★ ★ ☆ 95分 +☆ ☆ ☆ ☆ ☆ 0分 ```sql @@ -4715,6 +4619,10 @@ WHERE data >= '' ``` +## MySQL execute failed + +Unknown column 'data' in 'where clause' + ## 不建议使用 SELECT * 类型查询 * **Item:** COL.001 @@ -4735,6 +4643,8 @@ DROP DEFAULT ``` +## OK + # Query: B48292EDB9D0E010 ★ ★ ☆ ☆ ☆ 40分 -- GitLab