-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
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
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
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
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.
-68a61513f9e064ed9e79638ec40f8bff1a8ee678793683e2725a4ce63563db6a
\ No newline at end of file
+44dd01e3152eba0b487f9ec5349ecc9e6474e94a10e3f4951b9d928ea39f53f0
\ No newline at end of file
}
#endif
+void sqlite3PagerIsSchemaVersion(Pager *pPager, u64 *a){
+ sqlite3WalIsSchemaVersion(pPager->pWal, a);
+}
+
#endif /* SQLITE_OMIT_DISKIO */
# define enable_simulated_io_errors()
#endif
+void sqlite3PagerIsSchemaVersion(Pager*, u64*);
+
#endif /* SQLITE_PAGER_H */
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[] = {
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 ){
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)
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;
}
*/
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 );
void sqlite3VdbePrintOp(FILE*, int, VdbeOp*);
#endif
+void sqlite3VdbeIsSchemaVersion(Vdbe*);
+void sqlite3SchemaVersionLog(Vdbe *v);
+u64 sqlite3STimeNow();
+
#endif /* SQLITE_VDBE_H */
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
*/
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
#ifndef SQLITE_OMIT_WAL
#include "wal.h"
+#include "vdbeInt.h"
/*
** Trace output macros
#ifdef SQLITE_ENABLE_SETLK_TIMEOUT
sqlite3 *db;
#endif
+ u64 *aSchemaVersion;
};
/*
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);
}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 */
}
#endif
+ if( pWal->aSchemaVersion ){
+ pWal->aSchemaVersion[SCHEMA_VERSION_BEFOREWALTBR] = sqlite3STimeNow();
+ }
+
do{
rc = walTryBeginRead(pWal, pChanged, 0, ++cnt);
}while( rc==WAL_RETRY );
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 */
/* 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 */