From 967fa427fde2f7a22adc04399d0de3090d34f883 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 31 May 2016 06:58:33 -0700 Subject: 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 Reviewed-by: Brad Fitzpatrick --- src/database/sql/sql_test.go | 47 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'src/database/sql/sql_test.go') 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) -- cgit v1.3