diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 1d2e771722..f8883ba7ec 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -7900,6 +7900,31 @@ where }, }, }, + { + Name: "special case for not null default enum", + Dialect: "mysql", + SetUpScript: []string{ + "create table t (i int primary key, e enum('abc', 'def', 'ghi') not null);", + }, + Assertions: []ScriptTestAssertion{ + { + Query: "insert into t(i) values (1)", + Expected: []sql.Row{ + {types.NewOkResult(1)}, + }, + }, + { + Query: "insert into t values (2, null)", + ExpectedErr: sql.ErrInsertIntoNonNullableProvidedNull, + }, + { + Query: "select * from t;", + Expected: []sql.Row{ + {1, "abc"}, + }, + }, + }, + }, { Name: "not expression optimization", Dialect: "mysql", diff --git a/sql/rowexec/insert.go b/sql/rowexec/insert.go index 030fd56d68..c16d4b3b7d 100644 --- a/sql/rowexec/insert.go +++ b/sql/rowexec/insert.go @@ -80,6 +80,18 @@ func (i *insertIter) Next(ctx *sql.Context) (returnRow sql.Row, returnErr error) row = row[len(row)-len(i.schema):] } + // This is a special case in MySQL. + // When there's an enum column with a NOT NULL constraint, the DEFAULT value is the first entry. + for idx, col := range i.schema { + if idx >= len(i.insertExprs) { + break + } + _, isColDefVal := i.insertExprs[idx].(*sql.ColumnDefaultValue) + if row[idx] == nil && types.IsEnum(col.Type) && isColDefVal { + row[idx] = 1 + } + } + err = i.validateNullability(ctx, i.schema, row) if err != nil { return nil, i.ignoreOrClose(ctx, row, err)