aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/database/sql
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@golang.org>2013-02-20 22:15:36 -0800
committerBrad Fitzpatrick <bradfitz@golang.org>2013-02-20 22:15:36 -0800
commitc53fab969c31e3f15306a5b5b714928d2fd6b1df (patch)
tree18bfb95311816f3f9b570ca080354348084898e1 /src/pkg/database/sql
parent4036d876eab44f83d71e668e666acc5cd3997373 (diff)
downloadgo-c53fab969c31e3f15306a5b5b714928d2fd6b1df.tar.xz
database/sql: clarify that DB.Prepare's stmt is safe for concurrent use
And add a test too, for Alex. :) Fixes #3734 R=golang-dev, adg CC=golang-dev https://golang.org/cl/7399046
Diffstat (limited to 'src/pkg/database/sql')
-rw-r--r--src/pkg/database/sql/sql.go4
-rw-r--r--src/pkg/database/sql/sql_test.go29
2 files changed, 32 insertions, 1 deletions
diff --git a/src/pkg/database/sql/sql.go b/src/pkg/database/sql/sql.go
index 2833992109..4faaa11b11 100644
--- a/src/pkg/database/sql/sql.go
+++ b/src/pkg/database/sql/sql.go
@@ -408,7 +408,9 @@ func (db *DB) putConn(c driver.Conn, err error) {
c.Close()
}
-// Prepare creates a prepared statement for later execution.
+// Prepare creates a prepared statement for later queries or executions.
+// Multiple queries or executions may be run concurrently from the
+// returned statement.
func (db *DB) Prepare(query string) (*Stmt, error) {
var stmt *Stmt
var err error
diff --git a/src/pkg/database/sql/sql_test.go b/src/pkg/database/sql/sql_test.go
index e6fc6a1d57..74ba8e0ce7 100644
--- a/src/pkg/database/sql/sql_test.go
+++ b/src/pkg/database/sql/sql_test.go
@@ -273,6 +273,35 @@ func TestStatementQueryRow(t *testing.T) {
}
+// golang.org/issue/3734
+func TestStatementQueryRowConcurrent(t *testing.T) {
+ db := newTestDB(t, "people")
+ defer closeDB(t, db)
+ stmt, err := db.Prepare("SELECT|people|age|name=?")
+ if err != nil {
+ t.Fatalf("Prepare: %v", err)
+ }
+ defer stmt.Close()
+
+ const n = 10
+ ch := make(chan error, n)
+ for i := 0; i < n; i++ {
+ go func() {
+ var age int
+ err := stmt.QueryRow("Alice").Scan(&age)
+ if err == nil && age != 1 {
+ err = fmt.Errorf("unexpected age %d", age)
+ }
+ ch <- err
+ }()
+ }
+ for i := 0; i < n; i++ {
+ if err := <-ch; err != nil {
+ t.Error(err)
+ }
+ }
+}
+
// just a test of fakedb itself
func TestBogusPreboundParameters(t *testing.T) {
db := newTestDB(t, "foo")