diff --git a/ast/rewrite.go b/ast/rewrite.go index 38dc5b2ac014057bc88fdaf3050f7376ed577a8c..ff2d323495d1454f2d9e55f23b2545f0f61a35bb 100644 --- a/ast/rewrite.go +++ b/ast/rewrite.go @@ -20,6 +20,7 @@ import ( "bytes" "encoding/json" "fmt" + "github.com/pingcap/parser/ast" "reflect" "regexp" "strings" @@ -1691,17 +1692,39 @@ func MergeAlterTables(sqls ...string) map[string]string { for _, sql := range sqls { sql = strings.Trim(sql, common.Config.Delimiter) - stmt, _ := sqlparser.Parse(sql) + stmts, err := TiParse(sql, "", "") + if err != nil { + common.Log.Warn(err.Error()) + continue + } + // stmt, _ := sqlparser.Parse(sql) alterSQL := "" dbName := "" tableName := "" - switch n := stmt.(type) { - case *sqlparser.DDL: - // 注意: 表名和库名不区分大小写 - tableName = strings.ToLower(n.Table.Name.String()) - dbName = strings.ToLower(n.Table.Qualifier.String()) - switch n.Action { - case "rename": + for _, stmt := range stmts { + switch n := stmt.(type) { + case *ast.AlterTableStmt: + // 注意: 表名和库名不区分大小写 + tableName = n.Table.Name.L + dbName = n.Table.Schema.L + if alterExp.MatchString(sql) { + common.Log.Debug("rename alterExp: ALTER %v %v", tableName, alterExp.ReplaceAllString(sql, "")) + alterSQL = fmt.Sprint(alterExp.ReplaceAllString(sql, "")) + } + case *ast.CreateIndexStmt: + tableName = n.Table.Name.L + dbName = n.Table.Schema.L + + buf := createIndexExp.ReplaceAllString(sql, "") + idxName := strings.TrimSpace(indexNameExp.FindString(buf)) + buf = string([]byte(buf)[strings.Index(buf, "("):]) + common.Log.Error(buf) + common.Log.Debug("alter createIndexExp: ALTER %v ADD INDEX %v %v", tableName, "ADD INDEX", idxName, buf) + alterSQL = fmt.Sprint("ADD INDEX", " "+idxName+" ", buf) + case *ast.RenameTableStmt: + // 注意: 表名和库名不区分大小写 + tableName = n.OldTable.Name.L + dbName = n.OldTable.Schema.L if alterExp.MatchString(sql) { common.Log.Debug("rename alterExp: ALTER %v %v", tableName, alterExp.ReplaceAllString(sql, "")) alterSQL = fmt.Sprint(alterExp.ReplaceAllString(sql, "")) @@ -1711,22 +1734,10 @@ func MergeAlterTables(sqls ...string) map[string]string { } else { common.Log.Warn("rename not match: ALTER %v %v", tableName, sql) } - case "alter": - if alterExp.MatchString(sql) { - common.Log.Debug("rename alterExp: ALTER %v %v", tableName, alterExp.ReplaceAllString(sql, "")) - alterSQL = fmt.Sprint(alterExp.ReplaceAllString(sql, "")) - } else if createIndexExp.MatchString(sql) { - buf := createIndexExp.ReplaceAllString(sql, "") - idxName := strings.TrimSpace(indexNameExp.FindString(buf)) - buf = string([]byte(buf)[strings.Index(buf, "("):]) - common.Log.Error(buf) - common.Log.Debug("alter createIndexExp: ALTER %v ADD INDEX %v %v", tableName, "ADD INDEX", idxName, buf) - alterSQL = fmt.Sprint("ADD INDEX", " "+idxName+" ", buf) - } default: - } } + if alterSQL != "" && tableName != "" && tableName != "dual" { if dbName == "" { alterSQLs["`"+tableName+"`"] = append(alterSQLs["`"+tableName+"`"], alterSQL) diff --git a/ast/rewrite_test.go b/ast/rewrite_test.go index ac5ca8d50233d338cf508a906b7ee67ffb2a1038..3cd8b18e716596d97a9663e99d9a274e98c2142b 100644 --- a/ast/rewrite_test.go +++ b/ast/rewrite_test.go @@ -660,7 +660,7 @@ func TestMergeAlterTables(t *testing.T) { // table name quote in back ticks "alter table `t3`add index `idx_a`(a)", - "alter table`t3`drop index`idx_b`(b)", + "alter table`t3`drop index`idx_b`", } alterSQLs := MergeAlterTables(sqls...) diff --git a/ast/testdata/TestMergeAlterTables.golden b/ast/testdata/TestMergeAlterTables.golden index d82b3c9a3be1249b39b2c130dbc12a649d06f37d..a8a0ff2ecd4f15bc28218eb6cc16bf2237da091a 100644 --- a/ast/testdata/TestMergeAlterTables.golden +++ b/ast/testdata/TestMergeAlterTables.golden @@ -1,12 +1,16 @@ `customer` : ALTER TABLE `customer` ADD INDEX part_of_name (name(10)) ; +`db`.`old_table` : ALTER TABLE `db`.`old_table` RENAME new_table ; + +`old_table` : ALTER TABLE `old_table` RENAME TO new_table, RENAME AS new_table ; + `sakila`.`t1` : ALTER TABLE `sakila`.`t1` add index `idx_col`(`col`), add UNIQUE index `idx_col`(`col`), add index `idx_ID`(`ID`) ; -`t1` : ALTER TABLE `t1` RENAME INDEX idx_a TO idx_b, RENAME KEY idx_a TO idx_b, MODIFY col1 BIGINT UNSIGNED DEFAULT 1 COMMENT 'my column', CHANGE b a INT NOT NULL ; +`t1` : ALTER TABLE `t1` RENAME COLUMN a TO b, RENAME INDEX idx_a TO idx_b, RENAME KEY idx_a TO idx_b, MODIFY col1 BIGINT UNSIGNED DEFAULT 1 COMMENT 'my column', CHANGE b a INT NOT NULL ; `t2` : ALTER TABLE `t2` DROP COLUMN c, DROP COLUMN d, ADD COLUMN C int, ADD COLUMN D int FIRST, ADD COLUMN E int AFTER D ; -`t3` : ALTER TABLE `t3` add index `idx_a`(a), drop index`idx_b`(b) ; +`t3` : ALTER TABLE `t3` add index `idx_a`(a), drop index`idx_b` ; `test_bb` : ALTER TABLE `test_bb` ADD INDEX idx_test_cca (test_cc) ; diff --git a/ast/testdata/TestPrintPrettyStmtNode.golden b/ast/testdata/TestPrintPrettyStmtNode.golden index 04cfef3796ff15e384901659f0df5a52d0758d79..c2d8544502cc911875b28a03b44f737db6a3db3d 100644 --- a/ast/testdata/TestPrintPrettyStmtNode.golden +++ b/ast/testdata/TestPrintPrettyStmtNode.golden @@ -7,12 +7,15 @@ }, resultSetNode: ast.resultSetNode{}, SelectStmtOpts: &ast.SelectStmtOpts{ - Distinct: false, - SQLCache: true, - CalcFoundRows: false, - StraightJoin: false, - Priority: 0, - TableHints: nil, + Distinct: false, + SQLBigResult: false, + SQLBufferResult: false, + SQLCache: true, + SQLSmallResult: false, + CalcFoundRows: false, + StraightJoin: false, + Priority: 0, + TableHints: nil, }, Distinct: false, From: (*ast.TableRefsClause)(nil), diff --git a/ast/testdata/TestStmtNode2JSON.golden b/ast/testdata/TestStmtNode2JSON.golden index ac7cb8a1260d297dc9b22d0a03bb5c1dd365fb6c..34f3134db16fcba1c81041e22ad9c2b30cd1dd67 100644 --- a/ast/testdata/TestStmtNode2JSON.golden +++ b/ast/testdata/TestStmtNode2JSON.golden @@ -2,7 +2,10 @@ { "text": "select 1", "resultFields": null, + "SQLBigResult": false, + "SQLBufferResult": false, "SQLCache": true, + "SQLSmallResult": false, "CalcFoundRows": false, "StraightJoin": false, "Priority": 0, diff --git a/ast/testdata/TestTokenizer.golden b/ast/testdata/TestTokenizer.golden index 87a1c2df4ac850a691ae7fe83c46a4e381841940..af4d6a08d6b45f9453e98069d1f03ee8bb233581 100644 --- a/ast/testdata/TestTokenizer.golden +++ b/ast/testdata/TestTokenizer.golden @@ -210,7 +210,7 @@ } []ast.Token{ {Type:57348, Val:"select", i:0}, - {Type:57593, Val:"sql_calc_found_rows", i:0}, + {Type:57588, Val:"sql_calc_found_rows", i:0}, {Type:57396, Val:"col", i:0}, {Type:57353, Val:"from", i:0}, {Type:57396, Val:"tbl", i:0},