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