From 7df3814c3429ea338123533b8fc94c63c69ab989 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Fri, 19 Dec 2025 16:51:50 +0000 Subject: [PATCH] Improved driver metadata. --- .github/workflows/test.yml | 4 ++-- driver/driver.go | 24 +++++++++++++++--------- ext/bloom/bloom.go | 8 ++++---- ext/closure/closure.go | 2 +- ext/fileio/fileio.go | 2 +- ext/pivot/pivot.go | 7 ++++++- 6 files changed, 29 insertions(+), 18 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 72eb681..8e91bb7 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -68,8 +68,8 @@ jobs: shell: bash run: | go work init . - go work use -r embed gormlite - go test ./embed/bcw2/... + go work use -r embed/bcw2 gormlite litestream + go test ./embed/bcw2 ./gormlite ./litestream - name: Test GORM shell: bash diff --git a/driver/driver.go b/driver/driver.go index 8dd7d85..b362d9b 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -698,17 +698,23 @@ func (r *rows) loadColumnMetadata() { types := make([]string, count) scans := make([]scantype, count) for i := range types { - var notnull bool - if col := r.Stmt.ColumnOriginName(i); col != "" { - types[i], _, notnull, _, _, _ = c.TableColumnMetadata( + var declType string + var notNull, autoInc bool + if column := r.Stmt.ColumnOriginName(i); column != "" { + declType, _, notNull, _, autoInc, _ = c.TableColumnMetadata( r.Stmt.ColumnDatabaseName(i), r.Stmt.ColumnTableName(i), - col) - types[i] = strings.ToUpper(types[i]) - scans[i] = scanFromDecl(types[i]) - if notnull { - scans[i] |= _NOT_NULL - } + column) + } else { + declType = r.Stmt.ColumnDeclType(i) + } + if declType != "" { + declType = strings.ToUpper(declType) + scans[i] = scanFromDecl(declType) + types[i] = declType + } + if notNull || autoInc { + scans[i] |= _NOT_NULL } } r.types = types diff --git a/ext/bloom/bloom.go b/ext/bloom/bloom.go index b203ada..ffd479e 100644 --- a/ext/bloom/bloom.go +++ b/ext/bloom/bloom.go @@ -35,6 +35,8 @@ type bloom struct { hashes int } +const vtab = `CREATE TABLE x(present, word TEXT HIDDEN NOT NULL PRIMARY KEY) WITHOUT ROWID` + func create(db *sqlite3.Conn, _, schema, table string, arg ...string) (_ *bloom, err error) { b := bloom{ db: db, @@ -79,8 +81,7 @@ func create(db *sqlite3.Conn, _, schema, table string, arg ...string) (_ *bloom, b.bytes = numBytes(nelem, b.prob) - err = db.DeclareVTab( - `CREATE TABLE x(present, word HIDDEN NOT NULL PRIMARY KEY) WITHOUT ROWID`) + err = db.DeclareVTab(vtab) if err != nil { return nil, err } @@ -114,8 +115,7 @@ func connect(db *sqlite3.Conn, _, schema, table string, arg ...string) (_ *bloom storage: table + "_storage", } - err = db.DeclareVTab( - `CREATE TABLE x(present, word HIDDEN NOT NULL PRIMARY KEY) WITHOUT ROWID`) + err = db.DeclareVTab(vtab) if err != nil { return nil, err } diff --git a/ext/closure/closure.go b/ext/closure/closure.go index 44b9679..82ba813 100644 --- a/ext/closure/closure.go +++ b/ext/closure/closure.go @@ -56,7 +56,7 @@ func Register(db *sqlite3.Conn) error { done.Add(key) } - err := db.DeclareVTab(`CREATE TABLE x(id,depth,root HIDDEN,tablename HIDDEN,idcolumn HIDDEN,parentcolumn HIDDEN)`) + err := db.DeclareVTab(`CREATE TABLE x(id INT,depth INT,root HIDDEN,tablename TEXT HIDDEN,idcolumn TEXT HIDDEN,parentcolumn TEXT HIDDEN)`) if err != nil { return nil, err } diff --git a/ext/fileio/fileio.go b/ext/fileio/fileio.go index 885f1c4..3741eb6 100644 --- a/ext/fileio/fileio.go +++ b/ext/fileio/fileio.go @@ -30,7 +30,7 @@ func RegisterFS(db *sqlite3.Conn, fsys fs.FS) error { db.CreateFunction("readfile", 1, sqlite3.DIRECTONLY, readfile(fsys)), db.CreateFunction("lsmode", 1, sqlite3.DETERMINISTIC, lsmode), sqlite3.CreateModule(db, "fsdir", nil, func(db *sqlite3.Conn, _, _, _ string, _ ...string) (fsdir, error) { - err := db.DeclareVTab(`CREATE TABLE x(name,mode,mtime TIMESTAMP,data,path HIDDEN,dir HIDDEN)`) + err := db.DeclareVTab(`CREATE TABLE x(name TEXT,mode INT,mtime TIMESTAMP,data BLOB,path HIDDEN,dir HIDDEN)`) if err == nil { err = db.VTabConfig(sqlite3.VTAB_DIRECTONLY) } diff --git a/ext/pivot/pivot.go b/ext/pivot/pivot.go index e17a976..3e566c3 100644 --- a/ext/pivot/pivot.go +++ b/ext/pivot/pivot.go @@ -55,6 +55,8 @@ func declare(db *sqlite3.Conn, _, _, _ string, arg ...string) (ret *table, err e t.keys[i] = name create.WriteString(sep) create.WriteString(name) + create.WriteString(" ") + create.WriteString(stmt.ColumnDeclType(i)) sep = "," } stmt.Close() @@ -71,8 +73,11 @@ func declare(db *sqlite3.Conn, _, _, _ string, arg ...string) (ret *table, err e for stmt.Step() { name := sqlite3.QuoteIdentifier(stmt.ColumnText(1)) t.cols = append(t.cols, stmt.ColumnValue(0).Dup()) - create.WriteString(",") + create.WriteString(sep) create.WriteString(name) + create.WriteString(" ") + create.WriteString(stmt.ColumnDeclType(1)) + sep = "," } stmt.Close()