提交 7c812ec6 编写于 作者: martianzhang's avatar martianzhang

fix #18, #20

  1. ARG.010 wrong case
  2. update gometalinter to 2.0.11 latest version
上级 7500a5ee
...@@ -2044,6 +2044,7 @@ func (q *Query4Audit) RuleSpaceWithQuote() Rule { ...@@ -2044,6 +2044,7 @@ func (q *Query4Audit) RuleSpaceWithQuote() Rule {
} }
// RuleHint ARG.010 // RuleHint ARG.010
// TODO: sql_no_cache, straight join
func (q *Query4Audit) RuleHint() Rule { func (q *Query4Audit) RuleHint() 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) {
......
...@@ -1731,7 +1731,7 @@ func TestRuleHint(t *testing.T) { ...@@ -1731,7 +1731,7 @@ func TestRuleHint(t *testing.T) {
{ {
`SELECT * FROM t1 USE INDEX (i1) ORDER BY a;`, `SELECT * FROM t1 USE INDEX (i1) ORDER BY a;`,
`SELECT * FROM t1 IGNORE INDEX (i1) ORDER BY (i2);`, `SELECT * FROM t1 IGNORE INDEX (i1) ORDER BY (i2);`,
// vitess syntax not support now // TODO: vitess syntax not support now
// `SELECT * FROM t1 USE INDEX (i1,i2) IGNORE INDEX (i2);`, // `SELECT * FROM t1 USE INDEX (i1,i2) IGNORE INDEX (i2);`,
// `SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);`, // `SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);`,
}, },
......
...@@ -251,9 +251,9 @@ func init() { ...@@ -251,9 +251,9 @@ func init() {
"ARG.010": { "ARG.010": {
Item: "ARG.010", Item: "ARG.010",
Severity: "L1", Severity: "L1",
Summary: "不要使用hint,如sql_no_cache,force index,ignore key,straight join等", Summary: "不要使用hint,如sql_no_cache, force index, ignore key, straight join等",
Content: `hint是用来强制SQL按照某个执行计划来执行,但随着数据量变化我们无法保证自己当初的预判是正确的。`, Content: `hint是用来强制SQL按照某个执行计划来执行,但随着数据量变化我们无法保证自己当初的预判是正确的。`,
Case: "SELECT 'abc '", Case: "SELECT * FROM t1 USE INDEX (i1) ORDER BY a;",
Func: (*Query4Audit).RuleHint, Func: (*Query4Audit).RuleHint,
}, },
"ARG.011": { "ARG.011": {
......
...@@ -162,7 +162,7 @@ SELECT c1,c2,c3 FROM tbl WHERE c1 = 14 OR c1 = 17 ...@@ -162,7 +162,7 @@ SELECT c1,c2,c3 FROM tbl WHERE c1 = 14 OR c1 = 17
```sql ```sql
SELECT 'abc ' SELECT 'abc '
``` ```
## 不要使用hint,如sql\_no\_cache,force index,ignore key,straight join等 ## 不要使用hint,如sql\_no\_cache, force index, ignore key, straight join等
* **Item**:ARG.010 * **Item**:ARG.010
* **Severity**:L1 * **Severity**:L1
...@@ -170,7 +170,7 @@ SELECT 'abc ' ...@@ -170,7 +170,7 @@ SELECT 'abc '
* **Case**: * **Case**:
```sql ```sql
SELECT 'abc ' SELECT * FROM t1 USE INDEX (i1) ORDER BY a;
``` ```
## 不要使用负向查询,如:NOT IN/NOT LIKE ## 不要使用负向查询,如:NOT IN/NOT LIKE
......
...@@ -13,7 +13,7 @@ advisor.Rule{Item:"ARG.006", Severity:"L1", Summary:"应尽量避免在WHERE子 ...@@ -13,7 +13,7 @@ advisor.Rule{Item:"ARG.006", Severity:"L1", Summary:"应尽量避免在WHERE子
advisor.Rule{Item:"ARG.007", Severity:"L3", Summary:"避免使用模式匹配", Content:"性能问题是使用模式匹配操作符的最大缺点。使用LIKE或正则表达式进行模式匹配进行查询的另一个问题,是可能会返回意料之外的结果。最好的方案就是使用特殊的搜索引擎技术来替代SQL,比如Apache Lucene。另一个可选方案是将结果保存起来从而减少重复的搜索开销。如果一定要使用SQL,请考虑在MySQL中使用像FULLTEXT索引这样的第三方扩展。但更广泛地说,您不一定要使用SQL来解决所有问题。", Case:"select c_id,c2,c3 from tbl where c2 like 'test%'", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"ARG.007", Severity:"L3", Summary:"避免使用模式匹配", Content:"性能问题是使用模式匹配操作符的最大缺点。使用LIKE或正则表达式进行模式匹配进行查询的另一个问题,是可能会返回意料之外的结果。最好的方案就是使用特殊的搜索引擎技术来替代SQL,比如Apache Lucene。另一个可选方案是将结果保存起来从而减少重复的搜索开销。如果一定要使用SQL,请考虑在MySQL中使用像FULLTEXT索引这样的第三方扩展。但更广泛地说,您不一定要使用SQL来解决所有问题。", Case:"select c_id,c2,c3 from tbl where c2 like 'test%'", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}}
advisor.Rule{Item:"ARG.008", Severity:"L1", Summary:"OR查询索引列时请尽量使用IN谓词", Content:"IN-list谓词可以用于索引检索,并且优化器可以对IN-list进行排序,以匹配索引的排序序列,从而获得更有效的检索。请注意,IN-list必须只包含常量,或在查询块执行期间保持常量的值,例如外引用。", Case:"SELECT c1,c2,c3 FROM tbl WHERE c1 = 14 OR c1 = 17", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"ARG.008", Severity:"L1", Summary:"OR查询索引列时请尽量使用IN谓词", Content:"IN-list谓词可以用于索引检索,并且优化器可以对IN-list进行排序,以匹配索引的排序序列,从而获得更有效的检索。请注意,IN-list必须只包含常量,或在查询块执行期间保持常量的值,例如外引用。", Case:"SELECT c1,c2,c3 FROM tbl WHERE c1 = 14 OR c1 = 17", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}}
advisor.Rule{Item:"ARG.009", Severity:"L1", Summary:"引号中的字符串开头或结尾包含空格", Content:"如果VARCHAR列的前后存在空格将可能引起逻辑问题,如在MySQL 5.5中'a'和'a '可能会在查询中被认为是相同的值。", Case:"SELECT 'abc '", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"ARG.009", Severity:"L1", Summary:"引号中的字符串开头或结尾包含空格", Content:"如果VARCHAR列的前后存在空格将可能引起逻辑问题,如在MySQL 5.5中'a'和'a '可能会在查询中被认为是相同的值。", Case:"SELECT 'abc '", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}}
advisor.Rule{Item:"ARG.010", Severity:"L1", Summary:"不要使用hint,如sql_no_cache,force index,ignore key,straight join等", Content:"hint是用来强制SQL按照某个执行计划来执行,但随着数据量变化我们无法保证自己当初的预判是正确的。", Case:"SELECT 'abc '", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"ARG.010", Severity:"L1", Summary:"不要使用hint,如sql_no_cache, force index, ignore key, straight join等", Content:"hint是用来强制SQL按照某个执行计划来执行,但随着数据量变化我们无法保证自己当初的预判是正确的。", Case:"SELECT * FROM t1 USE INDEX (i1) ORDER BY a;", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}}
advisor.Rule{Item:"ARG.011", Severity:"L3", Summary:"不要使用负向查询,如:NOT IN/NOT LIKE", Content:"请尽量不要使用负向查询,这将导致全表扫描,对查询性能影响较大。", Case:"select id from t where num not in(1,2,3);", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"ARG.011", Severity:"L3", Summary:"不要使用负向查询,如:NOT IN/NOT LIKE", Content:"请尽量不要使用负向查询,这将导致全表扫描,对查询性能影响较大。", Case:"select id from t where num not in(1,2,3);", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}}
advisor.Rule{Item:"CLA.001", Severity:"L4", Summary:"最外层SELECT未指定WHERE条件", Content:"SELECT语句没有WHERE子句,可能检查比预期更多的行(全表扫描)。对于SELECT COUNT(*)类型的请求如果不要求精度,建议使用SHOW TABLE STATUS或EXPLAIN替代。", Case:"select id from tbl", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"CLA.001", Severity:"L4", Summary:"最外层SELECT未指定WHERE条件", Content:"SELECT语句没有WHERE子句,可能检查比预期更多的行(全表扫描)。对于SELECT COUNT(*)类型的请求如果不要求精度,建议使用SHOW TABLE STATUS或EXPLAIN替代。", Case:"select id from tbl", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}}
advisor.Rule{Item:"CLA.002", Severity:"L3", Summary:"不建议使用ORDER BY RAND()", Content:"ORDER BY RAND()是从结果集中检索随机行的一种非常低效的方法,因为它会对整个结果进行排序并丢弃其大部分数据。", Case:"select name from tbl where id < 1000 order by rand(number)", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"CLA.002", Severity:"L3", Summary:"不建议使用ORDER BY RAND()", Content:"ORDER BY RAND()是从结果集中检索随机行的一种非常低效的方法,因为它会对整个结果进行排序并丢弃其大部分数据。", Case:"select name from tbl where id < 1000 order by rand(number)", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}}
......
...@@ -162,7 +162,7 @@ SELECT c1,c2,c3 FROM tbl WHERE c1 = 14 OR c1 = 17 ...@@ -162,7 +162,7 @@ SELECT c1,c2,c3 FROM tbl WHERE c1 = 14 OR c1 = 17
```sql ```sql
SELECT 'abc ' SELECT 'abc '
``` ```
## 不要使用hint,如sql\_no\_cache,force index,ignore key,straight join等 ## 不要使用hint,如sql\_no\_cache, force index, ignore key, straight join等
* **Item**:ARG.010 * **Item**:ARG.010
* **Severity**:L1 * **Severity**:L1
...@@ -170,7 +170,7 @@ SELECT 'abc ' ...@@ -170,7 +170,7 @@ SELECT 'abc '
* **Case**: * **Case**:
```sql ```sql
SELECT 'abc ' SELECT * FROM t1 USE INDEX (i1) ORDER BY a;
``` ```
## 不要使用负向查询,如:NOT IN/NOT LIKE ## 不要使用负向查询,如:NOT IN/NOT LIKE
......
...@@ -6,7 +6,7 @@ set -euo pipefail ...@@ -6,7 +6,7 @@ set -euo pipefail
which retool >/dev/null || go get -u github.com/twitchtv/retool which retool >/dev/null || go get -u github.com/twitchtv/retool
# This tool can run other checks in a standardized way # This tool can run other checks in a standardized way
retool add gopkg.in/alecthomas/gometalinter.v2 v2.0.5 retool add gopkg.in/alecthomas/gometalinter.v2 v2.0.11
# check spelling # check spelling
# misspell works with gometalinter # misspell works with gometalinter
......
...@@ -1016,68 +1016,68 @@ ...@@ -1016,68 +1016,68 @@
{ {
"checksumSHA1": "w8FCRjH70gM6QttB9QrEh9Y1x64=", "checksumSHA1": "w8FCRjH70gM6QttB9QrEh9Y1x64=",
"path": "vitess.io/vitess", "path": "vitess.io/vitess",
"revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", "revision": "44180fbce377cb4836348bb7880caa38808af817",
"revisionTime": "2018-10-21T20:32:27Z" "revisionTime": "2018-10-22T18:04:59Z"
}, },
{ {
"checksumSHA1": "aKn1oKcY74N8TRLm3Ayt7Q4bbI4=", "checksumSHA1": "aKn1oKcY74N8TRLm3Ayt7Q4bbI4=",
"path": "vitess.io/vitess/go/bytes2", "path": "vitess.io/vitess/go/bytes2",
"revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", "revision": "44180fbce377cb4836348bb7880caa38808af817",
"revisionTime": "2018-10-21T20:32:27Z" "revisionTime": "2018-10-22T18:04:59Z"
}, },
{ {
"checksumSHA1": "JVCEN4UGRmg3TofIBdzZMZ3G0Ww=", "checksumSHA1": "JVCEN4UGRmg3TofIBdzZMZ3G0Ww=",
"path": "vitess.io/vitess/go/hack", "path": "vitess.io/vitess/go/hack",
"revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", "revision": "44180fbce377cb4836348bb7880caa38808af817",
"revisionTime": "2018-10-21T20:32:27Z" "revisionTime": "2018-10-22T18:04:59Z"
}, },
{ {
"checksumSHA1": "L7ROM3XZyVXSD799Isv3bcFFhuQ=", "checksumSHA1": "L7ROM3XZyVXSD799Isv3bcFFhuQ=",
"path": "vitess.io/vitess/go/sqltypes", "path": "vitess.io/vitess/go/sqltypes",
"revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", "revision": "44180fbce377cb4836348bb7880caa38808af817",
"revisionTime": "2018-10-21T20:32:27Z" "revisionTime": "2018-10-22T18:04:59Z"
}, },
{ {
"checksumSHA1": "ntFIQYkBS51G6y+FEkjFW40+HOU=", "checksumSHA1": "ntFIQYkBS51G6y+FEkjFW40+HOU=",
"path": "vitess.io/vitess/go/vt/log", "path": "vitess.io/vitess/go/vt/log",
"revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", "revision": "44180fbce377cb4836348bb7880caa38808af817",
"revisionTime": "2018-10-21T20:32:27Z" "revisionTime": "2018-10-22T18:04:59Z"
}, },
{ {
"checksumSHA1": "+AyVYXW7XGu+R8AUNU0YY8DcE8k=", "checksumSHA1": "+AyVYXW7XGu+R8AUNU0YY8DcE8k=",
"path": "vitess.io/vitess/go/vt/proto/query", "path": "vitess.io/vitess/go/vt/proto/query",
"revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", "revision": "44180fbce377cb4836348bb7880caa38808af817",
"revisionTime": "2018-10-21T20:32:27Z" "revisionTime": "2018-10-22T18:04:59Z"
}, },
{ {
"checksumSHA1": "OnWsUHLDKcO3spwH0jD55SvKD24=", "checksumSHA1": "OnWsUHLDKcO3spwH0jD55SvKD24=",
"path": "vitess.io/vitess/go/vt/proto/topodata", "path": "vitess.io/vitess/go/vt/proto/topodata",
"revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", "revision": "44180fbce377cb4836348bb7880caa38808af817",
"revisionTime": "2018-10-21T20:32:27Z" "revisionTime": "2018-10-22T18:04:59Z"
}, },
{ {
"checksumSHA1": "jUgYgOnOM36Zs1GMRVV+vG1hfnw=", "checksumSHA1": "jUgYgOnOM36Zs1GMRVV+vG1hfnw=",
"path": "vitess.io/vitess/go/vt/proto/vtgate", "path": "vitess.io/vitess/go/vt/proto/vtgate",
"revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", "revision": "44180fbce377cb4836348bb7880caa38808af817",
"revisionTime": "2018-10-21T20:32:27Z" "revisionTime": "2018-10-22T18:04:59Z"
}, },
{ {
"checksumSHA1": "pLWM+SPGZs3k+IhjktE/cGUlpM0=", "checksumSHA1": "pLWM+SPGZs3k+IhjktE/cGUlpM0=",
"path": "vitess.io/vitess/go/vt/proto/vtrpc", "path": "vitess.io/vitess/go/vt/proto/vtrpc",
"revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", "revision": "44180fbce377cb4836348bb7880caa38808af817",
"revisionTime": "2018-10-21T20:32:27Z" "revisionTime": "2018-10-22T18:04:59Z"
}, },
{ {
"checksumSHA1": "LDXjimRADIzASesUnWUOJ6smswg=", "checksumSHA1": "LDXjimRADIzASesUnWUOJ6smswg=",
"path": "vitess.io/vitess/go/vt/sqlparser", "path": "vitess.io/vitess/go/vt/sqlparser",
"revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", "revision": "44180fbce377cb4836348bb7880caa38808af817",
"revisionTime": "2018-10-21T20:32:27Z" "revisionTime": "2018-10-22T18:04:59Z"
}, },
{ {
"checksumSHA1": "oF4XzuOzwvj1iduX/lYqNSyY/HM=", "checksumSHA1": "oF4XzuOzwvj1iduX/lYqNSyY/HM=",
"path": "vitess.io/vitess/go/vt/vterrors", "path": "vitess.io/vitess/go/vt/vterrors",
"revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", "revision": "44180fbce377cb4836348bb7880caa38808af817",
"revisionTime": "2018-10-21T20:32:27Z" "revisionTime": "2018-10-22T18:04:59Z"
} }
], ],
"rootPath": "github.com/XiaoMi/soar" "rootPath": "github.com/XiaoMi/soar"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册