From 511a80bae4d37b65b7f9e41e23f700c9b4c79584 Mon Sep 17 00:00:00 2001 From: crazycs Date: Wed, 27 Feb 2019 11:10:38 +0800 Subject: [PATCH] ddl: fix check column field length when add column (#9143) --- ddl/db_test.go | 3 ++- ddl/ddl_api.go | 18 ++++-------------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/ddl/db_test.go b/ddl/db_test.go index 8c70ee4823320..14b0dbfaadbec 100644 --- a/ddl/db_test.go +++ b/ddl/db_test.go @@ -2189,7 +2189,8 @@ func (s *testDBSuite) TestCheckTooBigFieldLength(c *C) { s.tk.MustExec("create table tr_03 (id int, name varchar(65534), purchased date ) default charset=latin1;") s.tk.MustExec("drop table if exists tr_04;") - s.tk.MustExec("create table tr_04 (a varchar(20000)) default charset utf8;") + s.tk.MustExec("create table tr_04 (a varchar(20000) ) default charset utf8;") + assertErrorCode(c, s.tk, "alter table tr_04 add column b varchar(20000) charset utf8mb4;", tmysql.ErrTooBigFieldlength) assertErrorCode(c, s.tk, "alter table tr_04 convert to character set utf8mb4;", tmysql.ErrTooBigFieldlength) assertErrorCode(c, s.tk, "create table tr (id int, name varchar(30000), purchased date ) default charset=utf8 collate=utf8_bin;", tmysql.ErrTooBigFieldlength) assertErrorCode(c, s.tk, "create table tr (id int, name varchar(20000) charset utf8mb4, purchased date ) default charset=utf8 collate=utf8;", tmysql.ErrTooBigFieldlength) diff --git a/ddl/ddl_api.go b/ddl/ddl_api.go index ed9869d954437..b14de4efe6aa0 100644 --- a/ddl/ddl_api.go +++ b/ddl/ddl_api.go @@ -471,6 +471,10 @@ func columnDefToCol(ctx sessionctx.Context, offset int, colDef *ast.ColumnDef, o if err != nil { return nil, nil, errors.Trace(err) } + err = checkColumnFieldLength(col) + if err != nil { + return nil, nil, errors.Trace(err) + } return col, constraints, nil } @@ -725,16 +729,6 @@ func checkColumnsAttributes(colDefs []*ast.ColumnDef) error { return nil } -// checkColumnsFieldLength check the maximum length limit for different character set varchar type columns. -func checkColumnsFieldLength(cols []*table.Column) error { - for _, col := range cols { - if err := checkColumnFieldLength(col); err != nil { - return errors.Trace(err) - } - } - return nil -} - func checkColumnFieldLength(col *table.Column) error { if col.Tp == mysql.TypeVarchar { if err := IsTooBigFieldLength(col.Flen, col.Name.O, col.Charset); err != nil { @@ -1036,10 +1030,6 @@ func buildTableInfoWithCheck(ctx sessionctx.Context, d *ddl, s *ast.CreateTableS return nil, errors.Trace(err) } - if err = checkColumnsFieldLength(cols); err != nil { - return nil, errors.Trace(err) - } - err = checkConstraintNames(newConstraints) if err != nil { return nil, errors.Trace(err)