diff options
| author | Russ Cox <rsc@golang.org> | 2015-12-18 12:16:05 -0500 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2016-01-08 15:49:12 +0000 |
| commit | 99ed71a02c07a073a82a06c8f3a975a9540e962e (patch) | |
| tree | dd332d1d47f7c3c39e24adec946163631db908b5 /src/database/sql/fakedb_test.go | |
| parent | 81adfa508a81e24b8257571dd717845647607cbd (diff) | |
| download | go-99ed71a02c07a073a82a06c8f3a975a9540e962e.tar.xz | |
database/sql: guard against panics in driver.Stmt implementation
For #13677, but there is more to do.
Change-Id: Id1af999dc972d07cdfc771e5855a1a7dca47ca96
Reviewed-on: https://go-review.googlesource.com/18046
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/database/sql/fakedb_test.go')
| -rw-r--r-- | src/database/sql/fakedb_test.go | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/database/sql/fakedb_test.go b/src/database/sql/fakedb_test.go index f1e8f6cb6e..b5ff121358 100644 --- a/src/database/sql/fakedb_test.go +++ b/src/database/sql/fakedb_test.go @@ -33,6 +33,9 @@ var _ = log.Printf // INSERT|<tablename>|col=val,col2=val2,col3=? // SELECT|<tablename>|projectcol1,projectcol2|filtercol=?,filtercol2=? // +// Any of these can be preceded by PANIC|<method>|, to cause the +// named method on fakeStmt to panic. +// // When opening a fakeDriver's database, it starts empty with no // tables. All tables and data are stored in memory only. type fakeDriver struct { @@ -111,6 +114,7 @@ type fakeStmt struct { cmd string table string + panic string closed bool @@ -499,9 +503,15 @@ func (c *fakeConn) Prepare(query string) (driver.Stmt, error) { if len(parts) < 1 { return nil, errf("empty query") } + stmt := &fakeStmt{q: query, c: c} + if len(parts) >= 3 && parts[0] == "PANIC" { + stmt.panic = parts[1] + parts = parts[2:] + } cmd := parts[0] + stmt.cmd = cmd parts = parts[1:] - stmt := &fakeStmt{q: query, c: c, cmd: cmd} + c.incrStat(&c.stmtsMade) switch cmd { case "WIPE": @@ -524,6 +534,9 @@ func (c *fakeConn) Prepare(query string) (driver.Stmt, error) { } func (s *fakeStmt) ColumnConverter(idx int) driver.ValueConverter { + if s.panic == "ColumnConverter" { + panic(s.panic) + } if len(s.placeholderConverter) == 0 { return driver.DefaultParameterConverter } @@ -531,6 +544,9 @@ func (s *fakeStmt) ColumnConverter(idx int) driver.ValueConverter { } func (s *fakeStmt) Close() error { + if s.panic == "Close" { + panic(s.panic) + } if s.c == nil { panic("nil conn in fakeStmt.Close") } @@ -550,6 +566,9 @@ var errClosed = errors.New("fakedb: statement has been closed") var hookExecBadConn func() bool func (s *fakeStmt) Exec(args []driver.Value) (driver.Result, error) { + if s.panic == "Exec" { + panic(s.panic) + } if s.closed { return nil, errClosed } @@ -634,6 +653,9 @@ func (s *fakeStmt) execInsert(args []driver.Value, doInsert bool) (driver.Result var hookQueryBadConn func() bool func (s *fakeStmt) Query(args []driver.Value) (driver.Rows, error) { + if s.panic == "Query" { + panic(s.panic) + } if s.closed { return nil, errClosed } @@ -716,6 +738,9 @@ rows: } func (s *fakeStmt) NumInput() int { + if s.panic == "NumInput" { + panic(s.panic) + } return s.placeholders } |
