From 0b3e68a594626c5b497d177546e65c64a9134d0a Mon Sep 17 00:00:00 2001 From: Leon Zhang Date: Tue, 13 Nov 2018 11:45:51 +0800 Subject: [PATCH] fix #97 merge alter token split bug bug --- ast/rewrite.go | 11 +++--- ast/rewrite_test.go | 22 +++++++++++- ast/testdata/TestMergeAlterTables.golden | 10 ++++++ vendor/vendor.json | 44 ++++++++++++------------ 4 files changed, 60 insertions(+), 27 deletions(-) create mode 100644 ast/testdata/TestMergeAlterTables.golden diff --git a/ast/rewrite.go b/ast/rewrite.go index a21bbcd..eafaef1 100644 --- a/ast/rewrite.go +++ b/ast/rewrite.go @@ -1659,12 +1659,15 @@ func MergeAlterTables(sqls ...string) map[string]string { alterStrs := make(map[string][]string) mergedAlterStr := make(map[string]string) - alterExp := regexp.MustCompile(`(?i)alter\s*table\s*[^\s]*\s*`) // ALTER TABLE - renameExp := regexp.MustCompile(`(?i)rename\s*table\s*[^\s]*\s*`) // RENAME TABLE + // table/column/index name can be quoted in back ticks + backTicks := "(`[^\\s]*`)" + + alterExp := regexp.MustCompile(`(?i)alter\s*table\s*(` + backTicks + `|([^\s]*))\s*`) // ALTER TABLE + renameExp := regexp.MustCompile(`(?i)rename\s*table\s*(` + backTicks + `|([^\s]*))\s*`) // RENAME TABLE // CREATE [UNIQUE|FULLTEXT|SPATIAL|PRIMARY] [KEY|INDEX] idx_name ON tbl_name createIndexExp := regexp.MustCompile(`(?i)create((unique)|(fulltext)|(spatial)|(primary)|(\s*)\s*)((index)|(key))\s*`) - indexNameExp := regexp.MustCompile(`(?i)[^\s]*\s*`) - indexColsExp := regexp.MustCompile(`(?i)[^\s]*\s*on\s*[^\s]*\s*`) + indexNameExp := regexp.MustCompile(`(?i)(` + backTicks + `|([^\s]*))\s*`) + indexColsExp := regexp.MustCompile(`(?i)(` + backTicks + `|([^\s]*))\s*on\s*(` + backTicks + `|([^\s]*))\s*`) for _, sql := range sqls { sql = strings.Trim(sql, common.Config.Delimiter) diff --git a/ast/rewrite_test.go b/ast/rewrite_test.go index f84250f..043acb9 100644 --- a/ast/rewrite_test.go +++ b/ast/rewrite_test.go @@ -18,6 +18,7 @@ package ast import ( "fmt" + "sort" "testing" "github.com/XiaoMi/soar/common" @@ -574,8 +575,27 @@ func TestMergeAlterTables(t *testing.T) { // MODIFY & CHANGE "ALTER TABLE t1 MODIFY col1 BIGINT UNSIGNED DEFAULT 1 COMMENT 'my column';", "ALTER TABLE t1 CHANGE b a INT NOT NULL;", + + // table name quote in back ticks + "alter table `t3`add index `idx_a`(a)", + "alter table`t3`drop index`idx_b`(b)", + } + + alterSQLs := MergeAlterTables(sqls...) + var sortedAlterSQLs []string + for item := range alterSQLs { + sortedAlterSQLs = append(sortedAlterSQLs, item) + } + sort.Strings(sortedAlterSQLs) + + err := common.GoldenDiff(func() { + for _, tb := range sortedAlterSQLs { + fmt.Println(tb, ":", alterSQLs[tb]) + } + }, t.Name(), update) + if err != nil { + t.Error(err) } - fmt.Println(MergeAlterTables(sqls...)) } func TestRewriteUnionAll(t *testing.T) { diff --git a/ast/testdata/TestMergeAlterTables.golden b/ast/testdata/TestMergeAlterTables.golden new file mode 100644 index 0000000..0d08219 --- /dev/null +++ b/ast/testdata/TestMergeAlterTables.golden @@ -0,0 +1,10 @@ +`customer` : ALTER TABLE `customer` ADD INDEX part_of_name (name(10)) ; + +`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 ; + +`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) ; + diff --git a/vendor/vendor.json b/vendor/vendor.json index 3b27d31..cf63c3f 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -1016,68 +1016,68 @@ { "checksumSHA1": "w8FCRjH70gM6QttB9QrEh9Y1x64=", "path": "vitess.io/vitess", - "revision": "782fec9ad81f5a9a5bfd40a91d04a4a20abfaa12", - "revisionTime": "2018-11-10T18:38:47Z" + "revision": "870177ca857e3bba2941a999174cc97d2c40c864", + "revisionTime": "2018-11-13T00:32:13Z" }, { "checksumSHA1": "aKn1oKcY74N8TRLm3Ayt7Q4bbI4=", "path": "vitess.io/vitess/go/bytes2", - "revision": "782fec9ad81f5a9a5bfd40a91d04a4a20abfaa12", - "revisionTime": "2018-11-10T18:38:47Z" + "revision": "870177ca857e3bba2941a999174cc97d2c40c864", + "revisionTime": "2018-11-13T00:32:13Z" }, { "checksumSHA1": "JVCEN4UGRmg3TofIBdzZMZ3G0Ww=", "path": "vitess.io/vitess/go/hack", - "revision": "782fec9ad81f5a9a5bfd40a91d04a4a20abfaa12", - "revisionTime": "2018-11-10T18:38:47Z" + "revision": "870177ca857e3bba2941a999174cc97d2c40c864", + "revisionTime": "2018-11-13T00:32:13Z" }, { "checksumSHA1": "e1WJ7vCnVrlQQQlc6n/FewCDMso=", "path": "vitess.io/vitess/go/sqltypes", - "revision": "782fec9ad81f5a9a5bfd40a91d04a4a20abfaa12", - "revisionTime": "2018-11-10T18:38:47Z" + "revision": "870177ca857e3bba2941a999174cc97d2c40c864", + "revisionTime": "2018-11-13T00:32:13Z" }, { "checksumSHA1": "ntFIQYkBS51G6y+FEkjFW40+HOU=", "path": "vitess.io/vitess/go/vt/log", - "revision": "782fec9ad81f5a9a5bfd40a91d04a4a20abfaa12", - "revisionTime": "2018-11-10T18:38:47Z" + "revision": "870177ca857e3bba2941a999174cc97d2c40c864", + "revisionTime": "2018-11-13T00:32:13Z" }, { "checksumSHA1": "XozR8bmeSR5KTe/nlUJkpJY2HKI=", "path": "vitess.io/vitess/go/vt/proto/query", - "revision": "782fec9ad81f5a9a5bfd40a91d04a4a20abfaa12", - "revisionTime": "2018-11-10T18:38:47Z" + "revision": "870177ca857e3bba2941a999174cc97d2c40c864", + "revisionTime": "2018-11-13T00:32:13Z" }, { "checksumSHA1": "OnWsUHLDKcO3spwH0jD55SvKD24=", "path": "vitess.io/vitess/go/vt/proto/topodata", - "revision": "782fec9ad81f5a9a5bfd40a91d04a4a20abfaa12", - "revisionTime": "2018-11-10T18:38:47Z" + "revision": "870177ca857e3bba2941a999174cc97d2c40c864", + "revisionTime": "2018-11-13T00:32:13Z" }, { "checksumSHA1": "sBAuZ/itMR8U8qbK4yLHxkP6Cpc=", "path": "vitess.io/vitess/go/vt/proto/vtgate", - "revision": "782fec9ad81f5a9a5bfd40a91d04a4a20abfaa12", - "revisionTime": "2018-11-10T18:38:47Z" + "revision": "870177ca857e3bba2941a999174cc97d2c40c864", + "revisionTime": "2018-11-13T00:32:13Z" }, { "checksumSHA1": "pLWM+SPGZs3k+IhjktE/cGUlpM0=", "path": "vitess.io/vitess/go/vt/proto/vtrpc", - "revision": "782fec9ad81f5a9a5bfd40a91d04a4a20abfaa12", - "revisionTime": "2018-11-10T18:38:47Z" + "revision": "870177ca857e3bba2941a999174cc97d2c40c864", + "revisionTime": "2018-11-13T00:32:13Z" }, { "checksumSHA1": "3ggEFYVEhMPxyhkKhRGw3x1eZ9M=", "path": "vitess.io/vitess/go/vt/sqlparser", - "revision": "782fec9ad81f5a9a5bfd40a91d04a4a20abfaa12", - "revisionTime": "2018-11-10T18:38:47Z" + "revision": "870177ca857e3bba2941a999174cc97d2c40c864", + "revisionTime": "2018-11-13T00:32:13Z" }, { "checksumSHA1": "oF4XzuOzwvj1iduX/lYqNSyY/HM=", "path": "vitess.io/vitess/go/vt/vterrors", - "revision": "782fec9ad81f5a9a5bfd40a91d04a4a20abfaa12", - "revisionTime": "2018-11-10T18:38:47Z" + "revision": "870177ca857e3bba2941a999174cc97d2c40c864", + "revisionTime": "2018-11-13T00:32:13Z" } ], "rootPath": "github.com/XiaoMi/soar" -- GitLab