Skip to content
This repository has been archived by the owner on Nov 24, 2023. It is now read-only.

Commit

Permalink
parser: split ALTER TABLE ADD COLUMN (#1340) (#1345)
Browse files Browse the repository at this point in the history
Signed-off-by: ti-srebot <ti-srebot@pingcap.com>

Co-authored-by: lance6716 <lance6716@gmail.com>
  • Loading branch information
ti-srebot and lance6716 authored Dec 18, 2020
1 parent 22466f2 commit ef88545
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 8 deletions.
21 changes: 21 additions & 0 deletions pkg/parser/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,27 @@ func SplitDDL(stmt ast.StmtNode, schema string) (sqls []string, err error) {

v.Specs = []*ast.AlterTableSpec{spec}

// handle `alter table t1 add column (c1 int, c2 int)`
if spec.Tp == ast.AlterTableAddColumns && len(spec.NewColumns) > 1 {
columns := spec.NewColumns
spec.Position = &ast.ColumnPosition{
Tp: ast.ColumnPositionNone, // otherwise restore will become "alter table t1 add column (c1 int)"
}
for _, c := range columns {
spec.NewColumns = []*ast.ColumnDef{c}
bf.Reset()
err = stmt.Restore(ctx)
if err != nil {
v.Specs = specs
v.Table = table
return nil, terror.ErrRestoreASTNode.Delegate(err)
}
sqls = append(sqls, bf.String())
}
// we have restore SQL for every columns, skip below general restoring and continue on next spec
continue
}

bf.Reset()
err = stmt.Restore(ctx)
if err != nil {
Expand Down
5 changes: 5 additions & 0 deletions pkg/parser/common_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ var sqls = []string{
"alter table `t1` partition by list (a) (partition x default)",
"alter table `t1` partition by system_time (partition x history, partition y current)",
"alter database `test` charset utf8mb4",
"alter table `t1` add column (c1 int, c2 int)",
}

var nonDDLs = []string{
Expand Down Expand Up @@ -171,6 +172,7 @@ func (t *testParserSuite) TestResolveDDL(c *C) {
{"ALTER TABLE `test`.`t1` PARTITION BY LIST (`a`) (PARTITION `x` DEFAULT)"},
{"ALTER TABLE `test`.`t1` PARTITION BY SYSTEM_TIME (PARTITION `x` HISTORY,PARTITION `y` CURRENT)"},
{"ALTER DATABASE `test` CHARACTER SET = utf8mb4"},
{"ALTER TABLE `test`.`t1` ADD COLUMN `c1` INT", "ALTER TABLE `test`.`t1` ADD COLUMN `c2` INT"},
}

expectedTableName := [][][]*filter.Table{
Expand Down Expand Up @@ -215,6 +217,7 @@ func (t *testParserSuite) TestResolveDDL(c *C) {
{{genTableName("test", "t1")}},
{{genTableName("test", "t1")}},
{{genTableName("test", "")}},
{{genTableName("test", "t1")}, {genTableName("test", "t1")}},
}

targetTableNames := [][][]*filter.Table{
Expand Down Expand Up @@ -259,6 +262,7 @@ func (t *testParserSuite) TestResolveDDL(c *C) {
{{genTableName("xtest", "xt1")}},
{{genTableName("xtest", "xt1")}},
{{genTableName("xtest", "")}},
{{genTableName("xtest", "t1")}, {genTableName("xtest", "t1")}},
}

targetSQLs := [][]string{
Expand Down Expand Up @@ -303,6 +307,7 @@ func (t *testParserSuite) TestResolveDDL(c *C) {
{"ALTER TABLE `xtest`.`xt1` PARTITION BY LIST (`a`) (PARTITION `x` DEFAULT)"},
{"ALTER TABLE `xtest`.`xt1` PARTITION BY SYSTEM_TIME (PARTITION `x` HISTORY,PARTITION `y` CURRENT)"},
{"ALTER DATABASE `xtest` CHARACTER SET = utf8mb4"},
{"ALTER TABLE `xtest`.`t1` ADD COLUMN `c1` INT", "ALTER TABLE `xtest`.`t1` ADD COLUMN `c2` INT"},
}

for i, sql := range sqls {
Expand Down
6 changes: 2 additions & 4 deletions tests/sequence_safe_mode/data/db1.increment.sql
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
use sequence_safe_mode_test;
insert into t1 (uid, name) values (10003, 'Buenos Aires');
alter table t1 add column age int;
alter table t1 add column (age int, level int);
alter table t1 add index age(age);
alter table t1 add column level int;
alter table t1 add index level(level);
insert into t1 (uid, name, age) values (10005, 'Buenos Aires', 200);
insert into t2 (uid, name) values (20005, 'Aureliano José');
insert into t1 (uid, name, age) values (10006, 'Buenos Aires', 200);
alter table t2 add column age int;
alter table t2 add column (age int, level int);
alter table t2 add index age(age);
alter table t2 add column level int;
alter table t2 add index level(level);
insert into t1 (uid, name, age) values (10007, 'Buenos Aires', 300);
insert into t2 (uid, name, age) values (20006, 'Colonel Aureliano Buendía', 301);
Expand Down
6 changes: 2 additions & 4 deletions tests/sequence_safe_mode/data/db2.increment.sql
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
use sequence_safe_mode_test;
delete from t3 where name = 'Santa Sofía de la Piedad';
alter table t2 add column age int;
alter table t2 add column (age int, level int);
alter table t2 add index age(age);
alter table t2 add column level int;
alter table t2 add index level(level);
insert into t2 (uid, name, age) values (40002, 'Remedios Moscote', 100), (40003, 'Amaranta', 103);
insert into t3 (uid, name) values (30004, 'Aureliano José'), (30005, 'Santa Sofía de la Piedad'), (30006, '17 Aurelianos');
alter table t3 add column age int;
alter table t3 add column (age int, level int);
alter table t3 add index age(age);
alter table t3 add column level int;
alter table t3 add index level(level);
update t3 set age = 1;

0 comments on commit ef88545

Please sign in to comment.