]> Cypherpunks repositories - gostls13.git/commitdiff
database/sql: fix Conn leak
authorBrad Fitzpatrick <bradfitz@golang.org>
Fri, 8 Mar 2013 18:04:17 +0000 (10:04 -0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 8 Mar 2013 18:04:17 +0000 (10:04 -0800)
Fixes #4902

R=golang-dev, alex.brainman, r, google
CC=golang-dev
https://golang.org/cl/7579045

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

index 4faaa11b11fa3a51e3c725cc2d8d894e494c1928..6d52d2986d1821a49a0ce6218a8c8f7939a2de46 100644 (file)
@@ -445,6 +445,7 @@ func (db *DB) prepare(query string) (*Stmt, error) {
                css:   []connStmt{{ci, si}},
        }
        db.addDep(stmt, stmt)
+       db.putConn(ci, nil)
        return stmt, nil
 }
 
index 53b229600d9066df66ba9b541b87d748b7cb9a00..f5c3f1ed659075b447a97b6ead899a0afa31a6fd 100644 (file)
@@ -708,3 +708,32 @@ func TestQueryRowNilScanDest(t *testing.T) {
                t.Errorf("error = %q; want %q", err.Error(), want)
        }
 }
+
+func TestIssue4902(t *testing.T) {
+       db := newTestDB(t, "people")
+       defer closeDB(t, db)
+
+       driver := db.driver.(*fakeDriver)
+       opens0 := driver.openCount
+
+       var stmt *Stmt
+       var err error
+       for i := 0; i < 10; i++ {
+               stmt, err = db.Prepare("SELECT|people|name|")
+               if err != nil {
+                       t.Fatal(err)
+               }
+               err = stmt.Close()
+               if err != nil {
+                       t.Fatal(err)
+               }
+       }
+
+       opens := driver.openCount - opens0
+       if opens > 1 {
+               t.Errorf("opens = %d; want <= 1", opens)
+               t.Logf("db = %#v", db)
+               t.Logf("driver = %#v", driver)
+               t.Logf("stmt = %#v", stmt)
+       }
+}