Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions enginetest/queries/create_table_queries.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand Down
26 changes: 26 additions & 0 deletions enginetest/queries/script_queries.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand Down
41 changes: 27 additions & 14 deletions sql/rowexec/show_iters.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
}
}

Expand Down
Loading