aboutsummaryrefslogtreecommitdiff
path: root/src/database/sql/fakedb_test.go
diff options
context:
space:
mode:
authorDaniel Theophanes <kardianos@gmail.com>2021-07-12 09:25:04 -0500
committerDaniel Theophanes <kardianos@gmail.com>2021-11-03 22:51:09 +0000
commit1f368d5b860b178bcbd55dfeb64474295263516b (patch)
tree15044e9c6db0af964a6d08bdd3bf50dec975754d /src/database/sql/fakedb_test.go
parentd3f5dd57811ca6c55654e67c58cf594fc2e5091e (diff)
downloadgo-1f368d5b860b178bcbd55dfeb64474295263516b.tar.xz
database/sql: use errors.Is when checking ErrBadConn
When drivers return driver.ErrBadConn, no meaningful information about what the cause of the problem is returned. Ideally the driver.ErrBadConn would be always caught with the retry loop, but this is not always the case. Drivers today must choose between returning a useful error and use the rety logic. This allows supporting both. Fixes #47142 Change-Id: I454573028f041dfdf874eed6c254fb194ccf6d96 Reviewed-on: https://go-review.googlesource.com/c/go/+/333949 Run-TryBot: Ian Lance Taylor <iant@golang.org> Trust: Ian Lance Taylor <iant@golang.org> Trust: Daniel Theophanes <kardianos@gmail.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/database/sql/fakedb_test.go')
-rw-r--r--src/database/sql/fakedb_test.go27
1 files changed, 20 insertions, 7 deletions
diff --git a/src/database/sql/fakedb_test.go b/src/database/sql/fakedb_test.go
index 4b68f1cba9..34e97e012b 100644
--- a/src/database/sql/fakedb_test.go
+++ b/src/database/sql/fakedb_test.go
@@ -96,6 +96,19 @@ type fakeDB struct {
allowAny bool
}
+type fakeError struct {
+ Message string
+ Wrapped error
+}
+
+func (err fakeError) Error() string {
+ return err.Message
+}
+
+func (err fakeError) Unwrap() error {
+ return err.Wrapped
+}
+
type table struct {
mu sync.Mutex
colname []string
@@ -368,7 +381,7 @@ func (c *fakeConn) isDirtyAndMark() bool {
func (c *fakeConn) Begin() (driver.Tx, error) {
if c.isBad() {
- return nil, driver.ErrBadConn
+ return nil, fakeError{Wrapped: driver.ErrBadConn}
}
if c.currTx != nil {
return nil, errors.New("fakedb: already in a transaction")
@@ -401,7 +414,7 @@ func (c *fakeConn) ResetSession(ctx context.Context) error {
c.dirtySession = false
c.currTx = nil
if c.isBad() {
- return driver.ErrBadConn
+ return fakeError{Message: "Reset Session: bad conn", Wrapped: driver.ErrBadConn}
}
return nil
}
@@ -629,7 +642,7 @@ func (c *fakeConn) PrepareContext(ctx context.Context, query string) (driver.Stm
}
if c.stickyBad || (hookPrepareBadConn != nil && hookPrepareBadConn()) {
- return nil, driver.ErrBadConn
+ return nil, fakeError{Message: "Preapre: Sticky Bad", Wrapped: driver.ErrBadConn}
}
c.touchMem()
@@ -756,7 +769,7 @@ func (s *fakeStmt) ExecContext(ctx context.Context, args []driver.NamedValue) (d
}
if s.c.stickyBad || (hookExecBadConn != nil && hookExecBadConn()) {
- return nil, driver.ErrBadConn
+ return nil, fakeError{Message: "Exec: Sticky Bad", Wrapped: driver.ErrBadConn}
}
if s.c.isDirtyAndMark() {
return nil, errFakeConnSessionDirty
@@ -870,7 +883,7 @@ func (s *fakeStmt) QueryContext(ctx context.Context, args []driver.NamedValue) (
}
if s.c.stickyBad || (hookQueryBadConn != nil && hookQueryBadConn()) {
- return nil, driver.ErrBadConn
+ return nil, fakeError{Message: "Query: Sticky Bad", Wrapped: driver.ErrBadConn}
}
if s.c.isDirtyAndMark() {
return nil, errFakeConnSessionDirty
@@ -1031,7 +1044,7 @@ var hookCommitBadConn func() bool
func (tx *fakeTx) Commit() error {
tx.c.currTx = nil
if hookCommitBadConn != nil && hookCommitBadConn() {
- return driver.ErrBadConn
+ return fakeError{Message: "Commit: Hook Bad Conn", Wrapped: driver.ErrBadConn}
}
tx.c.touchMem()
return nil
@@ -1043,7 +1056,7 @@ var hookRollbackBadConn func() bool
func (tx *fakeTx) Rollback() error {
tx.c.currTx = nil
if hookRollbackBadConn != nil && hookRollbackBadConn() {
- return driver.ErrBadConn
+ return fakeError{Message: "Rollback: Hook Bad Conn", Wrapped: driver.ErrBadConn}
}
tx.c.touchMem()
return nil