Skip to content

Commit c5f7d51

Browse files
authored
Merge pull request #2958 from dolthub/nicktobey/enum
Correctly map enum values when altering an enum column.
2 parents 9a519d1 + 3d54d6c commit c5f7d51

File tree

2 files changed

+36
-14
lines changed

2 files changed

+36
-14
lines changed

enginetest/queries/script_queries.go

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ CREATE TABLE teams (
181181
},
182182
{
183183
Query: "alter table xy modify y enum('a')",
184-
ExpectedErr: types.ErrConvertingToEnum,
184+
ExpectedErr: types.ErrDataTruncatedForColumn,
185185
},
186186
},
187187
},
@@ -7706,6 +7706,7 @@ where
77067706
Name: "preserve enums through alter statements",
77077707
SetUpScript: []string{
77087708
"create table t (i int primary key, e enum('a', 'b', 'c'));",
7709+
"insert ignore into t values (0, 'error');",
77097710
"insert into t values (1, 'a');",
77107711
"insert into t values (2, 'b');",
77117712
"insert into t values (3, 'c');",
@@ -7714,6 +7715,7 @@ where
77147715
{
77157716
Query: "select i, e, e + 0 from t;",
77167717
Expected: []sql.Row{
7718+
{0, "", float64(0)},
77177719
{1, "a", float64(1)},
77187720
{2, "b", float64(2)},
77197721
{3, "c", float64(3)},
@@ -7728,6 +7730,7 @@ where
77287730
{
77297731
Query: "select i, e, e + 0 from t;",
77307732
Expected: []sql.Row{
7733+
{0, "", float64(0)},
77317734
{1, "a", float64(2)},
77327735
{2, "b", float64(3)},
77337736
{3, "c", float64(1)},
@@ -7742,6 +7745,7 @@ where
77427745
{
77437746
Query: "select i, e, e + 0 from t;",
77447747
Expected: []sql.Row{
7748+
{0, "", float64(0)},
77457749
{1, "a", float64(2)},
77467750
{2, "b", float64(3)},
77477751
{3, "c", float64(4)},
@@ -7756,14 +7760,30 @@ where
77567760
{
77577761
Query: "select i, e, e + 0 from t;",
77587762
Expected: []sql.Row{
7763+
{0, "", float64(0)},
77597764
{1, "a", float64(2)},
77607765
{2, "b", float64(3)},
77617766
{3, "c", float64(4)},
77627767
},
77637768
},
7769+
{
7770+
Query: "alter table t modify column e enum('a', 'b', 'c');",
7771+
Expected: []sql.Row{
7772+
{types.NewOkResult(0)},
7773+
},
7774+
},
7775+
{
7776+
Query: "select i, e, e + 0 from t;",
7777+
Expected: []sql.Row{
7778+
{0, "", float64(0)},
7779+
{1, "a", float64(1)},
7780+
{2, "b", float64(2)},
7781+
{3, "c", float64(3)},
7782+
},
7783+
},
77647784
{
77657785
Query: "alter table t modify column e enum('abc');",
7766-
ExpectedErr: types.ErrConvertingToEnum,
7786+
ExpectedErr: types.ErrDataTruncatedForColumn,
77677787
},
77687788
},
77697789
},

sql/rowexec/ddl_iters.go

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,6 @@ func (i *modifyColumnIter) rewriteTable(ctx *sql.Context, rwt sql.RewritableTabl
545545
return false, err
546546
}
547547

548-
newColIdx := newSch.IndexOf(newCol.Name, newCol.Source)
549548
rowIter := sql.NewTableRowIter(ctx, rwt, partitions)
550549
for {
551550
r, err := rowIter.Next(ctx)
@@ -557,24 +556,27 @@ func (i *modifyColumnIter) rewriteTable(ctx *sql.Context, rwt sql.RewritableTabl
557556
return false, err
558557
}
559558

559+
// remap old enum values to new enum values
560+
if isOldEnum && isNewEnum && r[oldColIdx] != nil {
561+
oldIdx := int(r[oldColIdx].(uint16))
562+
// 0 values in enums are error values. They are preserved during remapping.
563+
if oldIdx != 0 {
564+
oldStr, _ := oldEnum.At(oldIdx)
565+
newIdx := newEnum.IndexOf(oldStr)
566+
if newIdx == -1 {
567+
return false, types.ErrDataTruncatedForColumn.New(newCol.Name)
568+
}
569+
r[oldColIdx] = uint16(newIdx)
570+
}
571+
}
572+
560573
newRow, err := projectRowWithTypes(ctx, newSch, projections, r)
561574
if err != nil {
562575
_ = inserter.DiscardChanges(ctx, err)
563576
_ = inserter.Close(ctx)
564577
return false, err
565578
}
566579

567-
// remap old enum values to new enum values
568-
if isOldEnum && isNewEnum && newRow[newColIdx] != nil {
569-
oldIdx := int(newRow[newColIdx].(uint16))
570-
oldStr, _ := oldEnum.At(oldIdx)
571-
newIdx := newEnum.IndexOf(oldStr)
572-
if newIdx == -1 {
573-
return false, types.ErrDataTruncatedForColumn.New(newCol.Name)
574-
}
575-
newRow[newColIdx] = uint16(newIdx)
576-
}
577-
578580
err = i.validateNullability(ctx, newSch, newRow)
579581
if err != nil {
580582
_ = inserter.DiscardChanges(ctx, err)

0 commit comments

Comments
 (0)