提交 9e2d2b6e 编写于 作者: L liipx

fix #57 && sync vitess update

上级 31ee2581
...@@ -205,7 +205,7 @@ func init() { ...@@ -205,7 +205,7 @@ func init() {
Severity: "L4", Severity: "L4",
Summary: "IN (NULL)/NOT IN (NULL)永远非真", Summary: "IN (NULL)/NOT IN (NULL)永远非真",
Content: "正确的作法是col IN ('val1', 'val2', 'val3') OR col IS 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, Func: (*Query4Audit).RuleIn,
}, },
"ARG.005": { "ARG.005": {
......
...@@ -110,7 +110,7 @@ SELECT * FROM sakila.film WHERE length >= '60'; ...@@ -110,7 +110,7 @@ SELECT * FROM sakila.film WHERE length >= '60';
* **Case**: * **Case**:
```sql ```sql
SELECT * FROM sakila.film WHERE length >= '60'; SELECT * FROM tb WHERE col IN (NULL);
``` ```
## IN要慎用,元素过多会导致全表扫描 ## IN要慎用,元素过多会导致全表扫描
......
...@@ -8,7 +8,7 @@ advisor.Rule{Item:"ALT.004", Severity:"L0", Summary:"删除主键和外键为高 ...@@ -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.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.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.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.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.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 {...}}
......
...@@ -110,7 +110,7 @@ SELECT * FROM sakila.film WHERE length >= '60'; ...@@ -110,7 +110,7 @@ SELECT * FROM sakila.film WHERE length >= '60';
* **Case**: * **Case**:
```sql ```sql
SELECT * FROM sakila.film WHERE length >= '60'; SELECT * FROM tb WHERE col IN (NULL);
``` ```
## IN要慎用,元素过多会导致全表扫描 ## IN要慎用,元素过多会导致全表扫描
......
...@@ -1016,68 +1016,68 @@ ...@@ -1016,68 +1016,68 @@
{ {
"checksumSHA1": "w8FCRjH70gM6QttB9QrEh9Y1x64=", "checksumSHA1": "w8FCRjH70gM6QttB9QrEh9Y1x64=",
"path": "vitess.io/vitess", "path": "vitess.io/vitess",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7", "revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-25T23:53:19Z" "revisionTime": "2018-10-29T04:28:01Z"
}, },
{ {
"checksumSHA1": "aKn1oKcY74N8TRLm3Ayt7Q4bbI4=", "checksumSHA1": "aKn1oKcY74N8TRLm3Ayt7Q4bbI4=",
"path": "vitess.io/vitess/go/bytes2", "path": "vitess.io/vitess/go/bytes2",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7", "revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-25T23:53:19Z" "revisionTime": "2018-10-29T04:28:01Z"
}, },
{ {
"checksumSHA1": "JVCEN4UGRmg3TofIBdzZMZ3G0Ww=", "checksumSHA1": "JVCEN4UGRmg3TofIBdzZMZ3G0Ww=",
"path": "vitess.io/vitess/go/hack", "path": "vitess.io/vitess/go/hack",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7", "revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-25T23:53:19Z" "revisionTime": "2018-10-29T04:28:01Z"
}, },
{ {
"checksumSHA1": "L7ROM3XZyVXSD799Isv3bcFFhuQ=", "checksumSHA1": "yApy/qZmEZrjMB7ksmSgQCVfQCw=",
"path": "vitess.io/vitess/go/sqltypes", "path": "vitess.io/vitess/go/sqltypes",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7", "revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-25T23:53:19Z" "revisionTime": "2018-10-29T04:28:01Z"
}, },
{ {
"checksumSHA1": "ntFIQYkBS51G6y+FEkjFW40+HOU=", "checksumSHA1": "ntFIQYkBS51G6y+FEkjFW40+HOU=",
"path": "vitess.io/vitess/go/vt/log", "path": "vitess.io/vitess/go/vt/log",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7", "revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-25T23:53:19Z" "revisionTime": "2018-10-29T04:28:01Z"
}, },
{ {
"checksumSHA1": "+AyVYXW7XGu+R8AUNU0YY8DcE8k=", "checksumSHA1": "XozR8bmeSR5KTe/nlUJkpJY2HKI=",
"path": "vitess.io/vitess/go/vt/proto/query", "path": "vitess.io/vitess/go/vt/proto/query",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7", "revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-25T23:53:19Z" "revisionTime": "2018-10-29T04:28:01Z"
}, },
{ {
"checksumSHA1": "OnWsUHLDKcO3spwH0jD55SvKD24=", "checksumSHA1": "OnWsUHLDKcO3spwH0jD55SvKD24=",
"path": "vitess.io/vitess/go/vt/proto/topodata", "path": "vitess.io/vitess/go/vt/proto/topodata",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7", "revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-25T23:53:19Z" "revisionTime": "2018-10-29T04:28:01Z"
}, },
{ {
"checksumSHA1": "jUgYgOnOM36Zs1GMRVV+vG1hfnw=", "checksumSHA1": "sBAuZ/itMR8U8qbK4yLHxkP6Cpc=",
"path": "vitess.io/vitess/go/vt/proto/vtgate", "path": "vitess.io/vitess/go/vt/proto/vtgate",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7", "revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-25T23:53:19Z" "revisionTime": "2018-10-29T04:28:01Z"
}, },
{ {
"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": "1520d4c736d48e4c3988d33345188abe497e17d7", "revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-25T23:53:19Z" "revisionTime": "2018-10-29T04:28:01Z"
}, },
{ {
"checksumSHA1": "LDXjimRADIzASesUnWUOJ6smswg=", "checksumSHA1": "az6gvy2kdu4o6RISiA1ox5VDncE=",
"path": "vitess.io/vitess/go/vt/sqlparser", "path": "vitess.io/vitess/go/vt/sqlparser",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7", "revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-25T23:53:19Z" "revisionTime": "2018-10-29T04:28:01Z"
}, },
{ {
"checksumSHA1": "oF4XzuOzwvj1iduX/lYqNSyY/HM=", "checksumSHA1": "oF4XzuOzwvj1iduX/lYqNSyY/HM=",
"path": "vitess.io/vitess/go/vt/vterrors", "path": "vitess.io/vitess/go/vt/vterrors",
"revision": "1520d4c736d48e4c3988d33345188abe497e17d7", "revision": "edaead80d2579c241ae292c70a69d1f526ceeba8",
"revisionTime": "2018-10-25T23:53:19Z" "revisionTime": "2018-10-29T04:28:01Z"
} }
], ],
"rootPath": "github.com/XiaoMi/soar" "rootPath": "github.com/XiaoMi/soar"
......
...@@ -110,6 +110,11 @@ func NewUint64(v uint64) Value { ...@@ -110,6 +110,11 @@ func NewUint64(v uint64) Value {
return MakeTrusted(Uint64, strconv.AppendUint(nil, v, 10)) 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. // NewFloat64 builds an Float64 Value.
func NewFloat64(v float64) Value { func NewFloat64(v float64) Value {
return MakeTrusted(Float64, strconv.AppendFloat(nil, v, 'g', -1, 64)) return MakeTrusted(Float64, strconv.AppendFloat(nil, v, 'g', -1, 64))
......
...@@ -30,6 +30,8 @@ const ( ...@@ -30,6 +30,8 @@ const (
DirectiveSkipQueryPlanCache = "SKIP_QUERY_PLAN_CACHE" DirectiveSkipQueryPlanCache = "SKIP_QUERY_PLAN_CACHE"
// DirectiveQueryTimeout sets a query timeout in vtgate. Only supported for SELECTS. // DirectiveQueryTimeout sets a query timeout in vtgate. Only supported for SELECTS.
DirectiveQueryTimeout = "QUERY_TIMEOUT_MS" DirectiveQueryTimeout = "QUERY_TIMEOUT_MS"
// DirectiveScatterErrorsAsWarnings enables partial success scatter select queries
DirectiveScatterErrorsAsWarnings = "SCATTER_ERRORS_AS_WARNINGS"
) )
func isNonSpace(r rune) bool { func isNonSpace(r rune) bool {
......
...@@ -162,7 +162,7 @@ func forceEOF(yylex interface{}) { ...@@ -162,7 +162,7 @@ func forceEOF(yylex interface{}) {
%token <bytes> SHOW DESCRIBE EXPLAIN DATE ESCAPE REPAIR OPTIMIZE TRUNCATE %token <bytes> SHOW DESCRIBE EXPLAIN DATE ESCAPE REPAIR OPTIMIZE TRUNCATE
%token <bytes> MAXVALUE PARTITION REORGANIZE LESS THAN PROCEDURE TRIGGER %token <bytes> MAXVALUE PARTITION REORGANIZE LESS THAN PROCEDURE TRIGGER
%token <bytes> VINDEX VINDEXES %token <bytes> VINDEX VINDEXES
%token <bytes> STATUS VARIABLES %token <bytes> STATUS VARIABLES WARNINGS
// Transaction Tokens // Transaction Tokens
%token <bytes> BEGIN START TRANSACTION COMMIT ROLLBACK %token <bytes> BEGIN START TRANSACTION COMMIT ROLLBACK
...@@ -1548,6 +1548,10 @@ show_statement: ...@@ -1548,6 +1548,10 @@ show_statement:
{ {
$$ = &Show{Type: string($2)} $$ = &Show{Type: string($2)}
} }
| SHOW WARNINGS
{
$$ = &Show{Type: string($2)}
}
/* /*
* Catch-all for show statements without vitess keywords: * Catch-all for show statements without vitess keywords:
* *
...@@ -3169,7 +3173,6 @@ reserved_keyword: ...@@ -3169,7 +3173,6 @@ reserved_keyword:
| SHOW | SHOW
| STRAIGHT_JOIN | STRAIGHT_JOIN
| TABLE | TABLE
| TABLES
| THEN | THEN
| TO | TO
| TRUE | TRUE
...@@ -3274,6 +3277,7 @@ non_reserved_keyword: ...@@ -3274,6 +3277,7 @@ non_reserved_keyword:
| SPATIAL | SPATIAL
| START | START
| STATUS | STATUS
| TABLES
| TEXT | TEXT
| THAN | THAN
| TIME | TIME
...@@ -3298,6 +3302,7 @@ non_reserved_keyword: ...@@ -3298,6 +3302,7 @@ non_reserved_keyword:
| VITESS_TABLETS | VITESS_TABLETS
| VSCHEMA_TABLES | VSCHEMA_TABLES
| VITESS_TARGET | VITESS_TARGET
| WARNINGS
| WITH | WITH
| WRITE | WRITE
| YEAR | YEAR
......
...@@ -392,6 +392,7 @@ var keywords = map[string]int{ ...@@ -392,6 +392,7 @@ var keywords = map[string]int{
"vitess_tablets": VITESS_TABLETS, "vitess_tablets": VITESS_TABLETS,
"vitess_target": VITESS_TARGET, "vitess_target": VITESS_TARGET,
"vschema_tables": VSCHEMA_TABLES, "vschema_tables": VSCHEMA_TABLES,
"warnings": WARNINGS,
"when": WHEN, "when": WHEN,
"where": WHERE, "where": WHERE,
"while": UNUSED, "while": UNUSED,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册