]> Cypherpunks repositories - gostls13.git/commitdiff
database/sql: clarify that DB.Prepare's stmt is safe for concurrent use
authorBrad Fitzpatrick <bradfitz@golang.org>
Thu, 21 Feb 2013 06:15:36 +0000 (22:15 -0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 21 Feb 2013 06:15:36 +0000 (22:15 -0800)
And add a test too, for Alex. :)

Fixes #3734

R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/7399046

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

index 28339921091aa2420e1a27f06d44e64e2e8cd60e..4faaa11b11fa3a51e3c725cc2d8d894e494c1928 100644 (file)
@@ -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
index e6fc6a1d57c53720150124f0748058f1dfc6ba13..74ba8e0ce743e8e24546ce614c85bfcd1b354f68 100644 (file)
@@ -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")