]> Cypherpunks repositories - gostls13.git/commitdiff
database/sql: stop reuse of bad connections
authorJulien Schmidt <google@julienschmidt.com>
Fri, 24 Aug 2012 02:29:47 +0000 (19:29 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 24 Aug 2012 02:29:47 +0000 (19:29 -0700)
The second parameter for sql.putConn() (err) is always nil. As a result bad
connections are reused, even if the driver returns an driver.ErrBadConn.
Unsing a pointer to err instead achievs the desired behavior.
See http://code.google.com/p/go/issues/detail?id=3777 for more details.
Fixes #3777.

R=golang-dev, dave, bradfitz, jameshuachow, BlakeSGentry
CC=golang-dev
https://golang.org/cl/6348069

src/pkg/database/sql/sql.go [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index b87f57f..b0cba94
@@ -311,7 +311,10 @@ func (db *DB) prepare(query string) (stmt *Stmt, err error) {
        if err != nil {
                return nil, err
        }
-       defer db.putConn(ci, err)
+       defer func() {
+               db.putConn(ci, err)
+       }()
+
        si, err := ci.Prepare(query)
        if err != nil {
                return nil, err
@@ -342,7 +345,9 @@ func (db *DB) exec(query string, args []interface{}) (res Result, err error) {
        if err != nil {
                return nil, err
        }
-       defer db.putConn(ci, err)
+       defer func() {
+               db.putConn(ci, err)
+       }()
 
        if execer, ok := ci.(driver.Execer); ok {
                dargs, err := driverArgs(nil, args)