diff options
| author | Jinzhu <wosmvp@gmail.com> | 2022-05-19 02:44:00 +0000 |
|---|---|---|
| committer | Daniel Theophanes <kardianos@gmail.com> | 2022-05-19 20:21:12 +0000 |
| commit | 29057b707d468bd690e6eadfebe89c4ff737867c (patch) | |
| tree | 43eea83d17246f982b659eb13a553d7fc6e6cbc5 /src/database/sql | |
| parent | 97ce98ac203e76fc1a1e902226277dc00456b41b (diff) | |
| download | go-git-29057b707d468bd690e6eadfebe89c4ff737867c.tar.gz | |
database/sql: fix close rows error ignored in Next
Change-Id: I19f0d764e2a6122307f3f26a6dd3be7b1155c73b
GitHub-Last-Rev: 9f1f883c452201679a2d2af2cc29de0f09a43f28
GitHub-Pull-Request: golang/go#52756
Reviewed-on: https://go-review.googlesource.com/c/go/+/404794
Reviewed-by: Daniel Theophanes <kardianos@gmail.com>
Reviewed-by: Bryan Mills <bcmills@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Run-TryBot: Daniel Theophanes <kardianos@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src/database/sql')
| -rw-r--r-- | src/database/sql/fakedb_test.go | 5 | ||||
| -rw-r--r-- | src/database/sql/sql.go | 2 | ||||
| -rw-r--r-- | src/database/sql/sql_test.go | 33 |
3 files changed, 39 insertions, 1 deletions
diff --git a/src/database/sql/fakedb_test.go b/src/database/sql/fakedb_test.go index ec47ce4714..2fe5ea42da 100644 --- a/src/database/sql/fakedb_test.go +++ b/src/database/sql/fakedb_test.go @@ -1089,6 +1089,9 @@ type rowsCursor struct { // This is separate from the fakeConn.line to allow for drivers that // can start multiple queries on the same transaction at the same time. line int64 + + // closeErr is returned when rowsCursor.Close + closeErr error } func (rc *rowsCursor) touchMem() { @@ -1100,7 +1103,7 @@ func (rc *rowsCursor) Close() error { rc.touchMem() rc.parentMem.touchMem() rc.closed = true - return nil + return rc.closeErr } func (rc *rowsCursor) Columns() []string { diff --git a/src/database/sql/sql.go b/src/database/sql/sql.go index 04897b3360..854a895281 100644 --- a/src/database/sql/sql.go +++ b/src/database/sql/sql.go @@ -3331,6 +3331,8 @@ func (rs *Rows) close(err error) error { rs.closeStmt.Close() } rs.releaseConn(err) + + rs.lasterr = rs.lasterrOrErrLocked(err) return err } diff --git a/src/database/sql/sql_test.go b/src/database/sql/sql_test.go index 41631c735f..6bc869fc86 100644 --- a/src/database/sql/sql_test.go +++ b/src/database/sql/sql_test.go @@ -2636,6 +2636,39 @@ func TestRowsImplicitClose(t *testing.T) { } } +func TestRowsCloseError(t *testing.T) { + db := newTestDB(t, "people") + defer db.Close() + rows, err := db.Query("SELECT|people|age,name|") + if err != nil { + t.Fatalf("Query: %v", err) + } + type row struct { + age int + name string + } + got := []row{} + + rc, ok := rows.rowsi.(*rowsCursor) + if !ok { + t.Fatal("not using *rowsCursor") + } + rc.closeErr = errors.New("rowsCursor: failed to close") + + for rows.Next() { + var r row + err = rows.Scan(&r.age, &r.name) + if err != nil { + t.Fatalf("Scan: %v", err) + } + got = append(got, r) + } + err = rows.Err() + if err != rc.closeErr { + t.Fatalf("unexpected err: got %v, want %v", err, rc.closeErr) + } +} + func TestStmtCloseOrder(t *testing.T) { db := newTestDB(t, "people") defer closeDB(t, db) |
