]> Cypherpunks repositories - gostls13.git/commitdiff
database/sql: add method Err on sql.Row
authorTim Möhlmann <muhlemmer@gmail.com>
Fri, 10 Jan 2020 10:06:53 +0000 (12:06 +0200)
committerDaniel Theophanes <kardianos@gmail.com>
Thu, 19 Mar 2020 16:17:59 +0000 (16:17 +0000)
The Row.Err method is intended to assist wrapping sql.DB.
Because sql.Row is a struct with private fields,
a wrapper in an existing code base cannot easily provide users
with a different implementation without large rewrites.
Adding this method allows query level errors to be handled
centrally.

Fixes #35804

Change-Id: I94e6329de89a7ee1284ce9ef76af4363d2d081f9
Reviewed-on: https://go-review.googlesource.com/c/go/+/214317
Reviewed-by: Daniel Theophanes <kardianos@gmail.com>
Run-TryBot: Daniel Theophanes <kardianos@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

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

index 1bf3731b008c1fd3916e1b192aba526bd2dfdcc1..95906b1318aef5868f893b0969f61b39bd61b2e4 100644 (file)
@@ -3174,6 +3174,14 @@ func (r *Row) Scan(dest ...interface{}) error {
        return r.rows.Close()
 }
 
+// Err provides a way for wrapping packages to check for
+// query errors without calling Scan.
+// Err returns the error, if any, that was encountered while running the query.
+// If this error is not nil, this error will also be returned from Scan.
+func (r *Row) Err() error {
+       return r.err
+}
+
 // A Result summarizes an executed SQL command.
 type Result interface {
        // LastInsertId returns the integer generated by the database
index a1437c46c96027365f342cd1e6fa98568becdf99..0fc994d0a1a1b4e69cdc9f630460cf0811b95b6d 100644 (file)
@@ -788,6 +788,24 @@ func TestQueryRow(t *testing.T) {
        }
 }
 
+func TestRowErr(t *testing.T) {
+       db := newTestDB(t, "people")
+
+       err := db.QueryRowContext(context.Background(), "SELECT|people|bdate|age=?", 3).Err()
+       if err != nil {
+               t.Errorf("Unexpected err = %v; want %v", err, nil)
+       }
+
+       ctx, cancel := context.WithCancel(context.Background())
+       cancel()
+
+       err = db.QueryRowContext(ctx, "SELECT|people|bdate|age=?", 3).Err()
+       exp := "context canceled"
+       if err == nil || !strings.Contains(err.Error(), exp) {
+               t.Errorf("Expected err = %v; got %v", exp, err)
+       }
+}
+
 func TestTxRollbackCommitErr(t *testing.T) {
        db := newTestDB(t, "people")
        defer closeDB(t, db)