Skip to content

Commit

Permalink
fix HeuristicRules init bug & update rule COL.018
Browse files Browse the repository at this point in the history
	column-not-allow-type show be L9 as it's name said
  • Loading branch information
martianzhang committed Jun 3, 2021
1 parent b93aad4 commit d096d6f
Show file tree
Hide file tree
Showing 7 changed files with 20 additions and 5 deletions.
9 changes: 7 additions & 2 deletions advisor/rules.go
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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,
},
Expand Down
2 changes: 1 addition & 1 deletion advisor/testdata/TestListHeuristicRules.golden
Original file line number Diff line number Diff line change
Expand Up @@ -545,7 +545,7 @@ CREATE TABLE tab (a varchar(3500));
## 建表语句中使用了不推荐的字段类型

* **Item**:COL.018
* **Severity**:L1
* **Severity**:L9
* **Content**:以下字段类型不被推荐使用:boolean
* **Case**:

Expand Down
2 changes: 1 addition & 1 deletion advisor/testdata/TestMergeConflictHeuristicRules.golden
Original file line number Diff line number Diff line change
Expand Up @@ -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 {...}}
Expand Down
4 changes: 4 additions & 0 deletions cmd/soar/tool.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ func initConfig() {
fmt.Println(err.Error())
os.Exit(1)
}

// 更新 HeuristicRules 中与配置相关的文字
advisor.InitHeuristicRules()

common.LogIfWarn(err, "")
}

Expand Down
2 changes: 2 additions & 0 deletions common/testdata/TestPrintConfiguration.golden
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion doc/heuristic.md
Original file line number Diff line number Diff line change
Expand Up @@ -545,7 +545,7 @@ CREATE TABLE tab (a varchar(3500));
## 建表语句中使用了不推荐的字段类型

* **Item**:COL.018
* **Severity**:L1
* **Severity**:L9
* **Content**:以下字段类型不被推荐使用:boolean
* **Case**:

Expand Down
4 changes: 4 additions & 0 deletions etc/soar.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit d096d6f

Please sign in to comment.