Improved driver metadata.

This commit is contained in:
Nuno Cruces
2025-12-19 16:51:50 +00:00
parent c5f49b835a
commit 7df3814c34
6 changed files with 29 additions and 18 deletions

View File

@@ -68,8 +68,8 @@ jobs:
shell: bash shell: bash
run: | run: |
go work init . go work init .
go work use -r embed gormlite go work use -r embed/bcw2 gormlite litestream
go test ./embed/bcw2/... go test ./embed/bcw2 ./gormlite ./litestream
- name: Test GORM - name: Test GORM
shell: bash shell: bash

View File

@@ -698,17 +698,23 @@ func (r *rows) loadColumnMetadata() {
types := make([]string, count) types := make([]string, count)
scans := make([]scantype, count) scans := make([]scantype, count)
for i := range types { for i := range types {
var notnull bool var declType string
if col := r.Stmt.ColumnOriginName(i); col != "" { var notNull, autoInc bool
types[i], _, notnull, _, _, _ = c.TableColumnMetadata( if column := r.Stmt.ColumnOriginName(i); column != "" {
declType, _, notNull, _, autoInc, _ = c.TableColumnMetadata(
r.Stmt.ColumnDatabaseName(i), r.Stmt.ColumnDatabaseName(i),
r.Stmt.ColumnTableName(i), r.Stmt.ColumnTableName(i),
col) column)
types[i] = strings.ToUpper(types[i]) } else {
scans[i] = scanFromDecl(types[i]) declType = r.Stmt.ColumnDeclType(i)
if notnull {
scans[i] |= _NOT_NULL
} }
if declType != "" {
declType = strings.ToUpper(declType)
scans[i] = scanFromDecl(declType)
types[i] = declType
}
if notNull || autoInc {
scans[i] |= _NOT_NULL
} }
} }
r.types = types r.types = types

View File

@@ -35,6 +35,8 @@ type bloom struct {
hashes int 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) { func create(db *sqlite3.Conn, _, schema, table string, arg ...string) (_ *bloom, err error) {
b := bloom{ b := bloom{
db: db, db: db,
@@ -79,8 +81,7 @@ func create(db *sqlite3.Conn, _, schema, table string, arg ...string) (_ *bloom,
b.bytes = numBytes(nelem, b.prob) b.bytes = numBytes(nelem, b.prob)
err = db.DeclareVTab( err = db.DeclareVTab(vtab)
`CREATE TABLE x(present, word HIDDEN NOT NULL PRIMARY KEY) WITHOUT ROWID`)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -114,8 +115,7 @@ func connect(db *sqlite3.Conn, _, schema, table string, arg ...string) (_ *bloom
storage: table + "_storage", storage: table + "_storage",
} }
err = db.DeclareVTab( err = db.DeclareVTab(vtab)
`CREATE TABLE x(present, word HIDDEN NOT NULL PRIMARY KEY) WITHOUT ROWID`)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@@ -56,7 +56,7 @@ func Register(db *sqlite3.Conn) error {
done.Add(key) 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 { if err != nil {
return nil, err return nil, err
} }

View File

@@ -30,7 +30,7 @@ func RegisterFS(db *sqlite3.Conn, fsys fs.FS) error {
db.CreateFunction("readfile", 1, sqlite3.DIRECTONLY, readfile(fsys)), db.CreateFunction("readfile", 1, sqlite3.DIRECTONLY, readfile(fsys)),
db.CreateFunction("lsmode", 1, sqlite3.DETERMINISTIC, lsmode), db.CreateFunction("lsmode", 1, sqlite3.DETERMINISTIC, lsmode),
sqlite3.CreateModule(db, "fsdir", nil, func(db *sqlite3.Conn, _, _, _ string, _ ...string) (fsdir, error) { 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 { if err == nil {
err = db.VTabConfig(sqlite3.VTAB_DIRECTONLY) err = db.VTabConfig(sqlite3.VTAB_DIRECTONLY)
} }

View File

@@ -55,6 +55,8 @@ func declare(db *sqlite3.Conn, _, _, _ string, arg ...string) (ret *table, err e
t.keys[i] = name t.keys[i] = name
create.WriteString(sep) create.WriteString(sep)
create.WriteString(name) create.WriteString(name)
create.WriteString(" ")
create.WriteString(stmt.ColumnDeclType(i))
sep = "," sep = ","
} }
stmt.Close() stmt.Close()
@@ -71,8 +73,11 @@ func declare(db *sqlite3.Conn, _, _, _ string, arg ...string) (ret *table, err e
for stmt.Step() { for stmt.Step() {
name := sqlite3.QuoteIdentifier(stmt.ColumnText(1)) name := sqlite3.QuoteIdentifier(stmt.ColumnText(1))
t.cols = append(t.cols, stmt.ColumnValue(0).Dup()) t.cols = append(t.cols, stmt.ColumnValue(0).Dup())
create.WriteString(",") create.WriteString(sep)
create.WriteString(name) create.WriteString(name)
create.WriteString(" ")
create.WriteString(stmt.ColumnDeclType(1))
sep = ","
} }
stmt.Close() stmt.Close()