Index: src/build.c ================================================================== --- src/build.c +++ src/build.c @@ -366,11 +366,14 @@ if( pParse->disableVtab==0 ){ Module *pMod = (Module*)sqlite3HashFind(&db->aModule, zName); if( pMod==0 && sqlite3_strnicmp(zName, "pragma_", 7)==0 ){ pMod = sqlite3PragmaVtabRegister(db, zName); } - if( pMod && sqlite3VtabEponymousTableInit(pParse, pMod) ){ + if( pMod + && !pMod->bDisabled + && sqlite3VtabEponymousTableInit(pParse, pMod) + ){ return pMod->pEpoTab; } } #endif if( flags & LOCATE_NOERR ) return 0; Index: src/main.c ================================================================== --- src/main.c +++ src/main.c @@ -826,10 +826,23 @@ void *pBuf = va_arg(ap, void*); /* IMP: R-26835-10964 */ int sz = va_arg(ap, int); /* IMP: R-47871-25994 */ int cnt = va_arg(ap, int); /* IMP: R-04460-53386 */ rc = setupLookaside(db, pBuf, sz, cnt); break; + } + case SQLITE_DBCONFIG_DISABLE_VTAB: + case SQLITE_DBCONFIG_ENABLE_VTAB: { + const char *zPattern = va_arg(ap, const char*); + int bDisable = op==SQLITE_DBCONFIG_DISABLE_VTAB; + HashElem *j; + for(j=sqliteHashFirst(&db->aModule); j; j=sqliteHashNext(j)){ + Module *pMod = (Module*)sqliteHashData(j); + if( sqlite3_strlike(zPattern, pMod->zName, 0)==0 ){ + pMod->bDisabled = bDisable; + } + } + rc = SQLITE_OK; } default: { static const struct { int op; /* The opcode */ u32 mask; /* Mask of the bit in sqlite3.flags to set/clear */ Index: src/pragma.c ================================================================== --- src/pragma.c +++ src/pragma.c @@ -1254,10 +1254,11 @@ case PragTyp_MODULE_LIST: { HashElem *j; pParse->nMem = 1; for(j=sqliteHashFirst(&db->aModule); j; j=sqliteHashNext(j)){ Module *pMod = (Module*)sqliteHashData(j); + if( pMod->bDisabled ) continue; sqlite3VdbeMultiLoad(v, 1, "s", pMod->zName); } } break; #endif /* SQLITE_OMIT_VIRTUALTABLE */ Index: src/shell.c.in ================================================================== --- src/shell.c.in +++ src/shell.c.in @@ -6279,36 +6279,47 @@ if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){ static const struct DbConfigChoices { const char *zName; int op; + int eArgType; } aDbConfig[] = { - { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY }, - { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER }, - { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, - { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, - { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, - { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG }, - { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP }, - { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE }, - { "defensive", SQLITE_DBCONFIG_DEFENSIVE }, + { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY, 0 }, + { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER, 0 }, + { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, 0 }, + { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, 0 }, + { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE, 0 }, + { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG, 0 }, + { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP, 0 }, + { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE, 0 }, + { "defensive", SQLITE_DBCONFIG_DEFENSIVE, 0 }, + { "enable_vtab", SQLITE_DBCONFIG_ENABLE_VTAB, 1 }, + { "disable_vtab", SQLITE_DBCONFIG_DISABLE_VTAB, 1 }, }; int ii, v; open_db(p, 0); for(ii=0; ii1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue; if( nArg>=3 ){ - sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0); + if( aDbConfig[ii].eArgType==0 ){ + sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0); + }else{ + sqlite3_db_config(p->db, aDbConfig[ii].op, azArg[2], 0); + } } - sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v); - utf8_printf(p->out, "%18s %s\n", aDbConfig[ii].zName, v ? "on" : "off"); + if( aDbConfig[ii].eArgType==0 ){ + sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v); + utf8_printf(p->out, "%18s %s\n", aDbConfig[ii].zName, v ? "on" : "off"); + }else if( nArg<2 ){ + utf8_printf(p->out, "%18s PATTERN\n", aDbConfig[ii].zName); + } if( nArg>1 ) break; } if( nArg>1 && ii==ArraySize(aDbConfig) ){ utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]); utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n"); - } + } }else if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){ rc = shell_dbinfo_command(p, nArg, azArg); }else Index: src/sqlite.h.in ================================================================== --- src/sqlite.h.in +++ src/sqlite.h.in @@ -2213,10 +2213,13 @@ ** integer into which is written 0 or 1 to indicate whether the writable_schema ** is enabled or disabled following this call. ** ** */ +#define SQLITE_DBCONFIG_MIN 998 /* Smallest DBCONFIG */ +#define SQLITE_DBCONFIG_ENABLE_VTAB 998 /* const char* */ +#define SQLITE_DBCONFIG_DISABLE_VTAB 999 /* const char* */ #define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ #define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */ #define SQLITE_DBCONFIG_ENABLE_FKEY 1002 /* int int* */ #define SQLITE_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */ #define SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1004 /* int int* */ Index: src/sqliteInt.h ================================================================== --- src/sqliteInt.h +++ src/sqliteInt.h @@ -1804,10 +1804,11 @@ ** hash table. */ struct Module { const sqlite3_module *pModule; /* Callback pointers */ const char *zName; /* Name passed to create_module() */ + u8 bDisabled; /* True if disabled */ void *pAux; /* pAux passed to create_module() */ void (*xDestroy)(void *); /* Module destructor function */ Table *pEpoTab; /* Eponymous table for this module */ }; Index: src/test1.c ================================================================== --- src/test1.c +++ src/test1.c @@ -7581,20 +7581,24 @@ Tcl_Obj *CONST objv[] ){ static const struct { const char *zName; int eVal; + int eArgType; } aSetting[] = { - { "FKEY", SQLITE_DBCONFIG_ENABLE_FKEY }, - { "TRIGGER", SQLITE_DBCONFIG_ENABLE_TRIGGER }, - { "FTS3_TOKENIZER", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, - { "LOAD_EXTENSION", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, - { "NO_CKPT_ON_CLOSE",SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, - { "QPSG", SQLITE_DBCONFIG_ENABLE_QPSG }, - { "TRIGGER_EQP", SQLITE_DBCONFIG_TRIGGER_EQP }, - { "RESET_DB", SQLITE_DBCONFIG_RESET_DATABASE }, - { "DEFENSIVE", SQLITE_DBCONFIG_DEFENSIVE }, + { "FKEY", SQLITE_DBCONFIG_ENABLE_FKEY, 0 }, + { "TRIGGER", SQLITE_DBCONFIG_ENABLE_TRIGGER, 0 }, + { "FTS3_TOKENIZER", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, 0 }, + { "LOAD_EXTENSION", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, 0 }, + { "NO_CKPT_ON_CLOSE",SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE, 0 }, + { "QPSG", SQLITE_DBCONFIG_ENABLE_QPSG, 0 }, + { "TRIGGER_EQP", SQLITE_DBCONFIG_TRIGGER_EQP, 0 }, + { "RESET_DB", SQLITE_DBCONFIG_RESET_DATABASE, 0 }, + { "DEFENSIVE", SQLITE_DBCONFIG_DEFENSIVE, 0 }, + { "WRITABLE_SCHEMA", SQLITE_DBCONFIG_WRITABLE_SCHEMA, 0 }, + { "ENABLE_VTAB", SQLITE_DBCONFIG_ENABLE_VTAB, 1 }, + { "DISABLE_VTAB", SQLITE_DBCONFIG_DISABLE_VTAB, 1 }, }; int i; int v; const char *zSetting; sqlite3 *db; @@ -7605,22 +7609,28 @@ } if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; zSetting = Tcl_GetString(objv[2]); if( sqlite3_strglob("SQLITE_*", zSetting)==0 ) zSetting += 7; if( sqlite3_strglob("DBCONFIG_*", zSetting)==0 ) zSetting += 9; - if( sqlite3_strglob("ENABLE_*", zSetting)==0 ) zSetting += 7; + if( sqlite3_strglob("ENABLE_*", zSetting)==0 && zSetting[7]!='V' ){ + zSetting += 7; + } for(i=0; i=ArraySize(aSetting) ){ Tcl_SetObjResult(interp, Tcl_NewStringObj("unknown sqlite3_db_config setting", -1)); return TCL_ERROR; } - if( Tcl_GetIntFromObj(interp, objv[3], &v) ) return TCL_ERROR; - sqlite3_db_config(db, aSetting[i].eVal, v, &v); - Tcl_SetObjResult(interp, Tcl_NewIntObj(v)); + if( aSetting[i].eArgType==0 ){ + if( Tcl_GetIntFromObj(interp, objv[3], &v) ) return TCL_ERROR; + sqlite3_db_config(db, aSetting[i].eVal, v, &v); + Tcl_SetObjResult(interp, Tcl_NewIntObj(v)); + }else if( aSetting[i].eArgType==1 ){ + sqlite3_db_config(db, aSetting[i].eVal, Tcl_GetString(objv[3])); + } return TCL_OK; } /* ** Change the name of the main database schema from "main" to "icecube". Index: src/vtab.c ================================================================== --- src/vtab.c +++ src/vtab.c @@ -635,11 +635,11 @@ /* Locate the required virtual table module */ zMod = pTab->azModuleArg[0]; pMod = (Module*)sqlite3HashFind(&db->aModule, zMod); - if( !pMod ){ + if( !pMod || pMod->bDisabled ){ const char *zModule = pTab->azModuleArg[0]; sqlite3ErrorMsg(pParse, "no such module: %s", zModule); rc = SQLITE_ERROR; }else{ char *zErr = 0;