Skip to content

Commit cf6e423

Browse files
committed
database/sql: prefer to return Rows.lasterr rather then a static error
Fixes #25829 Change-Id: I400fdaf0ef3a23bc0d61c4873ffa298e0cf0fc6a Reviewed-on: https://go-review.googlesource.com/c/145204 Reviewed-by: Brad Fitzpatrick <[email protected]>
1 parent 37afd3e commit cf6e423

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

src/database/sql/sql.go

+19-9
Original file line numberDiff line numberDiff line change
@@ -2605,6 +2605,15 @@ type Rows struct {
26052605
lastcols []driver.Value
26062606
}
26072607

2608+
// lasterrOrErrLocked returns either lasterr or the provided err.
2609+
// rs.closemu must be read-locked.
2610+
func (rs *Rows) lasterrOrErrLocked(err error) error {
2611+
if rs.lasterr != nil && rs.lasterr != io.EOF {
2612+
return rs.lasterr
2613+
}
2614+
return err
2615+
}
2616+
26082617
func (rs *Rows) initContextClose(ctx, txctx context.Context) {
26092618
if ctx.Done() == nil && (txctx == nil || txctx.Done() == nil) {
26102619
return
@@ -2728,22 +2737,22 @@ func (rs *Rows) NextResultSet() bool {
27282737
func (rs *Rows) Err() error {
27292738
rs.closemu.RLock()
27302739
defer rs.closemu.RUnlock()
2731-
if rs.lasterr == io.EOF {
2732-
return nil
2733-
}
2734-
return rs.lasterr
2740+
return rs.lasterrOrErrLocked(nil)
27352741
}
27362742

2743+
var errRowsClosed = errors.New("sql: Rows are closed")
2744+
var errNoRows = errors.New("sql: no Rows available")
2745+
27372746
// Columns returns the column names.
27382747
// Columns returns an error if the rows are closed.
27392748
func (rs *Rows) Columns() ([]string, error) {
27402749
rs.closemu.RLock()
27412750
defer rs.closemu.RUnlock()
27422751
if rs.closed {
2743-
return nil, errors.New("sql: Rows are closed")
2752+
return nil, rs.lasterrOrErrLocked(errRowsClosed)
27442753
}
27452754
if rs.rowsi == nil {
2746-
return nil, errors.New("sql: no Rows available")
2755+
return nil, rs.lasterrOrErrLocked(errNoRows)
27472756
}
27482757
rs.dc.Lock()
27492758
defer rs.dc.Unlock()
@@ -2757,10 +2766,10 @@ func (rs *Rows) ColumnTypes() ([]*ColumnType, error) {
27572766
rs.closemu.RLock()
27582767
defer rs.closemu.RUnlock()
27592768
if rs.closed {
2760-
return nil, errors.New("sql: Rows are closed")
2769+
return nil, rs.lasterrOrErrLocked(errRowsClosed)
27612770
}
27622771
if rs.rowsi == nil {
2763-
return nil, errors.New("sql: no Rows available")
2772+
return nil, rs.lasterrOrErrLocked(errNoRows)
27642773
}
27652774
rs.dc.Lock()
27662775
defer rs.dc.Unlock()
@@ -2916,8 +2925,9 @@ func (rs *Rows) Scan(dest ...interface{}) error {
29162925
return rs.lasterr
29172926
}
29182927
if rs.closed {
2928+
err := rs.lasterrOrErrLocked(errRowsClosed)
29192929
rs.closemu.RUnlock()
2920-
return errors.New("sql: Rows are closed")
2930+
return err
29212931
}
29222932
rs.closemu.RUnlock()
29232933

0 commit comments

Comments
 (0)