--- src/btree.h +++ src/btree.h @@ -121,6 +121,14 @@ int sqlite3BtreeNewDb(Btree *p); /* + * BEGIN Berkeley DB specific function forward declarations. + */ +int sqlite3BtreeHandleCacheFixup(Btree *, int); +/* + * END Berkeley DB specific function forward declarations. + */ + +/* ** The second parameter to sqlite3BtreeGetMeta or sqlite3BtreeUpdateMeta ** should be one of the following values. The integer values are assigned ** to constants so that the offset of the corresponding field in an --- src/vdbe.c +++ src/vdbe.c @@ -3122,12 +3122,14 @@ case OP_VerifyCookie: { int iMeta; int iGen; + int iSchemaUpdated; Btree *pBt; assert( pOp->p1>=0 && pOp->p1nDb ); assert( (p->btreeMask & (((yDbMask)1)<p1))!=0 ); assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) ); assert( p->bIsReader ); + iSchemaUpdated = 0; pBt = db->aDb[pOp->p1].pBt; if( pBt ){ sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&iMeta); @@ -3156,12 +3158,14 @@ ** a v-table method. */ if( db->aDb[pOp->p1].pSchema->schema_cookie!=iMeta ){ + iSchemaUpdated = 1; sqlite3ResetOneSchema(db, pOp->p1); } p->expired = 1; rc = SQLITE_SCHEMA; } + sqlite3BtreeHandleCacheFixup(pBt, iSchemaUpdated); break; }