]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Different version of "PRAGMA schema_version" instrumentation.
authordan <Dan Kennedy>
Thu, 22 Dec 2022 14:29:55 +0000 (14:29 +0000)
committerdan <Dan Kennedy>
Thu, 22 Dec 2022 14:29:55 +0000 (14:29 +0000)
FossilOrigin-Name: b9efbc538b5461e6eb429630b3c61a7a849a77cdc4cc0efd6fc80d3e27d5f389

manifest
manifest.uuid
src/btree.c
src/btree.h
src/btreeInt.h
src/pager.c
src/vdbe.c
src/vdbeInt.h
src/vdbeaux.c
src/wal.c

index 7c0d038f72acff1551b56c6fad00ed922766cf59..1a0ef9f9d63420a4a9888925bd08d3740528a16e 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Hack\sfor\sspecial\sgettimeofday()\sinstrumentation\sof\s"PRAGMA\sschema_version".
-D 2022-12-19T18:42:55.300
+C Different\sversion\sof\s"PRAGMA\sschema_version"\sinstrumentation.
+D 2022-12-22T14:29:55.943
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -536,9 +536,9 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf
 F src/backup.c a2891172438e385fdbe97c11c9745676bec54f518d4447090af97189fd8e52d7
 F src/bitvec.c 3907fcbe8a0c8c2db58d97087d15cdabbf2842adb9125df9ab9ff87d3db16775
 F src/btmutex.c 6ffb0a22c19e2f9110be0964d0731d2ef1c67b5f7fabfbaeb7b9dabc4b7740ca
-F src/btree.c 1cc413c83cf2dfd7b33d82e74e518f57c186d4eb19492a8c3e5f1658088eb04f
-F src/btree.h 900067641b64d619e6e2a93bd115c952a52f41d3bee32e551e2a4ceee05fc431
-F src/btreeInt.h 650add92a0ffc8c315406f140325c5f41f0e386848dafbb1e27a72fe7cf6f179
+F src/btree.c 2bf3ae348445d1c0082e9d28f843ea665fa4dae4ee88ec0fcb699f484b8d07e5
+F src/btree.h c0f87461695a74cbe0be4643a8e47758a5f39752d4cc2ab9a941fd5ccbc0b80c
+F src/btreeInt.h 4e2992ce4402150a4ea849e1ac5dbfa6050345080a77ce74bae6e2f7016fc7fa
 F src/build.c c3cfa409c354a291acdb9d40199fa30e71020c30fdc6dee2d936ca15deb9046a
 F src/callback.c 4cd7225b26a97f7de5fee5ae10464bed5a78f2adefe19534cc2095b3a8ca484a
 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
@@ -583,7 +583,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586
 F src/os_unix.c 52ac6823d3895c6a3a5cf4b07c05052f7ee8bd100a076bf0cd672ec83c996246
 F src/os_win.c 8d129ae3e59e0fa900e20d0ad789e96f2e08177f0b00b53cdda65c40331e0902
 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
-F src/pager.c c15d151cd6f6c2a66a48cefdd1a6a7bda1cbe67057e48315e7e04b4c8bf9e71b
+F src/pager.c 2a7d84bc3131d731d823ef8e8892b1f6402bc8657ed48c5a4b832c8049fc1acf
 F src/pager.h 4684b1ea6a770b6cebd9dcd519e25d9eb3891f49fad14b096b4c35e3d6d27869
 F src/parse.y 17c50d262d92083badeb60b3ebe4725e19c76548f90aea898ab07d4f2940a7d8
 F src/pcache.c f4268f7f73c6a3db12ce22fd25bc68dc42315d19599414ab1207d7cf32f79197
@@ -668,11 +668,11 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937
 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
 F src/util.c 0be191521ff6d2805995f4910f0b6231b42843678b2efdc1abecaf39929a673f
 F src/vacuum.c 5b7888f917936dda09f98b1fda164cff1dad44fb5e143436bdbb9dc3191ce2df
