Skip to content

Commit 0486dee

Browse files
committed
load extensions using the C API instead of SQL
This fixes the problem of loading ICU, which needs to replace existing functions. Replacing existing functions are prohibited when a VM is running.
1 parent a141177 commit 0486dee

File tree

1 file changed

+5
-11
lines changed

1 file changed

+5
-11
lines changed

sqlite3.go

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -287,21 +287,15 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
287287
return nil, errors.New(C.GoString(C.sqlite3_errmsg(db)))
288288
}
289289

290-
stmt, err := conn.Prepare("SELECT load_extension(?);")
291-
if err != nil {
292-
return nil, err
293-
}
294-
295290
for _, extension := range d.Extensions {
296-
if _, err = stmt.Exec([]driver.Value{extension}); err != nil {
297-
return nil, err
291+
cext := C.CString(extension)
292+
defer C.free(unsafe.Pointer(cext))
293+
rv = C.sqlite3_load_extension(db, cext, nil, nil)
294+
if rv != C.SQLITE_OK {
295+
return nil, errors.New(C.GoString(C.sqlite3_errmsg(db)))
298296
}
299297
}
300298

301-
if err = stmt.Close(); err != nil {
302-
return nil, err
303-
}
304-
305299
rv = C.sqlite3_enable_load_extension(db, 0)
306300
if rv != C.SQLITE_OK {
307301
return nil, errors.New(C.GoString(C.sqlite3_errmsg(db)))

0 commit comments

Comments
 (0)