From d096d6f54fc5c50a1046f47ad80301ae3a26d275 Mon Sep 17 00:00:00 2001 From: Leon Zhang Date: Thu, 3 Jun 2021 13:59:02 +0800 Subject: [PATCH] fix HeuristicRules init bug & update rule COL.018 column-not-allow-type show be L9 as it's name said --- advisor/rules.go | 9 +++++++-- advisor/testdata/TestListHeuristicRules.golden | 2 +- advisor/testdata/TestMergeConflictHeuristicRules.golden | 2 +- cmd/soar/tool.go | 4 ++++ common/testdata/TestPrintConfiguration.golden | 2 ++ doc/heuristic.md | 2 +- etc/soar.yaml | 4 ++++ 7 files changed, 20 insertions(+), 5 deletions(-) diff --git a/advisor/rules.go b/advisor/rules.go index e3a01ca..0f5da8b 100644 --- a/advisor/rules.go +++ b/advisor/rules.go @@ -111,6 +111,11 @@ type Rule struct { var HeuristicRules map[string]Rule func init() { + InitHeuristicRules() +} + +// InitHeuristicRules ... +func InitHeuristicRules() { HeuristicRules = map[string]Rule{ "OK": { Item: "OK", @@ -579,9 +584,9 @@ func init() { }, "COL.018": { Item: "COL.018", - Severity: "L1", + Severity: "L9", Summary: "建表语句中使用了不推荐的字段类型", - Content: "以下字段类型不被推荐使用:" + strings.Join(common.Config.ColumnNotAllowType, ","), + Content: "以下字段类型不被推荐使用:" + strings.Join(common.Config.ColumnNotAllowType, ", "), Case: "CREATE TABLE tab (a BOOLEAN);", Func: (*Query4Audit).RuleColumnNotAllowType, }, diff --git a/advisor/testdata/TestListHeuristicRules.golden b/advisor/testdata/TestListHeuristicRules.golden index ea05609..41bf7c0 100644 --- a/advisor/testdata/TestListHeuristicRules.golden +++ b/advisor/testdata/TestListHeuristicRules.golden @@ -545,7 +545,7 @@ CREATE TABLE tab (a varchar(3500)); ## 建表语句中使用了不推荐的字段类型 * **Item**:COL.018 -* **Severity**:L1 +* **Severity**:L9 * **Content**:以下字段类型不被推荐使用:boolean * **Case**: diff --git a/advisor/testdata/TestMergeConflictHeuristicRules.golden b/advisor/testdata/TestMergeConflictHeuristicRules.golden index 36f01bc..431af4c 100644 --- a/advisor/testdata/TestMergeConflictHeuristicRules.golden +++ b/advisor/testdata/TestMergeConflictHeuristicRules.golden @@ -51,7 +51,7 @@ advisor.Rule{Item:"COL.014", Severity:"L5", Summary:"为列指定了字符集", advisor.Rule{Item:"COL.015", Severity:"L4", Summary:"TEXT、BLOB 和 JSON 类型的字段不可指定非 NULL 的默认值", Content:"MySQL 数据库中 TEXT、BLOB 和 JSON 类型的字段不可指定非 NULL 的默认值。TEXT最大长度为2^16-1个字符,MEDIUMTEXT最大长度为2^32-1个字符,LONGTEXT最大长度为2^64-1个字符。", Case:"CREATE TABLE `tbl` (`c` blob DEFAULT NULL);", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"COL.016", Severity:"L1", Summary:"整型定义建议采用 INT(10) 或 BIGINT(20)", Content:"INT(M) 在 integer 数据类型中,M 表示最大显示宽度。 在 INT(M) 中,M 的值跟 INT(M) 所占多少存储空间并无任何关系。 INT(3)、INT(4)、INT(8) 在磁盘上都是占用 4 bytes 的存储空间。高版本 MySQL 已经不推荐设置整数显示宽度。", Case:"CREATE TABLE tab (a INT(1));", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"COL.017", Severity:"L2", Summary:"VARCHAR 定义长度过长", Content:"varchar 是可变长字符串,不预先分配存储空间,长度不要超过1024,如果存储长度过长 MySQL 将定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索引效率。", Case:"CREATE TABLE tab (a varchar(3500));", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} -advisor.Rule{Item:"COL.018", Severity:"L1", Summary:"建表语句中使用了不推荐的字段类型", Content:"以下字段类型不被推荐使用:boolean", Case:"CREATE TABLE tab (a BOOLEAN);", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} +advisor.Rule{Item:"COL.018", Severity:"L9", Summary:"建表语句中使用了不推荐的字段类型", Content:"以下字段类型不被推荐使用:boolean", Case:"CREATE TABLE tab (a BOOLEAN);", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"COL.019", Severity:"L1", Summary:"不建议使用精度在秒级以下的时间数据类型", Content:"使用高精度的时间数据类型带来的存储空间消耗相对较大;MySQL 在5.6.4以上才可以支持精确到微秒的时间数据类型,使用时需要考虑版本兼容问题。", Case:"CREATE TABLE t1 (t TIME(3), dt DATETIME(6));", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"DIS.001", Severity:"L1", Summary:"消除不必要的 DISTINCT 条件", Content:"太多DISTINCT条件是复杂的裹脚布式查询的症状。考虑将复杂查询分解成许多简单的查询,并减少DISTINCT条件的数量。如果主键列是列的结果集的一部分,则DISTINCT条件可能没有影响。", Case:"SELECT DISTINCT c.c_id,count(DISTINCT c.c_name),count(DISTINCT c.c_e),count(DISTINCT c.c_n),count(DISTINCT c.c_me),c.c_d FROM (select distinct id, name from B) as e WHERE e.country_id = c.country_id", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"DIS.002", Severity:"L3", Summary:"COUNT(DISTINCT) 多列时结果可能和你预想的不同", Content:"COUNT(DISTINCT col) 计算该列除NULL之外的不重复行数,注意 COUNT(DISTINCT col, col2) 如果其中一列全为 NULL 那么即使另一列有不同的值,也返回0。", Case:"SELECT COUNT(DISTINCT col, col2) FROM tbl;", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} diff --git a/cmd/soar/tool.go b/cmd/soar/tool.go index 361a4d2..d12c3c2 100644 --- a/cmd/soar/tool.go +++ b/cmd/soar/tool.go @@ -60,6 +60,10 @@ func initConfig() { fmt.Println(err.Error()) os.Exit(1) } + + // 更新 HeuristicRules 中与配置相关的文字 + advisor.InitHeuristicRules() + common.LogIfWarn(err, "") } diff --git a/common/testdata/TestPrintConfiguration.golden b/common/testdata/TestPrintConfiguration.golden index 8dde11f..eea8652 100644 --- a/common/testdata/TestPrintConfiguration.golden +++ b/common/testdata/TestPrintConfiguration.golden @@ -95,6 +95,8 @@ unique-key-prefix: uk_ max-subquery-depth: 5 max-varchar-length: 1024 column-not-allow-type: +- json +- text - boolean min-cardinality: 0 explain-sql-report-type: pretty diff --git a/doc/heuristic.md b/doc/heuristic.md index ea05609..41bf7c0 100644 --- a/doc/heuristic.md +++ b/doc/heuristic.md @@ -545,7 +545,7 @@ CREATE TABLE tab (a varchar(3500)); ## 建表语句中使用了不推荐的字段类型 * **Item**:COL.018 -* **Severity**:L1 +* **Severity**:L9 * **Content**:以下字段类型不被推荐使用:boolean * **Case**: diff --git a/etc/soar.yaml b/etc/soar.yaml index 7202d21..ee9760f 100644 --- a/etc/soar.yaml +++ b/etc/soar.yaml @@ -15,6 +15,10 @@ test-dsn: # 高危,仅测试时使用,线上环境禁止配置为 true allow-online-as-test: true +column-not-allow-type: +- json +- text +- boolean log-level: 7 log-output: soar.log -- GitLab