-F src/vdbe.c 0aebfd43f07b3c97e08ac0c2fe6a4c6b0e46b4f78573c3fa613463298aff1168
+F src/vdbe.c addae8131682cb442a636a423e3fede8aa17385e625319e79b9604ccfe3e51b1
 F src/vdbe.h 2b994184581ac41e9f7ec49ac0f1569da1766f24d7a1775df67328d749a22a1c
-F src/vdbeInt.h 18ed4bf4bc1c0070e217822f82217cf586023288b6c7b30dabe020f96a3a7df8
+F src/vdbeInt.h a86401bdb72a4c4e512d0bef4456b06a99eb91729bc572f5e0a6945abec34f40
 F src/vdbeapi.c fc3183daf72808b4311b228989120fdbc2dc44972fb0d77d5c453460cc0e5b2c
-F src/vdbeaux.c 9922b5ce849a301934ab918403aaa0cdbc70d6c3f73bbb7925a024ec40781eef
+F src/vdbeaux.c 8fe6ea4ea89376846b07db993e631d654e03bec3f0ad388c0c4f802324debd5a
 F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd
 F src/vdbemem.c c3ce80af15e2ff5c2824a8db881681cbf511376f13613da020bac6d320c535b1
 F src/vdbesort.c 43756031ca7430f7aec3ef904824a7883c4ede783e51f280d99b9b65c0796e35
@@ -680,7 +680,7 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8
 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c
 F src/vtab.c bb53f9e2eaeecca07158643dd3d5039cf13b525fe2d267e113b39a36f374556c
 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
-F src/wal.c 6d1fc9d36b681af15cc46cbf8e3c3683a7d6970a0c24b82b28d00df94dba4a60
+F src/wal.c 1676bd032fd3c23642616b8e690c479894be948fffa209954f01f8fbaa5e094d
 F src/wal.h 11692a4e45c39dd8851a1b226cb22046f1271dedc19a2c734af0a1929c837b91
 F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b
 F src/where.c 63e712bcad47f70e94c2150976cd7da5040933699e3938d4189d064acbe40891
@@ -2035,11 +2035,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 68a61513f9e064ed9e79638ec40f8bff1a8ee678793683e2725a4ce63563db6a
-R 2f43d3dc3e17ee6fabc748016c417fe1
-T *branch * schema-version-instr
-T *sym-schema-version-instr *
-T -sym-begin-concurrent-pnu-wal2 *
+P 44dd01e3152eba0b487f9ec5349ecc9e6474e94a10e3f4951b9d928ea39f53f0
+R d5056c419efcdf823361a2366dfea511
 U dan
-Z a4635fc4d36ee98a47f7e6822a0b7770
+Z 74b2fd006816a04f2a350fdf86f0491b
 # Remove this line to create a well-formed Fossil manifest.
index a8b7a517a46f5defd2c6f625d55100c4771c99b1..94aabf0a449209c5115a5a6e989c6854fa18f23e 100644 (file)
@@ -1 +1 @@
-44dd01e3152eba0b487f9ec5349ecc9e6474e94a10e3f4951b9d928ea39f53f0
\ No newline at end of file
+b9efbc538b5461e6eb429630b3c61a7a849a77cdc4cc0efd6fc80d3e27d5f389
\ No newline at end of file
index b507a703ec702090de8047fe6379600467ae5567..5a693ed3192db6d176c3e4b01e0aa20ea368737f 100644 (file)
@@ -14,6 +14,7 @@
 ** Including a description of file format and an overview of operation.
 */
 #include "btreeInt.h"
+#include "vdbeInt.h"
 
 /*
 ** The header string that appears at the beginning of every
@@ -3434,6 +3435,10 @@ static int lockBtree(BtShared *pBt){
   rc = btreeGetPage(pBt, 1, &pPage1, 0);
   if( rc!=SQLITE_OK ) return rc;
 
+  if( pBt->aSchemaVersion ){
+    pBt->aSchemaVersion[SCHEMA_VERSION_AFTERGETPAGE1] = sqlite3STimeNow();
+  }
+
   /* Do some checking to help insure the file we opened really is
   ** a valid database file. 
   */
