@@ -684,7 +684,24 @@ VirtualTableModule::VirtualTableModule(Environment* env,
684684 num_columns_(num_columns),
685685 hidden_col_indices_(std::move(hidden_col_indices)),
686686 use_bigint_args_(use_bigint_args),
687- direct_only_(direct_only) {
687+ direct_only_(direct_only),
688+ module_def_({}) {
689+ // Initialize the sqlite3_module definition. Each VirtualTableModule instance
690+ // gets its own copy to avoid thread-safety issues with worker threads.
691+ module_def_.iVersion = 1 ;
692+ module_def_.xCreate = VirtualTableModule::xCreate;
693+ module_def_.xConnect = VirtualTableModule::xCreate;
694+ module_def_.xBestIndex = VirtualTableModule::xBestIndex;
695+ module_def_.xDisconnect = VirtualTableModule::xDisconnect;
696+ module_def_.xDestroy = VirtualTableModule::xDestroy;
697+ module_def_.xOpen = VirtualTableModule::xOpen;
698+ module_def_.xClose = VirtualTableModule::xClose;
699+ module_def_.xFilter = VirtualTableModule::xFilter;
700+ module_def_.xNext = VirtualTableModule::xNext;
701+ module_def_.xEof = VirtualTableModule::xEof;
702+ module_def_.xColumn = VirtualTableModule::xColumn;
703+ module_def_.xRowid = VirtualTableModule::xRowid;
704+
688705 // Build mapping from schema column index to row array index.
689706 // Visible columns are numbered sequentially; hidden columns map to -1.
690707 col_index_map_.assign (num_columns, 0 );
@@ -2146,36 +2163,6 @@ void DatabaseSync::CreateModule(const FunctionCallbackInfo<Value>& args) {
21462163
21472164 schema_sql += " )" ;
21482165
2149- // Create the static module definition.
2150- // This must be static or heap-allocated because SQLite retains a pointer.
2151- static sqlite3_module vtab_module_def = {
2152- 1 , // iVersion
2153- VirtualTableModule::xCreate, // xCreate
2154- VirtualTableModule::xCreate, // xConnect (same as xCreate)
2155- VirtualTableModule::xBestIndex, // xBestIndex
2156- VirtualTableModule::xDisconnect, // xDisconnect
2157- VirtualTableModule::xDestroy, // xDestroy
2158- VirtualTableModule::xOpen, // xOpen
2159- VirtualTableModule::xClose, // xClose
2160- VirtualTableModule::xFilter, // xFilter
2161- VirtualTableModule::xNext, // xNext
2162- VirtualTableModule::xEof, // xEof
2163- VirtualTableModule::xColumn, // xColumn
2164- VirtualTableModule::xRowid, // xRowid
2165- nullptr , // xUpdate
2166- nullptr , // xBegin
2167- nullptr , // xSync
2168- nullptr , // xCommit
2169- nullptr , // xRollback
2170- nullptr , // xFindFunction
2171- nullptr , // xRename
2172- nullptr , // xSavepoint
2173- nullptr , // xRelease
2174- nullptr , // xRollbackTo
2175- nullptr , // xShadowName
2176- nullptr , // xIntegrity
2177- };
2178-
21792166 VirtualTableModule* vtab_mod =
21802167 new VirtualTableModule (env,
21812168 db,
@@ -2188,7 +2175,7 @@ void DatabaseSync::CreateModule(const FunctionCallbackInfo<Value>& args) {
21882175
21892176 int r = sqlite3_create_module_v2 (db->connection_ ,
21902177 *name,
2191- &vtab_module_def ,
2178+ &vtab_mod-> module_def_ ,
21922179 vtab_mod,
21932180 VirtualTableModule::xDestroyModule);
21942181 CHECK_ERROR_OR_THROW (env->isolate (), db, r, SQLITE_OK, void ());
0 commit comments