aboutsummaryrefslogtreecommitdiff
path: root/src/database/sql
diff options
context:
space:
mode:
Diffstat (limited to 'src/database/sql')
-rw-r--r--src/database/sql/driver/driver.go12
-rw-r--r--src/database/sql/sql.go11
-rw-r--r--src/database/sql/sql_test.go96
3 files changed, 1 insertions, 118 deletions
diff --git a/src/database/sql/driver/driver.go b/src/database/sql/driver/driver.go
index 487870be63..d0892e80fc 100644
--- a/src/database/sql/driver/driver.go
+++ b/src/database/sql/driver/driver.go
@@ -515,18 +515,6 @@ type RowsColumnTypePrecisionScale interface {
ColumnTypePrecisionScale(index int) (precision, scale int64, ok bool)
}
-// RowsColumnScanner may be implemented by [Rows]. It allows the driver to completely
-// take responsibility for how values are scanned and replace the normal [database/sql].
-// scanning path. This allows drivers to directly support types that do not implement
-// [database/sql.Scanner].
-type RowsColumnScanner interface {
- Rows
-
- // ScanColumn copies the column in the current row into the value pointed at by
- // dest. It returns [ErrSkip] to fall back to the normal [database/sql] scanning path.
- ScanColumn(dest any, index int) error
-}
-
// Tx is a transaction.
type Tx interface {
Commit() error
diff --git a/src/database/sql/sql.go b/src/database/sql/sql.go
index 85b9ffc37d..4be450ca87 100644
--- a/src/database/sql/sql.go
+++ b/src/database/sql/sql.go
@@ -3396,16 +3396,7 @@ func (rs *Rows) scanLocked(dest ...any) error {
}
for i, sv := range rs.lastcols {
- err := driver.ErrSkip
-
- if rcs, ok := rs.rowsi.(driver.RowsColumnScanner); ok {
- err = rcs.ScanColumn(dest[i], i)
- }
-
- if err == driver.ErrSkip {
- err = convertAssignRows(dest[i], sv, rs)
- }
-
+ err := convertAssignRows(dest[i], sv, rs)
if err != nil {
return fmt.Errorf(`sql: Scan error on column index %d, name %q: %w`, i, rs.rowsi.Columns()[i], err)
}
diff --git a/src/database/sql/sql_test.go b/src/database/sql/sql_test.go
index 6ee8505855..e8a6560097 100644
--- a/src/database/sql/sql_test.go
+++ b/src/database/sql/sql_test.go
@@ -4200,102 +4200,6 @@ func TestNamedValueCheckerSkip(t *testing.T) {
}
}
-type rcsDriver struct {
- fakeDriver
-}
-
-func (d *rcsDriver) Open(dsn string) (driver.Conn, error) {
- c, err := d.fakeDriver.Open(dsn)
- fc := c.(*fakeConn)
- fc.db.allowAny = true
- return &rcsConn{fc}, err
-}
-
-type rcsConn struct {
- *fakeConn
-}
-
-func (c *rcsConn) PrepareContext(ctx context.Context, q string) (driver.Stmt, error) {
- stmt, err := c.fakeConn.PrepareContext(ctx, q)
- if err != nil {
- return stmt, err
- }
- return &rcsStmt{stmt.(*fakeStmt)}, nil
-}
-
-type rcsStmt struct {
- *fakeStmt
-}
-
-func (s *rcsStmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) {
- rows, err := s.fakeStmt.QueryContext(ctx, args)
- if err != nil {
- return rows, err
- }
- return &rcsRows{rows.(*rowsCursor)}, nil
-}
-
-type rcsRows struct {
- *rowsCursor
-}
-
-func (r *rcsRows) ScanColumn(dest any, index int) error {
- switch d := dest.(type) {
- case *int64:
- *d = 42
- return nil
- }
-
- return driver.ErrSkip
-}
-
-func TestRowsColumnScanner(t *testing.T) {
- Register("RowsColumnScanner", &rcsDriver{})
- db, err := Open("RowsColumnScanner", "")
- if err != nil {
- t.Fatal(err)
- }
- defer db.Close()
-
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
-
- _, err = db.ExecContext(ctx, "CREATE|t|str=string,n=int64")
- if err != nil {
- t.Fatal("exec create", err)
- }
-
- _, err = db.ExecContext(ctx, "INSERT|t|str=?,n=?", "foo", int64(1))
- if err != nil {
- t.Fatal("exec insert", err)
- }
- var (
- str string
- i64 int64
- i int
- f64 float64
- ui uint
- )
- err = db.QueryRowContext(ctx, "SELECT|t|str,n,n,n,n|").Scan(&str, &i64, &i, &f64, &ui)
- if err != nil {
- t.Fatal("select", err)
- }
-
- list := []struct{ got, want any }{
- {str, "foo"},
- {i64, int64(42)},
- {i, int(1)},
- {f64, float64(1)},
- {ui, uint(1)},
- }
-
- for index, item := range list {
- if !reflect.DeepEqual(item.got, item.want) {
- t.Errorf("got %#v wanted %#v for index %d", item.got, item.want, index)
- }
- }
-}
-
func TestOpenConnector(t *testing.T) {
Register("testctx", &fakeDriverCtx{})
db, err := Open("testctx", "people")