Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
上島
soar
提交
47b425c9
S
soar
项目概览
上島
/
soar
与 Fork 源项目一致
Fork自
Xiaomi / soar
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
soar
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
47b425c9
编写于
1月 22, 2021
作者:
martianzhang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ADD ARG.014 Rule and some doc fix
上级
ee6cfd0c
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
15 addition
and
3 deletion
+15
-3
advisor/heuristic.go
advisor/heuristic.go
+5
-1
advisor/rules.go
advisor/rules.go
+9
-1
doc/heuristic.md
doc/heuristic.md
+1
-1
未找到文件。
advisor/heuristic.go
浏览文件 @
47b425c9
...
...
@@ -2553,7 +2553,7 @@ func (q *Query4Audit) RuleTruncateTable() Rule {
return
rule
}
// RuleIn ARG.005 && ARG.004
// RuleIn ARG.005 && ARG.004
&& ARG.014
func
(
q
*
Query4Audit
)
RuleIn
()
Rule
{
var
rule
=
q
.
RuleOK
()
err
:=
sqlparser
.
Walk
(
func
(
node
sqlparser
.
SQLNode
)
(
kontinue
bool
,
err
error
)
{
...
...
@@ -2562,6 +2562,10 @@ func (q *Query4Audit) RuleIn() Rule {
switch
strings
.
ToLower
(
n
.
Operator
)
{
case
"in"
:
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
:
// IN (NULL)
for
_
,
v
:=
range
r
{
...
...
advisor/rules.go
浏览文件 @
47b425c9
...
...
@@ -280,6 +280,14 @@ func init() {
Case
:
"CREATE TABLE tb (a varchar(10) default '“”'"
,
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"
:
{
Item
:
"CLA.001"
,
Severity
:
"L4"
,
...
...
@@ -506,7 +514,7 @@ func init() {
"COL.010"
:
{
Item
:
"COL.010"
,
Severity
:
"L2"
,
Summary
:
"不建议使用 ENUM 数据类型"
,
Summary
:
"不建议使用 ENUM
/BIT/SET
数据类型"
,
Content
:
`ENUM 定义了列中值的类型,使用字符串表示 ENUM 里的值时,实际存储在列中的数据是这些值在定义时的序数。因此,这列的数据是字节对齐的,当您进行一次排序查询时,结果是按照实际存储的序数值排序的,而不是按字符串值的字母顺序排序的。这可能不是您所希望的。没有什么语法支持从 ENUM 或者 check 约束中添加或删除一个值;您只能使用一个新的集合重新定义这一列。如果您打算废弃一个选项,您可能会为历史数据而烦恼。作为一种策略,改变元数据——也就是说,改变表和列的定义——应该是不常见的,并且要注意测试和质量保证。有一个更好的解决方案来约束一列中的可选值:创建一张检查表,每一行包含一个允许在列中出现的候选值;然后在引用新表的旧表上声明一个外键约束。`
,
Case
:
"create table tab1(status ENUM('new','in progress','fixed'))"
,
Func
:
(
*
Query4Audit
)
.
RuleValuesInDefinition
,
...
...
doc/heuristic.md
浏览文件 @
47b425c9
...
...
@@ -452,7 +452,7 @@ create table t1(id int,name char(20),last_time date)
```
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
))
```
## 不建议使用 ENUM 数据类型
## 不建议使用 ENUM
/BIT/SET
数据类型
*
**Item**
:COL.010
*
**Severity**
:L2
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录