Skip to content

Commit ce93880

Browse files
committed
Add RowsColumnScanner test
1 parent dbc3ff0 commit ce93880

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

src/database/sql/sql_test.go

+92
Original file line numberDiff line numberDiff line change
@@ -4211,6 +4211,98 @@ func TestNamedValueCheckerSkip(t *testing.T) {
42114211
}
42124212
}
42134213

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+
42144306
func TestOpenConnector(t *testing.T) {
42154307
Register("testctx", &fakeDriverCtx{})
42164308
db, err := Open("testctx", "people")

0 commit comments

Comments
 (0)