@@ -4201,6 +4201,102 @@ func TestNamedValueCheckerSkip(t *testing.T) {
4201
4201
}
4202
4202
}
4203
4203
4204
+ type rcsDriver struct {
4205
+ fakeDriver
4206
+ }
4207
+
4208
+ func (d * rcsDriver ) Open (dsn string ) (driver.Conn , error ) {
4209
+ c , err := d .fakeDriver .Open (dsn )
4210
+ fc := c .(* fakeConn )
4211
+ fc .db .allowAny = true
4212
+ return & rcsConn {fc }, err
4213
+ }
4214
+
4215
+ type rcsConn struct {
4216
+ * fakeConn
4217
+ }
4218
+
4219
+ func (c * rcsConn ) PrepareContext (ctx context.Context , q string ) (driver.Stmt , error ) {
4220
+ stmt , err := c .fakeConn .PrepareContext (ctx , q )
4221
+ if err != nil {
4222
+ return stmt , err
4223
+ }
4224
+ return & rcsStmt {stmt .(* fakeStmt )}, nil
4225
+ }
4226
+
4227
+ type rcsStmt struct {
4228
+ * fakeStmt
4229
+ }
4230
+
4231
+ func (s * rcsStmt ) QueryContext (ctx context.Context , args []driver.NamedValue ) (driver.Rows , error ) {
4232
+ rows , err := s .fakeStmt .QueryContext (ctx , args )
4233
+ if err != nil {
4234
+ return rows , err
4235
+ }
4236
+ return & rcsRows {rows .(* rowsCursor )}, nil
4237
+ }
4238
+
4239
+ type rcsRows struct {
4240
+ * rowsCursor
4241
+ }
4242
+
4243
+ func (r * rcsRows ) ScanColumn (dest any , index int ) error {
4244
+ switch d := dest .(type ) {
4245
+ case * int64 :
4246
+ * d = 42
4247
+ return nil
4248
+ }
4249
+
4250
+ return driver .ErrSkip
4251
+ }
4252
+
4253
+ func TestRowsColumnScanner (t * testing.T ) {
4254
+ Register ("RowsColumnScanner" , & rcsDriver {})
4255
+ db , err := Open ("RowsColumnScanner" , "" )
4256
+ if err != nil {
4257
+ t .Fatal (err )
4258
+ }
4259
+ defer db .Close ()
4260
+
4261
+ ctx , cancel := context .WithCancel (context .Background ())
4262
+ defer cancel ()
4263
+
4264
+ _ , err = db .ExecContext (ctx , "CREATE|t|str=string,n=int64" )
4265
+ if err != nil {
4266
+ t .Fatal ("exec create" , err )
4267
+ }
4268
+
4269
+ _ , err = db .ExecContext (ctx , "INSERT|t|str=?,n=?" , "foo" , int64 (1 ))
4270
+ if err != nil {
4271
+ t .Fatal ("exec insert" , err )
4272
+ }
4273
+ var (
4274
+ str string
4275
+ i64 int64
4276
+ i int
4277
+ f64 float64
4278
+ ui uint
4279
+ )
4280
+ err = db .QueryRowContext (ctx , "SELECT|t|str,n,n,n,n|" ).Scan (& str , & i64 , & i , & f64 , & ui )
4281
+ if err != nil {
4282
+ t .Fatal ("select" , err )
4283
+ }
4284
+
4285
+ list := []struct { got , want any }{
4286
+ {str , "foo" },
4287
+ {i64 , int64 (42 )},
4288
+ {i , int (1 )},
4289
+ {f64 , float64 (1 )},
4290
+ {ui , uint (1 )},
4291
+ }
4292
+
4293
+ for index , item := range list {
4294
+ if ! reflect .DeepEqual (item .got , item .want ) {
4295
+ t .Errorf ("got %#v wanted %#v for index %d" , item .got , item .want , index )
4296
+ }
4297
+ }
4298
+ }
4299
+
4204
4300
func TestOpenConnector (t * testing.T ) {
4205
4301
Register ("testctx" , & fakeDriverCtx {})
4206
4302
db , err := Open ("testctx" , "people" )
0 commit comments