From 7c812ec60a38224b1a46d19f65efd67189bc2f10 Mon Sep 17 00:00:00 2001 From: Leon Zhang Date: Tue, 23 Oct 2018 12:50:09 +0800 Subject: [PATCH] fix #18, #20 1. ARG.010 wrong case 2. update gometalinter to 2.0.11 latest version --- advisor/heuristic.go | 1 + advisor/heuristic_test.go | 2 +- advisor/rules.go | 4 +- .../testdata/TestListHeuristicRules.golden | 4 +- .../TestMergeConflictHeuristicRules.golden | 2 +- doc/heuristic.md | 4 +- retool-install.sh | 2 +- vendor/vendor.json | 44 +++++++++---------- 8 files changed, 32 insertions(+), 31 deletions(-) diff --git a/advisor/heuristic.go b/advisor/heuristic.go index ac822a2..c999ffd 100644 --- a/advisor/heuristic.go +++ b/advisor/heuristic.go @@ -2044,6 +2044,7 @@ func (q *Query4Audit) RuleSpaceWithQuote() Rule { } // RuleHint ARG.010 +// TODO: sql_no_cache, straight join func (q *Query4Audit) RuleHint() Rule { var rule = q.RuleOK() err := sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { diff --git a/advisor/heuristic_test.go b/advisor/heuristic_test.go index 7366c45..be14632 100644 --- a/advisor/heuristic_test.go +++ b/advisor/heuristic_test.go @@ -1731,7 +1731,7 @@ func TestRuleHint(t *testing.T) { { `SELECT * FROM t1 USE INDEX (i1) ORDER BY a;`, `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) IGNORE INDEX (i2) USE INDEX (i2);`, }, diff --git a/advisor/rules.go b/advisor/rules.go index 97a60e8..3190bea 100644 --- a/advisor/rules.go +++ b/advisor/rules.go @@ -251,9 +251,9 @@ func init() { "ARG.010": { Item: "ARG.010", 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按照某个执行计划来执行,但随着数据量变化我们无法保证自己当初的预判是正确的。`, - Case: "SELECT 'abc '", + Case: "SELECT * FROM t1 USE INDEX (i1) ORDER BY a;", Func: (*Query4Audit).RuleHint, }, "ARG.011": { diff --git a/advisor/testdata/TestListHeuristicRules.golden b/advisor/testdata/TestListHeuristicRules.golden index 1e93d48..c9cfef4 100644 --- a/advisor/testdata/TestListHeuristicRules.golden +++ b/advisor/testdata/TestListHeuristicRules.golden @@ -162,7 +162,7 @@ SELECT c1,c2,c3 FROM tbl WHERE c1 = 14 OR c1 = 17 ```sql 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 * **Severity**:L1 @@ -170,7 +170,7 @@ SELECT 'abc ' * **Case**: ```sql -SELECT 'abc ' +SELECT * FROM t1 USE INDEX (i1) ORDER BY a; ``` ## 不要使用负向查询,如:NOT IN/NOT LIKE diff --git a/advisor/testdata/TestMergeConflictHeuristicRules.golden b/advisor/testdata/TestMergeConflictHeuristicRules.golden index 9023265..47233e5 100644 --- a/advisor/testdata/TestMergeConflictHeuristicRules.golden +++ b/advisor/testdata/TestMergeConflictHeuristicRules.golden @@ -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.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.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:"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 {...}} diff --git a/doc/heuristic.md b/doc/heuristic.md index 1e93d48..c9cfef4 100644 --- a/doc/heuristic.md +++ b/doc/heuristic.md @@ -162,7 +162,7 @@ SELECT c1,c2,c3 FROM tbl WHERE c1 = 14 OR c1 = 17 ```sql 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 * **Severity**:L1 @@ -170,7 +170,7 @@ SELECT 'abc ' * **Case**: ```sql -SELECT 'abc ' +SELECT * FROM t1 USE INDEX (i1) ORDER BY a; ``` ## 不要使用负向查询,如:NOT IN/NOT LIKE diff --git a/retool-install.sh b/retool-install.sh index 23e441e..877ef91 100755 --- a/retool-install.sh +++ b/retool-install.sh @@ -6,7 +6,7 @@ set -euo pipefail which retool >/dev/null || go get -u github.com/twitchtv/retool # 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 # misspell works with gometalinter diff --git a/vendor/vendor.json b/vendor/vendor.json index d9d7d93..b0537c0 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -1016,68 +1016,68 @@ { "checksumSHA1": "w8FCRjH70gM6QttB9QrEh9Y1x64=", "path": "vitess.io/vitess", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "aKn1oKcY74N8TRLm3Ayt7Q4bbI4=", "path": "vitess.io/vitess/go/bytes2", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "JVCEN4UGRmg3TofIBdzZMZ3G0Ww=", "path": "vitess.io/vitess/go/hack", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "L7ROM3XZyVXSD799Isv3bcFFhuQ=", "path": "vitess.io/vitess/go/sqltypes", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "ntFIQYkBS51G6y+FEkjFW40+HOU=", "path": "vitess.io/vitess/go/vt/log", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "+AyVYXW7XGu+R8AUNU0YY8DcE8k=", "path": "vitess.io/vitess/go/vt/proto/query", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "OnWsUHLDKcO3spwH0jD55SvKD24=", "path": "vitess.io/vitess/go/vt/proto/topodata", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "jUgYgOnOM36Zs1GMRVV+vG1hfnw=", "path": "vitess.io/vitess/go/vt/proto/vtgate", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "pLWM+SPGZs3k+IhjktE/cGUlpM0=", "path": "vitess.io/vitess/go/vt/proto/vtrpc", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "LDXjimRADIzASesUnWUOJ6smswg=", "path": "vitess.io/vitess/go/vt/sqlparser", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "oF4XzuOzwvj1iduX/lYqNSyY/HM=", "path": "vitess.io/vitess/go/vt/vterrors", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" } ], "rootPath": "github.com/XiaoMi/soar" -- GitLab