@@ -3824,6 +3829,10 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){
     */
     while( pBt->pPage1==0 && SQLITE_OK==(rc = lockBtree(pBt)) );
 
+    if( pBt->aSchemaVersion ){
+      pBt->aSchemaVersion[SCHEMA_VERSION_AFTERLOCKBTREE] = sqlite3STimeNow();
+    }
+
     if( rc==SQLITE_OK && wrflag ){
       if( (pBt->btsFlags & BTS_READ_ONLY)!=0 ){
         rc = SQLITE_READONLY;
@@ -3839,6 +3848,10 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){
           rc = SQLITE_BUSY;
         }
       }
+
+      if( pBt->aSchemaVersion ){
+        pBt->aSchemaVersion[SCHEMA_VERSION_AFTEROPENWRITE] = sqlite3STimeNow();
+      }
     }
   
     if( rc!=SQLITE_OK ){
@@ -3899,6 +3912,9 @@ trans_begun:
     if( rc==SQLITE_OK && wrflag ){
       rc = btreePtrmapAllocate(pBt);
     }
+    if( pBt->aSchemaVersion ){
+      pBt->aSchemaVersion[SCHEMA_VERSION_AFTERBEGINCONC] = sqlite3STimeNow();
+    }
   }
 #endif
 
@@ -11661,3 +11677,8 @@ int sqlite3BtreeConnectionCount(Btree *p){
   return p->pBt->nRef;
 }
 #endif
+
+void sqlite3BtreeIsSchemaVersion(Btree *p, u64 *a){
+  p->pBt->aSchemaVersion = a;
+  sqlite3PagerIsSchemaVersion(p->pBt->pPager, a);
+}
index f736d523e74080b60da9fb559f202b2cbe9dd5a8..f3be41cc7891663c6153daa60aa507180801f54e 100644 (file)
@@ -410,4 +410,6 @@ int sqlite3BtreeTransferRow(BtCursor*, BtCursor*, i64);
 # define sqlite3SchemaMutexHeld(X,Y,Z) 1
 #endif
 
+void sqlite3BtreeIsSchemaVersion(Btree *p, u64 *a);
+
 #endif /* SQLITE_BTREE_H */
index 0782fe1c5bfcf6691b68c6d272828e4a33ce4a55..c9f10e62f31916f4728f1170fb24e9ea60e9394b 100644 (file)
@@ -464,6 +464,7 @@ struct BtShared {
   BtreePtrmap *pMap;
 #endif
   int nPreformatSize;   /* Size of last cell written by TransferRow() */
+  u64 *aSchemaVersion;
 };
 
 /*
index 3f60d1e66ed010c76edc88f19550c42daa9e20bf..37cf61f80526dfb77dab6dfe14c70f8ec20a6aa4 100644 (file)
@@ -21,6 +21,7 @@
 #ifndef SQLITE_OMIT_DISKIO
 #include "sqliteInt.h"
 #include "wal.h"
+#include "vdbeInt.h"
 
 
 /******************* NOTES ON THE DESIGN OF THE PAGER ************************
@@ -703,6 +704,7 @@ struct Pager {
   Wal *pWal;                  /* Write-ahead log used by "journal_mode=wal" */
   char *zWal;                 /* File name for write-ahead log */
 #endif
