diff --git a/config.go b/config.go index 3f60b8f..c1154b2 100644 --- a/config.go +++ b/config.go @@ -294,3 +294,17 @@ func autoVacuumCallback(ctx context.Context, mod api.Module, pApp, zSchema, nDbP schema := util.ReadString(mod, zSchema, _MAX_NAME) return uint32(fn(schema, uint(nDbPage), uint(nFreePage), uint(nBytePerPage))) } + +// SoftHeapLimit imposes a soft limit on heap size. +// +// https://sqlite.org/c3ref/hard_heap_limit64.html +func (c *Conn) SoftHeapLimit(n int64) int64 { + return int64(c.call("sqlite3_soft_heap_limit64", uint64(n))) +} + +// SoftHeapLimit imposes a hard limit on heap size. +// +// https://sqlite.org/c3ref/hard_heap_limit64.html +func (c *Conn) HardHeapLimit(n int64) int64 { + return int64(c.call("sqlite3_hard_heap_limit64", uint64(n))) +} diff --git a/embed/bcw2/bcw2.wasm b/embed/bcw2/bcw2.wasm index b851bcb..596b22b 100755 Binary files a/embed/bcw2/bcw2.wasm and b/embed/bcw2/bcw2.wasm differ diff --git a/embed/exports.txt b/embed/exports.txt index 0123605..b624ee1 100644 --- a/embed/exports.txt +++ b/embed/exports.txt @@ -74,6 +74,7 @@ sqlite3_finalize sqlite3_free sqlite3_get_autocommit sqlite3_get_auxdata +sqlite3_hard_heap_limit64 sqlite3_interrupt sqlite3_last_insert_rowid sqlite3_limit @@ -100,6 +101,7 @@ sqlite3_rollback_hook_go sqlite3_set_authorizer_go sqlite3_set_auxdata_go sqlite3_set_last_insert_rowid +sqlite3_soft_heap_limit64 sqlite3_step sqlite3_stmt_busy sqlite3_stmt_readonly diff --git a/embed/sqlite3.wasm b/embed/sqlite3.wasm index 8105ebb..6b18057 100755 Binary files a/embed/sqlite3.wasm and b/embed/sqlite3.wasm differ diff --git a/sqlite3/sqlite_opt.h b/sqlite3/sqlite_opt.h index 7015ebb..c67f271 100644 --- a/sqlite3/sqlite_opt.h +++ b/sqlite3/sqlite_opt.h @@ -2,7 +2,6 @@ #define SQLITE_DQS 0 #define SQLITE_THREADSAFE 0 -#define SQLITE_DEFAULT_MEMSTATUS 0 #define SQLITE_DEFAULT_WAL_SYNCHRONOUS 1 #define SQLITE_LIKE_DOESNT_MATCH_BLOBS #define SQLITE_MAX_EXPR_DEPTH 0 @@ -13,6 +12,7 @@ #define SQLITE_OMIT_AUTOINIT // We need these: +// #define SQLITE_DEFAULT_MEMSTATUS 0 // #define SQLITE_OMIT_DECLTYPE // #define SQLITE_OMIT_PROGRESS_CALLBACK diff --git a/tests/config_test.go b/tests/config_test.go new file mode 100644 index 0000000..da2dbee --- /dev/null +++ b/tests/config_test.go @@ -0,0 +1,427 @@ +package tests + +import ( + "errors" + "math" + "net/url" + "path/filepath" + "testing" + + "github.com/ncruces/go-sqlite3" + "github.com/ncruces/go-sqlite3/vfs" + "github.com/ncruces/go-sqlite3/vfs/memdb" +) + +func TestConn_Config(t *testing.T) { + t.Parallel() + + db, err := sqlite3.Open(":memory:") + if err != nil { + t.Fatal(err) + } + defer db.Close() + + o, err := db.Config(sqlite3.DBCONFIG_DEFENSIVE) + if err != nil { + t.Fatal(err) + } + if o != false { + t.Error("want false") + } + + o, err = db.Config(sqlite3.DBCONFIG_DEFENSIVE, true) + if err != nil { + t.Fatal(err) + } + if o != true { + t.Error("want true") + } + + o, err = db.Config(sqlite3.DBCONFIG_DEFENSIVE) + if err != nil { + t.Fatal(err) + } + if o != true { + t.Error("want true") + } + + o, err = db.Config(sqlite3.DBCONFIG_DEFENSIVE, false) + if err != nil { + t.Fatal(err) + } + if o != false { + t.Error("want false") + } + + o, err = db.Config(sqlite3.DBCONFIG_DEFENSIVE) + if err != nil { + t.Fatal(err) + } + if o != false { + t.Error("want false") + } +} + +func TestConn_ConfigLog(t *testing.T) { + t.Parallel() + + db, err := sqlite3.Open(":memory:") + if err != nil { + t.Fatal(err) + } + defer db.Close() + + var code sqlite3.ExtendedErrorCode + err = db.ConfigLog(func(c sqlite3.ExtendedErrorCode, msg string) { + t.Log(msg) + code = c + }) + if err != nil { + t.Fatal(err) + } + + db.Prepare(`SELECT * FRM sqlite_schema`) + + if code != sqlite3.ExtendedErrorCode(sqlite3.ERROR) { + t.Error("want sqlite3.ERROR") + } +} + +func TestConn_FileControl(t *testing.T) { + t.Parallel() + + file := filepath.Join(t.TempDir(), "test.db") + db, err := sqlite3.Open(file) + if err != nil { + t.Fatal(err) + } + defer db.Close() + + t.Run("MISUSE", func(t *testing.T) { + _, err := db.FileControl("main", 0) + if !errors.Is(err, sqlite3.MISUSE) { + t.Errorf("got %v, want MISUSE", err) + } + }) + t.Run("FCNTL_RESET_CACHE", func(t *testing.T) { + o, err := db.FileControl("", sqlite3.FCNTL_RESET_CACHE) + if err != nil { + t.Fatal(err) + } + if o != nil { + t.Errorf("got %v, want nil", o) + } + }) + + t.Run("FCNTL_PERSIST_WAL", func(t *testing.T) { + o, err := db.FileControl("", sqlite3.FCNTL_PERSIST_WAL) + if err != nil { + t.Fatal(err) + } + if o != false { + t.Errorf("got %v, want false", o) + } + + o, err = db.FileControl("", sqlite3.FCNTL_PERSIST_WAL, true) + if err != nil { + t.Fatal(err) + } + if o != true { + t.Errorf("got %v, want true", o) + } + + o, err = db.FileControl("", sqlite3.FCNTL_PERSIST_WAL) + if err != nil { + t.Fatal(err) + } + if o != true { + t.Errorf("got %v, want true", o) + } + }) + + t.Run("FCNTL_CHUNK_SIZE", func(t *testing.T) { + o, err := db.FileControl("", sqlite3.FCNTL_CHUNK_SIZE, 1024*1024) + if !errors.Is(err, sqlite3.NOTFOUND) { + t.Errorf("got %v, want NOTFOUND", err) + } + if o != nil { + t.Errorf("got %v, want nil", o) + } + }) + + t.Run("FCNTL_RESERVE_BYTES", func(t *testing.T) { + o, err := db.FileControl("", sqlite3.FCNTL_RESERVE_BYTES, 4) + if err != nil { + t.Fatal(err) + } + if o != 0 { + t.Errorf("got %v, want 0", o) + } + + o, err = db.FileControl("", sqlite3.FCNTL_RESERVE_BYTES) + if err != nil { + t.Fatal(err) + } + if o != 4 { + t.Errorf("got %v, want 4", o) + } + }) + + t.Run("FCNTL_DATA_VERSION", func(t *testing.T) { + o, err := db.FileControl("", sqlite3.FCNTL_DATA_VERSION) + if err != nil { + t.Fatal(err) + } + if o != uint32(2) { + t.Errorf("got %v, want 2", o) + } + }) + + t.Run("FCNTL_VFS_POINTER", func(t *testing.T) { + o, err := db.FileControl("", sqlite3.FCNTL_VFS_POINTER) + if err != nil { + t.Fatal(err) + } + if o != vfs.Find("os") { + t.Errorf("got %v, want os", o) + } + }) + + t.Run("FCNTL_FILE_POINTER", func(t *testing.T) { + o, err := db.FileControl("", sqlite3.FCNTL_FILE_POINTER) + if err != nil { + t.Fatal(err) + } + if _, ok := o.(vfs.File); !ok { + t.Errorf("got %v, want File", o) + } + }) + + t.Run("FCNTL_JOURNAL_POINTER", func(t *testing.T) { + o, err := db.FileControl("", sqlite3.FCNTL_JOURNAL_POINTER) + if err != nil { + t.Fatal(err) + } + if o != nil { + t.Errorf("got %v, want nil", o) + } + }) + + t.Run("FCNTL_LOCKSTATE", func(t *testing.T) { + if !vfs.SupportsFileLocking { + t.Skip("skipping without locks") + } + + txn, err := db.BeginExclusive() + if err != nil { + t.Fatal(err) + } + defer txn.End(&err) + + o, err := db.FileControl("", sqlite3.FCNTL_LOCKSTATE) + if err != nil { + t.Fatal(err) + } + if o != vfs.LOCK_EXCLUSIVE { + t.Errorf("got %v, want LOCK_EXCLUSIVE", o) + } + }) +} + +func TestConn_Limit(t *testing.T) { + t.Parallel() + + db, err := sqlite3.Open(":memory:") + if err != nil { + t.Fatal(err) + } + defer db.Close() + + l := db.Limit(sqlite3.LIMIT_COLUMN, -1) + if l != 2000 { + t.Errorf("got %d, want 2000", l) + } + + l = db.Limit(sqlite3.LIMIT_COLUMN, 100) + if l != 2000 { + t.Errorf("got %d, want 2000", l) + } + + l = db.Limit(sqlite3.LIMIT_COLUMN, -1) + if l != 100 { + t.Errorf("got %d, want 100", l) + } + + l = db.Limit(math.MaxUint32, -1) + if l != -1 { + t.Errorf("got %d, want -1", l) + } +} + +func TestConn_SetAuthorizer(t *testing.T) { + t.Parallel() + + db, err := sqlite3.Open(":memory:") + if err != nil { + t.Fatal(err) + } + defer db.Close() + + err = db.SetAuthorizer(func(action sqlite3.AuthorizerActionCode, name3rd, name4th, schema, nameInner string) sqlite3.AuthorizerReturnCode { + if action != sqlite3.AUTH_PRAGMA { + t.Errorf("got %v, want PRAGMA", action) + } + if name3rd != "busy_timeout" { + t.Errorf("got %q, want busy_timeout", name3rd) + } + if name4th != "5000" { + t.Errorf("got %q, want 5000", name4th) + } + if schema != "main" { + t.Errorf("got %q, want main", schema) + } + return sqlite3.AUTH_DENY + }) + if err != nil { + t.Fatal(err) + } + + err = db.Exec(`PRAGMA main.busy_timeout=5000`) + if !errors.Is(err, sqlite3.AUTH) { + t.Errorf("got %v, want sqlite3.AUTH", err) + } +} + +func TestConn_Trace(t *testing.T) { + t.Parallel() + + db, err := sqlite3.Open(":memory:") + if err != nil { + t.Fatal(err) + } + defer db.Close() + + rows := 0 + closed := false + err = db.Trace(math.MaxUint32, func(evt sqlite3.TraceEvent, a1 any, a2 any) error { + switch evt { + case sqlite3.TRACE_CLOSE: + closed = true + _ = a1.(*sqlite3.Conn) + return db.Exec(`PRAGMA optimize`) + case sqlite3.TRACE_STMT: + stmt := a1.(*sqlite3.Stmt) + if sql := a2.(string); sql != stmt.SQL() { + t.Errorf("got %q, want %q", sql, stmt.SQL()) + } + if sql := stmt.ExpandedSQL(); sql != `SELECT 1` { + t.Errorf("got %q", sql) + } + case sqlite3.TRACE_PROFILE: + _ = a1.(*sqlite3.Stmt) + if ns := a2.(int64); ns < 0 { + t.Errorf("got %d", ns) + } + case sqlite3.TRACE_ROW: + _ = a1.(*sqlite3.Stmt) + if a2 != nil { + t.Errorf("got %v", a2) + } + rows++ + } + return nil + }) + if err != nil { + t.Fatal(err) + } + + stmt, _, err := db.Prepare(`SELECT ?`) + if err != nil { + t.Fatal(err) + } + err = stmt.BindInt(1, 1) + if err != nil { + t.Fatal(err) + } + err = stmt.Exec() + if err != nil { + t.Fatal(err) + } + err = stmt.Close() + if err != nil { + t.Fatal(err) + } + if rows != 1 { + t.Error("want 1") + } + + err = db.Close() + if err != nil { + t.Fatal(err) + } + if !closed { + t.Error("want closed") + } +} + +func TestConn_AutoVacuumPages(t *testing.T) { + t.Parallel() + tmp := memdb.TestDB(t, url.Values{ + "_pragma": {"auto_vacuum(full)"}, + }) + + db, err := sqlite3.Open(tmp) + if err != nil { + t.Fatal(err) + } + defer db.Close() + + err = db.AutoVacuumPages(func(schema string, dbPages, freePages, bytesPerPage uint) uint { + return freePages + }) + if err != nil { + t.Fatal(err) + } + + err = db.Exec(`CREATE TABLE test (col)`) + if err != nil { + t.Fatal(err) + } + + err = db.Exec(`INSERT INTO test VALUES (zeroblob(1024*1024))`) + if err != nil { + t.Fatal(err) + } + + err = db.Exec(`DROP TABLE test`) + if err != nil { + t.Fatal(err) + } +} + +func TestConn_memoryLimit(t *testing.T) { + t.Parallel() + + db, err := sqlite3.Open(":memory:") + if err != nil { + t.Fatal(err) + } + defer db.Close() + + n := db.HardHeapLimit(-1) + if n != 0 { + t.Fatal("want zero") + } + + const limit = 64 * 1024 * 1024 + + n = db.SoftHeapLimit(limit) + if n != 0 { + t.Fatal("want zero") + } + + n = db.SoftHeapLimit(-1) + if n != limit { + t.Fatal("want", limit) + } +} diff --git a/tests/conn_test.go b/tests/conn_test.go index d4e20bd..c51e010 100644 --- a/tests/conn_test.go +++ b/tests/conn_test.go @@ -3,8 +3,6 @@ package tests import ( "context" "errors" - "math" - "net/url" "os" "path/filepath" "strings" @@ -13,8 +11,6 @@ import ( "github.com/ncruces/go-sqlite3" _ "github.com/ncruces/go-sqlite3/embed" _ "github.com/ncruces/go-sqlite3/internal/testcfg" - "github.com/ncruces/go-sqlite3/vfs" - "github.com/ncruces/go-sqlite3/vfs/memdb" _ "github.com/ncruces/go-sqlite3/vfs/memdb" ) @@ -265,358 +261,6 @@ func TestConn_Prepare_invalid(t *testing.T) { } } -func TestConn_Config(t *testing.T) { - t.Parallel() - - db, err := sqlite3.Open(":memory:") - if err != nil { - t.Fatal(err) - } - defer db.Close() - - o, err := db.Config(sqlite3.DBCONFIG_DEFENSIVE) - if err != nil { - t.Fatal(err) - } - if o != false { - t.Error("want false") - } - - o, err = db.Config(sqlite3.DBCONFIG_DEFENSIVE, true) - if err != nil { - t.Fatal(err) - } - if o != true { - t.Error("want true") - } - - o, err = db.Config(sqlite3.DBCONFIG_DEFENSIVE) - if err != nil { - t.Fatal(err) - } - if o != true { - t.Error("want true") - } - - o, err = db.Config(sqlite3.DBCONFIG_DEFENSIVE, false) - if err != nil { - t.Fatal(err) - } - if o != false { - t.Error("want false") - } - - o, err = db.Config(sqlite3.DBCONFIG_DEFENSIVE) - if err != nil { - t.Fatal(err) - } - if o != false { - t.Error("want false") - } -} - -func TestConn_ConfigLog(t *testing.T) { - t.Parallel() - - db, err := sqlite3.Open(":memory:") - if err != nil { - t.Fatal(err) - } - defer db.Close() - - var code sqlite3.ExtendedErrorCode - err = db.ConfigLog(func(c sqlite3.ExtendedErrorCode, msg string) { - t.Log(msg) - code = c - }) - if err != nil { - t.Fatal(err) - } - - db.Prepare(`SELECT * FRM sqlite_schema`) - - if code != sqlite3.ExtendedErrorCode(sqlite3.ERROR) { - t.Error("want sqlite3.ERROR") - } -} - -func TestConn_FileControl(t *testing.T) { - t.Parallel() - - file := filepath.Join(t.TempDir(), "test.db") - db, err := sqlite3.Open(file) - if err != nil { - t.Fatal(err) - } - defer db.Close() - - t.Run("MISUSE", func(t *testing.T) { - _, err := db.FileControl("main", 0) - if !errors.Is(err, sqlite3.MISUSE) { - t.Errorf("got %v, want MISUSE", err) - } - }) - t.Run("FCNTL_RESET_CACHE", func(t *testing.T) { - o, err := db.FileControl("", sqlite3.FCNTL_RESET_CACHE) - if err != nil { - t.Fatal(err) - } - if o != nil { - t.Errorf("got %v, want nil", o) - } - }) - - t.Run("FCNTL_PERSIST_WAL", func(t *testing.T) { - o, err := db.FileControl("", sqlite3.FCNTL_PERSIST_WAL) - if err != nil { - t.Fatal(err) - } - if o != false { - t.Errorf("got %v, want false", o) - } - - o, err = db.FileControl("", sqlite3.FCNTL_PERSIST_WAL, true) - if err != nil { - t.Fatal(err) - } - if o != true { - t.Errorf("got %v, want true", o) - } - - o, err = db.FileControl("", sqlite3.FCNTL_PERSIST_WAL) - if err != nil { - t.Fatal(err) - } - if o != true { - t.Errorf("got %v, want true", o) - } - }) - - t.Run("FCNTL_CHUNK_SIZE", func(t *testing.T) { - o, err := db.FileControl("", sqlite3.FCNTL_CHUNK_SIZE, 1024*1024) - if !errors.Is(err, sqlite3.NOTFOUND) { - t.Errorf("got %v, want NOTFOUND", err) - } - if o != nil { - t.Errorf("got %v, want nil", o) - } - }) - - t.Run("FCNTL_RESERVE_BYTES", func(t *testing.T) { - o, err := db.FileControl("", sqlite3.FCNTL_RESERVE_BYTES, 4) - if err != nil { - t.Fatal(err) - } - if o != 0 { - t.Errorf("got %v, want 0", o) - } - - o, err = db.FileControl("", sqlite3.FCNTL_RESERVE_BYTES) - if err != nil { - t.Fatal(err) - } - if o != 4 { - t.Errorf("got %v, want 4", o) - } - }) - - t.Run("FCNTL_DATA_VERSION", func(t *testing.T) { - o, err := db.FileControl("", sqlite3.FCNTL_DATA_VERSION) - if err != nil { - t.Fatal(err) - } - if o != uint32(2) { - t.Errorf("got %v, want 2", o) - } - }) - - t.Run("FCNTL_VFS_POINTER", func(t *testing.T) { - o, err := db.FileControl("", sqlite3.FCNTL_VFS_POINTER) - if err != nil { - t.Fatal(err) - } - if o != vfs.Find("os") { - t.Errorf("got %v, want os", o) - } - }) - - t.Run("FCNTL_FILE_POINTER", func(t *testing.T) { - o, err := db.FileControl("", sqlite3.FCNTL_FILE_POINTER) - if err != nil { - t.Fatal(err) - } - if _, ok := o.(vfs.File); !ok { - t.Errorf("got %v, want File", o) - } - }) - - t.Run("FCNTL_JOURNAL_POINTER", func(t *testing.T) { - o, err := db.FileControl("", sqlite3.FCNTL_JOURNAL_POINTER) - if err != nil { - t.Fatal(err) - } - if o != nil { - t.Errorf("got %v, want nil", o) - } - }) - - t.Run("FCNTL_LOCKSTATE", func(t *testing.T) { - if !vfs.SupportsFileLocking { - t.Skip("skipping without locks") - } - - txn, err := db.BeginExclusive() - if err != nil { - t.Fatal(err) - } - defer txn.End(&err) - - o, err := db.FileControl("", sqlite3.FCNTL_LOCKSTATE) - if err != nil { - t.Fatal(err) - } - if o != vfs.LOCK_EXCLUSIVE { - t.Errorf("got %v, want LOCK_EXCLUSIVE", o) - } - }) -} - -func TestConn_Limit(t *testing.T) { - t.Parallel() - - db, err := sqlite3.Open(":memory:") - if err != nil { - t.Fatal(err) - } - defer db.Close() - - l := db.Limit(sqlite3.LIMIT_COLUMN, -1) - if l != 2000 { - t.Errorf("got %d, want 2000", l) - } - - l = db.Limit(sqlite3.LIMIT_COLUMN, 100) - if l != 2000 { - t.Errorf("got %d, want 2000", l) - } - - l = db.Limit(sqlite3.LIMIT_COLUMN, -1) - if l != 100 { - t.Errorf("got %d, want 100", l) - } - - l = db.Limit(math.MaxUint32, -1) - if l != -1 { - t.Errorf("got %d, want -1", l) - } -} - -func TestConn_SetAuthorizer(t *testing.T) { - t.Parallel() - - db, err := sqlite3.Open(":memory:") - if err != nil { - t.Fatal(err) - } - defer db.Close() - - err = db.SetAuthorizer(func(action sqlite3.AuthorizerActionCode, name3rd, name4th, schema, nameInner string) sqlite3.AuthorizerReturnCode { - if action != sqlite3.AUTH_PRAGMA { - t.Errorf("got %v, want PRAGMA", action) - } - if name3rd != "busy_timeout" { - t.Errorf("got %q, want busy_timeout", name3rd) - } - if name4th != "5000" { - t.Errorf("got %q, want 5000", name4th) - } - if schema != "main" { - t.Errorf("got %q, want main", schema) - } - return sqlite3.AUTH_DENY - }) - if err != nil { - t.Fatal(err) - } - - err = db.Exec(`PRAGMA main.busy_timeout=5000`) - if !errors.Is(err, sqlite3.AUTH) { - t.Errorf("got %v, want sqlite3.AUTH", err) - } -} - -func TestConn_Trace(t *testing.T) { - t.Parallel() - - db, err := sqlite3.Open(":memory:") - if err != nil { - t.Fatal(err) - } - defer db.Close() - - rows := 0 - closed := false - err = db.Trace(math.MaxUint32, func(evt sqlite3.TraceEvent, a1 any, a2 any) error { - switch evt { - case sqlite3.TRACE_CLOSE: - closed = true - _ = a1.(*sqlite3.Conn) - return db.Exec(`PRAGMA optimize`) - case sqlite3.TRACE_STMT: - stmt := a1.(*sqlite3.Stmt) - if sql := a2.(string); sql != stmt.SQL() { - t.Errorf("got %q, want %q", sql, stmt.SQL()) - } - if sql := stmt.ExpandedSQL(); sql != `SELECT 1` { - t.Errorf("got %q", sql) - } - case sqlite3.TRACE_PROFILE: - _ = a1.(*sqlite3.Stmt) - if ns := a2.(int64); ns < 0 { - t.Errorf("got %d", ns) - } - case sqlite3.TRACE_ROW: - _ = a1.(*sqlite3.Stmt) - if a2 != nil { - t.Errorf("got %v", a2) - } - rows++ - } - return nil - }) - if err != nil { - t.Fatal(err) - } - - stmt, _, err := db.Prepare(`SELECT ?`) - if err != nil { - t.Fatal(err) - } - err = stmt.BindInt(1, 1) - if err != nil { - t.Fatal(err) - } - err = stmt.Exec() - if err != nil { - t.Fatal(err) - } - err = stmt.Close() - if err != nil { - t.Fatal(err) - } - if rows != 1 { - t.Error("want 1") - } - - err = db.Close() - if err != nil { - t.Fatal(err) - } - if !closed { - t.Error("want closed") - } -} - func TestConn_ReleaseMemory(t *testing.T) { t.Parallel() @@ -727,41 +371,6 @@ func TestConn_DBName(t *testing.T) { } } -func TestConn_AutoVacuumPages(t *testing.T) { - t.Parallel() - tmp := memdb.TestDB(t, url.Values{ - "_pragma": {"auto_vacuum(full)"}, - }) - - db, err := sqlite3.Open(tmp) - if err != nil { - t.Fatal(err) - } - defer db.Close() - - err = db.AutoVacuumPages(func(schema string, dbPages, freePages, bytesPerPage uint) uint { - return freePages - }) - if err != nil { - t.Fatal(err) - } - - err = db.Exec(`CREATE TABLE test (col)`) - if err != nil { - t.Fatal(err) - } - - err = db.Exec(`INSERT INTO test VALUES (zeroblob(1024*1024))`) - if err != nil { - t.Fatal(err) - } - - err = db.Exec(`DROP TABLE test`) - if err != nil { - t.Fatal(err) - } -} - func TestConn_Status(t *testing.T) { t.Parallel() diff --git a/vfs/tests/mptest/testdata/mptest.wasm.bz2 b/vfs/tests/mptest/testdata/mptest.wasm.bz2 index 10c625a..b89d85d 100644 --- a/vfs/tests/mptest/testdata/mptest.wasm.bz2 +++ b/vfs/tests/mptest/testdata/mptest.wasm.bz2 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:42858f7755a42e64913c5119dcd5ecb3fbceac71e13952d4e8b62a97c05311b5 -size 476253 +oid sha256:4b2ca8d3b914990e5c3486e039a6a4160b36c8d6db6c95e2c6c6619d69d26e1d +size 476258 diff --git a/vfs/tests/speedtest1/testdata/speedtest1.wasm.bz2 b/vfs/tests/speedtest1/testdata/speedtest1.wasm.bz2 index 6ed9a5a..f5060eb 100644 --- a/vfs/tests/speedtest1/testdata/speedtest1.wasm.bz2 +++ b/vfs/tests/speedtest1/testdata/speedtest1.wasm.bz2 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cf4fb9d930647e29f0da71981b6b1e204e4949c816e5f7d6aeded6a90ad9e8ab -size 489516 +oid sha256:259a3d0311302a0ea1d577a8209425f0dbf1ec3a77e214dbafa0e2c1a30723d3 +size 489479