6
6
"database/sql/driver"
7
7
"errors"
8
8
"io"
9
+ "reflect"
9
10
"sync"
10
11
"testing"
11
12
@@ -36,6 +37,7 @@ type singleResultSet struct {
36
37
37
38
rows [][]interface {}
38
39
currentRow int
40
+ scanTypes []reflect.Type
39
41
}
40
42
41
43
func (rows * singleResultSet ) Next (dest []driver.Value ) error {
@@ -50,6 +52,13 @@ func (rows *singleResultSet) Next(dest []driver.Value) error {
50
52
return nil
51
53
}
52
54
55
+ func (rows * singleResultSet ) ColumnTypeScanType (index int ) reflect.Type {
56
+ if index >= len (rows .scanTypes ) {
57
+ return reflect .TypeFor [any ]()
58
+ }
59
+ return rows .scanTypes [index ]
60
+ }
61
+
53
62
type multipleResultSets struct {
54
63
baseRows
55
64
@@ -148,6 +157,24 @@ func makeSingleResultSet(
148
157
return rows
149
158
}
150
159
160
+ func makeSingleResultSetWithScanTypes (
161
+ columnNames []string ,
162
+ scanTypes []reflect.Type ,
163
+ data ... []interface {},
164
+ ) * sql.Rows {
165
+ rows , _ := sql .OpenDB (& fakeDB {
166
+ rows : & singleResultSet {
167
+ baseRows : baseRows {
168
+ columnNames : columnNames ,
169
+ },
170
+ rows : data ,
171
+ currentRow : - 1 ,
172
+ scanTypes : scanTypes ,
173
+ },
174
+ }).Query ("" )
175
+ return rows
176
+ }
177
+
151
178
func makeMultipleResultSets (
152
179
columnNames []string ,
153
180
resultSets ... [][]interface {},
@@ -175,7 +202,7 @@ func TestFrameFromRows(t *testing.T) {
175
202
rowLimit int64
176
203
converters []sqlutil.Converter
177
204
frame * data.Frame
178
- err bool
205
+ err error
179
206
}{
180
207
{
181
208
name : "rows not implements driver.RowsNextResultSet" ,
@@ -204,7 +231,7 @@ func TestFrameFromRows(t *testing.T) {
204
231
data .NewField ("c" , nil , []* string {ptr ("3" ), ptr ("6" ), ptr ("9" )}),
205
232
},
206
233
},
207
- err : false ,
234
+ err : nil ,
208
235
},
209
236
{
210
237
name : "rows not implements driver.RowsNextResultSet, limit reached" ,
@@ -241,7 +268,7 @@ func TestFrameFromRows(t *testing.T) {
241
268
},
242
269
},
243
270
},
244
- err : false ,
271
+ err : nil ,
245
272
},
246
273
{
247
274
name : "rows implements driver.RowsNextResultSet, but contains only one result set" ,
@@ -272,7 +299,7 @@ func TestFrameFromRows(t *testing.T) {
272
299
data .NewField ("c" , nil , []* string {ptr ("3" ), ptr ("6" ), ptr ("9" )}),
273
300
},
274
301
},
275
- err : false ,
302
+ err : nil ,
276
303
},
277
304
{
278
305
name : "rows implements driver.RowsNextResultSet, but contains more then one result set" ,
@@ -305,7 +332,7 @@ func TestFrameFromRows(t *testing.T) {
305
332
data .NewField ("c" , nil , []* string {ptr ("3" ), ptr ("6" ), ptr ("9" )}),
306
333
},
307
334
},
308
- err : false ,
335
+ err : nil ,
309
336
},
310
337
{
311
338
name : "rows implements driver.RowsNextResultSet, limit reached" ,
@@ -338,13 +365,24 @@ func TestFrameFromRows(t *testing.T) {
338
365
data .NewField ("c" , nil , []* string {ptr ("3" ), ptr ("6" )}),
339
366
},
340
367
},
341
- err : false ,
368
+ err : nil ,
369
+ },
370
+ {
371
+ name : "row contains unsupported column type" ,
372
+ rows : makeSingleResultSetWithScanTypes ( //nolint:rowserrcheck
373
+ []string {"a" },
374
+ []reflect.Type {nil },
375
+ []interface {}{1 },
376
+ ),
377
+ rowLimit : 100 ,
378
+ converters : nil ,
379
+ err : sqlutil.ErrColumnTypeNotSupported {},
342
380
},
343
381
} {
344
382
t .Run (tt .name , func (t * testing.T ) {
345
383
frame , err := sqlutil .FrameFromRows (tt .rows , tt .rowLimit , tt .converters ... )
346
- if tt .err {
347
- require .Error (t , err )
384
+ if tt .err != nil {
385
+ require .ErrorAs (t , err , & tt . err )
348
386
} else {
349
387
require .NoError (t , err )
350
388
require .Equal (t , tt .frame , frame )
0 commit comments