+  u64 *aSchemaVersion;
 };
 
 /*
@@ -3015,10 +3017,17 @@ static int readDbPage(PgHdr *pPg){
   assert( pPager->eState>=PAGER_READER && !MEMDB );
   assert( isOpen(pPager->fd) );
 
+  if( pPager->aSchemaVersion ){
+    pPager->aSchemaVersion[SCHEMA_VERSION_BEFOREFINDFRAME] = sqlite3STimeNow();
+  }
+
   if( pagerUseWal(pPager) ){
     rc = sqlite3WalFindFrame(pPager->pWal, pPg->pgno, &iFrame);
     if( rc ) return rc;
   }
+  if( pPager->aSchemaVersion ){
+    pPager->aSchemaVersion[SCHEMA_VERSION_AFTERFINDFRAME] = sqlite3STimeNow();
+  }
   if( iFrame ){
     rc = sqlite3WalReadFrame(pPager->pWal, iFrame,pPager->pageSize,pPg->pData);
   }else
@@ -3030,6 +3039,9 @@ static int readDbPage(PgHdr *pPg){
       rc = SQLITE_OK;
     }
   }
+  if( pPager->aSchemaVersion ){
+    pPager->aSchemaVersion[SCHEMA_VERSION_AFTERREADPAGE] = sqlite3STimeNow();
+  }
 
   if( pPg->pgno==1 ){
     if( rc ){
@@ -7906,6 +7918,7 @@ int sqlite3PagerWalFramesize(Pager *pPager){
 #endif
 
 void sqlite3PagerIsSchemaVersion(Pager *pPager, u64 *a){
+  pPager->aSchemaVersion = a;
   sqlite3WalIsSchemaVersion(pPager->pWal, a);
 }
 
index ec4058b81d2fd71f97fd07284c7bdac8aa8c9126..38abe96a4b5c79cfb0891aa1f24f90022be2ab24 100644 (file)
@@ -3849,17 +3849,13 @@ case OP_Transaction: {
   pDb = &db->aDb[pOp->p1];
   pBt = pDb->pBt;
 
-  if( p->bSchemaVersion ){
-    p->aSchemaVersion[SCHEMA_VERSION_OPTRANS] = sqlite3STimeNow();
-  }
-
   if( pBt ){
     if( p->bSchemaVersion ){
-      sqlite3PagerIsSchemaVersion(sqlite3BtreePager(pBt), p->aSchemaVersion);
+      sqlite3BtreeIsSchemaVersion(pBt, p->aSchemaVersion);
     }
     rc = sqlite3BtreeBeginTrans(pBt, pOp->p2, &iMeta);
     if( p->bSchemaVersion ){
-      sqlite3PagerIsSchemaVersion(sqlite3BtreePager(pBt), 0);
+      sqlite3BtreeIsSchemaVersion(pBt, 0);
     }
     testcase( rc==SQLITE_BUSY_SNAPSHOT );
     testcase( rc==SQLITE_BUSY_RECOVERY );
@@ -3968,7 +3964,6 @@ case OP_ReadCookie: {               /* out2 */
   pOut = out2Prerelease(p, pOp);
   pOut->u.i = iMeta;
   if( p->bSchemaVersion ){
-    p->aSchemaVersion[SCHEMA_VERSION_READDONE] = sqlite3STimeNow();
     sqlite3SchemaVersionLog(p);
   }
   break;
index bf37cd8d7c10558daf232d50282c2dec8eab81ef..95e35ad74e2910ec89ce11c1a7d983a7019a1818 100644 (file)
@@ -488,19 +488,23 @@ struct Vdbe {
   ScanStatus *aScan;      /* Scan definitions for sqlite3_stmt_scanstatus() */
 #endif
   int bSchemaVersion;
-  u64 aSchemaVersion[6];
+  u64 aSchemaVersion[11];
 };
 
 #define SCHEMA_VERSION_START           0     /* OP_Init */
-#define SCHEMA_VERSION_OPTRANS         1     /* Start of OP_Transaction */
-#define SCHEMA_VERSION_BEFOREWALTBR    2     /* Before walTryBeginRead() loop */
-#define SCHEMA_VERSION_BEFOREWALSHARED 3     /* Before walTryBeginRead() loop */
-#define SCHEMA_VERSION_AFTERWALSHARED  4     /* Before walTryBeginRead() loop */
-#define SCHEMA_VERSION_BEGINTRANSDONE  5     /* After BeginTrans() */
-#define SCHEMA_VERSION_READDONE        6     /* End of OP_ReadCookie */
+#define SCHEMA_VERSION_AFTERWALTBR     1     /* After walTryBeginRead() loop */
+#define SCHEMA_VERSION_AFTEROPENWAL2   2     /* After walOpenWal2() */
+#define SCHEMA_VERSION_BEFOREFINDFRAME 3
+#define SCHEMA_VERSION_AFTERFINDFRAME  4
+#define SCHEMA_VERSION_AFTERREADPAGE   5
+#define SCHEMA_VERSION_AFTERGETPAGE1   6     /* After lockBtree() */
+#define SCHEMA_VERSION_AFTERLOCKBTREE  7     /* After lockBtree() */
+#define SCHEMA_VERSION_AFTEROPENWRITE  8     /* After OpenWrite()() */
+#define SCHEMA_VERSION_AFTERBEGINCONC  9     /* After PagerBeginConcurrent() */
+#define SCHEMA_VERSION_BEGINTRANSDONE 10     /* After BeginTrans() */
 
 /* Call sqlite3_log() if "PRAGMA schema_version" is slower than this (in us) */
