diff --git a/advisor/heuristic.go b/advisor/heuristic.go index 4262cb54f6527fed9de89f0e5b70565421c9f364..3efb1b42978ea3b922b89435c286c6694f758145 100644 --- a/advisor/heuristic.go +++ b/advisor/heuristic.go @@ -2185,8 +2185,8 @@ func (q *Query4Audit) RuleCompareWithFunction() Rule { } */ - // func(a) between func(c) and func(d) case *sqlparser.RangeCond: + // func(a) between func(c) and func(d) switch n.Left.(type) { case *sqlparser.SQLVal, *sqlparser.ColName: default: @@ -3231,12 +3231,12 @@ func RuleMySQLError(item string, err error) Rule { ErrString string } - // vitess 语法检查出错返回的是ERR.000 + // tidb parser 语法检查出错返回的是ERR.000 switch item { case "ERR.000": return Rule{ Item: item, - Summary: "MySQL执行出错 " + err.Error(), + Summary: "No available MySQL environment, build-in sql parse failed: " + err.Error(), Severity: "L8", Content: err.Error(), } @@ -3270,14 +3270,14 @@ func RuleMySQLError(item string, err error) Rule { case "", "1146": return Rule{ Item: item, - Summary: "MySQL执行出错", + Summary: "MySQL execute failed: ", Severity: "L0", Content: "", } default: return Rule{ Item: item, - Summary: "MySQL执行出错 " + mysqlError.ErrString, + Summary: "MySQL execute failed: " + mysqlError.ErrString, Severity: "L8", Content: mysqlError.ErrString, } diff --git a/advisor/heuristic_test.go b/advisor/heuristic_test.go index 81e7920a668d18e7374de9e7f0898eda8dedd603..6c0be851cc2d4e103ce9593d62cd21635a1dda42 100644 --- a/advisor/heuristic_test.go +++ b/advisor/heuristic_test.go @@ -1164,7 +1164,7 @@ func TestRuleRecursiveDependency(t *testing.T) { `ALTER TABLE tbl2 add FOREIGN KEY (p_id) REFERENCES tab1(p_id);`, }, { - `ALTER TABLE tbl2 ADD KEY (p_id) p_id;`, + `ALTER TABLE tbl2 ADD KEY p_id (p_id);`, }, } for _, sql := range sqls[0] { @@ -2128,7 +2128,7 @@ func TestRuleVarcharVSChar(t *testing.T) { func TestRuleCreateDualTable(t *testing.T) { common.Log.Debug("Entering function: %s", common.GetFunctionName()) sqls := []string{ - `create table dual(id int, primary key (id));`, + "create table `dual`(id int, primary key (id));", } for _, sql := range sqls { q, err := NewQuery4Audit(sql) diff --git a/advisor/rules.go b/advisor/rules.go index beadb79a69afb20b481809d4f67438c400930f8e..b5d080ba6ebf771a2b38f872b9cfd1c8bd4fb914 100644 --- a/advisor/rules.go +++ b/advisor/rules.go @@ -42,7 +42,7 @@ type Query4Audit struct { // NewQuery4Audit return a struct for Query4Audit func NewQuery4Audit(sql string, options ...string) (*Query4Audit, error) { - var err, tiErr error + var err, vErr error var charset string var collation string @@ -55,15 +55,15 @@ func NewQuery4Audit(sql string, options ...string) (*Query4Audit, error) { } q := &Query4Audit{Query: sql} - // vitess语法解析 - q.Stmt, err = sqlparser.Parse(sql) + // vitess 语法解析不上报,以 tidb parser 为主 + q.Stmt, vErr = sqlparser.Parse(sql) + if vErr != nil { + common.Log.Warn("NewQuery4Audit vitess parse Error: %s", vErr.Error()) + } - // TiDB 语法解析仅作为补充,不检查语法错误 // TODO: charset, collation - q.TiStmt, tiErr = ast.TiParse(sql, charset, collation) - if tiErr != nil { - common.Log.Warn("NewQuery4Audit ast.Tiparse Error: %s", tiErr.Error()) - } + // tdib parser 语法解析 + q.TiStmt, err = ast.TiParse(sql, charset, collation) return q, err } @@ -1205,7 +1205,7 @@ func FormatSuggest(sql string, format string, suggests ...map[string]Rule) (map[ } sort.Strings(sortedMySQLSuggest) if len(sortedMySQLSuggest) > 0 { - buf = append(buf, "## MySQL执行出错\n") + buf = append(buf, "## MySQL execute failed\n") } for _, item := range sortedMySQLSuggest { buf = append(buf, fmt.Sprintln(suggest[item].Content)) diff --git a/cmd/soar/soar.go b/cmd/soar/soar.go index e8e7783d72f1d6d0e32ade88b2335f62d02a1487..15c3678527d875a574c2abdbbdc5c0c3a50d1fb7 100644 --- a/cmd/soar/soar.go +++ b/cmd/soar/soar.go @@ -202,7 +202,7 @@ func main() { if !common.Config.DryRun { os.Exit(1) } - // vitess 语法检查给出的建议 ERR.000 + // tidb parser 语法检查给出的建议 ERR.000 if common.Config.TestDSN.Disable { mysqlSuggest["ERR.000"] = advisor.RuleMySQLError("ERR.000", syntaxErr) } diff --git a/doc/FAQ.md b/doc/FAQ.md index 58cb4a2462be808bd4ecf93aace377a62bbab533..5c2c5be2a8d64185101b34059ebd8776c366731f 100644 --- a/doc/FAQ.md +++ b/doc/FAQ.md @@ -9,6 +9,12 @@ * [mysql](https://www.mysql.com/) 测试时用来连接测试环境 * [retool](https://github.com/twitchtv/retool): 管理测试开发工具,首次安装耗时会比较长,如: `gometalinter.v2`, `revive`, `golangci-lint` +## Web 界面支持 + +官方不会提供 Web 界面支持,但社区已经有相当多的同学基于 SOAR 开发了衍生的 Web 平台。可以参考如下 ISSUE 的讨论。 + +> https://github.com/XiaoMi/soar/issues/51 + ## 命令行参数 `test-dsn`, `online-dsn` 中包含特殊字符怎么办? 如果 `test-dsn` 或 `online-dsn` 中包含':', '@', '/', '!'等特殊字符建议在配置文件中配置相关信息,配置文件为YAML格式,需要遵守YAML格式的要求规范。