diff --git a/conn.go b/conn.go index 044795c..a7f4acd 100644 --- a/conn.go +++ b/conn.go @@ -41,6 +41,7 @@ type Conn struct { busylst time.Time arena arena handle ptr_t + nprogr uint8 } // Open calls [OpenFlags] with [OPEN_READWRITE], [OPEN_CREATE] and [OPEN_URI]. @@ -120,7 +121,7 @@ func (c *Conn) openDB(filename string, flags OpenFlag) (ptr_t, error) { return 0, err } - c.call("sqlite3_progress_handler_go", stk_t(handle), 100) + c.call("sqlite3_progress_handler_go", stk_t(handle), 1000) if flags|OPEN_URI != 0 && strings.HasPrefix(filename, "file:") { var pragmas strings.Builder if _, after, ok := strings.Cut(filename, "?"); ok { @@ -376,7 +377,7 @@ func (c *Conn) checkInterrupt(handle ptr_t) { func progressCallback(ctx context.Context, mod api.Module, _ ptr_t) (interrupt int32) { if c, ok := ctx.Value(connKey{}).(*Conn); ok { - if c.interrupt.Done() != nil { + if c.nprogr++; c.nprogr%16 == 0 { runtime.Gosched() } if c.interrupt.Err() != nil { diff --git a/driver/driver_test.go b/driver/driver_test.go index aa35771..4ed030f 100644 --- a/driver/driver_test.go +++ b/driver/driver_test.go @@ -467,3 +467,29 @@ func Test_ColumnType_ScanType(t *testing.T) { t.Fatal(err) } } + +func Benchmark_loop(b *testing.B) { + db, err := Open(":memory:") + if err != nil { + b.Fatal(err) + } + defer db.Close() + + var version string + err = db.QueryRow(`SELECT sqlite_version();`).Scan(&version) + if err != nil { + b.Fatal(err) + } + + ctx, cancel := context.WithCancel(context.Background()) + b.Cleanup(cancel) + + b.ResetTimer() + for range b.N { + _, err := db.ExecContext(ctx, + `WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x < 1000000) SELECT x FROM c;`) + if err != nil { + b.Fatal(err) + } + } +}