-#define SCHEMA_VERSION_TIMEOUT 2000000
+#define SCHEMA_VERSION_TIMEOUT 2
 
 /*
 ** The following are allowed values for Vdbe.eVdbeState
index d99eb2b9b6437b405de22afd636cd9b7131df7f7..da4557f63f5d2ad1b2e920a85b9513585dba87c2 100644 (file)
@@ -5222,19 +5222,37 @@ void sqlite3VdbeIsSchemaVersion(Vdbe *v){
 }
 void sqlite3SchemaVersionLog(Vdbe *v){
   u64 i1 = v->aSchemaVersion[SCHEMA_VERSION_START];
-  if( v->aSchemaVersion[SCHEMA_VERSION_READDONE]>(i1+SCHEMA_VERSION_TIMEOUT) ){
+  if( v->aSchemaVersion[SCHEMA_VERSION_BEGINTRANSDONE]>(i1+SCHEMA_VERSION_TIMEOUT) ){
     sqlite3_log(SQLITE_WARNING, 
-        "slow \"PRAGMA schema_version\": (%d, %d, %d, %d, %d, %d)",
-        (int)(v->aSchemaVersion[SCHEMA_VERSION_OPTRANS] - i1),
-        (v->aSchemaVersion[SCHEMA_VERSION_BEFOREWALTBR]==0) ? 0 :
-            (int)(v->aSchemaVersion[SCHEMA_VERSION_BEFOREWALTBR] - i1),
-        (v->aSchemaVersion[SCHEMA_VERSION_BEFOREWALSHARED]==0) ? 0 :
-            (int)(v->aSchemaVersion[SCHEMA_VERSION_BEFOREWALSHARED] - i1),
-        (v->aSchemaVersion[SCHEMA_VERSION_AFTERWALSHARED]==0) ? 0 :
-            (int)(v->aSchemaVersion[SCHEMA_VERSION_AFTERWALSHARED] - i1),
-        (v->aSchemaVersion[SCHEMA_VERSION_BEGINTRANSDONE]==0) ? 0 :
-            (int)(v->aSchemaVersion[SCHEMA_VERSION_BEGINTRANSDONE] - i1),
-        (int)(v->aSchemaVersion[SCHEMA_VERSION_READDONE] - i1)
+        "slow \"PRAGMA schema_version\" (v=2): (%d, %d, %d, %d, %d, %d, %d, %d, %d, %d)",
+        (v->aSchemaVersion[SCHEMA_VERSION_AFTERWALTBR]==0) ? 0 :
+            (int)(v->aSchemaVersion[SCHEMA_VERSION_AFTERWALTBR] - i1),
+
+        (v->aSchemaVersion[SCHEMA_VERSION_AFTEROPENWAL2]==0) ? 0 :
+            (int)(v->aSchemaVersion[SCHEMA_VERSION_AFTEROPENWAL2] - i1),
+
+        (v->aSchemaVersion[SCHEMA_VERSION_BEFOREFINDFRAME]==0) ? 0 :
+            (int)(v->aSchemaVersion[SCHEMA_VERSION_BEFOREFINDFRAME] - i1),
+
+        (v->aSchemaVersion[SCHEMA_VERSION_AFTERFINDFRAME]==0) ? 0 :
+            (int)(v->aSchemaVersion[SCHEMA_VERSION_AFTERFINDFRAME] - i1),
+
+        (v->aSchemaVersion[SCHEMA_VERSION_AFTERREADPAGE]==0) ? 0 :
+            (int)(v->aSchemaVersion[SCHEMA_VERSION_AFTERREADPAGE] - i1),
+
+        (v->aSchemaVersion[SCHEMA_VERSION_AFTERGETPAGE1]==0) ? 0 :
+            (int)(v->aSchemaVersion[SCHEMA_VERSION_AFTERGETPAGE1] - i1),
+
+        (v->aSchemaVersion[SCHEMA_VERSION_AFTERLOCKBTREE]==0) ? 0 :
+            (int)(v->aSchemaVersion[SCHEMA_VERSION_AFTERLOCKBTREE] - i1),
+
+        (v->aSchemaVersion[SCHEMA_VERSION_AFTEROPENWRITE]==0) ? 0 :
+            (int)(v->aSchemaVersion[SCHEMA_VERSION_AFTEROPENWRITE] - i1),
+
+        (v->aSchemaVersion[SCHEMA_VERSION_AFTERBEGINCONC]==0) ? 0 :
+            (int)(v->aSchemaVersion[SCHEMA_VERSION_AFTERBEGINCONC] - i1),
+
+        (int)(v->aSchemaVersion[SCHEMA_VERSION_BEGINTRANSDONE] - i1)
     );
   }
 }
index 0385b0f8d2cb221285dcb957e6d0c1e8832e8ee4..e4c9b64f98135985d162849188e28eb0a53bbdf0 100644 (file)
--- a/src/wal.c
+++ b/src/wal.c
@@ -3437,10 +3437,6 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){
     assert( iWal!=1 || nBackfill!=1 || eLock==WAL_LOCK_PART2 );
     assert( iWal!=1 || nBackfill!=0 || eLock==WAL_LOCK_PART2_FULL1 );
 
-    if( pWal->aSchemaVersion ){
-      pWal->aSchemaVersion[SCHEMA_VERSION_BEFOREWALSHARED] = sqlite3STimeNow();
-    }
-
     rc = walLockShared(pWal, WAL_READ_LOCK(eLock));
     if( rc!=SQLITE_OK ){
       return (rc==SQLITE_BUSY ? WAL_RETRY : rc);
@@ -3452,9 +3448,6 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){
     }else{
       pWal->readLock = eLock;
     }
-    if( pWal->aSchemaVersion ){
-      pWal->aSchemaVersion[SCHEMA_VERSION_AFTERWALSHARED] = sqlite3STimeNow();
-    }
     assert( pWal->minFrame==0 && walFramePage(pWal->minFrame)==0 );
   }else{
     u32 mxReadMark;               /* Largest aReadMark[] value */
