]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Hack for special gettimeofday() instrumentation of "PRAGMA schema_version".
authordan <Dan Kennedy>
Mon, 19 Dec 2022 18:42:55 +0000 (18:42 +0000)
committerdan <Dan Kennedy>
Mon, 19 Dec 2022 18:42:55 +0000 (18:42 +0000)
FossilOrigin-Name: 44dd01e3152eba0b487f9ec5349ecc9e6474e94a10e3f4951b9d928ea39f53f0

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

index c6fa5feea515f8c3c45bb75ca105031715a15de3..7c0d038f72acff1551b56c6fad00ed922766cf59 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Merge\sthe\slatest\strunk\senhancements\sinto\sthe\sbegin-concurrent-pnu-wal2\sbranch.
-D 2022-09-30T14:04:15.072
+C Hack\sfor\sspecial\sgettimeofday()\sinstrumentation\sof\s"PRAGMA\sschema_version".
+D 2022-12-19T18:42:55.300
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -583,13 +583,13 @@ 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 6d3a93a7abfcb17e69ceb8a5e78ab74a0234ebf2a87819cc63d5c6044e78834c
-F src/pager.h 3ddab454e313da7c93f92fea35c842ad17ae9f4e96254871ddb0171b2bfb859a
+F src/pager.c c15d151cd6f6c2a66a48cefdd1a6a7bda1cbe67057e48315e7e04b4c8bf9e71b
+F src/pager.h 4684b1ea6a770b6cebd9dcd519e25d9eb3891f49fad14b096b4c35e3d6d27869
 F src/parse.y 17c50d262d92083badeb60b3ebe4725e19c76548f90aea898ab07d4f2940a7d8
 F src/pcache.c f4268f7f73c6a3db12ce22fd25bc68dc42315d19599414ab1207d7cf32f79197
 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586
 F src/pcache1.c dee95e3cd2b61e6512dc814c5ab76d5eb36f0bfc9441dbb4260fccc0d12bbddc
-F src/pragma.c c471a8752cc37919a213d860a1550c3e4b5bc1a416dff2aa72212e73c6982230
+F src/pragma.c 717d6213e98661583207a0053a451d9e28a7e1ad483e3ba9b1f5b97e0aaa608e
 F src/pragma.h 1f421360eed1a7721e8c521463df8519a7c8d0d5893ebd9dbfe0dba8de996f8c
 F src/prepare.c 971d5819a4bda88038c2283d71fc0a2974ffc3dd480f9bd941341017abacfd1b
 F src/printf.c e99ee9741e79ae3873458146f59644276657340385ade4e76a5f5d1c25793764
@@ -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 be71256da51f60d13e0f53850bae9902d7c9926c71e5e50d4c686bd92e458574
-F src/vdbe.h 64619af62603dc3c4f5ff6ff6d2c8f389abd667a29ce6007ed44bd22b3211cd0
-F src/vdbeInt.h 17b7461ffcf9ee760d1341731715a419f6b8c763089a7ece25c2e8098d702b3f
+F src/vdbe.c 0aebfd43f07b3c97e08ac0c2fe6a4c6b0e46b4f78573c3fa613463298aff1168
+F src/vdbe.h 2b994184581ac41e9f7ec49ac0f1569da1766f24d7a1775df67328d749a22a1c
+F src/vdbeInt.h 18ed4bf4bc1c0070e217822f82217cf586023288b6c7b30dabe020f96a3a7df8
 F src/vdbeapi.c fc3183daf72808b4311b228989120fdbc2dc44972fb0d77d5c453460cc0e5b2c
-F src/vdbeaux.c df2bbf6b5d6e45a7ab4061fb11f788fd1e4f91ae95ef0309cf8b9465f94eec83
+F src/vdbeaux.c 9922b5ce849a301934ab918403aaa0cdbc70d6c3f73bbb7925a024ec40781eef
 F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd
 F src/vdbemem.c c3ce80af15e2ff5c2824a8db881681cbf511376f13613da020bac6d320c535b1
 F src/vdbesort.c 43756031ca7430f7aec3ef904824a7883c4ede783e51f280d99b9b65c0796e35
@@ -680,8 +680,8 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8
 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c
 F src/vtab.c bb53f9e2eaeecca07158643dd3d5039cf13b525fe2d267e113b39a36f374556c
 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
-F src/wal.c 393ffbef8381b50265a3f0de5cf3c68d0df6c6867df429c5719c2446e9254126
-F src/wal.h 7a733af13b966ecb81872ce397e862116b3575ea53245b90b139a2873ee87825
+F src/wal.c 6d1fc9d36b681af15cc46cbf8e3c3683a7d6970a0c24b82b28d00df94dba4a60
+F src/wal.h 11692a4e45c39dd8851a1b226cb22046f1271dedc19a2c734af0a1929c837b91
 F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b
 F src/where.c 63e712bcad47f70e94c2150976cd7da5040933699e3938d4189d064acbe40891
 F src/whereInt.h 70cd30de9ed784aa33fa6bd1245f060617de7a00d992469b6d8e419eed915743
