summaryrefslogtreecommitdiff
path: root/src/database/sql
diff options
context:
space:
mode:
authorJinzhu <wosmvp@gmail.com>2022-05-19 02:44:00 +0000
committerDaniel Theophanes <kardianos@gmail.com>2022-05-19 20:21:12 +0000
commit29057b707d468bd690e6eadfebe89c4ff737867c (patch)
tree43eea83d17246f982b659eb13a553d7fc6e6cbc5 /src/database/sql
parent97ce98ac203e76fc1a1e902226277dc00456b41b (diff)
downloadgo-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.go5
-rw-r--r--src/database/sql/sql.go2
-rw-r--r--src/database/sql/sql_test.go33
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)