]> Cypherpunks repositories - gostls13.git/commit
database/sql: close driver Stmt before releasing Conn
authorBrad Fitzpatrick <bradfitz@golang.org>
Mon, 15 Apr 2013 21:06:41 +0000 (14:06 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Mon, 15 Apr 2013 21:06:41 +0000 (14:06 -0700)
commit36d3bef8a3b2a3b7b2662e5b2fd7abbf70c47114
tree9f21b77720c4b815480317a229ff5f89deac1003
parent80de7ab19098ca925c00c314aa5a5c77e6076b82
database/sql: close driver Stmt before releasing Conn

From the issue, which describes it as well as I could:

database/sql assumes that driver.Stmt.Close does not need the
connection.

see database/sql/sql.go:1308:

This puts the Rows' connection back into the idle pool, and
then calls the driver.Stmt.Close method of the Stmt it belongs
to.  In the postgresql driver implementation
(https://github.com/lib/pq), Stmt.Close communicates with the
server (on the connection that was just put back into the idle
pool).  Most of the time, this causes no problems, but if
another goroutine makes a query at the right (wrong?) time,
chaos results.

In any case, traffic is being sent on "free" connections
shortly after they are freed, leading to race conditions that
kill the driver code.

Fixes #5283

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/8633044
src/pkg/database/sql/fakedb_test.go
src/pkg/database/sql/sql.go
src/pkg/database/sql/sql_test.go