@@ -4201,6 +4201,102 @@ func TestNamedValueCheckerSkip(t *testing.T) {
42014201 }
42024202}
42034203
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+
42044300func TestOpenConnector (t * testing.T ) {
42054301 Register ("testctx" , & fakeDriverCtx {})
42064302 db , err := Open ("testctx" , "people" )
0 commit comments