Skip to content

Commit b989189

Browse files
committed
Return original error on WithTx methods
When the function passed as parameter, henceforth fn, to the WithTx* methods return an error a rollback is executed but if the rollback doesn't return any error the WithTx function should return the original error returned by fn.
1 parent ef3f227 commit b989189

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

sqlite3/sqlite3.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ func (c *Conn) WithTx(f func() error) error {
474474
err := f()
475475
if err != nil {
476476
err2 := c.Rollback()
477-
if err2 != nil {
477+
if err2 == nil {
478478
return err
479479
}
480480
return fmt.Errorf("%v, additionally rolling back transaction failed: %v", err, err2)
@@ -499,7 +499,7 @@ func (c *Conn) WithTxImmediate(f func() error) error {
499499
err := f()
500500
if err != nil {
501501
err2 := c.Rollback()
502-
if err2 != nil {
502+
if err2 == nil {
503503
return err
504504
}
505505
return fmt.Errorf("%v, additionally rolling back transaction failed: %v", err, err2)
@@ -523,7 +523,7 @@ func (c *Conn) WithTxExclusive(f func() error) error {
523523
err := f()
524524
if err != nil {
525525
err2 := c.Rollback()
526-
if err2 != nil {
526+
if err2 == nil {
527527
return err
528528
}
529529
return fmt.Errorf("%v, additionally rolling back transaction failed: %v", err, err2)

sqlite3/sqlite3_test.go

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package sqlite3
55

66
import (
77
"bytes"
8+
"errors"
89
"fmt"
910
"io"
1011
"io/ioutil"
@@ -1114,7 +1115,7 @@ func TestWithTx(T *testing.T) {
11141115
t.Fatalf("failed to create table")
11151116
}
11161117

1117-
conn.WithTx(func() error {
1118+
err = conn.WithTx(func() error {
11181119
err = conn.Exec(`INSERT INTO student VALUES (?, ?)`, "Bob", 18)
11191120
if err != nil {
11201121
return err
@@ -1125,7 +1126,15 @@ func TestWithTx(T *testing.T) {
11251126
t.Fatalf("failed to insert student")
11261127
}
11271128

1128-
conn.WithTxExclusive(func() error {
1129+
aberr := errors.New("abort operations")
1130+
err = conn.WithTx(func() error {
1131+
return aberr
1132+
})
1133+
if err != aberr {
1134+
t.Fatalf("WithTx hasn't returned the original error")
1135+
}
1136+
1137+
err = conn.WithTxExclusive(func() error {
11291138
err = conn.Exec(`INSERT INTO student VALUES (?, ?)`, "Bob", 18)
11301139
if err != nil {
11311140
return err
@@ -1136,7 +1145,14 @@ func TestWithTx(T *testing.T) {
11361145
t.Fatalf("failed to insert student")
11371146
}
11381147

1139-
conn.WithTxImmediate(func() error {
1148+
err = conn.WithTxExclusive(func() error {
1149+
return aberr
1150+
})
1151+
if err != aberr {
1152+
t.Fatalf("WithTxExclusive hasn't returned the original error")
1153+
}
1154+
1155+
err = conn.WithTxImmediate(func() error {
11401156
err = conn.Exec(`INSERT INTO student VALUES (?, ?)`, "Bob", 18)
11411157
if err != nil {
11421158
return err
@@ -1147,4 +1163,10 @@ func TestWithTx(T *testing.T) {
11471163
t.Fatalf("failed to insert student")
11481164
}
11491165

1166+
err = conn.WithTxImmediate(func() error {
1167+
return aberr
1168+
})
1169+
if err != aberr {
1170+
t.Fatalf("WithTxImmediate hasn't returned the original error")
1171+
}
11501172
}

0 commit comments

Comments
 (0)