Skip to content

Commit 7815f57

Browse files
committed
convert enum ordinal to string for duckdb insert
1 parent ad1d946 commit 7815f57

File tree

1 file changed

+20
-1
lines changed

1 file changed

+20
-1
lines changed

catalog/inserter.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ type rowInserter struct {
2424
stmt *stdsql.Stmt
2525
err error
2626
flushSQL string
27+
enums []int
2728
}
2829

2930
var _ sql.RowInserter = &rowInserter{}
@@ -75,9 +76,15 @@ func (ri *rowInserter) init(ctx *sql.Context) {
7576
}
7677
insert.WriteString(" INTO ")
7778
insert.WriteString(ConnectIdentifiersANSI(ri.db, ri.table))
78-
insert.WriteString(" SELECT * FROM ")
79+
insert.WriteString(" FROM ")
7980
insert.WriteString(QuoteIdentifierANSI(ri.tmpTable))
8081
ri.flushSQL = insert.String()
82+
83+
for i, col := range ri.schema {
84+
if _, ok := col.Type.(sql.EnumType); ok {
85+
ri.enums = append(ri.enums, i)
86+
}
87+
}
8188
}
8289

8390
func (ri *rowInserter) StatementBegin(ctx *sql.Context) {
@@ -106,6 +113,18 @@ func (ri *rowInserter) Insert(ctx *sql.Context, row sql.Row) error {
106113
if ri.err != nil {
107114
return ri.err
108115
}
116+
117+
// For enum columns, we have to convert the enum ordinal to the enum string.
118+
for _, i := range ri.enums {
119+
if idx, ok := row[i].(uint16); ok {
120+
if s, ok := ri.schema[i].Type.(sql.EnumType).At(int(idx)); ok {
121+
row[i] = s
122+
} else {
123+
return fmt.Errorf("invalid enum value %d for column %s", idx, ri.schema[i].Name)
124+
}
125+
}
126+
}
127+
109128
if _, err := ri.stmt.ExecContext(ctx, row...); err != nil {
110129
ri.err = err
111130
return err

0 commit comments

Comments
 (0)