@@ -24,6 +24,7 @@ type rowInserter struct {
2424 stmt * stdsql.Stmt
2525 err error
2626 flushSQL string
27+ enums []int
2728}
2829
2930var _ 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
8390func (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