diff options
author | Blake Mizerany <blake.mizerany@gmail.com> | 2012-01-25 17:49:30 -0800 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@golang.org> | 2012-01-25 17:49:30 -0800 |
commit | bcb976c5b277b30dab6e771659c01bddec8c8a72 (patch) | |
tree | 5bc2b4460cd5c5b3ae534cee65d8373403e57d25 | |
parent | 5c04272ff33d90f2417c1db40be8675dd74fdad9 (diff) | |
download | go-bcb976c5b277b30dab6e771659c01bddec8c8a72.tar.gz go-bcb976c5b277b30dab6e771659c01bddec8c8a72.zip |
database/sql: fix Tx.Query
Fixes #2784
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5574073
-rw-r--r-- | src/pkg/database/sql/sql.go | 7 | ||||
-rw-r--r-- | src/pkg/database/sql/sql_test.go | 34 |
2 files changed, 39 insertions, 2 deletions
diff --git a/src/pkg/database/sql/sql.go b/src/pkg/database/sql/sql.go index 70499b9a95..7e226b17dc 100644 --- a/src/pkg/database/sql/sql.go +++ b/src/pkg/database/sql/sql.go @@ -556,8 +556,11 @@ func (tx *Tx) Query(query string, args ...interface{}) (*Rows, error) { if err != nil { return nil, err } - defer stmt.Close() - return stmt.Query(args...) + rows, err := stmt.Query(args...) + if err == nil { + rows.closeStmt = stmt + } + return rows, err } // QueryRow executes a query that is expected to return at most one row. diff --git a/src/pkg/database/sql/sql_test.go b/src/pkg/database/sql/sql_test.go index 3fb137eb24..08db6d38ff 100644 --- a/src/pkg/database/sql/sql_test.go +++ b/src/pkg/database/sql/sql_test.go @@ -311,6 +311,40 @@ func TestTxStmt(t *testing.T) { } } +// Issue: http://golang.org/issue/2784 +// This test didn't fail before because we got luckly with the fakedb driver. +// It was failing, and now not, in github.com/bradfitz/go-sql-test +func TestTxQuery(t *testing.T) { + db := newTestDB(t, "") + defer closeDB(t, db) + exec(t, db, "CREATE|t1|name=string,age=int32,dead=bool") + exec(t, db, "INSERT|t1|name=Alice") + + tx, err := db.Begin() + if err != nil { + t.Fatal(err) + } + defer tx.Rollback() + + r, err := tx.Query("SELECT|t1|name|") + if err != nil { + t.Fatal(err) + } + + if !r.Next() { + if r.Err() != nil { + t.Fatal(r.Err()) + } + t.Fatal("expected one row") + } + + var x string + err = r.Scan(&x) + if err != nil { + t.Fatal(err) + } +} + // Tests fix for issue 2542, that we release a lock when querying on // a closed connection. func TestIssue2542Deadlock(t *testing.T) { |