diff --git a/api/go1.26.txt b/api/go1.26.txt index 87bcebd1af5..0706895bbdf 100644 --- a/api/go1.26.txt +++ b/api/go1.26.txt @@ -88,11 +88,6 @@ pkg crypto/x509, func OIDFromASN1OID(asn1.ObjectIdentifier) (OID, error) #75325 pkg crypto/x509, method (ExtKeyUsage) OID() OID #75325 pkg crypto/x509, method (ExtKeyUsage) String() string #56866 pkg crypto/x509, method (KeyUsage) String() string #56866 -pkg database/sql/driver, type RowsColumnScanner interface { Close, Columns, Next, ScanColumn } #67546 -pkg database/sql/driver, type RowsColumnScanner interface, Close() error #67546 -pkg database/sql/driver, type RowsColumnScanner interface, Columns() []string #67546 -pkg database/sql/driver, type RowsColumnScanner interface, Next([]Value) error #67546 -pkg database/sql/driver, type RowsColumnScanner interface, ScanColumn(interface{}, int) error #67546 pkg debug/elf, const R_LARCH_CALL36 = 110 #75562 pkg debug/elf, const R_LARCH_CALL36 R_LARCH #75562 pkg debug/elf, const R_LARCH_TLS_DESC32 = 13 #75562 diff --git a/src/database/sql/driver/driver.go b/src/database/sql/driver/driver.go index 487870be632..d0892e80fc2 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 85b9ffc37d9..4be450ca876 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 6ee85058558..e8a65600973 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")