From 928e8b49f8c0f7928c07e827ef67b955b3c26940 Mon Sep 17 00:00:00 2001 From: tangenta Date: Thu, 12 Sep 2019 00:13:01 +0800 Subject: [PATCH 1/5] ddl: allow multiple unique attributes in column --- ddl/db_integration_test.go | 12 ++++++++++++ ddl/ddl_api.go | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ddl/db_integration_test.go b/ddl/db_integration_test.go index 4993ed9e84a0e..c9e42e421ec17 100644 --- a/ddl/db_integration_test.go +++ b/ddl/db_integration_test.go @@ -1582,6 +1582,18 @@ func (s *testIntegrationSuite4) TestAlterColumn(c *C) { _, err = s.tk.Exec("alter table t1 modify column c bigint;") c.Assert(err, NotNil) c.Assert(err.Error(), Equals, "[ddl:1071]Specified key was too long; max key length is 3072 bytes") + + s.tk.MustExec("drop table if exists multi_unique") + s.tk.MustExec("create table multi_unique (a int unique unique)") + s.tk.MustExec("drop table multi_unique") + s.tk.MustExec("create table multi_unique (a int key primary key unique unique)") + s.tk.MustExec("drop table multi_unique") + s.tk.MustExec("create table multi_unique (a int key unique unique key unique)") + s.tk.MustExec("drop table multi_unique") + s.tk.MustExec("create table multi_unique (a serial serial default value)") + s.tk.MustExec("drop table multi_unique") + s.tk.MustExec("create table multi_unique (a serial serial default value serial default value)") + s.tk.MustExec("drop table multi_unique") } func (s *testIntegrationSuite) assertWarningExec(c *C, sql string, expectedWarn *terror.Error) { diff --git a/ddl/ddl_api.go b/ddl/ddl_api.go index bdb3247c4a0b4..a39d557b27570 100644 --- a/ddl/ddl_api.go +++ b/ddl/ddl_api.go @@ -511,7 +511,7 @@ func columnDefToCol(ctx sessionctx.Context, offset int, colDef *ast.ColumnDef, o constraints = append(constraints, constraint) col.Flag |= mysql.PriKeyFlag case ast.ColumnOptionUniqKey: - constraint := &ast.Constraint{Tp: ast.ConstraintUniqKey, Name: colDef.Name.Name.O, Keys: keys} + constraint := &ast.Constraint{Tp: ast.ConstraintUniqKey, Keys: keys} constraints = append(constraints, constraint) col.Flag |= mysql.UniqueKeyFlag case ast.ColumnOptionDefaultValue: From 984fc9d3ffe043ac20fab4e27cf7cc38d85a6465 Mon Sep 17 00:00:00 2001 From: tangenta Date: Tue, 17 Sep 2019 22:51:27 +0800 Subject: [PATCH 2/5] add check to avoid adding multiple constraints --- ddl/ddl_api.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ddl/ddl_api.go b/ddl/ddl_api.go index a39d557b27570..45cc93fce40c0 100644 --- a/ddl/ddl_api.go +++ b/ddl/ddl_api.go @@ -507,11 +507,17 @@ func columnDefToCol(ctx sessionctx.Context, offset int, colDef *ast.ColumnDef, o case ast.ColumnOptionAutoIncrement: col.Flag |= mysql.AutoIncrementFlag case ast.ColumnOptionPrimaryKey: + if col.Flag&mysql.PriKeyFlag != 0 { + continue + } constraint := &ast.Constraint{Tp: ast.ConstraintPrimaryKey, Keys: keys} constraints = append(constraints, constraint) col.Flag |= mysql.PriKeyFlag case ast.ColumnOptionUniqKey: constraint := &ast.Constraint{Tp: ast.ConstraintUniqKey, Keys: keys} + if col.Flag&mysql.UniqueFlag != 0 { + continue + } constraints = append(constraints, constraint) col.Flag |= mysql.UniqueKeyFlag case ast.ColumnOptionDefaultValue: From 4c76a08906740b047bda1d8751b5f2e798f28462 Mon Sep 17 00:00:00 2001 From: tangenta Date: Wed, 18 Sep 2019 10:30:21 +0800 Subject: [PATCH 3/5] add comments --- ddl/ddl_api.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ddl/ddl_api.go b/ddl/ddl_api.go index 45cc93fce40c0..326c7ce58c174 100644 --- a/ddl/ddl_api.go +++ b/ddl/ddl_api.go @@ -507,19 +507,19 @@ func columnDefToCol(ctx sessionctx.Context, offset int, colDef *ast.ColumnDef, o case ast.ColumnOptionAutoIncrement: col.Flag |= mysql.AutoIncrementFlag case ast.ColumnOptionPrimaryKey: - if col.Flag&mysql.PriKeyFlag != 0 { - continue + // Check PriKeyFlag first to avoid extra duplicate constraints. + if col.Flag&mysql.PriKeyFlag == 0 { + constraint := &ast.Constraint{Tp: ast.ConstraintPrimaryKey, Keys: keys} + constraints = append(constraints, constraint) + col.Flag |= mysql.PriKeyFlag } - constraint := &ast.Constraint{Tp: ast.ConstraintPrimaryKey, Keys: keys} - constraints = append(constraints, constraint) - col.Flag |= mysql.PriKeyFlag case ast.ColumnOptionUniqKey: - constraint := &ast.Constraint{Tp: ast.ConstraintUniqKey, Keys: keys} + // Check UniqueFlag first to avoid extra duplicate constraints. if col.Flag&mysql.UniqueFlag != 0 { - continue + constraint := &ast.Constraint{Tp: ast.ConstraintUniqKey, Keys: keys} + constraints = append(constraints, constraint) + col.Flag |= mysql.UniqueKeyFlag } - constraints = append(constraints, constraint) - col.Flag |= mysql.UniqueKeyFlag case ast.ColumnOptionDefaultValue: hasDefaultValue, err = setDefaultValue(ctx, col, v) if err != nil { From dd00b3ceda78381b877cb969cb528711631fd0b2 Mon Sep 17 00:00:00 2001 From: tangenta Date: Wed, 18 Sep 2019 10:31:17 +0800 Subject: [PATCH 4/5] fix mistake --- ddl/ddl_api.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddl/ddl_api.go b/ddl/ddl_api.go index 326c7ce58c174..36a798eb06e91 100644 --- a/ddl/ddl_api.go +++ b/ddl/ddl_api.go @@ -515,7 +515,7 @@ func columnDefToCol(ctx sessionctx.Context, offset int, colDef *ast.ColumnDef, o } case ast.ColumnOptionUniqKey: // Check UniqueFlag first to avoid extra duplicate constraints. - if col.Flag&mysql.UniqueFlag != 0 { + if col.Flag&mysql.UniqueFlag == 0 { constraint := &ast.Constraint{Tp: ast.ConstraintUniqKey, Keys: keys} constraints = append(constraints, constraint) col.Flag |= mysql.UniqueKeyFlag From 0cee7cebb0543402618e3c0e929d4e34e75083ec Mon Sep 17 00:00:00 2001 From: Tanner Date: Sun, 29 Sep 2019 08:57:21 +0800 Subject: [PATCH 5/5] Remove unsupported serial syntax --- ddl/db_integration_test.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ddl/db_integration_test.go b/ddl/db_integration_test.go index c9e42e421ec17..ead4a43eb236d 100644 --- a/ddl/db_integration_test.go +++ b/ddl/db_integration_test.go @@ -1590,10 +1590,6 @@ func (s *testIntegrationSuite4) TestAlterColumn(c *C) { s.tk.MustExec("drop table multi_unique") s.tk.MustExec("create table multi_unique (a int key unique unique key unique)") s.tk.MustExec("drop table multi_unique") - s.tk.MustExec("create table multi_unique (a serial serial default value)") - s.tk.MustExec("drop table multi_unique") - s.tk.MustExec("create table multi_unique (a serial serial default value serial default value)") - s.tk.MustExec("drop table multi_unique") } func (s *testIntegrationSuite) assertWarningExec(c *C, sql string, expectedWarn *terror.Error) {