diff --git a/enginetest/queries/create_table_queries.go b/enginetest/queries/create_table_queries.go index bb0f63c9aa..b96b4a8556 100644 --- a/enginetest/queries/create_table_queries.go +++ b/enginetest/queries/create_table_queries.go @@ -270,6 +270,12 @@ var CreateTableQueries = []WriteQueryTest{ SelectQuery: `SHOW CREATE TABLE t1`, ExpectedSelect: []sql.Row{{"t1", "CREATE TABLE `t1` (\n `pk` varbinary(10) NOT NULL,\n PRIMARY KEY (`pk`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin"}}, }, + { + WriteQuery: `create table t1 (pk bit(2) default 2)`, + ExpectedWriteResult: []sql.Row{{types.NewOkResult(0)}}, + SelectQuery: `SHOW CREATE TABLE t1`, + ExpectedSelect: []sql.Row{{"t1", "CREATE TABLE `t1` (\n `pk` bit(2) DEFAULT b'10'\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin"}}, + }, } var CreateTableScriptTests = []ScriptTest{ diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 8a776ec4d6..e0a1a4b307 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -8410,6 +8410,32 @@ where }, }, }, + { + Name: "bit default value", + Dialect: "mysql", + SetUpScript: []string{ + "create table t (i int primary key, b bit(2) default 2);", + "insert into t(i) values (1);", + "create table tt (b bit(2) default 2 primary key);", + "insert into tt values ();", + }, + Assertions: []ScriptTestAssertion{ + { + Skip: true, // this fails on server engine, even when skipped + Query: "select * from t;", + Expected: []sql.Row{ + {1, uint8(2)}, + }, + }, + { + Skip: true, // this fails on server engine, even when skipped + Query: "select * from tt;", + Expected: []sql.Row{ + {uint8(2)}, + }, + }, + }, + }, } var SpatialScriptTests = []ScriptTest{ diff --git a/sql/rowexec/show_iters.go b/sql/rowexec/show_iters.go index ec6ab5a92f..5a41a8415c 100644 --- a/sql/rowexec/show_iters.go +++ b/sql/rowexec/show_iters.go @@ -382,6 +382,25 @@ type NameAndSchema interface { Schema() sql.Schema } +func convertColumnDefaultToString(ctx *sql.Context, def *sql.ColumnDefaultValue) (string, error) { + // TODO : string literals should have character set introducer + colDefaultStr := def.String() + defType := def.Type() + + // These types do not need to be quoted + if !def.IsLiteral() || colDefaultStr == "NULL" || types.IsTime(defType) || types.IsText(defType) { + return colDefaultStr, nil + } + v, err := def.Eval(ctx, nil) + if err != nil { + return "", err + } + if types.IsBit(def.OutType) { + return fmt.Sprintf("b'%b'", v), nil + } + return fmt.Sprintf("'%v'", v), nil +} + func (i *showCreateTablesIter) produceCreateTableStatement(ctx *sql.Context, table sql.Table, schema sql.Schema, pkSchema sql.PrimaryKeySchema) (string, error) { colStmts := make([]string, len(schema)) var primaryKeyCols []string @@ -395,26 +414,20 @@ func (i *showCreateTablesIter) produceCreateTableStatement(ctx *sql.Context, tab tableCollation := table.Collation() for i, col := range schema { var colDefaultStr string + var err error if col.Default != nil && col.Generated == nil { // TODO : string literals should have character set introducer - colDefaultStr = col.Default.String() - if colDefaultStr != "NULL" && col.Default.IsLiteral() && !types.IsTime(col.Default.Type()) && !types.IsText(col.Default.Type()) { - v, err := col.Default.Eval(ctx, nil) - if err != nil { - return "", err - } - colDefaultStr = fmt.Sprintf("'%v'", v) + colDefaultStr, err = convertColumnDefaultToString(ctx, col.Default) + if err != nil { + return "", err } } + var onUpdateStr string if col.OnUpdate != nil { - onUpdateStr = col.OnUpdate.String() - if onUpdateStr != "NULL" && col.OnUpdate.IsLiteral() && !types.IsTime(col.OnUpdate.Type()) && !types.IsText(col.OnUpdate.Type()) { - v, err := col.OnUpdate.Eval(ctx, nil) - if err != nil { - return "", err - } - onUpdateStr = fmt.Sprintf("'%v'", v) + onUpdateStr, err = convertColumnDefaultToString(ctx, col.OnUpdate) + if err != nil { + return "", err } }