mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
database/sql: make Rows.Next returning false always implicitly call
Rows.Close.
Previously, callers that followed the example code (but not call
rows.Close after "for rows.Next() { ... }") could leak statements if
the driver returned an error other than io.EOF.
R=bradfitz, alex.brainman
CC=golang-dev, rsc
https://golang.org/cl/12677050
This commit is contained in:
parent
b75a08d03c
commit
bc21265074
3 changed files with 49 additions and 16 deletions
|
|
@ -6,6 +6,7 @@ package sql
|
|||
|
||||
import (
|
||||
"database/sql/driver"
|
||||
"errors"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"runtime"
|
||||
|
|
@ -1039,6 +1040,34 @@ func TestRowsCloseOrder(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestRowsImplicitClose(t *testing.T) {
|
||||
db := newTestDB(t, "people")
|
||||
defer closeDB(t, db)
|
||||
|
||||
rows, err := db.Query("SELECT|people|age,name|")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
want, fail := 2, errors.New("fail")
|
||||
r := rows.rowsi.(*rowsCursor)
|
||||
r.errPos, r.err = want, fail
|
||||
|
||||
got := 0
|
||||
for rows.Next() {
|
||||
got++
|
||||
}
|
||||
if got != want {
|
||||
t.Errorf("got %d rows, want %d", got, want)
|
||||
}
|
||||
if err := rows.Err(); err != fail {
|
||||
t.Errorf("got error %v, want %v", err, fail)
|
||||
}
|
||||
if !r.closed {
|
||||
t.Errorf("r.closed is false, want true")
|
||||
}
|
||||
}
|
||||
|
||||
func TestStmtCloseOrder(t *testing.T) {
|
||||
db := newTestDB(t, "people")
|
||||
defer closeDB(t, db)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue