Skip to content

Commit d5ffb5c

Browse files
authored
Merge pull request #489 from Projectplace/fix-cancel-race
Fix race in ExecContext
2 parents c41df79 + 5800484 commit d5ffb5c

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

sqlite3.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1171,9 +1171,13 @@ func (s *SQLiteStmt) exec(ctx context.Context, args []namedValue) (driver.Result
11711171
defer close(done)
11721172
go func(db *C.sqlite3) {
11731173
select {
1174-
case <-ctx.Done():
1175-
C.sqlite3_interrupt(db)
11761174
case <-done:
1175+
case <-ctx.Done():
1176+
select {
1177+
case <-done:
1178+
default:
1179+
C.sqlite3_interrupt(db)
1180+
}
11771181
}
11781182
}(s.c.db)
11791183

sqlite3_go18_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,3 +134,24 @@ func TestShortTimeout(t *testing.T) {
134134
t.Fatal(ctx.Err())
135135
}
136136
}
137+
138+
func TestExecCancel(t *testing.T) {
139+
db, err := sql.Open("sqlite3", ":memory:")
140+
if err != nil {
141+
t.Fatal(err)
142+
}
143+
defer db.Close()
144+
145+
if _, err = db.Exec("create table foo (id integer primary key)"); err != nil {
146+
t.Fatal(err)
147+
}
148+
149+
for n := 0; n < 100; n++ {
150+
ctx, cancel := context.WithCancel(context.Background())
151+
_, err = db.ExecContext(ctx, "insert into foo (id) values (?)", n)
152+
cancel()
153+
if err != nil {
154+
t.Fatal(err)
155+
}
156+
}
157+
}

0 commit comments

Comments
 (0)