]> Cypherpunks repositories - gostls13.git/commitdiff
database/sql: close statement before connection
authorAlex Brainman <alex.brainman@gmail.com>
Tue, 23 Jul 2013 04:09:53 +0000 (14:09 +1000)
committerAlex Brainman <alex.brainman@gmail.com>
Tue, 23 Jul 2013 04:09:53 +0000 (14:09 +1000)
Fixes #5936

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/11620046

src/pkg/database/sql/sql.go
src/pkg/database/sql/sql_test.go

index ebb7f440e0f123756ad1872d30b10b2ecdad8e5c..35d5338c564de7d0d5cc8d6cd9ecd2f6a2b7e2dd 100644 (file)
@@ -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
        }
 
index e6cc667fa97830eac0d5cf3c0fe9977e9173ee60..fc620bd6dcfbc1e082da7e30809287a7869e9544 100644 (file)
@@ -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() {