未验证 提交 b98039eb 编写于 作者: martianzhang's avatar martianzhang 提交者: GitHub

Merge pull request #60 from liipx/master

fix #57 && sync vitess update
......@@ -205,7 +205,7 @@ func init() {
Severity: "L4",
Summary: "IN (NULL)/NOT IN (NULL)永远非真",
Content: "正确的作法是col IN ('val1', 'val2', 'val3') OR col IS NULL",
Case: "SELECT * FROM sakila.film WHERE length >= '60';",
Case: "SELECT * FROM tb WHERE col IN (NULL);",
Func: (*Query4Audit).RuleIn,
},
"ARG.005": {
......
......@@ -110,7 +110,7 @@ SELECT * FROM sakila.film WHERE length >= '60';
* **Case**:
```sql
SELECT * FROM sakila.film WHERE length >= '60';
SELECT * FROM tb WHERE col IN (NULL);
```
## IN要慎用,元素过多会导致全表扫描
......
......@@ -8,7 +8,7 @@ advisor.Rule{Item:"ALT.004", Severity:"L0", Summary:"删除主键和外键为高
advisor.Rule{Item:"ARG.001", Severity:"L4", Summary:"不建议使用前项通配符查找", Content:"例如“%foo”,查询参数有一个前项通配符的情况无法使用已有索引。", Case:"select c1,c2,c3 from tbl where name like '%foo'", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}}
advisor.Rule{Item:"ARG.002", Severity:"L1", Summary:"没有通配符的LIKE查询", Content:"不包含通配符的LIKE查询可能存在逻辑错误,因为逻辑上它与等值查询相同。", Case:"select c1,c2,c3 from tbl where name like 'foo'", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}}
advisor.Rule{Item:"ARG.003", Severity:"L4", Summary:"参数比较包含隐式转换,无法使用索引", Content:"隐式类型转换有无法命中索引的风险,在高并发、大数据量的情况下,命不中索引带来的后果非常严重。", Case:"SELECT * FROM sakila.film WHERE length >= '60';", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}}
advisor.Rule{Item:"ARG.004", Severity:"L4", Summary:"IN (NULL)/NOT IN (NULL)永远非真", Content:"正确的作法是col IN ('val1', 'val2', 'val3') OR col IS NULL", Case:"SELECT * FROM sakila.film WHERE length >= '60';", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}}
advisor.Rule{Item:"ARG.004", Severity:"L4", Summary:"IN (NULL)/NOT IN (NULL)永远非真", Content:"正确的作法是col IN ('val1', 'val2', 'val3') OR col IS NULL", Case:"SELECT * FROM tb WHERE col IN (NULL);", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}}
advisor.Rule{Item:"ARG.006", Severity:"L1", Summary:"应尽量避免在WHERE子句中对字段进行NULL值判断", Content:"使用IS NULL或IS NOT NULL将可能导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null;可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0;", Case:"select id from t where num is null", 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 {...}}
......
......@@ -110,7 +110,7 @@ SELECT * FROM sakila.film WHERE length >= '60';
* **Case**:
```sql
SELECT * FROM sakila.film WHERE length >= '60';
SELECT * FROM tb WHERE col IN (NULL);
```
## IN要慎用,元素过多会导致全表扫描
......
......@@ -1016,68 +1016,68 @@
{
"checksumSHA1": "w8FCRjH70gM6QttB9QrEh9Y1x64=",
"path": "vitess.io/vitess",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7",
"revisionTime": "2018-10-25T23:53:19Z"
"revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-29T04:28:01Z"
},
{
"checksumSHA1": "aKn1oKcY74N8TRLm3Ayt7Q4bbI4=",
"path": "vitess.io/vitess/go/bytes2",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7",
"revisionTime": "2018-10-25T23:53:19Z"
"revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-29T04:28:01Z"
},
{
"checksumSHA1": "JVCEN4UGRmg3TofIBdzZMZ3G0Ww=",
"path": "vitess.io/vitess/go/hack",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7",
"revisionTime": "2018-10-25T23:53:19Z"
"revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-29T04:28:01Z"
},
{
"checksumSHA1": "L7ROM3XZyVXSD799Isv3bcFFhuQ=",
"checksumSHA1": "yApy/qZmEZrjMB7ksmSgQCVfQCw=",
"path": "vitess.io/vitess/go/sqltypes",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7",
"revisionTime": "2018-10-25T23:53:19Z"
"revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-29T04:28:01Z"
},
{
"checksumSHA1": "ntFIQYkBS51G6y+FEkjFW40+HOU=",
"path": "vitess.io/vitess/go/vt/log",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7",
"revisionTime": "2018-10-25T23:53:19Z"
"revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-29T04:28:01Z"
},
{
"checksumSHA1": "+AyVYXW7XGu+R8AUNU0YY8DcE8k=",
"checksumSHA1": "XozR8bmeSR5KTe/nlUJkpJY2HKI=",
"path": "vitess.io/vitess/go/vt/proto/query",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7",
"revisionTime": "2018-10-25T23:53:19Z"
"revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-29T04:28:01Z"
},
{
"checksumSHA1": "OnWsUHLDKcO3spwH0jD55SvKD24=",
"path": "vitess.io/vitess/go/vt/proto/topodata",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7",
"revisionTime": "2018-10-25T23:53:19Z"
"revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-29T04:28:01Z"
},
{
"checksumSHA1": "jUgYgOnOM36Zs1GMRVV+vG1hfnw=",
"checksumSHA1": "sBAuZ/itMR8U8qbK4yLHxkP6Cpc=",
"path": "vitess.io/vitess/go/vt/proto/vtgate",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7",
"revisionTime": "2018-10-25T23:53:19Z"
"revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-29T04:28:01Z"
},
{
"checksumSHA1": "pLWM+SPGZs3k+IhjktE/cGUlpM0=",
"path": "vitess.io/vitess/go/vt/proto/vtrpc",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7",
"revisionTime": "2018-10-25T23:53:19Z"
"revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-29T04:28:01Z"
},
{
"checksumSHA1": "LDXjimRADIzASesUnWUOJ6smswg=",
"checksumSHA1": "az6gvy2kdu4o6RISiA1ox5VDncE=",
"path": "vitess.io/vitess/go/vt/sqlparser",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7",
"revisionTime": "2018-10-25T23:53:19Z"
"revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-29T04:28:01Z"
},
{
"checksumSHA1": "oF4XzuOzwvj1iduX/lYqNSyY/HM=",
"path": "vitess.io/vitess/go/vt/vterrors",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7",
"revisionTime": "2018-10-25T23:53:19Z"
"revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-29T04:28:01Z"
}
],
"rootPath": "github.com/XiaoMi/soar"
......
......@@ -110,6 +110,11 @@ func NewUint64(v uint64) Value {
return MakeTrusted(Uint64, strconv.AppendUint(nil, v, 10))
}
// NewUint32 builds an Uint32 Value.
func NewUint32(v uint32) Value {
return MakeTrusted(Uint32, strconv.AppendUint(nil, uint64(v), 10))
}
// NewFloat64 builds an Float64 Value.
func NewFloat64(v float64) Value {
return MakeTrusted(Float64, strconv.AppendFloat(nil, v, 'g', -1, 64))
......
......@@ -30,6 +30,8 @@ const (
DirectiveSkipQueryPlanCache = "SKIP_QUERY_PLAN_CACHE"
// DirectiveQueryTimeout sets a query timeout in vtgate. Only supported for SELECTS.
DirectiveQueryTimeout = "QUERY_TIMEOUT_MS"
// DirectiveScatterErrorsAsWarnings enables partial success scatter select queries
DirectiveScatterErrorsAsWarnings = "SCATTER_ERRORS_AS_WARNINGS"
)
func isNonSpace(r rune) bool {
......
......@@ -162,7 +162,7 @@ func forceEOF(yylex interface{}) {
%token <bytes> SHOW DESCRIBE EXPLAIN DATE ESCAPE REPAIR OPTIMIZE TRUNCATE
%token <bytes> MAXVALUE PARTITION REORGANIZE LESS THAN PROCEDURE TRIGGER
%token <bytes> VINDEX VINDEXES
%token <bytes> STATUS VARIABLES
%token <bytes> STATUS VARIABLES WARNINGS
// Transaction Tokens
%token <bytes> BEGIN START TRANSACTION COMMIT ROLLBACK
......@@ -1548,6 +1548,10 @@ show_statement:
{
$$ = &Show{Type: string($2)}
}
| SHOW WARNINGS
{
$$ = &Show{Type: string($2)}
}
/*
* Catch-all for show statements without vitess keywords:
*
......@@ -3169,7 +3173,6 @@ reserved_keyword:
| SHOW
| STRAIGHT_JOIN
| TABLE
| TABLES
| THEN
| TO
| TRUE
......@@ -3274,6 +3277,7 @@ non_reserved_keyword:
| SPATIAL
| START
| STATUS
| TABLES
| TEXT
| THAN
| TIME
......@@ -3298,6 +3302,7 @@ non_reserved_keyword:
| VITESS_TABLETS
| VSCHEMA_TABLES
| VITESS_TARGET
| WARNINGS
| WITH
| WRITE
| YEAR
......
......@@ -392,6 +392,7 @@ var keywords = map[string]int{
"vitess_tablets": VITESS_TABLETS,
"vitess_target": VITESS_TARGET,
"vschema_tables": VSCHEMA_TABLES,
"warnings": WARNINGS,
"when": WHEN,
"where": WHERE,
"while": UNUSED,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册