From c822fa95c73ec69c8202ea86a750bb940ac6b86d Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Tue, 16 Jan 2024 15:18:14 +0000 Subject: [PATCH] Batch column scans. (#52) --- driver/driver.go | 45 +++++++++------------- embed/build.sh | 3 +- embed/exports.txt | 1 + embed/sqlite3.wasm | Bin 1474310 -> 1474908 bytes sqlite3/column.c | 51 +++++++++++++++++++++++++ sqlite3/main.c | 1 + sqlite3/vtab.c | 2 - stmt.go | 37 ++++++++++++++++++ vfs/tests/mptest/testdata/build.sh | 2 +- vfs/tests/speedtest1/testdata/build.sh | 2 +- 10 files changed, 111 insertions(+), 33 deletions(-) create mode 100644 sqlite3/column.c diff --git a/driver/driver.go b/driver/driver.go index 6408e68..1d22bc8 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -50,6 +50,7 @@ import ( "net/url" "strings" "time" + "unsafe" "github.com/ncruces/go-sqlite3" "github.com/ncruces/go-sqlite3/internal/util" @@ -532,46 +533,34 @@ func (r *rows) Next(dest []driver.Value) error { return io.EOF } + data := unsafe.Slice((*any)(unsafe.SliceData(dest)), len(dest)) + err := r.Stmt.Columns(data) for i := range dest { - t := r.Stmt.ColumnType(i) - if tm, ok := r.decodeTime(i, t); ok { - dest[i] = tm - continue - } - switch t { - case sqlite3.INTEGER: - dest[i] = r.Stmt.ColumnInt64(i) - case sqlite3.FLOAT: - dest[i] = r.Stmt.ColumnFloat(i) - case sqlite3.BLOB: - dest[i] = r.Stmt.ColumnRawBlob(i) - case sqlite3.TEXT: - dest[i] = stringOrTime(r.Stmt.ColumnText(i)) - case sqlite3.NULL: - dest[i] = nil - default: - panic(util.AssertErr()) + if t, ok := r.decodeTime(i, dest[i]); ok { + dest[i] = t + } else if s, ok := dest[i].(string); ok { + dest[i] = stringOrTime(s) } } - - return r.Stmt.Err() + return err } -func (r *rows) decodeTime(i int, typ sqlite3.Datatype) (_ time.Time, _ bool) { +func (r *rows) decodeTime(i int, v any) (_ time.Time, _ bool) { if r.tmRead == sqlite3.TimeFormatDefault { return } - switch typ { - case sqlite3.INTEGER, sqlite3.FLOAT, sqlite3.TEXT: - // maybe - default: - return - } switch r.declType(i) { case "DATE", "TIME", "DATETIME", "TIMESTAMP": // maybe default: return } - return r.Stmt.ColumnTime(i, r.tmRead), r.Stmt.Err() == nil + switch v.(type) { + case int64, float64, string: + // maybe + default: + return + } + t, err := r.tmRead.Decode(v) + return t, err == nil } diff --git a/embed/build.sh b/embed/build.sh index 615a2d0..638aca9 100755 --- a/embed/build.sh +++ b/embed/build.sh @@ -7,7 +7,8 @@ ROOT=../ BINARYEN="$ROOT/tools/binaryen-version_116/bin" WASI_SDK="$ROOT/tools/wasi-sdk-21.0/bin" -"$WASI_SDK/clang" --target=wasm32-wasi -flto -g0 -O2 \ +"$WASI_SDK/clang" --target=wasm32-wasi -std=c17 -flto -g0 -O2 \ + -Wall -Wextra -Wno-unused-parameter \ -o sqlite3.wasm "$ROOT/sqlite3/main.c" \ -I"$ROOT/sqlite3" \ -mexec-model=reactor \ diff --git a/embed/exports.txt b/embed/exports.txt index 67c0306..ed7b81d 100644 --- a/embed/exports.txt +++ b/embed/exports.txt @@ -39,6 +39,7 @@ sqlite3_column_name sqlite3_column_text sqlite3_column_type sqlite3_column_value +sqlite3_columns_go sqlite3_config_log_go sqlite3_create_aggregate_function_go sqlite3_create_collation_go diff --git a/embed/sqlite3.wasm b/embed/sqlite3.wasm index 2e67f810ed865682168efab8de408049e8178a1d..825b2dc2675a1a94b565e509741373b18288a7fd 100755 GIT binary patch delta 45228 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 z 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 eY23S{Ydw{du51(o17iIXYQHHfFsl`PBv delta 45185 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 diff --git a/sqlite3/column.c b/sqlite3/column.c new file mode 100644 index 0000000..b8fceda --- /dev/null +++ b/sqlite3/column.c @@ -0,0 +1,51 @@ +#include + +#include "sqlite3.h" + +union sqlite3_data { + sqlite3_int64 i; + double d; + struct { + const void *ptr; + int len; + }; +}; + +int sqlite3_columns_go(sqlite3_stmt *stmt, int nCol, char *aType, + union sqlite3_data *aData) { + if (nCol != sqlite3_column_count(stmt)) { + return SQLITE_MISUSE; + } + int rc = SQLITE_OK; + for (int i = 0; i < nCol; ++i) { + const void *ptr = NULL; + switch (aType[i] = sqlite3_column_type(stmt, i)) { + default: // SQLITE_NULL + aData[i] = (union sqlite3_data){}; + case SQLITE_INTEGER: + aData[i].i = sqlite3_column_int64(stmt, i); + continue; + case SQLITE_FLOAT: + aData[i].d = sqlite3_column_double(stmt, i); + continue; + case SQLITE_TEXT: + ptr = sqlite3_column_text(stmt, i); + break; + case SQLITE_BLOB: + ptr = sqlite3_column_blob(stmt, i); + break; + } + if (ptr == NULL && rc == SQLITE_OK) { + rc = sqlite3_errcode(sqlite3_db_handle(stmt)); + } + aData[i].ptr = ptr; + aData[i].len = sqlite3_column_bytes(stmt, i); + } + return rc; +} + +static_assert(offsetof(union sqlite3_data, i) == 0, "Unexpected offset"); +static_assert(offsetof(union sqlite3_data, d) == 0, "Unexpected offset"); +static_assert(offsetof(union sqlite3_data, ptr) == 0, "Unexpected offset"); +static_assert(offsetof(union sqlite3_data, len) == 4, "Unexpected offset"); +static_assert(sizeof(union sqlite3_data) == 8, "Unexpected size"); diff --git a/sqlite3/main.c b/sqlite3/main.c index da2d37f..eb5074a 100644 --- a/sqlite3/main.c +++ b/sqlite3/main.c @@ -10,6 +10,7 @@ #include "ext/uint.c" #include "ext/uuid.c" // Bindings +#include "column.c" #include "func.c" #include "log.c" #include "pointer.c" diff --git a/sqlite3/vtab.c b/sqlite3/vtab.c index 073402b..cb33864 100644 --- a/sqlite3/vtab.c +++ b/sqlite3/vtab.c @@ -136,8 +136,6 @@ static int go_cur_close_wrapper(sqlite3_vtab_cursor *pCursor) { static int go_vtab_find_function_wrapper( sqlite3_vtab *pVTab, int nArg, const char *zName, void (**pxFunc)(sqlite3_context *, int, sqlite3_value **), void **ppArg) { - struct go_vtab *vtab = container_of(pVTab, struct go_vtab, base); - go_handle handle; int rc = go_vtab_find_function(pVTab, nArg, zName, &handle); if (rc) { diff --git a/stmt.go b/stmt.go index 48c2ad5..4837760 100644 --- a/stmt.go +++ b/stmt.go @@ -549,3 +549,40 @@ func (s *Stmt) ColumnValue(col int) Value { handle: uint32(r), } } + +func (s *Stmt) Columns(dest []any) error { + defer s.c.arena.mark()() + count := uint64(len(dest)) + typePtr := s.c.arena.new(count) + dataPtr := s.c.arena.new(8 * count) + + r := s.c.call("sqlite3_columns_go", + uint64(s.handle), count, uint64(typePtr), uint64(dataPtr)) + if err := s.c.error(r); err != nil { + return err + } + + types := util.View(s.c.mod, typePtr, count) + for i := range dest { + switch types[i] { + case byte(INTEGER): + dest[i] = int64(util.ReadUint64(s.c.mod, dataPtr+8*uint32(i))) + continue + case byte(FLOAT): + dest[i] = util.ReadFloat64(s.c.mod, dataPtr+8*uint32(i)) + continue + case byte(NULL): + dest[i] = nil + continue + } + ptr := util.ReadUint32(s.c.mod, dataPtr+8*uint32(i)+0) + len := util.ReadUint32(s.c.mod, dataPtr+8*uint32(i)+4) + buf := util.View(s.c.mod, ptr, uint64(len)) + if types[i] == byte(TEXT) { + dest[i] = string(buf) + } else { + dest[i] = buf + } + } + return nil +} diff --git a/vfs/tests/mptest/testdata/build.sh b/vfs/tests/mptest/testdata/build.sh index 34150e3..570fa12 100755 --- a/vfs/tests/mptest/testdata/build.sh +++ b/vfs/tests/mptest/testdata/build.sh @@ -7,7 +7,7 @@ ROOT=../../../../ BINARYEN="$ROOT/tools/binaryen-version_116/bin" WASI_SDK="$ROOT/tools/wasi-sdk-21.0/bin" -"$WASI_SDK/clang" --target=wasm32-wasi -flto -g0 -O2 \ +"$WASI_SDK/clang" --target=wasm32-wasi -std=c17 -flto -g0 -O2 \ -o mptest.wasm main.c \ -I"$ROOT/sqlite3" \ -msimd128 -mmutable-globals \ diff --git a/vfs/tests/speedtest1/testdata/build.sh b/vfs/tests/speedtest1/testdata/build.sh index ad24c78..3436ec3 100755 --- a/vfs/tests/speedtest1/testdata/build.sh +++ b/vfs/tests/speedtest1/testdata/build.sh @@ -7,7 +7,7 @@ ROOT=../../../../ BINARYEN="$ROOT/tools/binaryen-version_116/bin" WASI_SDK="$ROOT/tools/wasi-sdk-21.0/bin" -"$WASI_SDK/clang" --target=wasm32-wasi -flto -g0 -O2 \ +"$WASI_SDK/clang" --target=wasm32-wasi -std=c17 -flto -g0 -O2 \ -o speedtest1.wasm main.c \ -I"$ROOT/sqlite3" \ -msimd128 -mmutable-globals \