@@ -2035,8 +2035,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P dde76e91d3cb5aa66fcfab91ab02adfcfcf1eafc1e7e9d3520f4f396d27655d7 c22c7c879846b1357c00741700b7f6d1111c4b94895b4e7f552c92299d35712e
-R e466d0b3e01cc2259e6859e5a0f9267d
-U drh
-Z caa9cc539d5620a96e294ec646f6ad74
+P 68a61513f9e064ed9e79638ec40f8bff1a8ee678793683e2725a4ce63563db6a
+R 2f43d3dc3e17ee6fabc748016c417fe1
+T *branch * schema-version-instr
+T *sym-schema-version-instr *
+T -sym-begin-concurrent-pnu-wal2 *
+U dan
+Z a4635fc4d36ee98a47f7e6822a0b7770
 # Remove this line to create a well-formed Fossil manifest.
index fe26a19e6dca2f925f5a3b7a0d6cfeb8ea7d40ef..a8b7a517a46f5defd2c6f625d55100c4771c99b1 100644 (file)
@@ -1 +1 @@
-68a61513f9e064ed9e79638ec40f8bff1a8ee678793683e2725a4ce63563db6a
\ No newline at end of file
+44dd01e3152eba0b487f9ec5349ecc9e6474e94a10e3f4951b9d928ea39f53f0
\ No newline at end of file
index 7aef60136f438c30a63591cba049af0a0345d660..3f60d1e66ed010c76edc88f19550c42daa9e20bf 100644 (file)
@@ -7905,4 +7905,8 @@ int sqlite3PagerWalFramesize(Pager *pPager){
 }
 #endif
 
+void sqlite3PagerIsSchemaVersion(Pager *pPager, u64 *a){
+  sqlite3WalIsSchemaVersion(pPager->pWal, a);
+}
+
 #endif /* SQLITE_OMIT_DISKIO */
index 58bfc0fa19bef078639107e61c45002e264199ed..05beca1366b7656b8b2de8a4688714f87561d5ef 100644 (file)
@@ -274,4 +274,6 @@ int sqlite3PagerWalInfo(Pager*, u32 *pnPrior, u32 *pnFrame);
 # define enable_simulated_io_errors()
 #endif
 
+void sqlite3PagerIsSchemaVersion(Pager*, u64*);
+
 #endif /* SQLITE_PAGER_H */
