summaryrefslogtreecommitdiff
path: root/lang/sql/adapter/sqlite-patches/30_handle_cache.patch
blob: 69f0b8da138d0295393058b3a4946eadec62add6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
--- 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->p1<db->nDb );
   assert( (p->btreeMask & (((yDbMask)1)<<pOp->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;
 }