diff options
author | mattn <mattn.jp@gmail.com> | 2017-11-22 09:24:37 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-22 09:24:37 +0900 |
commit | d5ffb5c0cca8778699a929b236766f4a7af674e8 (patch) | |
tree | 5bbecb2957b97369fa15b4be9b8f31f5847281a3 | |
parent | Merge pull request #485 from mattn/sqlite3-3.21.0 (diff) | |
parent | Fix race in ExecContext (diff) | |
download | golite-d5ffb5c0cca8778699a929b236766f4a7af674e8.tar.gz golite-d5ffb5c0cca8778699a929b236766f4a7af674e8.tar.xz |
Merge pull request #489 from Projectplace/fix-cancel-race
Fix race in ExecContext
-rw-r--r-- | sqlite3.go | 8 | ||||
-rw-r--r-- | sqlite3_go18_test.go | 21 |
2 files changed, 27 insertions, 2 deletions
@@ -1171,9 +1171,13 @@ func (s *SQLiteStmt) exec(ctx context.Context, args []namedValue) (driver.Result defer close(done) go func(db *C.sqlite3) { select { - case <-ctx.Done(): - C.sqlite3_interrupt(db) case <-done: + case <-ctx.Done(): + select { + case <-done: + default: + C.sqlite3_interrupt(db) + } } }(s.c.db) diff --git a/sqlite3_go18_test.go b/sqlite3_go18_test.go index 2662fcf..44fc4df 100644 --- a/sqlite3_go18_test.go +++ b/sqlite3_go18_test.go @@ -134,3 +134,24 @@ func TestShortTimeout(t *testing.T) { t.Fatal(ctx.Err()) } } + +func TestExecCancel(t *testing.T) { + db, err := sql.Open("sqlite3", ":memory:") + if err != nil { + t.Fatal(err) + } + defer db.Close() + + if _, err = db.Exec("create table foo (id integer primary key)"); err != nil { + t.Fatal(err) + } + + for n := 0; n < 100; n++ { + ctx, cancel := context.WithCancel(context.Background()) + _, err = db.ExecContext(ctx, "insert into foo (id) values (?)", n) + cancel() + if err != nil { + t.Fatal(err) + } + } +} |