diff options
| author | Ian Lance Taylor <iant@golang.org> | 2016-05-31 06:58:33 -0700 |
|---|---|---|
| committer | Ian Lance Taylor <iant@golang.org> | 2016-08-29 16:51:56 +0000 |
| commit | 967fa427fde2f7a22adc04399d0de3090d34f883 (patch) | |
| tree | 73c285aaf68aaa8835d1607b090c6021782861bc /src/database/sql/sql_test.go | |
| parent | e6a96a6277da312d71c76ecb6f4a9a99ba88c389 (diff) | |
| download | go-967fa427fde2f7a22adc04399d0de3090d34f883.tar.xz | |
database/sql: don't hang if the driver Exec method panics
Fixes #13677.
Fixes #15901.
Change-Id: Idffb82cdcba4985954d061bdb021217f47ff4984
Reviewed-on: https://go-review.googlesource.com/23576
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/database/sql/sql_test.go')
| -rw-r--r-- | src/database/sql/sql_test.go | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/database/sql/sql_test.go b/src/database/sql/sql_test.go index 08df0c7666..41afd00e92 100644 --- a/src/database/sql/sql_test.go +++ b/src/database/sql/sql_test.go @@ -2299,6 +2299,53 @@ func TestConnectionLeak(t *testing.T) { wg.Wait() } +// badConn implements a bad driver.Conn, for TestBadDriver. +// The Exec method panics. +type badConn struct{} + +func (bc badConn) Prepare(query string) (driver.Stmt, error) { + return nil, errors.New("badConn Prepare") +} + +func (bc badConn) Close() error { + return nil +} + +func (bc badConn) Begin() (driver.Tx, error) { + return nil, errors.New("badConn Begin") +} + +func (bc badConn) Exec(query string, args []driver.Value) (driver.Result, error) { + panic("badConn.Exec") +} + +// badDriver is a driver.Driver that uses badConn. +type badDriver struct{} + +func (bd badDriver) Open(name string) (driver.Conn, error) { + return badConn{}, nil +} + +// Issue 15901. +func TestBadDriver(t *testing.T) { + Register("bad", badDriver{}) + db, err := Open("bad", "ignored") + if err != nil { + t.Fatal(err) + } + defer func() { + if r := recover(); r == nil { + t.Error("expected panic") + } else { + if want := "badConn.Exec"; r.(string) != want { + t.Errorf("panic was %v, expected %v", r, want) + } + } + }() + defer db.Close() + db.Exec("ignored") +} + func BenchmarkConcurrentDBExec(b *testing.B) { b.ReportAllocs() ct := new(concurrentDBExecTest) |
