Commit 16f32a07 authored by Eric Rykwalder's avatar Eric Rykwalder Committed by Daniel Theophanes

database/sql: return context errors from Rows.Scan

The previous implementation would return "sql: Rows are closed" for any
context errors, which can be confusing for context timeouts or
cancelations.

Fixes #24431

Change-Id: I884904ec43204c43f4e94e2335b2802aab77a888
Reviewed-on: https://go-review.googlesource.com/104276Reviewed-by: default avatarDaniel Theophanes <kardianos@gmail.com>
Run-TryBot: Daniel Theophanes <kardianos@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 7a7b63f3
...@@ -2870,6 +2870,11 @@ func rowsColumnInfoSetupConnLocked(rowsi driver.Rows) []*ColumnType { ...@@ -2870,6 +2870,11 @@ func rowsColumnInfoSetupConnLocked(rowsi driver.Rows) []*ColumnType {
// string inputs parseable by strconv.ParseBool. // string inputs parseable by strconv.ParseBool.
func (rs *Rows) Scan(dest ...interface{}) error { func (rs *Rows) Scan(dest ...interface{}) error {
rs.closemu.RLock() rs.closemu.RLock()
if rs.lasterr != nil && rs.lasterr != io.EOF {
rs.closemu.RUnlock()
return rs.lasterr
}
if rs.closed { if rs.closed {
rs.closemu.RUnlock() rs.closemu.RUnlock()
return errors.New("sql: Rows are closed") return errors.New("sql: Rows are closed")
......
...@@ -325,8 +325,8 @@ func TestQueryContext(t *testing.T) { ...@@ -325,8 +325,8 @@ func TestQueryContext(t *testing.T) {
} }
t.Fatalf("Scan: %v", err) t.Fatalf("Scan: %v", err)
} }
if index == 2 && err == nil { if index == 2 && err != context.Canceled {
t.Fatal("expected an error on last scan") t.Fatalf("Scan: %v; want context.Canceled", err)
} }
got = append(got, r) got = append(got, r)
index++ index++
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment