From: Alex Brainman Date: Tue, 23 Jul 2013 04:09:53 +0000 (+1000) Subject: database/sql: close statement before connection X-Git-Tag: go1.2rc2~969 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=a293065a39963ef2efb4cc133e286d2d97b356a9;p=gostls13.git database/sql: close statement before connection Fixes #5936 R=golang-dev, bradfitz CC=golang-dev https://golang.org/cl/11620046 --- diff --git a/src/pkg/database/sql/sql.go b/src/pkg/database/sql/sql.go index ebb7f440e0..35d5338c56 100644 --- a/src/pkg/database/sql/sql.go +++ b/src/pkg/database/sql/sql.go @@ -759,10 +759,10 @@ func (db *DB) queryConn(dc *driverConn, releaseConn func(error), query string, a ds := driverStmt{dc, si} rowsi, err := rowsiFromStatement(ds, args...) if err != nil { - releaseConn(err) dc.Lock() si.Close() dc.Unlock() + releaseConn(err) return nil, err } diff --git a/src/pkg/database/sql/sql_test.go b/src/pkg/database/sql/sql_test.go index e6cc667fa9..fc620bd6dc 100644 --- a/src/pkg/database/sql/sql_test.go +++ b/src/pkg/database/sql/sql_test.go @@ -1046,6 +1046,20 @@ func TestRowsCloseOrder(t *testing.T) { } } +func TestStmtCloseOrder(t *testing.T) { + db := newTestDB(t, "people") + defer closeDB(t, db) + + db.SetMaxIdleConns(0) + setStrictFakeConnClose(t) + defer setStrictFakeConnClose(nil) + + _, err := db.Query("SELECT|non_existent|name|") + if err == nil { + t.Fatal("Quering non-existent table should fail") + } +} + func manyConcurrentQueries(t testOrBench) { maxProcs, numReqs := 16, 500 if testing.Short() {