Skip to content

Commit

Permalink
ddl:support check invalid charset when create database (pingcap#6152)
Browse files Browse the repository at this point in the history
  • Loading branch information
ciscoxll authored Mar 28, 2018
1 parent d8a1fdf commit c86cd59
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 1 deletion.
4 changes: 4 additions & 0 deletions ddl/ddl.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,8 @@ var (
ErrWrongColumnName = terror.ClassDDL.New(codeWrongColumnName, mysql.MySQLErrName[mysql.ErrWrongColumnName])
// ErrWrongNameForIndex returns for wrong index name.
ErrWrongNameForIndex = terror.ClassDDL.New(codeWrongNameForIndex, mysql.MySQLErrName[mysql.ErrWrongNameForIndex])
// ErrUnknownCharacterSet returns unknown character set.
ErrUnknownCharacterSet = terror.ClassDDL.New(codeUnknownCharacterSet, "Unknown character set: '%s'")
)

// DDL is responsible for updating schema in data store and maintaining in-memory InfoSchema cache.
Expand Down Expand Up @@ -555,6 +557,7 @@ const (
codeJSONUsedAsKey = 3152
codeWrongNameForIndex = terror.ErrCode(mysql.ErrWrongNameForIndex)
codeErrTooLongIndexComment = terror.ErrCode(mysql.ErrTooLongIndexComment)
codeUnknownCharacterSet = terror.ErrCode(mysql.ErrUnknownCharacterSet)
)

func init() {
Expand Down Expand Up @@ -585,6 +588,7 @@ func init() {
codeWrongNameForIndex: mysql.ErrWrongNameForIndex,
codeTooManyFields: mysql.ErrTooManyFields,
codeErrTooLongIndexComment: mysql.ErrTooLongIndexComment,
codeUnknownCharacterSet: mysql.ErrUnknownCharacterSet,
}
terror.ErrClassToMySQLCodes[terror.ClassDDL] = ddlMySQLErrCodes
}
7 changes: 6 additions & 1 deletion ddl/ddl_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,12 @@ func (d *ddl) CreateSchema(ctx sessionctx.Context, schema model.CIStr, charsetIn
dbInfo := &model.DBInfo{
Name: schema,
}

if charsetInfo != nil {
err = checkCharsetAndCollation(charsetInfo.Chs, charsetInfo.Col)
if err != nil {
return errors.Trace(err)
}
dbInfo.Charset = charsetInfo.Chs
dbInfo.Collate = charsetInfo.Col
} else {
Expand Down Expand Up @@ -803,7 +808,7 @@ func (d *ddl) CreateTable(ctx sessionctx.Context, ident ast.Ident, colDefs []*as

func checkCharsetAndCollation(cs string, co string) error {
if !charset.ValidCharsetAndCollation(cs, co) {
return errUnsupportedCharset.GenByArgs(cs, co)
return ErrUnknownCharacterSet.GenByArgs(cs)
}
return nil
}
Expand Down
12 changes: 12 additions & 0 deletions ddl/ddl_db_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,12 @@ func (s *testDBSuite) TestMySQLErrorCode(c *C) {
s.testErrorCode(c, sql, tmysql.ErrTooLongIdent)
sql = "create database test"
s.testErrorCode(c, sql, tmysql.ErrDBCreateExists)
sql = "create database test1 character set uft8;"
s.testErrorCode(c, sql, tmysql.ErrUnknownCharacterSet)
sql = "create database test2 character set gkb;"
s.testErrorCode(c, sql, tmysql.ErrUnknownCharacterSet)
sql = "create database test3 character set laitn1;"
s.testErrorCode(c, sql, tmysql.ErrUnknownCharacterSet)
// drop database
sql = "drop database db_not_exist"
s.testErrorCode(c, sql, tmysql.ErrDBDropExists)
Expand All @@ -149,6 +155,12 @@ func (s *testDBSuite) TestMySQLErrorCode(c *C) {
s.testErrorCode(c, sql, tmysql.ErrInvalidDefault)
sql = "CREATE TABLE `t` (`a` double DEFAULT now());"
s.testErrorCode(c, sql, tmysql.ErrInvalidDefault)
sql = "create table t1(a int) character set uft8;"
s.testErrorCode(c, sql, tmysql.ErrUnknownCharacterSet)
sql = "create table t1(a int) character set gkb;"
s.testErrorCode(c, sql, tmysql.ErrUnknownCharacterSet)
sql = "create table t1(a int) character set laitn1;"
s.testErrorCode(c, sql, tmysql.ErrUnknownCharacterSet)

// add column
sql = "alter table test_error_code_succ add column c1 int"
Expand Down

0 comments on commit c86cd59

Please sign in to comment.