提交 47b425c9 编写于 作者: martianzhang's avatar martianzhang

ADD ARG.014 Rule and some doc fix

上级 ee6cfd0c
...@@ -2553,7 +2553,7 @@ func (q *Query4Audit) RuleTruncateTable() Rule { ...@@ -2553,7 +2553,7 @@ func (q *Query4Audit) RuleTruncateTable() Rule {
return rule return rule
} }
// RuleIn ARG.005 && ARG.004 // RuleIn ARG.005 && ARG.004 && ARG.014
func (q *Query4Audit) RuleIn() Rule { func (q *Query4Audit) RuleIn() Rule {
var rule = q.RuleOK() var rule = q.RuleOK()
err := sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { err := sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) {
...@@ -2562,6 +2562,10 @@ func (q *Query4Audit) RuleIn() Rule { ...@@ -2562,6 +2562,10 @@ func (q *Query4Audit) RuleIn() Rule {
switch strings.ToLower(n.Operator) { switch strings.ToLower(n.Operator) {
case "in": case "in":
switch r := n.Right.(type) { switch r := n.Right.(type) {
case sqlparser.ColTuple:
// id in (1, 2, id), always true.
rule = HeuristicRules["ARG.014"]
return false, nil
case sqlparser.ValTuple: case sqlparser.ValTuple:
// IN (NULL) // IN (NULL)
for _, v := range r { for _, v := range r {
......
...@@ -280,6 +280,14 @@ func init() { ...@@ -280,6 +280,14 @@ func init() {
Case: "CREATE TABLE tb (a varchar(10) default '“”'", Case: "CREATE TABLE tb (a varchar(10) default '“”'",
Func: (*Query4Audit).RuleFullWidthQuote, Func: (*Query4Audit).RuleFullWidthQuote,
}, },
"ARG.014": {
Item: "ARG.014",
Severity: "L4",
Summary: "IN 条件中存在列名,可能导致数据匹配范围扩大",
Content: `如:delete from t where id in(1, 2, id) 可能会导致全表数据误删除。请仔细检查 IN 条件的正确性。`,
Case: "select id from t where id in(1, 2, id)",
Func: (*Query4Audit).RuleIn,
},
"CLA.001": { "CLA.001": {
Item: "CLA.001", Item: "CLA.001",
Severity: "L4", Severity: "L4",
...@@ -506,7 +514,7 @@ func init() { ...@@ -506,7 +514,7 @@ func init() {
"COL.010": { "COL.010": {
Item: "COL.010", Item: "COL.010",
Severity: "L2", Severity: "L2",
Summary: "不建议使用 ENUM 数据类型", Summary: "不建议使用 ENUM/BIT/SET 数据类型",
Content: `ENUM 定义了列中值的类型,使用字符串表示 ENUM 里的值时,实际存储在列中的数据是这些值在定义时的序数。因此,这列的数据是字节对齐的,当您进行一次排序查询时,结果是按照实际存储的序数值排序的,而不是按字符串值的字母顺序排序的。这可能不是您所希望的。没有什么语法支持从 ENUM 或者 check 约束中添加或删除一个值;您只能使用一个新的集合重新定义这一列。如果您打算废弃一个选项,您可能会为历史数据而烦恼。作为一种策略,改变元数据——也就是说,改变表和列的定义——应该是不常见的,并且要注意测试和质量保证。有一个更好的解决方案来约束一列中的可选值:创建一张检查表,每一行包含一个允许在列中出现的候选值;然后在引用新表的旧表上声明一个外键约束。`, Content: `ENUM 定义了列中值的类型,使用字符串表示 ENUM 里的值时,实际存储在列中的数据是这些值在定义时的序数。因此,这列的数据是字节对齐的,当您进行一次排序查询时,结果是按照实际存储的序数值排序的,而不是按字符串值的字母顺序排序的。这可能不是您所希望的。没有什么语法支持从 ENUM 或者 check 约束中添加或删除一个值;您只能使用一个新的集合重新定义这一列。如果您打算废弃一个选项,您可能会为历史数据而烦恼。作为一种策略,改变元数据——也就是说,改变表和列的定义——应该是不常见的,并且要注意测试和质量保证。有一个更好的解决方案来约束一列中的可选值:创建一张检查表,每一行包含一个允许在列中出现的候选值;然后在引用新表的旧表上声明一个外键约束。`,
Case: "create table tab1(status ENUM('new','in progress','fixed'))", Case: "create table tab1(status ENUM('new','in progress','fixed'))",
Func: (*Query4Audit).RuleValuesInDefinition, Func: (*Query4Audit).RuleValuesInDefinition,
......
...@@ -452,7 +452,7 @@ create table t1(id int,name char(20),last_time date) ...@@ -452,7 +452,7 @@ create table t1(id int,name char(20),last_time date)
```sql ```sql
CREATE TABLE tab2 (p_id BIGINT UNSIGNED NOT NULL,a_id BIGINT UNSIGNED NOT NULL,hours float not null,PRIMARY KEY (p_id, a_id)) CREATE TABLE tab2 (p_id BIGINT UNSIGNED NOT NULL,a_id BIGINT UNSIGNED NOT NULL,hours float not null,PRIMARY KEY (p_id, a_id))
``` ```
## 不建议使用 ENUM 数据类型 ## 不建议使用 ENUM/BIT/SET 数据类型
* **Item**:COL.010 * **Item**:COL.010
* **Severity**:L2 * **Severity**:L2
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册