index 7de9cfb4f971aeea3441a1dfc05bc0ba1470ce73..ba904896c57d3225f171f990939606872c79ed90 100644 (file)
@@ -2066,6 +2066,7 @@ void sqlite3Pragma(
   case PragTyp_HEADER_VALUE: {
     int iCookie = pPragma->iArg;  /* Which cookie to read or write */
     sqlite3VdbeUsesBtree(v, iDb);
+    if( iCookie==BTREE_SCHEMA_VERSION ) sqlite3VdbeIsSchemaVersion(v);
     if( zRight && (pPragma->mPragFlg & PragFlg_ReadOnly)==0 ){
       /* Write the specified cookie value */
       static const VdbeOpList setCookie[] = {
index e58ba74cf90729d33b50b0b7b13e82bf733bac1c..ec4058b81d2fd71f97fd07284c7bdac8aa8c9126 100644 (file)
@@ -3849,8 +3849,18 @@ 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);
+    }
     rc = sqlite3BtreeBeginTrans(pBt, pOp->p2, &iMeta);
+    if( p->bSchemaVersion ){
+      sqlite3PagerIsSchemaVersion(sqlite3BtreePager(pBt), 0);
+    }
     testcase( rc==SQLITE_BUSY_SNAPSHOT );
     testcase( rc==SQLITE_BUSY_RECOVERY );
     if( rc!=SQLITE_OK ){
@@ -3862,6 +3872,10 @@ case OP_Transaction: {
       goto abort_due_to_error;
     }
 
+    if( p->bSchemaVersion ){
+      p->aSchemaVersion[SCHEMA_VERSION_BEGINTRANSDONE] = sqlite3STimeNow();
+    }
+
     if( p->usesStmtJournal
      && pOp->p2
      && (db->autoCommit==0 || db->nVdbeRead>1) 
@@ -3953,6 +3967,10 @@ case OP_ReadCookie: {               /* out2 */
   sqlite3BtreeGetMeta(db->aDb[iDb].pBt, iCookie, (u32 *)&iMeta);
   pOut = out2Prerelease(p, pOp);
   pOut->u.i = iMeta;
+  if( p->bSchemaVersion ){
+    p->aSchemaVersion[SCHEMA_VERSION_READDONE] = sqlite3STimeNow();
+    sqlite3SchemaVersionLog(p);
+  }
   break;
 }
 
@@ -8508,6 +8526,11 @@ case OP_Init: {          /* jump */
   */
   assert( pOp->p4.z==0 || strncmp(pOp->p4.z, "-" "- ", 3)==0 );
 
+  if( p->bSchemaVersion ){
+    memset(p->aSchemaVersion, 0, sizeof(p->aSchemaVersion));
+    p->aSchemaVersion[SCHEMA_VERSION_START] = sqlite3STimeNow();
+  }
+
   /* OP_Init is always instruction 0 */
   assert( pOp==p->aOp || pOp->opcode==OP_Trace );
 
index eb1445f1db676597525d55f08c250abb391d1c14..6788963d23297049498c2b006ef1e1886b8b53a4 100644 (file)
@@ -392,4 +392,8 @@ void sqlite3VdbeScanStatus(Vdbe*, int, int, int, LogEst, const char*);
 void sqlite3VdbePrintOp(FILE*, int, VdbeOp*);
 #endif
 
+void sqlite3VdbeIsSchemaVersion(Vdbe*);
+void sqlite3SchemaVersionLog(Vdbe *v);
+u64 sqlite3STimeNow();
+
 #endif /* SQLITE_VDBE_H */
index 0c6301c8f1666492d7d000cf75088051c75d5ac4..bf37cd8d7c10558daf232d50282c2dec8eab81ef 100644 (file)
@@ -487,8 +487,21 @@ struct Vdbe {
   int nScan;              /* Entries in aScan[] */
   ScanStatus *aScan;      /* Scan definitions for sqlite3_stmt_scanstatus() */
 #endif
+  int bSchemaVersion;
+  u64 aSchemaVersion[6];
 };
 
+#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 */
+
+/* Call sqlite3_log() if "PRAGMA schema_version" is slower than this (in us) */
+#define SCHEMA_VERSION_TIMEOUT 2000000
+
 /*
 ** The following are allowed values for Vdbe.eVdbeState
 */
index 2ff02c82e9f3d5ed59c7f6dd5a2698562e867dad..d99eb2b9b6437b405de22afd636cd9b7131df7f7 100644 (file)
@@ -5216,6 +5216,34 @@ int sqlite3NotPureFunc(sqlite3_context *pCtx){
   return 1;
 }
 
+#include <sys/time.h>
+void sqlite3VdbeIsSchemaVersion(Vdbe *v){
+  v->bSchemaVersion = 1;
+}
+void sqlite3SchemaVersionLog(Vdbe *v){
+  u64 i1 = v->aSchemaVersion[SCHEMA_VERSION_START];
+  if( v->aSchemaVersion[SCHEMA_VERSION_READDONE]>(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)
+    );
+  }
+}
+u64 sqlite3STimeNow(){
+  struct timeval time;
+  gettimeofday(&time, 0);
+  return ((u64)time.tv_sec * 1000000 + (u64)time.tv_usec);
+}
+
 #ifndef SQLITE_OMIT_VIRTUALTABLE
 /*
 ** Transfer error message text from an sqlite3_vtab.zErrMsg (text stored
index 5fe3c6ff1d612d62960dd9179bf81e63af5de41c..0385b0f8d2cb221285dcb957e6d0c1e8832e8ee4 100644 (file)
--- a/src/wal.c
+++ b/src/wal.c
 #ifndef SQLITE_OMIT_WAL
 
 #include "wal.h"
+#include "vdbeInt.h"
 
 /*
 ** Trace output macros
@@ -802,6 +803,7 @@ struct Wal {
 #ifdef SQLITE_ENABLE_SETLK_TIMEOUT
   sqlite3 *db;
 #endif
+  u64 *aSchemaVersion;
 };
 
 /*
@@ -3435,6 +3437,10 @@ 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);
@@ -3446,6 +3452,9 @@ 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 */
@@ -3712,6 +3721,10 @@ 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 );
@@ -5331,4 +5344,10 @@ int sqlite3WalJournalMode(Wal *pWal){
   return (isWalMode2(pWal) ? PAGER_JOURNALMODE_WAL2 : PAGER_JOURNALMODE_WAL);
 }
 
+void sqlite3WalIsSchemaVersion(Wal *pWal, u64 *a){
+  if( pWal ){
+    pWal->aSchemaVersion = a;
+  }
+}
+
 #endif /* #ifndef SQLITE_OMIT_WAL */
index 137abcba2b662443f3dcdcbeb1eca3f99464cfd8..0ba96e792a272a26cacd6055304358f636d32fd5 100644 (file)
--- a/src/wal.h
+++ b/src/wal.h
@@ -170,5 +170,7 @@ int sqlite3WalInfo(Wal *pWal, u32 *pnPrior, u32 *pnFrame);
 /* sqlite3_wal_info() data */
 int sqlite3WalInfo(Wal *pWal, u32 *pnPrior, u32 *pnFrame);
 
+void sqlite3WalIsSchemaVersion(Wal *pWal, u64 *a);
+
 #endif /* ifndef SQLITE_OMIT_WAL */
 #endif /* SQLITE_WAL_H */