Index: src/vtab.c ================================================================== --- src/vtab.c +++ src/vtab.c @@ -146,12 +146,19 @@ assert( IsVirtual(pTab) ); #ifdef SQLITE_ENABLE_SHARED_SCHEMA if( IsSharedSchema(db) ){ int iDb = sqlite3SchemaToIndex(db, pTab->pSchema); if( iDb!=1 ){ - for(pVtab=db->aDb[iDb].pVTable; pVtab; pVtab=pVtab->pNext){ - if( sqlite3StrICmp(pTab->zName, pVtab->zName)==0 ) break; + VTable **pp; + for(pp=&db->aDb[iDb].pVTable; *pp; pp=&(*pp)->pNext){ + if( sqlite3StrICmp(pTab->zName, (*pp)->zName)==0 ) break; + } + pVtab = *pp; + if( pVtab && pTab->nCol<=0 ){ + *pp = pVtab->pNext; + sqlite3VtabUnlock(pVtab); + pVtab = 0; } return pVtab; } } #endif /* ifdef SQLITE_ENABLE_SHARED_SCHEMA */ @@ -662,10 +669,11 @@ Module *pMod; int rc; assert( pTab ); if( !IsVirtual(pTab) || sqlite3GetVTable(db, pTab) ){ + assert( !IsVirtual(pTab) || pTab->nCol>0 ); return SQLITE_OK; } /* Locate the required virtual table module */ zMod = pTab->azModuleArg[0]; Index: test/reuse6.test ================================================================== --- test/reuse6.test +++ test/reuse6.test @@ -104,16 +104,36 @@ sqlite3 db1 test.db -shared-schema 1 do_execsql_test -db db1 3.1 { ATTACH 'test.db2' AS aux; } -breakpoint do_execsql_test -db db1 3.2 { SELECT * FROM main.ft, aux.t1; } } +db1 close + +#------------------------------------------------------------------------- +reset_db +forcedelete test.db2 +ifcapable fts5 { + do_execsql_test 4.0 { + CREATE VIRTUAL TABLE ft USING fts5(a, b); + } + forcecopy test.db test.db2 + + sqlite3 db1 test.db -shared-schema 1 + do_execsql_test -db db1 4.1 { + ATTACH 'test.db2' AS aux; + SELECT * FROM main.ft; + SELECT * FROM aux.ft; + } + do_execsql_test -db db1 4.2 { + SELECT * FROM main.ft, aux.ft + } +}