diff --git a/advisor/rules.go b/advisor/rules.go index ab2775afce4e6c6ca7d8f0e823ee32198bfc88f2..c1ff9b9c0ab9ea73f97db365d6e4606d931ec9b6 100644 --- a/advisor/rules.go +++ b/advisor/rules.go @@ -881,7 +881,7 @@ func init() { Item: "RES.005", Severity: "L4", Summary: "UPDATE可能存在逻辑错误,导致数据损坏", - Content: "", + Content: "在一条UPDATE语句中,如果要更新多个字段,字段间不能使用 AND ,而应该用逗号分隔。", Case: "update tbl set col = 1 and cl = 2 where col=3;", Func: (*Query4Audit).RuleUpdateSetAnd, }, diff --git a/advisor/testdata/TestListHeuristicRules.golden b/advisor/testdata/TestListHeuristicRules.golden index 9c3d169035612bb137eb779d8496daff4d49bfad..2a03fab09cafa69491c687598ba4446214a182d1 100644 --- a/advisor/testdata/TestListHeuristicRules.golden +++ b/advisor/testdata/TestListHeuristicRules.golden @@ -916,7 +916,7 @@ UPDATE film SET length = 120 WHERE title = 'abc' ORDER BY title * **Item**:RES.005 * **Severity**:L4 -* **Content**: +* **Content**:在一条UPDATE语句中,如果要更新多个字段,字段间不能使用 AND ,而应该用逗号分隔。 * **Case**: ```sql diff --git a/advisor/testdata/TestMergeConflictHeuristicRules.golden b/advisor/testdata/TestMergeConflictHeuristicRules.golden index e2c1e87ae1abe7e1ed1b41016467f2b353a9a4c0..d7d2ce08aa0d2432efd42472d4b0f7f081976b28 100644 --- a/advisor/testdata/TestMergeConflictHeuristicRules.golden +++ b/advisor/testdata/TestMergeConflictHeuristicRules.golden @@ -86,7 +86,7 @@ advisor.Rule{Item:"RES.001", Severity:"L4", Summary:"非确定性的GROUP BY", C advisor.Rule{Item:"RES.002", Severity:"L4", Summary:"未使用ORDER BY的LIMIT查询", Content:"没有ORDER BY的LIMIT会导致非确定性的结果,这取决于查询执行计划。", Case:"select col1,col2 from tbl where name=xx limit 10", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"RES.003", Severity:"L4", Summary:"UPDATE/DELETE操作使用了LIMIT条件", Content:"UPDATE/DELETE操作使用LIMIT条件和不添加WHERE条件一样危险,它可将会导致主从数据不一致或从库同步中断。", Case:"UPDATE film SET length = 120 WHERE title = 'abc' LIMIT 1;", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"RES.004", Severity:"L4", Summary:"UPDATE/DELETE操作指定了ORDER BY条件", Content:"UPDATE/DELETE操作不要指定ORDER BY条件。", Case:"UPDATE film SET length = 120 WHERE title = 'abc' ORDER BY title", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} -advisor.Rule{Item:"RES.005", Severity:"L4", Summary:"UPDATE可能存在逻辑错误,导致数据损坏", Content:"", Case:"update tbl set col = 1 and cl = 2 where col=3;", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} +advisor.Rule{Item:"RES.005", Severity:"L4", Summary:"UPDATE可能存在逻辑错误,导致数据损坏", Content:"在一条UPDATE语句中,如果要更新多个字段,字段间不能使用 AND ,而应该用逗号分隔。", Case:"update tbl set col = 1 and cl = 2 where col=3;", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"RES.006", Severity:"L4", Summary:"永远不真的比较条件", Content:"查询条件永远非真,这将导致查询无匹配到的结果。", Case:"select * from tbl where 1 != 1;", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"RES.007", Severity:"L4", Summary:"永远为真的比较条件", Content:"查询条件永远为真,这将导致WHERE条件失效进行全表查询。", Case:"select * from tbl where 1 = 1;", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"RES.008", Severity:"L2", Summary:"不建议使用LOAD DATA/SELECT ... INTO OUTFILE", Content:"SELECT INTO OUTFILE需要授予FILE权限,这通过会引入安全问题。LOAD DATA虽然可以提高数据导入速度,但同时也可能导致从库同步延迟过大。", Case:"LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} diff --git a/doc/heuristic.md b/doc/heuristic.md index 9c3d169035612bb137eb779d8496daff4d49bfad..2a03fab09cafa69491c687598ba4446214a182d1 100644 --- a/doc/heuristic.md +++ b/doc/heuristic.md @@ -916,7 +916,7 @@ UPDATE film SET length = 120 WHERE title = 'abc' ORDER BY title * **Item**:RES.005 * **Severity**:L4 -* **Content**: +* **Content**:在一条UPDATE语句中,如果要更新多个字段,字段间不能使用 AND ,而应该用逗号分隔。 * **Case**: ```sql diff --git a/vendor/vendor.json b/vendor/vendor.json index 5389605c9fb779d54f6ecbd457359163bba18d0e..64fb2dbceb0a2a5dd4ba3a72e7cfea1cdaf3885b 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -1016,68 +1016,68 @@ { "checksumSHA1": "w8FCRjH70gM6QttB9QrEh9Y1x64=", "path": "vitess.io/vitess", - "revision": "3dc3648303ff7f553dc3c90fbc87e0709acf08f0", - "revisionTime": "2018-11-14T14:39:22Z" + "revision": "5b3aedd79bd1488060ae5c0551b31685892c6eed", + "revisionTime": "2018-11-14T21:08:06Z" }, { "checksumSHA1": "aKn1oKcY74N8TRLm3Ayt7Q4bbI4=", "path": "vitess.io/vitess/go/bytes2", - "revision": "3dc3648303ff7f553dc3c90fbc87e0709acf08f0", - "revisionTime": "2018-11-14T14:39:22Z" + "revision": "5b3aedd79bd1488060ae5c0551b31685892c6eed", + "revisionTime": "2018-11-14T21:08:06Z" }, { "checksumSHA1": "JVCEN4UGRmg3TofIBdzZMZ3G0Ww=", "path": "vitess.io/vitess/go/hack", - "revision": "3dc3648303ff7f553dc3c90fbc87e0709acf08f0", - "revisionTime": "2018-11-14T14:39:22Z" + "revision": "5b3aedd79bd1488060ae5c0551b31685892c6eed", + "revisionTime": "2018-11-14T21:08:06Z" }, { "checksumSHA1": "e1WJ7vCnVrlQQQlc6n/FewCDMso=", "path": "vitess.io/vitess/go/sqltypes", - "revision": "3dc3648303ff7f553dc3c90fbc87e0709acf08f0", - "revisionTime": "2018-11-14T14:39:22Z" + "revision": "5b3aedd79bd1488060ae5c0551b31685892c6eed", + "revisionTime": "2018-11-14T21:08:06Z" }, { "checksumSHA1": "ntFIQYkBS51G6y+FEkjFW40+HOU=", "path": "vitess.io/vitess/go/vt/log", - "revision": "3dc3648303ff7f553dc3c90fbc87e0709acf08f0", - "revisionTime": "2018-11-14T14:39:22Z" + "revision": "5b3aedd79bd1488060ae5c0551b31685892c6eed", + "revisionTime": "2018-11-14T21:08:06Z" }, { "checksumSHA1": "XozR8bmeSR5KTe/nlUJkpJY2HKI=", "path": "vitess.io/vitess/go/vt/proto/query", - "revision": "3dc3648303ff7f553dc3c90fbc87e0709acf08f0", - "revisionTime": "2018-11-14T14:39:22Z" + "revision": "5b3aedd79bd1488060ae5c0551b31685892c6eed", + "revisionTime": "2018-11-14T21:08:06Z" }, { "checksumSHA1": "OnWsUHLDKcO3spwH0jD55SvKD24=", "path": "vitess.io/vitess/go/vt/proto/topodata", - "revision": "3dc3648303ff7f553dc3c90fbc87e0709acf08f0", - "revisionTime": "2018-11-14T14:39:22Z" + "revision": "5b3aedd79bd1488060ae5c0551b31685892c6eed", + "revisionTime": "2018-11-14T21:08:06Z" }, { "checksumSHA1": "sBAuZ/itMR8U8qbK4yLHxkP6Cpc=", "path": "vitess.io/vitess/go/vt/proto/vtgate", - "revision": "3dc3648303ff7f553dc3c90fbc87e0709acf08f0", - "revisionTime": "2018-11-14T14:39:22Z" + "revision": "5b3aedd79bd1488060ae5c0551b31685892c6eed", + "revisionTime": "2018-11-14T21:08:06Z" }, { "checksumSHA1": "pLWM+SPGZs3k+IhjktE/cGUlpM0=", "path": "vitess.io/vitess/go/vt/proto/vtrpc", - "revision": "3dc3648303ff7f553dc3c90fbc87e0709acf08f0", - "revisionTime": "2018-11-14T14:39:22Z" + "revision": "5b3aedd79bd1488060ae5c0551b31685892c6eed", + "revisionTime": "2018-11-14T21:08:06Z" }, { "checksumSHA1": "3ggEFYVEhMPxyhkKhRGw3x1eZ9M=", "path": "vitess.io/vitess/go/vt/sqlparser", - "revision": "3dc3648303ff7f553dc3c90fbc87e0709acf08f0", - "revisionTime": "2018-11-14T14:39:22Z" + "revision": "5b3aedd79bd1488060ae5c0551b31685892c6eed", + "revisionTime": "2018-11-14T21:08:06Z" }, { "checksumSHA1": "oF4XzuOzwvj1iduX/lYqNSyY/HM=", "path": "vitess.io/vitess/go/vt/vterrors", - "revision": "3dc3648303ff7f553dc3c90fbc87e0709acf08f0", - "revisionTime": "2018-11-14T14:39:22Z" + "revision": "5b3aedd79bd1488060ae5c0551b31685892c6eed", + "revisionTime": "2018-11-14T21:08:06Z" } ], "rootPath": "github.com/XiaoMi/soar"