@@ -3721,10 +3714,6 @@ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){
   }
 #endif
 
-  if( pWal->aSchemaVersion ){
-    pWal->aSchemaVersion[SCHEMA_VERSION_BEFOREWALTBR] = sqlite3STimeNow();
-  }
-
   do{
     rc = walTryBeginRead(pWal, pChanged, 0, ++cnt);
   }while( rc==WAL_RETRY );
@@ -3732,11 +3721,19 @@ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){
   testcase( (rc&0xff)==SQLITE_IOERR );
   testcase( rc==SQLITE_PROTOCOL );
   testcase( rc==SQLITE_OK );
+
+  if( pWal->aSchemaVersion ){
+    pWal->aSchemaVersion[SCHEMA_VERSION_AFTERWALTBR] = sqlite3STimeNow();
+  }
   
   if( rc==SQLITE_OK && pWal->hdr.iVersion==WAL_VERSION2 ){
     rc = walOpenWal2(pWal);
   }
 
+  if( pWal->aSchemaVersion ){
+    pWal->aSchemaVersion[SCHEMA_VERSION_AFTEROPENWAL2] = sqlite3STimeNow();
+  }
+
   pWal->nPriorFrame = pWal->hdr.mxFrame;
 #ifdef SQLITE_ENABLE_SNAPSHOT
   if( rc==SQLITE_OK ){