]> Cypherpunks repositories - gostls13.git/commitdiff
database/sql: fix close rows error ignored in Next
authorJinzhu <wosmvp@gmail.com>
Thu, 19 May 2022 02:44:00 +0000 (02:44 +0000)
committerDaniel Theophanes <kardianos@gmail.com>
Thu, 19 May 2022 20:21:12 +0000 (20:21 +0000)
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>

src/database/sql/fakedb_test.go
src/database/sql/sql.go
src/database/sql/sql_test.go

index ec47ce47143835065e08532b40ba4bc973caf5b3..2fe5ea42da3a4d2027c0f5fa09eb1818b26d3c9c 100644 (file)
@@ -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 {
index 04897b33604dbd6ff631638c0ccc18def6fd8cac..854a895281ac47e3a04dba3c64b2ff15eaf6acea 100644 (file)
@@ -3331,6 +3331,8 @@ func (rs *Rows) close(err error) error {
                rs.closeStmt.Close()
        }
        rs.releaseConn(err)
+
+       rs.lasterr = rs.lasterrOrErrLocked(err)
        return err
 }
 
index 41631c735f7b7d6642bd66ab3429ca57f09d5a3a..6bc869fc864c26d4ac32cba3aadadf3cd9f12fea 100644 (file)
@@ -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)