From 3d39434c36bcc7cd1da4e4885829a85077616aa3 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 27 Jul 2015 19:31:45 +0000 Subject: [PATCH 001/113] Add an experimental "BEGIN UNLOCKED" command. FossilOrigin-Name: 8079421604dbd40d03471dad6d12115119b554c2 --- manifest | 47 +++---- manifest.uuid | 2 +- src/btree.c | 30 ++++- src/btree.h | 1 + src/build.c | 4 +- src/main.c | 1 + src/pager.c | 64 ++++++++- src/pager.h | 5 +- src/parse.y | 1 + src/sqliteInt.h | 1 + src/vacuum.c | 1 + src/vdbe.c | 36 ++++- src/vdbeaux.c | 28 +++- src/wal.c | 206 ++++++++++++++++++++++++----- src/wal.h | 5 + test/unlocked.test | 307 +++++++++++++++++++++++++++++++++++++++++++ tool/mkkeywordhash.c | 1 + 17 files changed, 658 insertions(+), 82 deletions(-) create mode 100644 test/unlocked.test diff --git a/manifest b/manifest index 9db7a69587..62addb80e6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.8.11 -D 2015-07-27T13:49:41.754 +C Add\san\sexperimental\s"BEGIN\sUNLOCKED"\scommand. +D 2015-07-27T19:31:45.102 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 4de3ef40c8b3b75c0c55ff4242a43c8ce1ad90ee F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -270,10 +270,10 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 4d9134dc988a87838c06056c89c0e8c4700a0452 F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c f48b3ef91676c06a90a8832987ecef6b94c931ee -F src/btree.h 969adc948e89e449220ff0ff724c94bb2a52e9f1 +F src/btree.c b184ce6d483dfadc53126a4b7994633ec0d5ef5f +F src/btree.h 550e8447684013a69196ec664142f67538da8ef1 F src/btreeInt.h 2ad754dd4528baa8d0946a593cc373b890bf859e -F src/build.c b3f15255d5b16e42dafeaa638fd4f8a47c94ed70 +F src/build.c 28c15c43eefc0066ff64040526ff649c32fe5523 F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0 F src/complete.c addcd8160b081131005d5bc2d34adf20c1c5c92f F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b @@ -293,7 +293,7 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e F src/lempar.c 92bafa308607dd985ca389a788cd9e0a2b608712 F src/loadext.c dfcee8c7c032cd0fd55af3e0fc1fcfb01e426df2 -F src/main.c 0a60b7ca8252c3a6f95438fa4ce8fe5b275c69f2 +F src/main.c ebbd5a45caf66ce0ebdf1b6c0bc4784e3cfcd768 F src/malloc.c 19461e159bccf0e2cf06a50e867963d0a7b124a8 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c abe6ee469b6c5a35c7f22bfeb9c9bac664a1c987 @@ -315,9 +315,9 @@ F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa F src/os_unix.c 388c023582b17890f10c980b30ec1922b471753b F src/os_win.c 40b3af7a47eb1107d0d69e592bec345a3b7b798a F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca -F src/pager.c aa916ca28606ccf4b6877dfc2b643ccbca86589f -F src/pager.h 6d435f563b3f7fcae4b84433b76a6ac2730036e2 -F src/parse.y 6d60dda8f8d418b6dc034f1fbccd816c459983a8 +F src/pager.c c9f22eb831851220c1095863c5797a88f71bea8a +F src/pager.h b6cf6e9552c5b1e7d6d0d8cd7ca51be7802bec72 +F src/parse.y 199145cd982587d70fa3db2f9b11f7ab118f0acd F src/pcache.c cde06aa50962595e412d497e22fd2e07878ba1f0 F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9 F src/pcache1.c d08939800abf3031bd0affd5a13fbc4d7ba3fb68 @@ -333,7 +333,7 @@ F src/shell.c 8af3cced094aebb5f57a8ad739b9dafc7867eed7 F src/sqlite.h.in f623dd30a4fb7df2fb44a2a85e27813d25e486c2 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h a0b948ebc89bac13941254641326a6aa248c2cc4 -F src/sqliteInt.h 81f458941cfb30c5536c37930fb6f41e66171284 +F src/sqliteInt.h f14033fa6da3ca70f7dde5ba19dc1ed58055a2d7 F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46 F src/status.c f266ad8a2892d659b74f0f50cb6a88b6e7c12179 F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e @@ -390,20 +390,20 @@ F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f F src/update.c 487747b328b7216bb7f6af0695d6937d5c9e605f F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c 46358a204b35971a839341cf64599d65b151ba88 -F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701 -F src/vdbe.c 86be40a4568f5385048ea6623adfd11ddb7bf710 +F src/vacuum.c 4e7e18d889662eda281855a7125e56269069f215 +F src/vdbe.c fd6832408d9621ad347a65b01a05380fe766232f F src/vdbe.h 7a75045d879118b9d3af7e8b3c108f2f27c51473 F src/vdbeInt.h 8b54e01ad0463590e7cffabce0bc36da9ee4f816 F src/vdbeapi.c adabbd66eb2e3a10f3998485ee0be7e326d06ee4 -F src/vdbeaux.c 787f5f9d58f4c6f39294ed06909ba602d1a402e6 +F src/vdbeaux.c 27feae106f3f4db298e65d37a9da4962aaff724b F src/vdbeblob.c 4f2e8e075d238392df98c5e03a64342465b03f90 F src/vdbemem.c ae38a0d35ae71cf604381a887c170466ba518090 F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 F src/vtab.c 082b35a25a26e3d36f365ca8cd73c1922532f05e F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb -F src/wal.c 6fb6b68969e4692593c2552c4e7bff5882de2cb8 -F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 +F src/wal.c d588e26ed0d912584551dfe65d644d8c27cc2d1f +F src/wal.h 5188cd85398dc612ae5ed2ed02d193377218be56 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804 F src/where.c 909eba3b6db984eb2adfbca9de2c237ee7056adb F src/whereInt.h 5f87e3c4b0551747d119730dfebddd3c54f04047 @@ -1215,6 +1215,7 @@ F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 41e7f83c6827605991160a31380148a9fc5f1339 F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825 +F test/unlocked.test edd4ed073ab16c0f8c9f5124e039100657b422c9 F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 F test/uri.test 23662b7b61958b0f0e47082de7d06341ccf85d5b @@ -1326,7 +1327,7 @@ F tool/lempar.c 01ca97f87610d1dac6d8cd96ab109ab1130e76dc F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c eef612f8adf4d0993dafed0416064cf50d5d33c6 F tool/mkautoconfamal.sh d1a2da0e15b2ed33d60af35c7e9d483f13a8eb9f -F tool/mkkeywordhash.c dfff09dbbfaf950e89af294f48f902181b144670 +F tool/mkkeywordhash.c de4a823fe66f9e8c39c86e465ac7285fd6935bb8 F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e F tool/mkpragmatab.tcl 84af2b180484323a2ea22a2279e8bd9e3e1e492e F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 @@ -1366,10 +1367,10 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9f1dcdc3e1644c21762dacf619fac70afe6318c5 -R 8f58f88db8a7564cc507b9707cc8c853 -T +bgcolor * #d0c0ff -T +sym-release * -T +sym-version-3.8.11 * -U drh -Z ff777afb71751a2633799d5aca45576d +P b8e92227a469de677a66da62e4361f099c0b79d0 +R 889966cd4fab23d4f4355c880be4edd8 +T *branch * experimental-begin-unlocked +T *sym-experimental-begin-unlocked * +T -sym-trunk * +U dan +Z 55f5e7a6a42bdc95bbb980b319cd8658 diff --git a/manifest.uuid b/manifest.uuid index 8247151f16..25c9006198 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b8e92227a469de677a66da62e4361f099c0b79d0 \ No newline at end of file +8079421604dbd40d03471dad6d12115119b554c2 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 2692ade8e4..c83a01ad4c 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3142,7 +3142,10 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ if( (pBt->btsFlags & BTS_READ_ONLY)!=0 ){ rc = SQLITE_READONLY; }else{ - rc = sqlite3PagerBegin(pBt->pPager,wrflag>1,sqlite3TempInMemory(p->db)); + int bSubjInMem = sqlite3TempInMemory(p->db); + int exFlag = p->db->bUnlocked ? -1 : (wrflag>1); + assert( p->db->bUnlocked==0 || wrflag==1 ); + rc = sqlite3PagerBegin(pBt->pPager, exFlag, bSubjInMem); if( rc==SQLITE_OK ){ rc = newDatabase(pBt); } @@ -3670,8 +3673,15 @@ int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zMaster){ if( p->inTrans==TRANS_WRITE ){ BtShared *pBt = p->pBt; sqlite3BtreeEnter(p); + #ifndef SQLITE_OMIT_AUTOVACUUM - if( pBt->autoVacuum ){ + /* Figure out if this is a commit of an UNLOCKED transaction that + ** requires a snapshot upgrade. If so, skip any auto-vacuum + ** processing. */ + if( pBt->autoVacuum && ( + 0==pBt->db->bUnlocked + || 0==sqlite3PagerCommitRequiresUpgrade(pBt->pPager) + )){ rc = autoVacuumCommit(pBt); if( rc!=SQLITE_OK ){ sqlite3BtreeLeave(p); @@ -3682,7 +3692,9 @@ int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zMaster){ sqlite3PagerTruncateImage(pBt->pPager, pBt->nPage); } #endif - rc = sqlite3PagerCommitPhaseOne(pBt->pPager, zMaster, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerCommitPhaseOne(pBt->pPager, zMaster, 0); + } sqlite3BtreeLeave(p); } return rc; @@ -9578,3 +9590,15 @@ int sqlite3BtreeIsReadonly(Btree *p){ ** Return the size of the header added to each page by this module. */ int sqlite3HeaderSizeBtree(void){ return ROUND8(sizeof(MemPage)); } + +int sqlite3BtreeExclusiveLock(Btree *p){ + int rc; + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); + rc = sqlite3PagerExclusiveLock(pBt->pPager, pBt->pPage1->pDbPage); + sqlite3BtreeLeave(p); + return rc; +} + + + diff --git a/src/btree.h b/src/btree.h index 3edc2b3b57..ae9b2c4e59 100644 --- a/src/btree.h +++ b/src/btree.h @@ -270,5 +270,6 @@ void sqlite3BtreeCursorList(Btree*); # define sqlite3SchemaMutexHeld(X,Y,Z) 1 #endif +int sqlite3BtreeExclusiveLock(Btree*); #endif /* _BTREE_H_ */ diff --git a/src/build.c b/src/build.c index 2936805365..0300e2fc15 100644 --- a/src/build.c +++ b/src/build.c @@ -3828,13 +3828,13 @@ void sqlite3BeginTransaction(Parse *pParse, int type){ } v = sqlite3GetVdbe(pParse); if( !v ) return; - if( type!=TK_DEFERRED ){ + if( type==TK_IMMEDIATE || type==TK_EXCLUSIVE ){ for(i=0; inDb; i++){ sqlite3VdbeAddOp2(v, OP_Transaction, i, (type==TK_EXCLUSIVE)+1); sqlite3VdbeUsesBtree(v, i); } } - sqlite3VdbeAddOp2(v, OP_AutoCommit, 0, 0); + sqlite3VdbeAddOp3(v, OP_AutoCommit, 0, 0, (type==TK_UNLOCKED)); } /* diff --git a/src/main.c b/src/main.c index 36206eec8c..27bb2f0e83 100644 --- a/src/main.c +++ b/src/main.c @@ -2737,6 +2737,7 @@ static int openDatabase( memcpy(db->aLimit, aHardLimit, sizeof(db->aLimit)); db->aLimit[SQLITE_LIMIT_WORKER_THREADS] = SQLITE_DEFAULT_WORKER_THREADS; db->autoCommit = 1; + db->bUnlocked = 0; db->nextAutovac = -1; db->szMmap = sqlite3GlobalConfig.szMmap; db->nextPagesize = 0; diff --git a/src/pager.c b/src/pager.c index 060edb8d1d..2ea3b90a96 100644 --- a/src/pager.c +++ b/src/pager.c @@ -3066,6 +3066,7 @@ static int pagerWalFrames( ** list here. */ PgHdr **ppNext = &pList; nList = 0; + for(p=pList; (*ppNext = p)!=0; p=p->pDirty){ if( p->pgno<=nTruncate ){ ppNext = &p->pDirty; @@ -4081,7 +4082,7 @@ static int syncJournal(Pager *pPager, int newHdr){ assert( assert_pager_state(pPager) ); assert( !pagerUseWal(pPager) ); - rc = sqlite3PagerExclusiveLock(pPager); + rc = sqlite3PagerExclusiveLock(pPager, 0); if( rc!=SQLITE_OK ) return rc; if( !pPager->noSync ){ @@ -4429,6 +4430,10 @@ static int pagerStress(void *p, PgHdr *pPg){ pPg->pDirty = 0; if( pagerUseWal(pPager) ){ + /* If the transaction is a "BEGIN UNLOCKED" transaction, the page + ** cannot be flushed to disk. Return early in this case. */ + if( sqlite3WalIsInTrans(pPager->pWal)==0 ) return SQLITE_OK; + /* Write a single frame for this page to the log. */ rc = subjournalPageIfRequired(pPg); if( rc==SQLITE_OK ){ @@ -5548,11 +5553,14 @@ static int pager_open_journal(Pager *pPager){ ** Begin a write-transaction on the specified pager object. If a ** write-transaction has already been opened, this function is a no-op. ** -** If the exFlag argument is false, then acquire at least a RESERVED -** lock on the database file. If exFlag is true, then acquire at least +** If the exFlag argument is 0, then acquire at least a RESERVED +** lock on the database file. If exFlag is >0, then acquire at least ** an EXCLUSIVE lock. If such a lock is already held, no locking ** functions need be called. ** +** If (exFlag<0) and the database is in WAL mode, do not take any locks. +** The transaction will run in UNLOCKED mode instead. +** ** If the subjInMemory argument is non-zero, then any sub-journal opened ** within this transaction will be opened as an in-memory file. This ** has no effect if the sub-journal is already opened (as it may be when @@ -5588,7 +5596,9 @@ int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){ ** The busy-handler is not invoked if another connection already ** holds the write-lock. If possible, the upper layer will call it. */ - rc = sqlite3WalBeginWriteTransaction(pPager->pWal); + if( exFlag>=0 ){ + rc = sqlite3WalBeginWriteTransaction(pPager->pWal); + } }else{ /* Obtain a RESERVED lock on the database file. If the exFlag parameter ** is true, then immediately upgrade this to an EXCLUSIVE lock. The @@ -5596,7 +5606,7 @@ int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){ ** lock, but not when obtaining the RESERVED lock. */ rc = pagerLockDb(pPager, RESERVED_LOCK); - if( rc==SQLITE_OK && exFlag ){ + if( rc==SQLITE_OK && exFlag>0 ){ rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); } } @@ -6056,7 +6066,7 @@ int sqlite3PagerSync(Pager *pPager, const char *zMaster){ ** Otherwise, either SQLITE_BUSY or an SQLITE_IOERR_XXX error code is ** returned. */ -int sqlite3PagerExclusiveLock(Pager *pPager){ +int sqlite3PagerExclusiveLock(Pager *pPager, PgHdr *pPage1){ int rc = SQLITE_OK; assert( pPager->eState==PAGER_WRITER_CACHEMOD || pPager->eState==PAGER_WRITER_DBMOD @@ -6065,10 +6075,52 @@ int sqlite3PagerExclusiveLock(Pager *pPager){ assert( assert_pager_state(pPager) ); if( 0==pagerUseWal(pPager) ){ rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); + }else{ + Wal *pWal = pPager->pWal; + if( 0==sqlite3WalIsInTrans(pWal) ){ + /* TODO: There must be an optimization opportunity here, as this call + ** to PcacheDirtyList() sorts the list of dirty pages, even though it + ** is not really required - and will be sorted again in CommitPhaseOne() + ** in any case. */ + PgHdr *pList = sqlite3PcacheDirtyList(pPager->pPCache); + + /* This is an UNLOCKED transaction. Attempt to lock the wal database + ** here. If SQLITE_BUSY (but not SQLITE_BUSY_SNAPSHOT) is returned, + ** invoke the busy-handler and try again for as long as it returns + ** non-zero. */ + do { + /* rc = sqlite3WalBeginWriteTransaction(pWal); */ + rc = sqlite3WalLockForCommit(pWal, pList, pPage1); + }while( rc==SQLITE_BUSY + && pPager->xBusyHandler(pPager->pBusyHandlerArg) + ); + } } return rc; } +/* +** If this is a WAL mode connection and the WRITER lock is currently held, +** relinquish it. +*/ +void sqlite3PagerDropExclusiveLock(Pager *pPager){ + if( pagerUseWal(pPager) ){ + sqlite3WalEndWriteTransaction(pPager->pWal); + } +} + +/* +** Return true if this is a WAL database and snapshot upgrade is required +** before the current transaction can be committed. +*/ +int sqlite3PagerCommitRequiresUpgrade(Pager *pPager){ + int res = 0; + if( pagerUseWal(pPager) ){ + res = sqlite3WalCommitRequiresUpgrade(pPager->pWal); + } + return res; +} + /* ** Sync the database file for the pager pPager. zMaster points to the name ** of a master journal file that should be written into the individual diff --git a/src/pager.h b/src/pager.h index e3b57f435e..57d2812701 100644 --- a/src/pager.h +++ b/src/pager.h @@ -150,7 +150,7 @@ void *sqlite3PagerGetExtra(DbPage *); void sqlite3PagerPagecount(Pager*, int*); int sqlite3PagerBegin(Pager*, int exFlag, int); int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, int); -int sqlite3PagerExclusiveLock(Pager*); +int sqlite3PagerExclusiveLock(Pager*, DbPage *pPage1); int sqlite3PagerSync(Pager *pPager, const char *zMaster); int sqlite3PagerCommitPhaseTwo(Pager*); int sqlite3PagerRollback(Pager*); @@ -158,6 +158,9 @@ int sqlite3PagerOpenSavepoint(Pager *pPager, int n); int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint); int sqlite3PagerSharedLock(Pager *pPager); +void sqlite3PagerDropExclusiveLock(Pager*); +int sqlite3PagerCommitRequiresUpgrade(Pager*); + #ifndef SQLITE_OMIT_WAL int sqlite3PagerCheckpoint(Pager *pPager, int, int*, int*); int sqlite3PagerWalSupported(Pager *pPager); diff --git a/src/parse.y b/src/parse.y index d7aa763683..db40b70b9c 100644 --- a/src/parse.y +++ b/src/parse.y @@ -121,6 +121,7 @@ transtype(A) ::= . {A = TK_DEFERRED;} transtype(A) ::= DEFERRED(X). {A = @X;} transtype(A) ::= IMMEDIATE(X). {A = @X;} transtype(A) ::= EXCLUSIVE(X). {A = @X;} +transtype(A) ::= UNLOCKED(X). {A = @X;} cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);} cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);} cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);} diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d26cd19eb7..2480bb0cfe 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1147,6 +1147,7 @@ struct sqlite3 { u16 dbOptFlags; /* Flags to enable/disable optimizations */ u8 enc; /* Text encoding */ u8 autoCommit; /* The auto-commit flag. */ + u8 bUnlocked; /* Current transaction is "UNLOCKED" */ u8 temp_store; /* 1: file 2: memory 0: default */ u8 mallocFailed; /* True if we have seen a malloc failure */ u8 dfltLockMode; /* Default locking-mode for attached dbs */ diff --git a/src/vacuum.c b/src/vacuum.c index adc802e60b..10f14cbf47 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -356,6 +356,7 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ ** is closed by the DETACH. */ db->autoCommit = 1; + db->bUnlocked = 0; if( pDb ){ sqlite3BtreeClose(pDb->pBt); diff --git a/src/vdbe.c b/src/vdbe.c index fe97087c09..b400c425b8 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2899,6 +2899,7 @@ case OP_Savepoint: { if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ goto vdbe_return; } + assert( db->bUnlocked==0 ); db->autoCommit = 1; if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){ p->pc = (int)(pOp - aOp); @@ -2970,29 +2971,39 @@ case OP_Savepoint: { break; } -/* Opcode: AutoCommit P1 P2 * * * +/* Opcode: AutoCommit P1 P2 P3 * * ** ** Set the database auto-commit flag to P1 (1 or 0). If P2 is true, roll ** back any currently active btree transactions. If there are any active ** VMs (apart from this one), then a ROLLBACK fails. A COMMIT fails if ** there are active writing VMs or active VMs that use shared cache. ** +** If P3 is non-zero, then this instruction is being executed as part of +** a "BEGIN UNLOCKED" command. +** ** This instruction causes the VM to halt. */ case OP_AutoCommit: { int desiredAutoCommit; int iRollback; int turnOnAC; + int bUnlocked; + int hrc; desiredAutoCommit = pOp->p1; iRollback = pOp->p2; + bUnlocked = pOp->p3; turnOnAC = desiredAutoCommit && !db->autoCommit; assert( desiredAutoCommit==1 || desiredAutoCommit==0 ); assert( desiredAutoCommit==1 || iRollback==0 ); + assert( desiredAutoCommit==0 || bUnlocked==0 ); + assert( db->autoCommit==0 || db->bUnlocked==0 ); assert( db->nVdbeActive>0 ); /* At least this one VM is active */ assert( p->bIsReader ); - if( turnOnAC && !iRollback && db->nVdbeWrite>0 ){ + if( turnOnAC && !iRollback && + (db->nVdbeWrite>0 || (db->bUnlocked && db->nVdbeActive>1)) + ){ /* If this instruction implements a COMMIT and other VMs are writing ** return an error indicating that the other VMs must complete first. */ @@ -3004,16 +3015,20 @@ case OP_AutoCommit: { assert( desiredAutoCommit==1 ); sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); db->autoCommit = 1; + db->bUnlocked = 0; }else if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ goto vdbe_return; }else{ db->autoCommit = (u8)desiredAutoCommit; - if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){ + hrc = sqlite3VdbeHalt(p); + if( (hrc & 0xFF)==SQLITE_BUSY ){ p->pc = (int)(pOp - aOp); db->autoCommit = (u8)(1-desiredAutoCommit); - p->rc = rc = SQLITE_BUSY; + p->rc = hrc; + rc = SQLITE_BUSY; goto vdbe_return; } + db->bUnlocked = (u8)bUnlocked; } assert( db->nStatement==0 ); sqlite3CloseSavepoints(db); @@ -3208,9 +3223,16 @@ case OP_SetCookie: { /* in3 */ /* See note about index shifting on OP_ReadCookie */ rc = sqlite3BtreeUpdateMeta(pDb->pBt, pOp->p2, (int)pIn3->u.i); if( pOp->p2==BTREE_SCHEMA_VERSION ){ - /* When the schema cookie changes, record the new cookie internally */ - pDb->pSchema->schema_cookie = (int)pIn3->u.i; - db->flags |= SQLITE_InternChanges; + if( db->bUnlocked ){ + sqlite3VdbeError(p, "cannot modify database schema - " + "UNLOCKED transaction" + ); + rc = SQLITE_ERROR; + }else{ + /* When the schema cookie changes, record the new cookie internally */ + pDb->pSchema->schema_cookie = (int)pIn3->u.i; + db->flags |= SQLITE_InternChanges; + } }else if( pOp->p2==BTREE_FILE_FORMAT ){ /* Record changes in the file format */ pDb->pSchema->file_format = (u8)pIn3->u.i; diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 08dc885df6..f5f9d0fbdd 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2020,11 +2020,24 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ if( sqlite3BtreeIsInTrans(pBt) ){ needXcommit = 1; if( i!=1 ) nTrans++; - sqlite3BtreeEnter(pBt); - rc = sqlite3PagerExclusiveLock(sqlite3BtreePager(pBt)); - sqlite3BtreeLeave(pBt); + rc = sqlite3BtreeExclusiveLock(pBt); } } + + if( db->bUnlocked && (rc & 0xFF)==SQLITE_BUSY ){ + /* An SQLITE_BUSY or SQLITE_BUSY_SNAPSHOT was encountered while + ** attempting to take the WRITER lock on a wal file. Release the + ** WRITER locks on all wal files and return early. */ + for(i=0; inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( sqlite3BtreeIsInTrans(pBt) ){ + sqlite3BtreeEnter(pBt); + sqlite3PagerDropExclusiveLock(sqlite3BtreePager(pBt)); + sqlite3BtreeLeave(pBt); + } + } + } + if( rc!=SQLITE_OK ){ return rc; } @@ -2427,6 +2440,7 @@ int sqlite3VdbeHalt(Vdbe *p){ sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); sqlite3CloseSavepoints(db); db->autoCommit = 1; + db->bUnlocked = 0; p->nChange = 0; } } @@ -2462,9 +2476,9 @@ int sqlite3VdbeHalt(Vdbe *p){ ** is required. */ rc = vdbeCommit(db, p); } - if( rc==SQLITE_BUSY && p->readOnly ){ + if( (rc & 0xFF)==SQLITE_BUSY && p->readOnly ){ sqlite3VdbeLeave(p); - return SQLITE_BUSY; + return rc; }else if( rc!=SQLITE_OK ){ p->rc = rc; sqlite3RollbackAll(db, SQLITE_OK); @@ -2489,6 +2503,7 @@ int sqlite3VdbeHalt(Vdbe *p){ sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); sqlite3CloseSavepoints(db); db->autoCommit = 1; + db->bUnlocked = 0; p->nChange = 0; } } @@ -2510,6 +2525,7 @@ int sqlite3VdbeHalt(Vdbe *p){ sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); sqlite3CloseSavepoints(db); db->autoCommit = 1; + db->bUnlocked = 0; p->nChange = 0; } } @@ -2554,7 +2570,7 @@ int sqlite3VdbeHalt(Vdbe *p){ } assert( db->nVdbeActive>0 || db->autoCommit==0 || db->nStatement==0 ); - return (p->rc==SQLITE_BUSY ? SQLITE_BUSY : SQLITE_OK); + return ((p->rc & 0xFF)==SQLITE_BUSY ? SQLITE_BUSY : SQLITE_OK); } diff --git a/src/wal.c b/src/wal.c index f7e2594001..a2200e7005 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2357,38 +2357,19 @@ void sqlite3WalEndReadTransaction(Wal *pWal){ } /* -** Search the wal file for page pgno. If found, set *piRead to the frame that -** contains the page. Otherwise, if pgno is not in the wal file, set *piRead -** to zero. -** -** Return SQLITE_OK if successful, or an error code if an error occurs. If an -** error does occur, the final value of *piRead is undefined. -*/ -int sqlite3WalFindFrame( - Wal *pWal, /* WAL handle */ - Pgno pgno, /* Database page number to read data for */ - u32 *piRead /* OUT: Frame number (or zero) */ +** Search the hash tables for an entry matching page number pgno. Ignore +** any entries that lie after frame iLast within the wal file. +*/ +static int walFindFrame( + Wal *pWal, + Pgno pgno, + u32 iLast, + u32 *piRead ){ - u32 iRead = 0; /* If !=0, WAL frame to return data from */ - u32 iLast = pWal->hdr.mxFrame; /* Last page in WAL for this reader */ int iHash; /* Used to loop through N hash tables */ + u32 iRead = 0; - /* This routine is only be called from within a read transaction. */ - assert( pWal->readLock>=0 || pWal->lockError ); - - /* If the "last page" field of the wal-index header snapshot is 0, then - ** no data will be read from the wal under any circumstances. Return early - ** in this case as an optimization. Likewise, if pWal->readLock==0, - ** then the WAL is ignored by the reader so return early, as if the - ** WAL were empty. - */ - if( iLast==0 || pWal->readLock==0 ){ - *piRead = 0; - return SQLITE_OK; - } - - /* Search the hash table or tables for an entry matching page number - ** pgno. Each iteration of the following for() loop searches one + /* Each iteration of the following for() loop searches one ** hash table (each hash table indexes up to HASHTABLE_NPAGE frames). ** ** This code might run concurrently to the code in walIndexAppend() @@ -2437,11 +2418,48 @@ int sqlite3WalFindFrame( } } + *piRead = iRead; + return SQLITE_OK; +} + +/* +** Search the wal file for page pgno. If found, set *piRead to the frame that +** contains the page. Otherwise, if pgno is not in the wal file, set *piRead +** to zero. +** +** Return SQLITE_OK if successful, or an error code if an error occurs. If an +** error does occur, the final value of *piRead is undefined. +*/ +int sqlite3WalFindFrame( + Wal *pWal, /* WAL handle */ + Pgno pgno, /* Database page number to read data for */ + u32 *piRead /* OUT: Frame number (or zero) */ +){ + u32 iRead = 0; /* If !=0, WAL frame to return data from */ + u32 iLast = pWal->hdr.mxFrame; /* Last page in WAL for this reader */ + int rc; + + /* This routine is only be called from within a read transaction. */ + assert( pWal->readLock>=0 || pWal->lockError ); + + /* If the "last page" field of the wal-index header snapshot is 0, then + ** no data will be read from the wal under any circumstances. Return early + ** in this case as an optimization. Likewise, if pWal->readLock==0, + ** then the WAL is ignored by the reader so return early, as if the + ** WAL were empty. + */ + if( iLast==0 || pWal->readLock==0 ){ + *piRead = 0; + return SQLITE_OK; + } + + rc = walFindFrame(pWal, pgno, iLast, &iRead); + #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT /* If expensive assert() statements are available, do a linear search ** of the wal-index file content. Make sure the results agree with the ** result obtained using the hash indexes above. */ - { + if( rc==SQLITE_OK ){ u32 iRead2 = 0; u32 iTest; for(iTest=iLast; iTest>0; iTest--){ @@ -2537,6 +2555,96 @@ int sqlite3WalBeginWriteTransaction(Wal *pWal){ return rc; } +/* +** TODO: Combine some code with BeginWriteTransaction() +** +** This function is only ever called when committing a "BEGIN UNLOCKED" +** transaction. It may be assumed that no frames have been written to +** the wal file. +*/ +int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pList, PgHdr *pPage1){ + volatile WalIndexHdr *pHead; /* Head of the wal file */ + int rc; + + /* Cannot start a write transaction without first holding a read + ** transaction. */ + assert( pWal->readLock>=0 ); + + if( pWal->readOnly ){ + return SQLITE_READONLY; + } + + /* Only one writer allowed at a time. Get the write lock. Return + ** SQLITE_BUSY if unable. + */ + rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1, 0); + if( rc ){ + return rc; + } + pWal->writeLock = 1; + + /* If the database has been modified since this transaction was started, + ** check if it is still possible to commit. The transaction can be + ** committed if: + ** + ** a) None of the pages in pList have been modified since the + ** transaction opened, and + ** + ** b) The database schema cookie has not been modified since the + ** transaction was started. + */ + pHead = walIndexHdr(pWal); + if( memcmp(&pWal->hdr, (void*)pHead, sizeof(WalIndexHdr))!=0 ){ + /* TODO: Is this safe? Because it holds the WRITER lock this thread + ** has exclusive access to the live header, but might it be corrupt? */ + PgHdr *pPg; + u32 iLast = pHead->mxFrame; + for(pPg=pList; rc==SQLITE_OK && pPg; pPg=pPg->pDirty){ + u32 iSlot = 0; + rc = walFindFrame(pWal, pPg->pgno, iLast, &iSlot); + if( iSlot>pWal->hdr.mxFrame ){ + sqlite3_log(SQLITE_OK, + "cannot commit UNLOCKED transaction (conflict at page %d)", + (int)pPg->pgno + ); + rc = SQLITE_BUSY_SNAPSHOT; + } + } + + if( rc==SQLITE_OK ){ + /* Read the newest schema cookie from the wal file. */ + u32 iSlot = 0; + rc = walFindFrame(pWal, 1, iLast, &iSlot); + if( rc==SQLITE_OK && iSlot>pWal->hdr.mxFrame ){ + u8 aNew[4]; + u8 *aOld = &((u8*)pPage1->pData)[40]; + int sz; + i64 iOffset; + sz = pWal->hdr.szPage; + sz = (sz&0xfe00) + ((sz&0x0001)<<16); + iOffset = walFrameOffset(iSlot, sz) + WAL_FRAME_HDRSIZE + 40; + rc = sqlite3OsRead(pWal->pWalFd, aNew, sizeof(aNew), iOffset); + if( rc==SQLITE_OK && memcmp(aOld, aNew, sizeof(aNew)) ){ + /* TODO: New error code? SQLITE_BUSY_SCHEMA. */ + rc = SQLITE_BUSY_SNAPSHOT; + } + } + } + } + + return rc; +} + +/* +** The caller holds the WRITER lock. This function returns true if a snapshot +** upgrade is required before the transaction can be committed, or false +** otherwise. +*/ +int sqlite3WalCommitRequiresUpgrade(Wal *pWal){ + assert( pWal->writeLock ); + return memcmp(&pWal->hdr, (void*)walIndexHdr(pWal), sizeof(WalIndexHdr))!=0; +} + /* ** End a write transaction. The commit has already been done. This ** routine merely releases the lock. @@ -2564,7 +2672,7 @@ int sqlite3WalEndWriteTransaction(Wal *pWal){ */ int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx){ int rc = SQLITE_OK; - if( ALWAYS(pWal->writeLock) ){ + if( pWal->writeLock ){ Pgno iMax = pWal->hdr.mxFrame; Pgno iFrame; @@ -2603,7 +2711,7 @@ int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx){ ** point in the event of a savepoint rollback (via WalSavepointUndo()). */ void sqlite3WalSavepoint(Wal *pWal, u32 *aWalData){ - assert( pWal->writeLock ); + /* assert( pWal->writeLock ); */ aWalData[0] = pWal->hdr.mxFrame; aWalData[1] = pWal->hdr.aFrameCksum[0]; aWalData[2] = pWal->hdr.aFrameCksum[1]; @@ -2619,7 +2727,7 @@ void sqlite3WalSavepoint(Wal *pWal, u32 *aWalData){ int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData){ int rc = SQLITE_OK; - assert( pWal->writeLock ); + assert( pWal->writeLock || aWalData[0]==pWal->hdr.mxFrame ); assert( aWalData[3]!=pWal->nCkpt || aWalData[0]<=pWal->hdr.mxFrame ); if( aWalData[3]!=pWal->nCkpt ){ @@ -2783,6 +2891,7 @@ int sqlite3WalFrames( int szFrame; /* The size of a single frame */ i64 iOffset; /* Next byte to write in WAL file */ WalWriter w; /* The writer */ + int bUpgrade = 0; /* True if commit requires snapshot upgrade */ assert( pList ); assert( pWal->writeLock ); @@ -2798,6 +2907,22 @@ int sqlite3WalFrames( } #endif + if( isCommit ){ + volatile WalIndexHdr *pHead = walIndexHdr(pWal); + if( pHead->mxFrame>pWal->hdr.mxFrame ){ + if( memcmp((void*)&pHead[0], (void*)&pHead[1], sizeof(WalIndexHdr))!=0 ){ + /* TODO: Deal with this case. It's quite possible, but fiddly. */ + return SQLITE_CORRUPT_BKPT; + } + memcpy(&pWal->hdr, (void*)pHead, sizeof(WalIndexHdr)); + if( nTruncatehdr.nPage ){ + /* Do not truncate the database file in this case */ + nTruncate = pWal->hdr.nPage; + } + bUpgrade = 1; + } + } + /* See if it is possible to write these frames into the start of the ** log file, instead of appending to it at pWal->hdr.mxFrame. */ @@ -2946,6 +3071,14 @@ int sqlite3WalFrames( } } + if( rc==SQLITE_OK && bUpgrade ){ + /* If this commit required a snapshot upgrade, the pager cache is + ** not currently consistent with the head of the wal file. Zeroing + ** Wal.hdr here forces the next transaction to reset the cache + ** before beginning to read the db. */ + memset(&pWal->hdr, 0, sizeof(WalIndexHdr)); + } + WALTRACE(("WAL%p: frame write %s\n", pWal, rc ? "failed" : "ok")); return rc; } @@ -3147,6 +3280,13 @@ int sqlite3WalHeapMemory(Wal *pWal){ return (pWal && pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ); } +/* +** Return true if in a write transaction, false otherwise. +*/ +int sqlite3WalIsInTrans(Wal *pWal){ + return (int)pWal->writeLock; +} + #ifdef SQLITE_ENABLE_ZIPVFS /* ** If the argument is not NULL, it points to a Wal object that holds a diff --git a/src/wal.h b/src/wal.h index 092546354b..db341caa04 100644 --- a/src/wal.h +++ b/src/wal.h @@ -126,6 +126,11 @@ int sqlite3WalExclusiveMode(Wal *pWal, int op); */ int sqlite3WalHeapMemory(Wal *pWal); +/* Return true if the WRITER lock is held. False otherwise. */ +int sqlite3WalIsInTrans(Wal *pWal); +int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pDirtyList, PgHdr *pPage1); +int sqlite3WalCommitRequiresUpgrade(Wal *pWal); + #ifdef SQLITE_ENABLE_ZIPVFS /* If the WAL file is not empty, return the number of bytes of content ** stored in each frame (i.e. the db page-size when the WAL was created). diff --git a/test/unlocked.test b/test/unlocked.test new file mode 100644 index 0000000000..e5f7868a20 --- /dev/null +++ b/test/unlocked.test @@ -0,0 +1,307 @@ +# 2015 July 26 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/lock_common.tcl +set ::testprefix unlocked + + +do_execsql_test 1.0 { + PRAGMA journal_mode = wal; +} {wal} + +do_execsql_test 1.1 { + CREATE TABLE t1(k INTEGER PRIMARY KEY, v); + BEGIN UNLOCKED; + INSERT INTO t1 VALUES(1, 'abcd'); + COMMIT; +} + +do_execsql_test 1.2 { + SELECT * FROM t1; +} {1 abcd} + +do_execsql_test 1.3 { + BEGIN UNLOCKED; + INSERT INTO t1 VALUES(2, 'efgh'); + ROLLBACK; +} + +do_execsql_test 1.4 { + SELECT * FROM t1; +} {1 abcd} + + +#------------------------------------------------------------------------- +# UNLOCKED transactions cannot do cache spills. +# +foreach {tn trans spill} { + 1 {BEGIN UNLOCKED} 0 + 2 {BEGIN} 1 +} { + do_test 1.5.$tn { + sqlite3 db2 test.db + set walsz [file size test.db-wal] + + execsql { PRAGMA cache_size = 10 } db2 + execsql $trans db2 + execsql { + WITH cnt(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM cnt WHERE i<50) + INSERT INTO t1(v) SELECT randomblob(900) FROM cnt; + } db2 + + expr {[file size test.db-wal]==$walsz} + } [expr !$spill] + + execsql ROLLBACK db2 + db2 close +} + +#------------------------------------------------------------------------- +# UNLOCKED transactions man not be committed while there are active +# readers. +do_execsql_test 1.6.setup { + DROP TABLE t1; + CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(1, 2); + INSERT INTO t1 VALUES(3, 4); + INSERT INTO t1 VALUES(5, 6); +} +foreach {tn trans commit_ok} { + 1 {BEGIN UNLOCKED} 0 + 2 {BEGIN} 1 +} { + do_test 1.6.$tn.1 { + set stmt [sqlite3_prepare db "SELECT * FROM t1" -1 dummy] + sqlite3_step $stmt + } SQLITE_ROW + do_test 1.6.$tn.2 { + execsql $trans + execsql { INSERT INTO t1 VALUES(7, 8) } + } {} + + if { $commit_ok } { + do_test 1.6.$tn.3 { catchsql COMMIT } {0 {}} + } else { + do_test 1.6.$tn.4 { catchsql COMMIT } {/1 {cannot commit transaction .*}/} + } + + sqlite3_finalize $stmt + catchsql ROLLBACK +} + +#------------------------------------------------------------------------- +# UNLOCKED transactions may not modify the db schema. +# +foreach {tn sql} { + 1 { CREATE TABLE xx(a, b) } + 2 { DROP TABLE t1 } +} { + do_catchsql_test 1.7.$tn.1 " + BEGIN UNLOCKED; + $sql + " {1 {cannot modify database schema - UNLOCKED transaction}} + + do_execsql_test 1.7.$tn.2 ROLLBACK +} + + +do_multiclient_test tn { + + #----------------------------------------------------------------------- + # 1. Start an UNLOCKED transaction using [db1]. + # + # 2. Start and then rollback a regular transaction using [db2]. This + # can be done as the ongoing [db1] transaction is UNLOCKED. + # + # 3. The [db1] transaction can now be committed, as [db2] has relinquished + # the write lock. + # + do_test 2.$tn.1.1 { + sql1 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(k INTEGER PRIMARY KEY, v); + INSERT INTO t1 VALUES(1, 'one'); + } + sql1 { + BEGIN UNLOCKED; + INSERT INTO t1 VALUES(2, 'two'); + } + code1 { sqlite3_get_autocommit db } + } 0 + + do_test 2.$tn.1.2 { + sql2 { + BEGIN; + INSERT INTO t1 VALUES(3, 'three'); + ROLLBACK; + } + } {} + + do_test 2.$tn.1.3 { + sql1 COMMIT + sql2 { SELECT * FROM t1 } + } {1 one 2 two} + + #----------------------------------------------------------------------- + # 1. Start an UNLOCKED transaction using [db1]. + # + # 2. Commit a transaction using [db2]. + # + # 3. Try to commit with [db1]. Check that SQLITE_BUSY_SNAPSHOT is returned, + # and the transaction is not rolled back. + # + do_test 2.$tn.2.1 { + sql1 { + BEGIN UNLOCKED; + INSERT INTO t1 VALUES(-1, 'hello world'); + } + } {} + + do_test 2.$tn.2.2 { + sql2 { + INSERT INTO t1 VALUES(3, 'three'); + } + } {} + + do_test 2.$tn.2.3.1 { + set rc [catch { sql1 COMMIT } msg] + list $rc $msg + } {1 {database is locked}} + + do_test 2.$tn.2.3.2 { + code1 { list [sqlite3_extended_errcode db] [sqlite3_get_autocommit db] } + } {SQLITE_BUSY_SNAPSHOT 0} + + do_test 2.$tn.2.3.3 { + sql1 { + SELECT * FROM t1; + ROLLBACK; + } + } {-1 {hello world} 1 one 2 two} + + #----------------------------------------------------------------------- + # 1. Start an UNLOCKED transaction using [db1]. + # + # 2. Open a transaction using [db2]. + # + # 3. Try to commit with [db1]. Check that SQLITE_BUSY is returned, + # and the transaction is not rolled back. + # + # 4. Have [db2] roll its transaction back. Then check that [db1] can + # commit. + # + do_test 2.$tn.3.1 { + sql1 { + BEGIN UNLOCKED; + INSERT INTO t1 VALUES(4, 'four'); + } + } {} + + do_test 2.$tn.3.2 { + sql2 { + BEGIN; + INSERT INTO t1 VALUES(-1, 'xyz'); + } + } {} + + do_test 2.$tn.3.3.1 { + set rc [catch { sql1 COMMIT } msg] + list $rc $msg + } {1 {database is locked}} + + do_test 2.$tn.3.3.2 { + code1 { list [sqlite3_extended_errcode db] [sqlite3_get_autocommit db] } + } {SQLITE_BUSY 0} + + do_test 2.$tn.3.3.3 { + sql1 { SELECT * FROM t1; } + } {1 one 2 two 3 three 4 four} + + do_test 2.$tn.3.4 { + sql2 ROLLBACK + sql1 COMMIT + sql1 { SELECT * FROM t1; } + } {1 one 2 two 3 three 4 four} + + #----------------------------------------------------------------------- + # 1. Create a second table - t2. + # + # 2. Write to t1 with [db] and t2 with [db2]. + # + # 3. See if it worked. + # + do_test 2.$tn.4.1 { + sql1 { CREATE TABLE t2(a, b) } + } {} + do_test 2.$tn.4.2 { + sql2 { + BEGIN UNLOCKED; + INSERT INTO t2 VALUES('i', 'n'); + } + + sql1 { + BEGIN UNLOCKED; + INSERT INTO t1 VALUES(5, 'five'); + COMMIT; + } + + sql2 COMMIT + } {} + + do_test 2.$tn.4.3.1 { + sql2 {SELECT * FROM t1} + } {1 one 2 two 3 three 4 four 5 five} + do_test 2.$tn.4.3.2 { + sql1 {SELECT * FROM t1} + } {1 one 2 two 3 three 4 four 5 five} + + do_test 2.$tn.4.3.3 { sql2 {SELECT * FROM t2} } {i n} + do_test 2.$tn.4.3.4 { sql1 {SELECT * FROM t2} } {i n} + + #----------------------------------------------------------------------- + # The "schema cookie" issue. + # + # 1. Begin and UNLOCKED write to "t1" using [db] + # + # 2. Create an index on t1 using [db2]. + # + # 3. Attempt to commit the UNLOCKED write. This is an SQLITE_BUSY_SNAPSHOT, + # even though there is no page collision. + # + + do_test 2.$tn.5.1 { + sql1 { + BEGIN UNLOCKED; + INSERT INTO t1 VALUES(6, 'six'); + } + } {} + + do_test 2.$tn.5.2 { + sql2 { CREATE INDEX i1 ON t1(v); } + } {} + + do_test 2.$tn.5.3 { + list [catch { sql1 { COMMIT } } msg] $msg [sqlite3_errcode db] + } {1 {database is locked} SQLITE_BUSY_SNAPSHOT} + + do_test 2.$tn.5.4 { + sql2 { PRAGMA integrity_check } + } {ok} + catch { sql1 ROLLBACK } + +} + + + +finish_test diff --git a/tool/mkkeywordhash.c b/tool/mkkeywordhash.c index 721611f5a3..d1810cbeb9 100644 --- a/tool/mkkeywordhash.c +++ b/tool/mkkeywordhash.c @@ -262,6 +262,7 @@ static Keyword aKeywordTable[] = { { "TRIGGER", "TK_TRIGGER", TRIGGER }, { "UNION", "TK_UNION", COMPOUND }, { "UNIQUE", "TK_UNIQUE", ALWAYS }, + { "UNLOCKED", "TK_UNLOCKED", ALWAYS }, { "UPDATE", "TK_UPDATE", ALWAYS }, { "USING", "TK_USING", ALWAYS }, { "VACUUM", "TK_VACUUM", VACUUM }, From 37d36205f3e7061e5d17e1ed6c291bbcc0875bae Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 28 Jul 2015 16:46:49 +0000 Subject: [PATCH 002/113] Add some test cases and fix some small problems with BEGIN UNLOCKED transactions. FossilOrigin-Name: 6da0e962ad2aa5e52c1f1b5c3dbf77a2cb16ac2d --- manifest | 17 ++--- manifest.uuid | 2 +- src/wal.c | 181 ++++++++++++++++++++++++--------------------- test/unlocked.test | 66 ++++++++++++++++- 4 files changed, 170 insertions(+), 96 deletions(-) diff --git a/manifest b/manifest index 62addb80e6..c4c044ae5c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\san\sexperimental\s"BEGIN\sUNLOCKED"\scommand. -D 2015-07-27T19:31:45.102 +C Add\ssome\stest\scases\sand\sfix\ssome\ssmall\sproblems\swith\sBEGIN\sUNLOCKED\stransactions. +D 2015-07-28T16:46:49.291 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 4de3ef40c8b3b75c0c55ff4242a43c8ce1ad90ee F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -402,7 +402,7 @@ F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 F src/vtab.c 082b35a25a26e3d36f365ca8cd73c1922532f05e F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb -F src/wal.c d588e26ed0d912584551dfe65d644d8c27cc2d1f +F src/wal.c a2e35f042103519ce22050acaf167960446963c7 F src/wal.h 5188cd85398dc612ae5ed2ed02d193377218be56 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804 F src/where.c 909eba3b6db984eb2adfbca9de2c237ee7056adb @@ -1215,7 +1215,7 @@ F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 41e7f83c6827605991160a31380148a9fc5f1339 F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825 -F test/unlocked.test edd4ed073ab16c0f8c9f5124e039100657b422c9 +F test/unlocked.test 854f3f428bb2e0ae91cb2400596a8f1ab7eaa409 F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 F test/uri.test 23662b7b61958b0f0e47082de7d06341ccf85d5b @@ -1367,10 +1367,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P b8e92227a469de677a66da62e4361f099c0b79d0 -R 889966cd4fab23d4f4355c880be4edd8 -T *branch * experimental-begin-unlocked -T *sym-experimental-begin-unlocked * -T -sym-trunk * +P 8079421604dbd40d03471dad6d12115119b554c2 +R 52e6230fe0fe2d8cb4434e54d864e964 U dan -Z 55f5e7a6a42bdc95bbb980b319cd8658 +Z 849da1cda4069d7075ecc7190a9058c5 diff --git a/manifest.uuid b/manifest.uuid index 25c9006198..23abb2a199 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8079421604dbd40d03471dad6d12115119b554c2 \ No newline at end of file +6da0e962ad2aa5e52c1f1b5c3dbf77a2cb16ac2d \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index a2200e7005..be018ebc99 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2508,6 +2508,34 @@ Pgno sqlite3WalDbsize(Wal *pWal){ return 0; } +/* +** Take the WRITER lock on the WAL file. Return SQLITE_OK if successful, +** or an SQLite error code otherwise. This routine does not invoke any +** busy-handler callbacks, that is done at a higher level. +*/ +static int walWriteLock(Wal *pWal){ + int rc; + + /* Cannot start a write transaction without first holding a read lock */ + assert( pWal->readLock>=0 ); + assert( pWal->writeLock==0 ); + + /* If this is a read-only connection, obtaining a write-lock is not + ** possible. In this case return SQLITE_READONLY. Otherwise, attempt + ** to grab the WRITER lock. Set Wal.writeLock to true and return + ** SQLITE_OK if successful, or leave Wal.writeLock clear and return + ** an SQLite error code (possibly SQLITE_BUSY) otherwise. */ + if( pWal->readOnly ){ + rc = SQLITE_READONLY; + }else{ + rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1, 0); + if( rc==SQLITE_OK ){ + pWal->writeLock = 1; + } + } + + return rc; +} /* ** This function starts a write transaction on the WAL. @@ -2523,35 +2551,18 @@ Pgno sqlite3WalDbsize(Wal *pWal){ ** There can only be a single writer active at a time. */ int sqlite3WalBeginWriteTransaction(Wal *pWal){ - int rc; - - /* Cannot start a write transaction without first holding a read - ** transaction. */ - assert( pWal->readLock>=0 ); - - if( pWal->readOnly ){ - return SQLITE_READONLY; - } - - /* Only one writer allowed at a time. Get the write lock. Return - ** SQLITE_BUSY if unable. - */ - rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1, 0); - if( rc ){ - return rc; - } - pWal->writeLock = 1; - - /* If another connection has written to the database file since the - ** time the read transaction on this connection was started, then - ** the write is disallowed. - */ - if( memcmp(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr))!=0 ){ - walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); - pWal->writeLock = 0; - rc = SQLITE_BUSY_SNAPSHOT; + int rc = walWriteLock(pWal); + if( rc==SQLITE_OK ){ + /* If another connection has written to the database file since the + ** time the read transaction on this connection was started, then + ** the write is disallowed. Release the WRITER lock and return + ** SQLITE_BUSY_SNAPSHOT in this case. */ + if( memcmp(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr))!=0 ){ + walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); + pWal->writeLock = 0; + rc = SQLITE_BUSY_SNAPSHOT; + } } - return rc; } @@ -2563,25 +2574,7 @@ int sqlite3WalBeginWriteTransaction(Wal *pWal){ ** the wal file. */ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pList, PgHdr *pPage1){ - volatile WalIndexHdr *pHead; /* Head of the wal file */ - int rc; - - /* Cannot start a write transaction without first holding a read - ** transaction. */ - assert( pWal->readLock>=0 ); - - if( pWal->readOnly ){ - return SQLITE_READONLY; - } - - /* Only one writer allowed at a time. Get the write lock. Return - ** SQLITE_BUSY if unable. - */ - rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1, 0); - if( rc ){ - return rc; - } - pWal->writeLock = 1; + int rc = walWriteLock(pWal); /* If the database has been modified since this transaction was started, ** check if it is still possible to commit. The transaction can be @@ -2593,41 +2586,53 @@ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pList, PgHdr *pPage1){ ** b) The database schema cookie has not been modified since the ** transaction was started. */ - pHead = walIndexHdr(pWal); - if( memcmp(&pWal->hdr, (void*)pHead, sizeof(WalIndexHdr))!=0 ){ - /* TODO: Is this safe? Because it holds the WRITER lock this thread - ** has exclusive access to the live header, but might it be corrupt? */ - PgHdr *pPg; - u32 iLast = pHead->mxFrame; - for(pPg=pList; rc==SQLITE_OK && pPg; pPg=pPg->pDirty){ - u32 iSlot = 0; - rc = walFindFrame(pWal, pPg->pgno, iLast, &iSlot); - if( iSlot>pWal->hdr.mxFrame ){ - sqlite3_log(SQLITE_OK, - "cannot commit UNLOCKED transaction (conflict at page %d)", - (int)pPg->pgno - ); - rc = SQLITE_BUSY_SNAPSHOT; - } - } - - if( rc==SQLITE_OK ){ - /* Read the newest schema cookie from the wal file. */ - u32 iSlot = 0; - rc = walFindFrame(pWal, 1, iLast, &iSlot); - if( rc==SQLITE_OK && iSlot>pWal->hdr.mxFrame ){ - u8 aNew[4]; - u8 *aOld = &((u8*)pPage1->pData)[40]; - int sz; - i64 iOffset; - sz = pWal->hdr.szPage; - sz = (sz&0xfe00) + ((sz&0x0001)<<16); - iOffset = walFrameOffset(iSlot, sz) + WAL_FRAME_HDRSIZE + 40; - rc = sqlite3OsRead(pWal->pWalFd, aNew, sizeof(aNew), iOffset); - if( rc==SQLITE_OK && memcmp(aOld, aNew, sizeof(aNew)) ){ - /* TODO: New error code? SQLITE_BUSY_SCHEMA. */ + if( rc==SQLITE_OK ){ + volatile WalIndexHdr *pHead; /* Head of the wal file */ + pHead = walIndexHdr(pWal); + if( memcmp(&pWal->hdr, (void*)pHead, sizeof(WalIndexHdr))!=0 ){ + int bSeenPage1 = 0; /* True if page 1 is in list pList */ + + /* TODO: Is this safe? Because it holds the WRITER lock this thread + ** has exclusive access to the live header, but might it be corrupt? */ + PgHdr *pPg; + u32 iLast = pHead->mxFrame; + for(pPg=pList; rc==SQLITE_OK && pPg; pPg=pPg->pDirty){ + u32 iSlot = 0; + rc = walFindFrame(pWal, pPg->pgno, iLast, &iSlot); + if( iSlot>pWal->hdr.mxFrame ){ + sqlite3_log(SQLITE_OK, + "cannot commit UNLOCKED transaction (conflict at page %d)", + (int)pPg->pgno + ); rc = SQLITE_BUSY_SNAPSHOT; } + if( pPg->pgno==1 ) bSeenPage1 = 1; + } + + /* If the current transaction does not modify page 1 of the database, + ** check if page 1 has been modified since the transaction was started. + ** If it has, check if the schema cookie value (the 4 bytes beginning at + ** byte offset 40) is the same as it is on pPage1. If not, this indicates + ** that the current head of the wal file uses a different schema than + ** the snapshot against which the current transaction was prepared. Return + ** SQLITE_BUSY_SNAPSHOT in this case. */ + if( rc==SQLITE_OK && bSeenPage1==0 ){ + u32 iSlot = 0; + rc = walFindFrame(pWal, 1, iLast, &iSlot); + if( rc==SQLITE_OK && iSlot>pWal->hdr.mxFrame ){ + u8 aNew[4]; + u8 *aOld = &((u8*)pPage1->pData)[40]; + int sz; + i64 iOffset; + sz = pWal->hdr.szPage; + sz = (sz&0xfe00) + ((sz&0x0001)<<16); + iOffset = walFrameOffset(iSlot, sz) + WAL_FRAME_HDRSIZE + 40; + rc = sqlite3OsRead(pWal->pWalFd, aNew, sizeof(aNew), iOffset); + if( rc==SQLITE_OK && memcmp(aOld, aNew, sizeof(aNew)) ){ + /* TODO: New error code? SQLITE_BUSY_SCHEMA. */ + rc = SQLITE_BUSY_SNAPSHOT; + } + } } } } @@ -2636,9 +2641,18 @@ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pList, PgHdr *pPage1){ } /* -** The caller holds the WRITER lock. This function returns true if a snapshot -** upgrade is required before the transaction can be committed, or false -** otherwise. +** This function is only ever called while committing an UNLOCKED +** transaction, after the caller has already obtained the WRITER lock +** (by calling the sqlite3WalLockForCommit() routine). This function +** returns true if the transaction was prepared against a database +** snapshot older than the current head of the wal file. +** +** Note that this will only work as described if the database is +** currently executing an UNLOCKED transaction, as it assumes that +** pWal->hdr has not been modified since the beginning of the +** transaction. This may not be true for a non-UNLOCKED transaction, +** as pWal->hdr is updated if any pages are spilled to the wal file +** while the transaction is executing. */ int sqlite3WalCommitRequiresUpgrade(Wal *pWal){ assert( pWal->writeLock ); @@ -2711,7 +2725,6 @@ int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx){ ** point in the event of a savepoint rollback (via WalSavepointUndo()). */ void sqlite3WalSavepoint(Wal *pWal, u32 *aWalData){ - /* assert( pWal->writeLock ); */ aWalData[0] = pWal->hdr.mxFrame; aWalData[1] = pWal->hdr.aFrameCksum[0]; aWalData[2] = pWal->hdr.aFrameCksum[1]; diff --git a/test/unlocked.test b/test/unlocked.test index e5f7868a20..c7ae0466e5 100644 --- a/test/unlocked.test +++ b/test/unlocked.test @@ -279,7 +279,6 @@ do_multiclient_test tn { # 3. Attempt to commit the UNLOCKED write. This is an SQLITE_BUSY_SNAPSHOT, # even though there is no page collision. # - do_test 2.$tn.5.1 { sql1 { BEGIN UNLOCKED; @@ -300,6 +299,71 @@ do_multiclient_test tn { } {ok} catch { sql1 ROLLBACK } + #----------------------------------------------------------------------- + # The "schema cookie" issue. + # + # 1. Begin an UNLOCKED write to "t1" using [db] + # + # 2. Lots of inserts into t2. Enough to grow the db file. + # + # 3. Check that the UNLOCKED transaction can still be committed. + # + do_test 2.$tn.6.1 { + sql1 { + BEGIN UNLOCKED; + INSERT INTO t1 VALUES(6, 'six'); + } + } {} + + do_test 2.$tn.6.2 { + sql2 { + WITH src(a,b) AS ( + VALUES(1,1) UNION ALL SELECT a+1,b+1 FROM src WHERE a<10000 + ) INSERT INTO t2 SELECT * FROM src; + } + } {} + + do_test 2.$tn.6.3 { + sql1 { + SELECT count(*) FROM t2; + COMMIT; + SELECT count(*) FROM t2; + } + } {1 10001} + + #----------------------------------------------------------------------- + # + # 1. Begin an big UNLOCKED write to "t1" using [db] - large enough to + # grow the db file. + # + # 2. Lots of inserts into t2. Also enough to grow the db file. + # + # 3. Check that the UNLOCKED transaction cannot be committed (due to a clash + # on page 1 - the db size field). + # + do_test 2.$tn.7.1 { + sql1 { + BEGIN UNLOCKED; + WITH src(a,b) AS ( + VALUES(10000,10000) UNION ALL SELECT a+1,b+1 FROM src WHERE a<20000 + ) INSERT INTO t1 SELECT * FROM src; + } + } {} + + do_test 2.$tn.7.2 { + sql2 { + WITH src(a,b) AS ( + VALUES(1,1) UNION ALL SELECT a+1,b+1 FROM src WHERE a<10000 + ) INSERT INTO t2 SELECT * FROM src; + } + } {} + + do_test 2.$tn.7.3 { + list [catch { sql1 { COMMIT } } msg] $msg [sqlite3_errcode db] + } {1 {database is locked} SQLITE_BUSY_SNAPSHOT} + sql1 ROLLBACK + + } From 773d2d6c097980a4b4c9c0a12b0e0c57f893b330 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 29 Jul 2015 12:14:28 +0000 Subject: [PATCH 003/113] Only allow UNLOCKED transactions to commit if none of the pages read by the transaction have been modified since it was opened. FossilOrigin-Name: 0b9718426e44df092850c5d095ce1b84a1e567cf --- manifest | 26 ++++++++-------- manifest.uuid | 2 +- src/btree.c | 12 -------- src/btree.h | 2 -- src/pager.c | 50 +++++++++++++++++++++---------- src/pager.h | 2 +- src/vdbeaux.c | 4 ++- src/wal.c | 75 +++++++++++++++++----------------------------- src/wal.h | 3 +- test/unlocked.test | 16 ++++++---- 10 files changed, 90 insertions(+), 102 deletions(-) diff --git a/manifest b/manifest index c4c044ae5c..2f36ddd5b8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\ssome\stest\scases\sand\sfix\ssome\ssmall\sproblems\swith\sBEGIN\sUNLOCKED\stransactions. -D 2015-07-28T16:46:49.291 +C Only\sallow\sUNLOCKED\stransactions\sto\scommit\sif\snone\sof\sthe\spages\sread\sby\sthe\stransaction\shave\sbeen\smodified\ssince\sit\swas\sopened. +D 2015-07-29T12:14:28.276 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 4de3ef40c8b3b75c0c55ff4242a43c8ce1ad90ee F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -270,8 +270,8 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 4d9134dc988a87838c06056c89c0e8c4700a0452 F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c b184ce6d483dfadc53126a4b7994633ec0d5ef5f -F src/btree.h 550e8447684013a69196ec664142f67538da8ef1 +F src/btree.c 5087b0a1358abd1449165dd14d49962bc3ad9f44 +F src/btree.h 40bd41ef0b71d6f7502725dc159fa0d6bebd8bb3 F src/btreeInt.h 2ad754dd4528baa8d0946a593cc373b890bf859e F src/build.c 28c15c43eefc0066ff64040526ff649c32fe5523 F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0 @@ -315,8 +315,8 @@ F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa F src/os_unix.c 388c023582b17890f10c980b30ec1922b471753b F src/os_win.c 40b3af7a47eb1107d0d69e592bec345a3b7b798a F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca -F src/pager.c c9f22eb831851220c1095863c5797a88f71bea8a -F src/pager.h b6cf6e9552c5b1e7d6d0d8cd7ca51be7802bec72 +F src/pager.c 18aa67541bd2c7d7963f180669ea4e48cd5246f4 +F src/pager.h 41938212a5d80a7068883bb29ea6ac0d4ef3a6d8 F src/parse.y 199145cd982587d70fa3db2f9b11f7ab118f0acd F src/pcache.c cde06aa50962595e412d497e22fd2e07878ba1f0 F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9 @@ -395,15 +395,15 @@ F src/vdbe.c fd6832408d9621ad347a65b01a05380fe766232f F src/vdbe.h 7a75045d879118b9d3af7e8b3c108f2f27c51473 F src/vdbeInt.h 8b54e01ad0463590e7cffabce0bc36da9ee4f816 F src/vdbeapi.c adabbd66eb2e3a10f3998485ee0be7e326d06ee4 -F src/vdbeaux.c 27feae106f3f4db298e65d37a9da4962aaff724b +F src/vdbeaux.c 24a03ccbadc8d4cfecf25b6399db95851b10dd21 F src/vdbeblob.c 4f2e8e075d238392df98c5e03a64342465b03f90 F src/vdbemem.c ae38a0d35ae71cf604381a887c170466ba518090 F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 F src/vtab.c 082b35a25a26e3d36f365ca8cd73c1922532f05e F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb -F src/wal.c a2e35f042103519ce22050acaf167960446963c7 -F src/wal.h 5188cd85398dc612ae5ed2ed02d193377218be56 +F src/wal.c 4497b466fee8ed56c31672bb35741dd0321ec999 +F src/wal.h cd7ea52439d56571d549b7d4eacdeed58d841385 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804 F src/where.c 909eba3b6db984eb2adfbca9de2c237ee7056adb F src/whereInt.h 5f87e3c4b0551747d119730dfebddd3c54f04047 @@ -1215,7 +1215,7 @@ F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 41e7f83c6827605991160a31380148a9fc5f1339 F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825 -F test/unlocked.test 854f3f428bb2e0ae91cb2400596a8f1ab7eaa409 +F test/unlocked.test 2da6645c3532985715d17dfcb240ef5f09c2e9d4 F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 F test/uri.test 23662b7b61958b0f0e47082de7d06341ccf85d5b @@ -1367,7 +1367,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 8079421604dbd40d03471dad6d12115119b554c2 -R 52e6230fe0fe2d8cb4434e54d864e964 +P 6da0e962ad2aa5e52c1f1b5c3dbf77a2cb16ac2d +R 74dcd93afc2d7e4cc222b666276012ce U dan -Z 849da1cda4069d7075ecc7190a9058c5 +Z 3bd2cb4e2cf9d30cb919b0a0d11717fa diff --git a/manifest.uuid b/manifest.uuid index 23abb2a199..f6215ad409 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6da0e962ad2aa5e52c1f1b5c3dbf77a2cb16ac2d \ No newline at end of file +0b9718426e44df092850c5d095ce1b84a1e567cf \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index c83a01ad4c..69d4873d0d 100644 --- a/src/btree.c +++ b/src/btree.c @@ -9590,15 +9590,3 @@ int sqlite3BtreeIsReadonly(Btree *p){ ** Return the size of the header added to each page by this module. */ int sqlite3HeaderSizeBtree(void){ return ROUND8(sizeof(MemPage)); } - -int sqlite3BtreeExclusiveLock(Btree *p){ - int rc; - BtShared *pBt = p->pBt; - sqlite3BtreeEnter(p); - rc = sqlite3PagerExclusiveLock(pBt->pPager, pBt->pPage1->pDbPage); - sqlite3BtreeLeave(p); - return rc; -} - - - diff --git a/src/btree.h b/src/btree.h index ae9b2c4e59..50dc8ca290 100644 --- a/src/btree.h +++ b/src/btree.h @@ -270,6 +270,4 @@ void sqlite3BtreeCursorList(Btree*); # define sqlite3SchemaMutexHeld(X,Y,Z) 1 #endif -int sqlite3BtreeExclusiveLock(Btree*); - #endif /* _BTREE_H_ */ diff --git a/src/pager.c b/src/pager.c index 2ea3b90a96..5107edda36 100644 --- a/src/pager.c +++ b/src/pager.c @@ -657,6 +657,7 @@ struct Pager { u32 cksumInit; /* Quasi-random value added to every checksum */ u32 nSubRec; /* Number of records written to sub-journal */ Bitvec *pInJournal; /* One bit for each page in the database file */ + Bitvec *pAllRead; /* Pages read within current UNLOCKED trans. */ sqlite3_file *fd; /* File descriptor for database */ sqlite3_file *jfd; /* File descriptor for main journal */ sqlite3_file *sjfd; /* File descriptor for sub-journal */ @@ -1738,6 +1739,16 @@ static int addToSavepointBitvecs(Pager *pPager, Pgno pgno){ return rc; } +/* +** Free the Pager.pInJournal and Pager.pAllRead bitvec objects. +*/ +static void pagerFreeBitvecs(Pager *pPager){ + sqlite3BitvecDestroy(pPager->pInJournal); + sqlite3BitvecDestroy(pPager->pAllRead); + pPager->pInJournal = 0; + pPager->pAllRead = 0; +} + /* ** This function is a no-op if the pager is in exclusive mode and not ** in the ERROR state. Otherwise, it switches the pager to PAGER_OPEN @@ -1762,8 +1773,7 @@ static void pager_unlock(Pager *pPager){ || pPager->eState==PAGER_ERROR ); - sqlite3BitvecDestroy(pPager->pInJournal); - pPager->pInJournal = 0; + pagerFreeBitvecs(pPager); releaseAllSavepoints(pPager); if( pagerUseWal(pPager) ){ @@ -1999,8 +2009,7 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ } #endif - sqlite3BitvecDestroy(pPager->pInJournal); - pPager->pInJournal = 0; + pagerFreeBitvecs(pPager); pPager->nRec = 0; sqlite3PcacheCleanAll(pPager->pPCache); sqlite3PcacheTruncate(pPager->pPCache, pPager->dbSize); @@ -4082,7 +4091,7 @@ static int syncJournal(Pager *pPager, int newHdr){ assert( assert_pager_state(pPager) ); assert( !pagerUseWal(pPager) ); - rc = sqlite3PagerExclusiveLock(pPager, 0); + rc = sqlite3PagerExclusiveLock(pPager); if( rc!=SQLITE_OK ) return rc; if( !pPager->noSync ){ @@ -4432,7 +4441,7 @@ static int pagerStress(void *p, PgHdr *pPg){ if( pagerUseWal(pPager) ){ /* If the transaction is a "BEGIN UNLOCKED" transaction, the page ** cannot be flushed to disk. Return early in this case. */ - if( sqlite3WalIsInTrans(pPager->pWal)==0 ) return SQLITE_OK; + if( pPager->pAllRead ) return SQLITE_OK; /* Write a single frame for this page to the log. */ rc = subjournalPageIfRequired(pPg); @@ -5274,6 +5283,14 @@ int sqlite3PagerAcquire( } pPager->hasBeenUsed = 1; + /* If this is an UNLOCKED transaction and the page being read was + ** present in the database file when the transaction was opened, + ** mark it as read in the pAllRead vector. */ + if( pPager->pAllRead && pgno<=pPager->dbOrigSize ){ + rc = sqlite3BitvecSet(pPager->pAllRead, pgno); + if( rc!=SQLITE_OK ) goto pager_acquire_err; + } + /* If the pager is in the error state, return an error immediately. ** Otherwise, request the page from the PCache layer. */ if( pPager->errCode!=SQLITE_OK ){ @@ -5578,6 +5595,7 @@ int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){ if( ALWAYS(pPager->eState==PAGER_READER) ){ assert( pPager->pInJournal==0 ); + assert( pPager->pAllRead==0 ); if( pagerUseWal(pPager) ){ /* If the pager is configured to use locking_mode=exclusive, and an @@ -5598,6 +5616,13 @@ int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){ */ if( exFlag>=0 ){ rc = sqlite3WalBeginWriteTransaction(pPager->pWal); + }else{ + pPager->pAllRead = sqlite3BitvecCreate(pPager->dbSize); + if( pPager->pAllRead==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3BitvecSet(pPager->pAllRead, 1); + } } }else{ /* Obtain a RESERVED lock on the database file. If the exFlag parameter @@ -6066,7 +6091,7 @@ int sqlite3PagerSync(Pager *pPager, const char *zMaster){ ** Otherwise, either SQLITE_BUSY or an SQLITE_IOERR_XXX error code is ** returned. */ -int sqlite3PagerExclusiveLock(Pager *pPager, PgHdr *pPage1){ +int sqlite3PagerExclusiveLock(Pager *pPager){ int rc = SQLITE_OK; assert( pPager->eState==PAGER_WRITER_CACHEMOD || pPager->eState==PAGER_WRITER_DBMOD @@ -6076,21 +6101,14 @@ int sqlite3PagerExclusiveLock(Pager *pPager, PgHdr *pPage1){ if( 0==pagerUseWal(pPager) ){ rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); }else{ - Wal *pWal = pPager->pWal; - if( 0==sqlite3WalIsInTrans(pWal) ){ - /* TODO: There must be an optimization opportunity here, as this call - ** to PcacheDirtyList() sorts the list of dirty pages, even though it - ** is not really required - and will be sorted again in CommitPhaseOne() - ** in any case. */ - PgHdr *pList = sqlite3PcacheDirtyList(pPager->pPCache); - + if( pPager->pAllRead ){ /* This is an UNLOCKED transaction. Attempt to lock the wal database ** here. If SQLITE_BUSY (but not SQLITE_BUSY_SNAPSHOT) is returned, ** invoke the busy-handler and try again for as long as it returns ** non-zero. */ do { /* rc = sqlite3WalBeginWriteTransaction(pWal); */ - rc = sqlite3WalLockForCommit(pWal, pList, pPage1); + rc = sqlite3WalLockForCommit(pPager->pWal, pPager->pAllRead); }while( rc==SQLITE_BUSY && pPager->xBusyHandler(pPager->pBusyHandlerArg) ); diff --git a/src/pager.h b/src/pager.h index 57d2812701..3c0b9a1a71 100644 --- a/src/pager.h +++ b/src/pager.h @@ -150,7 +150,7 @@ void *sqlite3PagerGetExtra(DbPage *); void sqlite3PagerPagecount(Pager*, int*); int sqlite3PagerBegin(Pager*, int exFlag, int); int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, int); -int sqlite3PagerExclusiveLock(Pager*, DbPage *pPage1); +int sqlite3PagerExclusiveLock(Pager*); int sqlite3PagerSync(Pager *pPager, const char *zMaster); int sqlite3PagerCommitPhaseTwo(Pager*); int sqlite3PagerRollback(Pager*); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index f5f9d0fbdd..93a7187ab9 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2020,7 +2020,9 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ if( sqlite3BtreeIsInTrans(pBt) ){ needXcommit = 1; if( i!=1 ) nTrans++; - rc = sqlite3BtreeExclusiveLock(pBt); + sqlite3BtreeEnter(pBt); + rc = sqlite3PagerExclusiveLock(sqlite3BtreePager(pBt)); + sqlite3BtreeLeave(pBt); } } diff --git a/src/wal.c b/src/wal.c index be018ebc99..5fbdae6a1a 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2573,7 +2573,7 @@ int sqlite3WalBeginWriteTransaction(Wal *pWal){ ** transaction. It may be assumed that no frames have been written to ** the wal file. */ -int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pList, PgHdr *pPage1){ +int sqlite3WalLockForCommit(Wal *pWal, Bitvec *pAllRead){ int rc = walWriteLock(pWal); /* If the database has been modified since this transaction was started, @@ -2590,49 +2590,35 @@ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pList, PgHdr *pPage1){ volatile WalIndexHdr *pHead; /* Head of the wal file */ pHead = walIndexHdr(pWal); if( memcmp(&pWal->hdr, (void*)pHead, sizeof(WalIndexHdr))!=0 ){ - int bSeenPage1 = 0; /* True if page 1 is in list pList */ - /* TODO: Is this safe? Because it holds the WRITER lock this thread - ** has exclusive access to the live header, but might it be corrupt? */ - PgHdr *pPg; - u32 iLast = pHead->mxFrame; - for(pPg=pList; rc==SQLITE_OK && pPg; pPg=pPg->pDirty){ - u32 iSlot = 0; - rc = walFindFrame(pWal, pPg->pgno, iLast, &iSlot); - if( iSlot>pWal->hdr.mxFrame ){ - sqlite3_log(SQLITE_OK, - "cannot commit UNLOCKED transaction (conflict at page %d)", - (int)pPg->pgno - ); - rc = SQLITE_BUSY_SNAPSHOT; - } - if( pPg->pgno==1 ) bSeenPage1 = 1; - } - - /* If the current transaction does not modify page 1 of the database, - ** check if page 1 has been modified since the transaction was started. - ** If it has, check if the schema cookie value (the 4 bytes beginning at - ** byte offset 40) is the same as it is on pPage1. If not, this indicates - ** that the current head of the wal file uses a different schema than - ** the snapshot against which the current transaction was prepared. Return - ** SQLITE_BUSY_SNAPSHOT in this case. */ - if( rc==SQLITE_OK && bSeenPage1==0 ){ - u32 iSlot = 0; - rc = walFindFrame(pWal, 1, iLast, &iSlot); - if( rc==SQLITE_OK && iSlot>pWal->hdr.mxFrame ){ - u8 aNew[4]; - u8 *aOld = &((u8*)pPage1->pData)[40]; - int sz; - i64 iOffset; - sz = pWal->hdr.szPage; - sz = (sz&0xfe00) + ((sz&0x0001)<<16); - iOffset = walFrameOffset(iSlot, sz) + WAL_FRAME_HDRSIZE + 40; - rc = sqlite3OsRead(pWal->pWalFd, aNew, sizeof(aNew), iOffset); - if( rc==SQLITE_OK && memcmp(aOld, aNew, sizeof(aNew)) ){ - /* TODO: New error code? SQLITE_BUSY_SCHEMA. */ - rc = SQLITE_BUSY_SNAPSHOT; + ** has exclusive access to the live header, but might it be corrupt? + ** This code should check that the wal-index-header is Ok, and return + ** SQLITE_BUSY_SNAPSHOT if it is not. */ + int iHash; + int iLastHash = walFramePage(pHead->mxFrame); + for(iHash=walFramePage(pWal->hdr.mxFrame+1); iHash<=iLastHash; iHash++){ + volatile ht_slot *aHash; + volatile u32 *aPgno; + u32 iZero; + + rc = walHashGet(pWal, iHash, &aHash, &aPgno, &iZero); + if( rc==SQLITE_OK ){ + int i; + int iMin = (pWal->hdr.mxFrame+1 - iZero); + int iMax = (iHash==0) ? HASHTABLE_NPAGE_ONE : HASHTABLE_NPAGE; + if( iMin<1 ) iMin = 1; + if( iMax>pHead->mxFrame ) iMax = pHead->mxFrame; + for(i=iMin; i<=iMax; i++){ + if( sqlite3BitvecTestNotNull(pAllRead, aPgno[i]) ){ + sqlite3_log(SQLITE_OK, + "cannot commit UNLOCKED transaction (conflict at page %d)", + (int)aPgno[i] + ); + rc = SQLITE_BUSY_SNAPSHOT; + } } } + if( rc!=SQLITE_OK ) break; } } } @@ -3293,13 +3279,6 @@ int sqlite3WalHeapMemory(Wal *pWal){ return (pWal && pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ); } -/* -** Return true if in a write transaction, false otherwise. -*/ -int sqlite3WalIsInTrans(Wal *pWal){ - return (int)pWal->writeLock; -} - #ifdef SQLITE_ENABLE_ZIPVFS /* ** If the argument is not NULL, it points to a Wal object that holds a diff --git a/src/wal.h b/src/wal.h index db341caa04..fe85a52cc0 100644 --- a/src/wal.h +++ b/src/wal.h @@ -127,8 +127,7 @@ int sqlite3WalExclusiveMode(Wal *pWal, int op); int sqlite3WalHeapMemory(Wal *pWal); /* Return true if the WRITER lock is held. False otherwise. */ -int sqlite3WalIsInTrans(Wal *pWal); -int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pDirtyList, PgHdr *pPage1); +int sqlite3WalLockForCommit(Wal *pWal, Bitvec *pRead); int sqlite3WalCommitRequiresUpgrade(Wal *pWal); #ifdef SQLITE_ENABLE_ZIPVFS diff --git a/test/unlocked.test b/test/unlocked.test index c7ae0466e5..2a5862d3ac 100644 --- a/test/unlocked.test +++ b/test/unlocked.test @@ -300,13 +300,12 @@ do_multiclient_test tn { catch { sql1 ROLLBACK } #----------------------------------------------------------------------- - # The "schema cookie" issue. # # 1. Begin an UNLOCKED write to "t1" using [db] # - # 2. Lots of inserts into t2. Enough to grow the db file. + # 2. Lots of inserts into t2. Enough to grow the db file and modify page 1. # - # 3. Check that the UNLOCKED transaction can still be committed. + # 3. Check that the UNLOCKED transaction can not be committed. # do_test 2.$tn.6.1 { sql1 { @@ -324,12 +323,17 @@ do_multiclient_test tn { } {} do_test 2.$tn.6.3 { + sql1 { SELECT count(*) FROM t2 } + list [catch { sql1 { COMMIT } } msg] $msg [sqlite3_errcode db] + } {1 {database is locked} SQLITE_BUSY_SNAPSHOT} + sql1 ROLLBACK + + do_test 2.$tn.6.4 { sql1 { - SELECT count(*) FROM t2; - COMMIT; + SELECT count(*) FROM t1; SELECT count(*) FROM t2; } - } {1 10001} + } {5 10001} #----------------------------------------------------------------------- # From 1a9cde3ba9f2a9125886d26141686a4bca7f11de Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 15 Aug 2015 18:16:46 +0000 Subject: [PATCH 004/113] Handle writes to auto-vacuum databases within UNLOCKED transactions in the same way as for non-UNLOCKED transactions. FossilOrigin-Name: de1ea450db33b140b11af5b801ea6a15875e774e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- test/unlocked.test | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 2f36ddd5b8..7ca1c00b94 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Only\sallow\sUNLOCKED\stransactions\sto\scommit\sif\snone\sof\sthe\spages\sread\sby\sthe\stransaction\shave\sbeen\smodified\ssince\sit\swas\sopened. -D 2015-07-29T12:14:28.276 +C Handle\swrites\sto\sauto-vacuum\sdatabases\swithin\sUNLOCKED\stransactions\sin\sthe\ssame\sway\sas\sfor\snon-UNLOCKED\stransactions. +D 2015-08-15T18:16:46.463 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 4de3ef40c8b3b75c0c55ff4242a43c8ce1ad90ee F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -270,7 +270,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 4d9134dc988a87838c06056c89c0e8c4700a0452 F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c 5087b0a1358abd1449165dd14d49962bc3ad9f44 +F src/btree.c c1bbc83539de1e749aa36ce9c283f95b50543bcb F src/btree.h 40bd41ef0b71d6f7502725dc159fa0d6bebd8bb3 F src/btreeInt.h 2ad754dd4528baa8d0946a593cc373b890bf859e F src/build.c 28c15c43eefc0066ff64040526ff649c32fe5523 @@ -1215,7 +1215,7 @@ F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 41e7f83c6827605991160a31380148a9fc5f1339 F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825 -F test/unlocked.test 2da6645c3532985715d17dfcb240ef5f09c2e9d4 +F test/unlocked.test 644a84d7f032ca029d490f0b0bc8fb9f86c7a1a5 F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 F test/uri.test 23662b7b61958b0f0e47082de7d06341ccf85d5b @@ -1367,7 +1367,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 6da0e962ad2aa5e52c1f1b5c3dbf77a2cb16ac2d -R 74dcd93afc2d7e4cc222b666276012ce +P 0b9718426e44df092850c5d095ce1b84a1e567cf +R ac1d3857424ab06ed70d671704c3737d U dan -Z 3bd2cb4e2cf9d30cb919b0a0d11717fa +Z 12da9addf6141c212c3c7cdffe33d767 diff --git a/manifest.uuid b/manifest.uuid index f6215ad409..6a4d41072d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0b9718426e44df092850c5d095ce1b84a1e567cf \ No newline at end of file +de1ea450db33b140b11af5b801ea6a15875e774e \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 69d4873d0d..7f9054f309 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3142,8 +3142,8 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ if( (pBt->btsFlags & BTS_READ_ONLY)!=0 ){ rc = SQLITE_READONLY; }else{ + int exFlag = (p->db->bUnlocked && !ISAUTOVACUUM) ? -1 : (wrflag>1); int bSubjInMem = sqlite3TempInMemory(p->db); - int exFlag = p->db->bUnlocked ? -1 : (wrflag>1); assert( p->db->bUnlocked==0 || wrflag==1 ); rc = sqlite3PagerBegin(pBt->pPager, exFlag, bSubjInMem); if( rc==SQLITE_OK ){ diff --git a/test/unlocked.test b/test/unlocked.test index 2a5862d3ac..23eb5a5064 100644 --- a/test/unlocked.test +++ b/test/unlocked.test @@ -115,6 +115,41 @@ foreach {tn sql} { do_execsql_test 1.7.$tn.2 ROLLBACK } +#------------------------------------------------------------------------- +# If an auto-vacuum database is written within an UNLOCKED transaction, it +# is handled in the same way as for a non-UNLOCKED transaction. +# +reset_db +do_execsql_test 1.8.1 { + PRAGMA auto_vacuum = 1; + PRAGMA journal_mode = wal; + CREATE TABLE t1(x, y); + INSERT INTO t1 VALUES('x', 'y'); +} {wal} + +do_execsql_test 1.8.2 { + BEGIN UNLOCKED; + SELECT * FROM t1; + COMMIT; +} {x y} + +do_catchsql_test 1.8.3 { + BEGIN UNLOCKED; + INSERT INTO t1 VALUES('a', 'b'); +} {0 {}} + +do_test 1.8.4 { + sqlite3 db2 test.db + catchsql { + BEGIN UNLOCKED; + INSERT INTO t1 VALUES('c', 'd'); + } db2 +} {1 {database is locked}} + +do_test 1.8.5 { + db eval COMMIT + db2 eval COMMIT +} {} do_multiclient_test tn { From 7b3d71e9cc82ae2b7aad42234875b53b935b21af Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 19 Aug 2015 20:27:05 +0000 Subject: [PATCH 005/113] When committing an unlocked transaction, relocate newly allocated database pages within the file to avoid conflicting with committed transactions. There are lots of things still to fix in this code. FossilOrigin-Name: 3bbc31d515ba9fc920c5cbc7059d3eb1ba9c7f8e --- manifest | 29 ++-- manifest.uuid | 2 +- src/btree.c | 410 ++++++++++++++++++++++++++++++++++++++------ src/btree.h | 2 + src/btreeInt.h | 10 ++ src/pager.c | 37 ++-- src/pager.h | 10 +- src/vdbeaux.c | 4 +- src/wal.c | 59 ++++--- src/wal.h | 3 +- test/unlocked.test | 5 +- test/unlocked2.test | 101 +++++++++++ 12 files changed, 558 insertions(+), 114 deletions(-) create mode 100644 test/unlocked2.test diff --git a/manifest b/manifest index 7ca1c00b94..92f5317a3d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Handle\swrites\sto\sauto-vacuum\sdatabases\swithin\sUNLOCKED\stransactions\sin\sthe\ssame\sway\sas\sfor\snon-UNLOCKED\stransactions. -D 2015-08-15T18:16:46.463 +C When\scommitting\san\sunlocked\stransaction,\srelocate\snewly\sallocated\sdatabase\spages\swithin\sthe\sfile\sto\savoid\sconflicting\swith\scommitted\stransactions.\sThere\sare\slots\sof\sthings\sstill\sto\sfix\sin\sthis\scode. +D 2015-08-19T20:27:05.840 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 4de3ef40c8b3b75c0c55ff4242a43c8ce1ad90ee F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -270,9 +270,9 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 4d9134dc988a87838c06056c89c0e8c4700a0452 F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c c1bbc83539de1e749aa36ce9c283f95b50543bcb -F src/btree.h 40bd41ef0b71d6f7502725dc159fa0d6bebd8bb3 -F src/btreeInt.h 2ad754dd4528baa8d0946a593cc373b890bf859e +F src/btree.c a00a7c4809d642bf6c63979e73face9fed53dc66 +F src/btree.h 00d4cdb747c4172a5566faf037116985dbbc377e +F src/btreeInt.h 9f77bac260d81cc74ecd96cccf73a8c5af1688c4 F src/build.c 28c15c43eefc0066ff64040526ff649c32fe5523 F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0 F src/complete.c addcd8160b081131005d5bc2d34adf20c1c5c92f @@ -315,8 +315,8 @@ F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa F src/os_unix.c 388c023582b17890f10c980b30ec1922b471753b F src/os_win.c 40b3af7a47eb1107d0d69e592bec345a3b7b798a F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca -F src/pager.c 18aa67541bd2c7d7963f180669ea4e48cd5246f4 -F src/pager.h 41938212a5d80a7068883bb29ea6ac0d4ef3a6d8 +F src/pager.c fe82e368600278cfd35024c20b888e945236f675 +F src/pager.h 3fc23bca2e7d606ca4fbdd923713cdcdcec48297 F src/parse.y 199145cd982587d70fa3db2f9b11f7ab118f0acd F src/pcache.c cde06aa50962595e412d497e22fd2e07878ba1f0 F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9 @@ -395,15 +395,15 @@ F src/vdbe.c fd6832408d9621ad347a65b01a05380fe766232f F src/vdbe.h 7a75045d879118b9d3af7e8b3c108f2f27c51473 F src/vdbeInt.h 8b54e01ad0463590e7cffabce0bc36da9ee4f816 F src/vdbeapi.c adabbd66eb2e3a10f3998485ee0be7e326d06ee4 -F src/vdbeaux.c 24a03ccbadc8d4cfecf25b6399db95851b10dd21 +F src/vdbeaux.c 27feae106f3f4db298e65d37a9da4962aaff724b F src/vdbeblob.c 4f2e8e075d238392df98c5e03a64342465b03f90 F src/vdbemem.c ae38a0d35ae71cf604381a887c170466ba518090 F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 F src/vtab.c 082b35a25a26e3d36f365ca8cd73c1922532f05e F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb -F src/wal.c 4497b466fee8ed56c31672bb35741dd0321ec999 -F src/wal.h cd7ea52439d56571d549b7d4eacdeed58d841385 +F src/wal.c 8bb1130dc1876e1c1c3fa082a5b0ec6437feb8e8 +F src/wal.h 5aaed8ca6cad1406088042ff8767951a6a3c7b56 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804 F src/where.c 909eba3b6db984eb2adfbca9de2c237ee7056adb F src/whereInt.h 5f87e3c4b0551747d119730dfebddd3c54f04047 @@ -1215,7 +1215,8 @@ F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 41e7f83c6827605991160a31380148a9fc5f1339 F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825 -F test/unlocked.test 644a84d7f032ca029d490f0b0bc8fb9f86c7a1a5 +F test/unlocked.test d143a871bd874311d4e5c98ce458218ca6b579fd +F test/unlocked2.test fc4c730a44c3650250467ecacca6ddb969f64405 F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 F test/uri.test 23662b7b61958b0f0e47082de7d06341ccf85d5b @@ -1367,7 +1368,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0b9718426e44df092850c5d095ce1b84a1e567cf -R ac1d3857424ab06ed70d671704c3737d +P de1ea450db33b140b11af5b801ea6a15875e774e +R db05422c8fb37e882a7e6cc4bd7c8ffb U dan -Z 12da9addf6141c212c3c7cdffe33d767 +Z cccfd407eb244cf1cd3b5cab72e65fda diff --git a/manifest.uuid b/manifest.uuid index 6a4d41072d..7d70f3c411 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -de1ea450db33b140b11af5b801ea6a15875e774e \ No newline at end of file +3bbc31d515ba9fc920c5cbc7059d3eb1ba9c7f8e \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 7f9054f309..cc97fd8623 100644 --- a/src/btree.c +++ b/src/btree.c @@ -439,6 +439,152 @@ static void downgradeAllSharedCacheTableLocks(Btree *p){ #endif /* SQLITE_OMIT_SHARED_CACHE */ +/* +** The following structure stores the in-memory pointer map used for newly +** allocated pages in UNLOCKED transactions. Such pages are always allocated +** in a contiguous block (from the end of the file) starting with page +** BtreePtrmap.iFirst. +** +** The page number for the parent page iFirst is stored in aPtr[0]. For +** (iFirst+1), aPtr[1]. A zero value indicates that the page has not +** been allocated. +** +** +*/ + +typedef struct RollbackEntry RollbackEntry; +typedef struct PtrmapEntry PtrmapEntry; +struct PtrmapEntry { + Pgno parent; + u8 eType; +}; +struct RollbackEntry { + Pgno pgno; + Pgno parent; + u8 eType; +}; + +struct BtreePtrmap { + Pgno iFirst; /* First new page number aPtr[0] */ + + int nPtrAlloc; /* Allocated size of aPtr[] array */ + PtrmapEntry *aPtr; /* Array of parent page numbers */ + + int nSvpt; /* Used size of aSvpt[] array */ + int nSvptAlloc; /* Allocated size of aSvpt[] */ + int *aSvpt; /* First aRollback[] entry for savepoint i */ + + int nRollback; /* Used size of aRollback[] array */ + int nRollbackAlloc; /* Allocated size of aRollback[] array */ + RollbackEntry *aRollback; /* Array of rollback entries */ +}; + +static int btreePtrmapStore( + BtreePtrmap *pMap, + Pgno pgno, + u8 eType, + Pgno parent +){ + if( pgno>=pMap->iFirst ){ + int iEntry = pgno - pMap->iFirst; + + /* Grow the aPtr[] array if required */ + if( iEntry>=pMap->nPtrAlloc ){ + int nNew = pMap->nPtrAlloc ? pMap->nPtrAlloc*2 : 16; + PtrmapEntry *aNew = (PtrmapEntry*)sqlite3_realloc( + pMap->aPtr, nNew*sizeof(PtrmapEntry) + ); + if( aNew==0 ){ + return SQLITE_NOMEM; + }else{ + int nByte = (nNew-pMap->nPtrAlloc)*sizeof(PtrmapEntry); + memset(&aNew[pMap->nPtrAlloc], 0, nByte); + pMap->aPtr = aNew; + pMap->nPtrAlloc = nNew; + } + } + + /* Add an entry to the rollback log if required */ + if( pMap->nSvpt>0 && pMap->aPtr[iEntry].parent ){ + if( pMap->nRollback>=pMap->nRollbackAlloc ){ + int nNew = pMap->nRollback ? pMap->nRollback*2 : 16; + RollbackEntry *aNew = (RollbackEntry*)sqlite3_realloc( + pMap->aRollback, nNew*sizeof(RollbackEntry) + ); + if( aNew==0 ){ + return SQLITE_NOMEM; + }else{ + pMap->aRollback = aNew; + pMap->nRollbackAlloc = nNew; + } + } + + pMap->aRollback[pMap->nRollback].pgno = pgno; + pMap->aRollback[pMap->nRollback].parent = pMap->aPtr[iEntry].parent; + pMap->aRollback[pMap->nRollback].eType = pMap->aPtr[iEntry].eType; + } + + /* Update the aPtr[] array */ + pMap->aPtr[iEntry].parent = parent; + pMap->aPtr[iEntry].eType = eType; + } + + return SQLITE_OK; +} + +/* +** Open savepoint iSavepoint, if it is not already open. +*/ +static int btreePtrmapBegin(BtreePtrmap *pMap, int nSvpt){ + if( nSvptnSvpt ){ + int i; + if( nSvpt>=pMap->nSvptAlloc ){ + int nNew = pMap->nSvptAlloc ? pMap->nSvptAlloc*2 : 16; + int *aNew = sqlite3_realloc(pMap->aSvpt, sizeof(int) * nNew); + if( aNew==0 ){ + return SQLITE_NOMEM; + }else{ + pMap->aSvpt = aNew; + pMap->nSvptAlloc = nNew; + } + } + + for(i=pMap->nSvpt; iaSvpt[i] = pMap->nRollback; + } + pMap->nSvpt = nSvpt; + } + + return SQLITE_OK; +} + +/* +** Rollback (if op==SAVEPOINT_ROLLBACK) or release (if op==SAVEPOINT_RELEASE) +** savepoint iSvpt. +*/ +static void btreePtrmapEnd(BtreePtrmap *pMap, int op, int iSvpt){ + assert( op==SAVEPOINT_ROLLBACK || op==SAVEPOINT_RELEASE ); + assert( iSvpt>=0 || (iSvpt==-1 && op==SAVEPOINT_ROLLBACK) ); + if( iSvpt<0 ){ + pMap->nSvpt = 0; + pMap->nRollback = 0; + memset(pMap->aPtr, 0, sizeof(Pgno) * pMap->nPtrAlloc); + }else if( iSvptnSvpt ){ + if( op==SAVEPOINT_ROLLBACK ){ + int ii; + for(ii=pMap->nRollback-1; ii>=pMap->aSvpt[iSvpt]; ii--){ + RollbackEntry *p = &pMap->aRollback[ii]; + PtrmapEntry *pEntry = &pMap->aPtr[p->pgno - pMap->iFirst]; + pEntry->parent = p->parent; + pEntry->eType = p->eType; + } + } + pMap->nSvpt = iSvpt + (op==SAVEPOINT_ROLLBACK); + pMap->nRollback = pMap->aSvpt[iSvpt]; + } +} + + static void releasePage(MemPage *pPage); /* Forward reference */ /* @@ -878,42 +1024,44 @@ static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){ int offset; /* Offset in pointer map page */ int rc; /* Return code from subfunctions */ + assert( sqlite3_mutex_held(pBt->mutex) ); if( *pRC ) return; - assert( sqlite3_mutex_held(pBt->mutex) ); - /* The master-journal page number must never be used as a pointer map page */ - assert( 0==PTRMAP_ISPAGE(pBt, PENDING_BYTE_PAGE(pBt)) ); + if( pBt->pMap ){ + *pRC = btreePtrmapStore(pBt->pMap, key, eType, parent); + }else{ + /* The master-journal page number must never be used as a ptr map page */ + assert( 0==PTRMAP_ISPAGE(pBt, PENDING_BYTE_PAGE(pBt)) ); - assert( pBt->autoVacuum ); - if( key==0 ){ - *pRC = SQLITE_CORRUPT_BKPT; - return; - } - iPtrmap = PTRMAP_PAGENO(pBt, key); - rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage); - if( rc!=SQLITE_OK ){ - *pRC = rc; - return; - } - offset = PTRMAP_PTROFFSET(iPtrmap, key); - if( offset<0 ){ - *pRC = SQLITE_CORRUPT_BKPT; - goto ptrmap_exit; - } - assert( offset <= (int)pBt->usableSize-5 ); - pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage); + assert( pBt->autoVacuum ); + if( key==0 ){ + *pRC = SQLITE_CORRUPT_BKPT; + return; + } + iPtrmap = PTRMAP_PAGENO(pBt, key); + rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage); + if( rc!=SQLITE_OK ){ + *pRC = rc; + return; + } + offset = PTRMAP_PTROFFSET(iPtrmap, key); + if( offset<0 ){ + *pRC = SQLITE_CORRUPT_BKPT; + }else{ + assert( offset <= (int)pBt->usableSize-5 ); + pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage); - if( eType!=pPtrmap[offset] || get4byte(&pPtrmap[offset+1])!=parent ){ - TRACE(("PTRMAP_UPDATE: %d->(%d,%d)\n", key, eType, parent)); - *pRC= rc = sqlite3PagerWrite(pDbPage); - if( rc==SQLITE_OK ){ - pPtrmap[offset] = eType; - put4byte(&pPtrmap[offset+1], parent); + if( eType!=pPtrmap[offset] || get4byte(&pPtrmap[offset+1])!=parent ){ + TRACE(("PTRMAP_UPDATE: %d->(%d,%d)\n", key, eType, parent)); + *pRC= rc = sqlite3PagerWrite(pDbPage); + if( rc==SQLITE_OK ){ + pPtrmap[offset] = eType; + put4byte(&pPtrmap[offset+1], parent); + } + } } + sqlite3PagerUnref(pDbPage); } - -ptrmap_exit: - sqlite3PagerUnref(pDbPage); } /* @@ -1924,6 +2072,50 @@ u32 sqlite3BtreeLastPage(Btree *p){ return btreePagecount(p->pBt); } +#ifdef SQLITE_ENABLE_UNLOCKED +/* +** This function is called before allocating or freeing a b-tree page. If +** the current transaction is UNLOCKED, it allocates the BtreePtrmap +** structure and zeroes the nFree/iTrunk fields in the database header +** on page 1. +*/ +static int allocatePtrmap(BtShared *pBt){ + int rc = SQLITE_OK; + if( pBt->pMap==0 && sqlite3PagerIsUnlocked(pBt->pPager) ){ + /* If this is an unlocked transaction, set the header values + ** identifying the size of the free-list and the page number + ** of the first trunk page to zero. */ + BtreePtrmap *pMap = sqlite3_malloc(sizeof(BtreePtrmap)); + if( pMap==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(&pBt->pPage1->aData[32], 0, sizeof(u32)*2); + memset(pMap, 0, sizeof(BtreePtrmap)); + pMap->iFirst = btreePagecount(pBt) + 1; + pBt->pMap = pMap; + } + } + return rc; +} + +/* +** Free a pointer-map allocated by allocatePtrmap. +*/ +static void deletePtrmap(BtShared *pBt){ + BtreePtrmap *pMap = pBt->pMap; + if( pMap ){ + sqlite3_free(pMap->aRollback); + sqlite3_free(pMap->aPtr); + sqlite3_free(pMap->aSvpt); + sqlite3_free(pMap); + pBt->pMap = 0; + } +} +#else +#define allocatePtrmap(x) SQLITE_OK +#define deletePtrmap(x) +#endif + /* ** Get a page from the pager and initialize it. ** @@ -3149,6 +3341,9 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ if( rc==SQLITE_OK ){ rc = newDatabase(pBt); } + if( rc==SQLITE_OK ){ + rc = allocatePtrmap(pBt); + } } } @@ -3205,7 +3400,11 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ ** open savepoints. If the second parameter is greater than 0 and ** the sub-journal is not already open, then it will be opened here. */ - rc = sqlite3PagerOpenSavepoint(pBt->pPager, p->db->nSavepoint); + int nSavepoint = p->db->nSavepoint; + rc = sqlite3PagerOpenSavepoint(pBt->pPager, nSavepoint); + if( pBt->pMap && rc==SQLITE_OK && nSavepoint ){ + rc = btreePtrmapBegin(pBt->pMap, nSavepoint); + } } btreeIntegrity(p); @@ -3642,6 +3841,92 @@ static int autoVacuumCommit(BtShared *pBt){ # define setChildPtrmaps(x) SQLITE_OK #endif +/* +** The b-tree handle passed as the only argument is about to commit an +** UNLOCKED transaction. At this point it is guaranteed that this is +** possible - the wal WRITER lock is held and it is known that there are +** no conflicts with committed transactions. +*/ +static int btreeFixUnlocked(Btree *p){ + BtShared *pBt = p->pBt; + MemPage *pPage1 = pBt->pPage1; + u8 *p1 = pPage1->aData; + Pager *pPager = pBt->pPager; + int rc = SQLITE_OK; + + /* If page 1 of the database is not writable, then no pages were allocated + ** or freed by this transaction. In this case no special handling is + ** required. Otherwise, if page 1 is dirty, proceed. */ + BtreePtrmap *pMap = pBt->pMap; + Pgno iTrunk = get4byte(&p1[32]); + Pgno nPage = btreePagecount(pBt); + Pgno nOrig = pMap->iFirst-1; + u32 nFree = get4byte(&p1[36]); + + assert( sqlite3PagerIsUnlocked(pPager) ); + assert( pBt->pMap ); + rc = sqlite3PagerUpgradeSnapshot(pPager, pPage1->pDbPage); + assert( p1==pPage1->aData ); + + if( rc==SQLITE_OK ){ + Pgno nHPage = get4byte(&p1[28]); + Pgno nFinal = nHPage; + + if( sqlite3PagerIswriteable(pPage1->pDbPage) ){ + Pgno iHTrunk = get4byte(&p1[32]); + u32 nHFree = get4byte(&p1[36]); + + /* Attach the head database free list to the end of the current + ** transactions free-list (if any). */ + if( iTrunk!=0 ){ + put4byte(&p1[36], nHFree + nFree); + put4byte(&p1[32], iTrunk); + while( iTrunk ){ + DbPage *pTrunk = sqlite3PagerLookup(pPager, iTrunk); + iTrunk = get4byte((u8*)pTrunk->pData); + if( iTrunk==0 ){ + put4byte((u8*)pTrunk->pData, iHTrunk); + } + sqlite3PagerUnref(pTrunk); + }; + } + + if( nHPageiFirst through + ** nPage (inclusive) at the end of the database file. Meanwhile, + ** other transactions have allocated (iFirst..nHPage). So move + ** pages (iFirst..MIN(nPage,nHPage)) to (MAX(nPage,nHPage)+1). + */ + Pgno iLast = MIN(nPage, nHPage); /* Last page to move */ + Pgno iPg; + + nFinal = MAX(nPage, nHPage); /* Final size of database */ + for(iPg=pMap->iFirst; iPg<=iLast && rc==SQLITE_OK; iPg++){ + MemPage *pPg = 0; + Pgno iNew; /* New page number for pPg */ + PtrmapEntry *pEntry; /* Pointer map entry for page iPg */ + + btreeGetPage(pBt, iPg, &pPg, 0); + assert( sqlite3PagerIswriteable(pPg->pDbPage) ); + assert( sqlite3PagerPageRefcount(pPg->pDbPage)==1 ); + pEntry = &pMap->aPtr[iPg - pMap->iFirst]; + iNew = ++nFinal; + + rc = relocatePage(pBt, pPg, pEntry->eType, pEntry->parent, iNew, 1); + releasePageNotNull(pPg); + } + + put4byte(&p1[28], nFinal); + } + } + sqlite3PagerSetDbsize(pPager, nFinal); + } + + return rc; +} + /* ** This routine does the first phase of a two-phase commit. This routine ** causes a rollback journal to be created (if it does not already exist) @@ -3678,10 +3963,8 @@ int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zMaster){ /* Figure out if this is a commit of an UNLOCKED transaction that ** requires a snapshot upgrade. If so, skip any auto-vacuum ** processing. */ - if( pBt->autoVacuum && ( - 0==pBt->db->bUnlocked - || 0==sqlite3PagerCommitRequiresUpgrade(pBt->pPager) - )){ + if( pBt->autoVacuum ){ + assert( sqlite3PagerIsUnlocked(pBt->pPager)==0 ); rc = autoVacuumCommit(pBt); if( rc!=SQLITE_OK ){ sqlite3BtreeLeave(p); @@ -3692,6 +3975,9 @@ int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zMaster){ sqlite3PagerTruncateImage(pBt->pPager, pBt->nPage); } #endif + if( rc==SQLITE_OK && sqlite3PagerIsUnlocked(pBt->pPager) ){ + rc = btreeFixUnlocked(p); + } if( rc==SQLITE_OK ){ rc = sqlite3PagerCommitPhaseOne(pBt->pPager, zMaster, 0); } @@ -3737,6 +4023,8 @@ static void btreeEndTransaction(Btree *p){ unlockBtreeIfUnused(pBt); } + /* If this was an UNLOCKED transaction, delete the pBt->pMap object */ + deletePtrmap(pBt); btreeIntegrity(p); } @@ -3962,6 +4250,9 @@ int sqlite3BtreeBeginStmt(Btree *p, int iStatement){ ** such savepoints while the statement transaction savepoint is active. */ rc = sqlite3PagerOpenSavepoint(pBt->pPager, iStatement); + if( rc==SQLITE_OK && pBt->pMap ){ + rc = btreePtrmapBegin(pBt->pMap, iStatement); + } sqlite3BtreeLeave(p); return rc; } @@ -3985,6 +4276,7 @@ int sqlite3BtreeSavepoint(Btree *p, int op, int iSavepoint){ assert( op==SAVEPOINT_RELEASE || op==SAVEPOINT_ROLLBACK ); assert( iSavepoint>=0 || (iSavepoint==-1 && op==SAVEPOINT_ROLLBACK) ); sqlite3BtreeEnter(p); + if( pBt->pMap ) btreePtrmapEnd(pBt->pMap, op, iSavepoint); rc = sqlite3PagerSavepoint(pBt->pPager, op, iSavepoint); if( rc==SQLITE_OK ){ if( iSavepoint<0 && (pBt->btsFlags & BTS_INITIALLY_EMPTY)!=0 ){ @@ -5493,6 +5785,16 @@ static int allocateBtreePage( if( n>=mxPage ){ return SQLITE_CORRUPT_BKPT; } + + /* Ensure page 1 is writable. This function will either change the number + ** of pages in the free-list or the size of the database file. Since both + ** of these operations involve modifying page 1 header fields, page 1 + ** will definitely be written by this transaction. If this is an UNLOCKED + ** transaction, ensure the BtreePtrmap structure has been allocated. */ + assert( eMode!=BTALLOC_EXACT || sqlite3PagerIsUnlocked(pBt->pPager)==0 ); + rc = sqlite3PagerWrite(pPage1->pDbPage); + if( rc ) return rc; + if( n>0 ){ /* There are pages on the freelist. Reuse one of those pages. */ Pgno iTrunk; @@ -5523,8 +5825,6 @@ static int allocateBtreePage( /* Decrement the free-list count by 1. Set iTrunk to the index of the ** first free-list trunk page. iPrevTrunk is initially 1. */ - rc = sqlite3PagerWrite(pPage1->pDbPage); - if( rc ) return rc; put4byte(&pPage1->aData[36], n-1); /* The code within this loop is run only once if the 'searchList' variable @@ -5830,7 +6130,7 @@ static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){ /* If the database supports auto-vacuum, write an entry in the pointer-map ** to indicate that the page is free. */ - if( ISAUTOVACUUM ){ + if( REQUIRE_PTRMAP ){ ptrmapPut(pBt, iPage, PTRMAP_FREEPAGE, 0, &rc); if( rc ) goto freepage_out; } @@ -6116,7 +6416,7 @@ static int fillInCell( } #endif rc = allocateBtreePage(pBt, &pOvfl, &pgnoOvfl, pgnoOvfl, 0); -#ifndef SQLITE_OMIT_AUTOVACUUM + /* If the database supports auto-vacuum, and the second or subsequent ** overflow page is being allocated, add an entry to the pointer-map ** for that page now. @@ -6127,14 +6427,13 @@ static int fillInCell( ** may misinterpret the uninitialized values and delete the ** wrong pages from the database. */ - if( pBt->autoVacuum && rc==SQLITE_OK ){ + if( REQUIRE_PTRMAP && rc==SQLITE_OK ){ u8 eType = (pgnoPtrmap?PTRMAP_OVERFLOW2:PTRMAP_OVERFLOW1); ptrmapPut(pBt, pgnoOvfl, eType, pgnoPtrmap, &rc); if( rc ){ releasePage(pOvfl); } } -#endif if( rc ){ releasePage(pToRelease); return rc; @@ -6301,6 +6600,7 @@ static void insertCell( assert( j==0 || pPage->aiOvfl[j-1]<(u16)i ); /* Overflows in sorted order */ assert( j==0 || i==pPage->aiOvfl[j-1]+1 ); /* Overflows are sequential */ }else{ + BtShared *pBt = pPage->pBt; int rc = sqlite3PagerWrite(pPage->pDbPage); if( rc!=SQLITE_OK ){ *pRC = rc; @@ -6315,7 +6615,7 @@ static void insertCell( ** if it returns successfully */ assert( idx >= 0 ); assert( idx >= pPage->cellOffset+2*pPage->nCell+2 || CORRUPT_DB ); - assert( idx+sz <= (int)pPage->pBt->usableSize ); + assert( idx+sz <= (int)pBt->usableSize ); pPage->nFree -= (u16)(2 + sz); memcpy(&data[idx], pCell, sz); if( iChild ){ @@ -6328,14 +6628,12 @@ static void insertCell( /* increment the cell count */ if( (++data[pPage->hdrOffset+4])==0 ) data[pPage->hdrOffset+3]++; assert( get2byte(&data[pPage->hdrOffset+3])==pPage->nCell ); -#ifndef SQLITE_OMIT_AUTOVACUUM - if( pPage->pBt->autoVacuum ){ + if( REQUIRE_PTRMAP ){ /* The cell may contain a pointer to an overflow page. If so, write ** the entry for the overflow page into the pointer map. */ ptrmapPutOvflPtr(pPage, pCell, pRC); } -#endif } } @@ -6740,7 +7038,7 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ ** be marked as dirty. Returning an error code will cause a ** rollback, undoing any changes made to the parent page. */ - if( ISAUTOVACUUM ){ + if( REQUIRE_PTRMAP ){ ptrmapPut(pBt, pgnoNew, PTRMAP_BTREE, pParent->pgno, &rc); if( szCell>pNew->minLocal ){ ptrmapPutOvflPtr(pNew, pCell, &rc); @@ -6875,7 +7173,7 @@ static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){ /* If this is an auto-vacuum database, update the pointer-map entries ** for any b-tree or overflow pages that pTo now contains the pointers to. */ - if( ISAUTOVACUUM ){ + if( REQUIRE_PTRMAP ){ *pRC = setChildPtrmaps(pTo); } } @@ -7345,7 +7643,7 @@ static int balance_nonroot( cntOld[i] = b.nCell; /* Set the pointer-map entry for the new sibling page. */ - if( ISAUTOVACUUM ){ + if( REQUIRE_PTRMAP ){ ptrmapPut(pBt, pNew->pgno, PTRMAP_BTREE, pParent->pgno, &rc); if( rc!=SQLITE_OK ){ goto balance_cleanup; @@ -7439,7 +7737,7 @@ static int balance_nonroot( ** updated. This happens below, after the sibling pages have been ** populated, not here. */ - if( ISAUTOVACUUM ){ + if( REQUIRE_PTRMAP ){ MemPage *pNew = apNew[0]; u8 *aOld = pNew->aData; int cntOldNext = pNew->nCell + pNew->nOverflow; @@ -7624,7 +7922,7 @@ static int balance_nonroot( ); copyNodeContent(apNew[0], pParent, &rc); freePage(apNew[0], &rc); - }else if( ISAUTOVACUUM && !leafCorrection ){ + }else if( REQUIRE_PTRMAP && !leafCorrection ){ /* Fix the pointer map entries associated with the right-child of each ** sibling page. All other pointer map entries have already been taken ** care of. */ @@ -7710,7 +8008,7 @@ static int balance_deeper(MemPage *pRoot, MemPage **ppChild){ if( rc==SQLITE_OK ){ rc = allocateBtreePage(pBt,&pChild,&pgnoChild,pRoot->pgno,0); copyNodeContent(pRoot, pChild, &rc); - if( ISAUTOVACUUM ){ + if( REQUIRE_PTRMAP ){ ptrmapPut(pBt, pgnoChild, PTRMAP_BTREE, pRoot->pgno, &rc); } } @@ -9590,3 +9888,13 @@ int sqlite3BtreeIsReadonly(Btree *p){ ** Return the size of the header added to each page by this module. */ int sqlite3HeaderSizeBtree(void){ return ROUND8(sizeof(MemPage)); } + +int sqlite3BtreeExclusiveLock(Btree *p){ + int rc; + BtShared *pBt = p->pBt; + assert( p->inTrans==TRANS_WRITE && pBt->pPage1 ); + sqlite3BtreeEnter(p); + rc = sqlite3PagerExclusiveLock(pBt->pPager, pBt->pPage1->pDbPage); + sqlite3BtreeLeave(p); + return rc; +} diff --git a/src/btree.h b/src/btree.h index 50dc8ca290..8f611b7a9b 100644 --- a/src/btree.h +++ b/src/btree.h @@ -215,6 +215,8 @@ int sqlite3BtreeCursorHasHint(BtCursor*, unsigned int mask); int sqlite3BtreeIsReadonly(Btree *pBt); int sqlite3HeaderSizeBtree(void); +int sqlite3BtreeExclusiveLock(Btree *pBt); + #ifndef NDEBUG int sqlite3BtreeCursorIsValid(BtCursor*); #endif diff --git a/src/btreeInt.h b/src/btreeInt.h index cbf6c99847..67b1da6e3f 100644 --- a/src/btreeInt.h +++ b/src/btreeInt.h @@ -232,6 +232,7 @@ typedef struct MemPage MemPage; typedef struct BtLock BtLock; typedef struct CellInfo CellInfo; +typedef struct BtreePtrmap BtreePtrmap; /* ** This is a magic string that appears at the beginning of every @@ -447,6 +448,9 @@ struct BtShared { Btree *pWriter; /* Btree with currently open write transaction */ #endif u8 *pTmpSpace; /* Temp space sufficient to hold a single cell */ +#ifdef SQLITE_ENABLE_UNLOCKED + BtreePtrmap *pMap; +#endif }; /* @@ -659,6 +663,12 @@ struct BtCursor { #define ISAUTOVACUUM 0 #endif +#ifdef SQLITE_ENABLE_UNLOCKED +# define REQUIRE_PTRMAP (ISAUTOVACUUM || pBt->pMap) +#else +# define REQUIRE_PTRMAP ISAUTOVACUUM +#endif + /* ** This structure is passed around through all the sanity checking routines diff --git a/src/pager.c b/src/pager.c index 5107edda36..efbea0ab8e 100644 --- a/src/pager.c +++ b/src/pager.c @@ -657,7 +657,9 @@ struct Pager { u32 cksumInit; /* Quasi-random value added to every checksum */ u32 nSubRec; /* Number of records written to sub-journal */ Bitvec *pInJournal; /* One bit for each page in the database file */ +#ifdef SQLITE_ENABLE_UNLOCKED Bitvec *pAllRead; /* Pages read within current UNLOCKED trans. */ +#endif sqlite3_file *fd; /* File descriptor for database */ sqlite3_file *jfd; /* File descriptor for main journal */ sqlite3_file *sjfd; /* File descriptor for sub-journal */ @@ -4091,7 +4093,7 @@ static int syncJournal(Pager *pPager, int newHdr){ assert( assert_pager_state(pPager) ); assert( !pagerUseWal(pPager) ); - rc = sqlite3PagerExclusiveLock(pPager); + rc = sqlite3PagerExclusiveLock(pPager, 0); if( rc!=SQLITE_OK ) return rc; if( !pPager->noSync ){ @@ -5929,11 +5931,9 @@ int sqlite3PagerWrite(PgHdr *pPg){ ** to sqlite3PagerWrite(). In other words, return TRUE if it is ok ** to change the content of the page. */ -#ifndef NDEBUG int sqlite3PagerIswriteable(DbPage *pPg){ return pPg->flags & PGHDR_WRITEABLE; } -#endif /* ** A call to this routine tells the pager that it is not necessary to @@ -6091,7 +6091,7 @@ int sqlite3PagerSync(Pager *pPager, const char *zMaster){ ** Otherwise, either SQLITE_BUSY or an SQLITE_IOERR_XXX error code is ** returned. */ -int sqlite3PagerExclusiveLock(Pager *pPager){ +int sqlite3PagerExclusiveLock(Pager *pPager, PgHdr *pPage1){ int rc = SQLITE_OK; assert( pPager->eState==PAGER_WRITER_CACHEMOD || pPager->eState==PAGER_WRITER_DBMOD @@ -6108,7 +6108,7 @@ int sqlite3PagerExclusiveLock(Pager *pPager){ ** non-zero. */ do { /* rc = sqlite3WalBeginWriteTransaction(pWal); */ - rc = sqlite3WalLockForCommit(pPager->pWal, pPager->pAllRead); + rc = sqlite3WalLockForCommit(pPager->pWal, pPage1, pPager->pAllRead); }while( rc==SQLITE_BUSY && pPager->xBusyHandler(pPager->pBusyHandlerArg) ); @@ -6117,6 +6117,24 @@ int sqlite3PagerExclusiveLock(Pager *pPager){ return rc; } +int sqlite3PagerUpgradeSnapshot(Pager *pPager, DbPage *pPage1){ + int rc; + u32 iFrame = 0; + + assert( pPager->pWal && pPager->pAllRead ); + sqlite3WalUpgradeSnapshot(pPager->pWal); + rc = sqlite3WalFindFrame(pPager->pWal, 1, &iFrame); + if( rc==SQLITE_OK ){ + rc = readDbPage(pPage1, iFrame); + } + + return rc; +} + +void sqlite3PagerSetDbsize(Pager *pPager, Pgno nFinal){ + pPager->dbSize = nFinal; +} + /* ** If this is a WAL mode connection and the WRITER lock is currently held, ** relinquish it. @@ -6131,14 +6149,11 @@ void sqlite3PagerDropExclusiveLock(Pager *pPager){ ** Return true if this is a WAL database and snapshot upgrade is required ** before the current transaction can be committed. */ -int sqlite3PagerCommitRequiresUpgrade(Pager *pPager){ - int res = 0; - if( pagerUseWal(pPager) ){ - res = sqlite3WalCommitRequiresUpgrade(pPager->pWal); - } - return res; +int sqlite3PagerIsUnlocked(Pager *pPager){ + return pPager->pAllRead!=0; } + /* ** Sync the database file for the pager pPager. zMaster points to the name ** of a master journal file that should be written into the individual diff --git a/src/pager.h b/src/pager.h index 3c0b9a1a71..92e5546282 100644 --- a/src/pager.h +++ b/src/pager.h @@ -145,12 +145,13 @@ int sqlite3PagerMovepage(Pager*,DbPage*,Pgno,int); int sqlite3PagerPageRefcount(DbPage*); void *sqlite3PagerGetData(DbPage *); void *sqlite3PagerGetExtra(DbPage *); +int sqlite3PagerIsDirty(DbPage*); /* Functions used to manage pager transactions and savepoints. */ void sqlite3PagerPagecount(Pager*, int*); int sqlite3PagerBegin(Pager*, int exFlag, int); int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, int); -int sqlite3PagerExclusiveLock(Pager*); +int sqlite3PagerExclusiveLock(Pager*, DbPage *pPage1); int sqlite3PagerSync(Pager *pPager, const char *zMaster); int sqlite3PagerCommitPhaseTwo(Pager*); int sqlite3PagerRollback(Pager*); @@ -159,7 +160,7 @@ int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint); int sqlite3PagerSharedLock(Pager *pPager); void sqlite3PagerDropExclusiveLock(Pager*); -int sqlite3PagerCommitRequiresUpgrade(Pager*); +int sqlite3PagerIsUnlocked(Pager*); #ifndef SQLITE_OMIT_WAL int sqlite3PagerCheckpoint(Pager *pPager, int, int*, int*); @@ -196,6 +197,10 @@ void sqlite3PagerTruncateImage(Pager*,Pgno); void sqlite3PagerRekey(DbPage*, Pgno, u16); +int sqlite3PagerIswriteable(DbPage*); +int sqlite3PagerUpgradeSnapshot(Pager *pPager, DbPage*); +void sqlite3PagerSetDbsize(Pager *pPager, Pgno); + #if defined(SQLITE_HAS_CODEC) && !defined(SQLITE_OMIT_WAL) void *sqlite3PagerCodec(DbPage *); #endif @@ -203,7 +208,6 @@ void *sqlite3PagerCodec(DbPage *); /* Functions to support testing and debugging. */ #if !defined(NDEBUG) || defined(SQLITE_TEST) Pgno sqlite3PagerPagenumber(DbPage*); - int sqlite3PagerIswriteable(DbPage*); #endif #ifdef SQLITE_TEST int *sqlite3PagerStats(Pager*); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 93a7187ab9..f5f9d0fbdd 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2020,9 +2020,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ if( sqlite3BtreeIsInTrans(pBt) ){ needXcommit = 1; if( i!=1 ) nTrans++; - sqlite3BtreeEnter(pBt); - rc = sqlite3PagerExclusiveLock(sqlite3BtreePager(pBt)); - sqlite3BtreeLeave(pBt); + rc = sqlite3BtreeExclusiveLock(pBt); } } diff --git a/src/wal.c b/src/wal.c index 5fbdae6a1a..809ce2b109 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2573,7 +2573,8 @@ int sqlite3WalBeginWriteTransaction(Wal *pWal){ ** transaction. It may be assumed that no frames have been written to ** the wal file. */ -int sqlite3WalLockForCommit(Wal *pWal, Bitvec *pAllRead){ +int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPage1, Bitvec *pAllRead){ + Pager *pPager = pPage1->pPager; int rc = walWriteLock(pWal); /* If the database has been modified since this transaction was started, @@ -2589,6 +2590,9 @@ int sqlite3WalLockForCommit(Wal *pWal, Bitvec *pAllRead){ if( rc==SQLITE_OK ){ volatile WalIndexHdr *pHead; /* Head of the wal file */ pHead = walIndexHdr(pWal); + + /* TODO: Check header checksum is good here. */ + if( memcmp(&pWal->hdr, (void*)pHead, sizeof(WalIndexHdr))!=0 ){ /* TODO: Is this safe? Because it holds the WRITER lock this thread ** has exclusive access to the live header, but might it be corrupt? @@ -2609,12 +2613,33 @@ int sqlite3WalLockForCommit(Wal *pWal, Bitvec *pAllRead){ if( iMin<1 ) iMin = 1; if( iMax>pHead->mxFrame ) iMax = pHead->mxFrame; for(i=iMin; i<=iMax; i++){ - if( sqlite3BitvecTestNotNull(pAllRead, aPgno[i]) ){ + PgHdr *pPg; + if( aPgno[i]==1 ){ + /* Check that the schema cookie has not been modified. If + ** it has not, the commit can proceed. */ + u8 aNew[4]; + u8 *aOld = &((u8*)pPage1->pData)[40]; + int sz; + i64 iOffset; + sz = pWal->hdr.szPage; + sz = (sz&0xfe00) + ((sz&0x0001)<<16); + iOffset = walFrameOffset(i+iZero, sz) + WAL_FRAME_HDRSIZE + 40; + rc = sqlite3OsRead(pWal->pWalFd, aNew, sizeof(aNew), iOffset); + if( rc==SQLITE_OK && memcmp(aOld, aNew, sizeof(aNew)) ){ + rc = SQLITE_BUSY_SNAPSHOT; + } + }else if( sqlite3BitvecTestNotNull(pAllRead, aPgno[i]) ){ sqlite3_log(SQLITE_OK, "cannot commit UNLOCKED transaction (conflict at page %d)", (int)aPgno[i] ); rc = SQLITE_BUSY_SNAPSHOT; + }else if( (pPg = sqlite3PagerLookup(pPager, aPgno[i])) ){ + if( sqlite3PagerIswriteable(pPg)==0 ){ + sqlite3PcacheDrop(pPg); + }else{ + sqlite3PagerUnref(pPg); + } } } } @@ -2626,6 +2651,11 @@ int sqlite3WalLockForCommit(Wal *pWal, Bitvec *pAllRead){ return rc; } +void sqlite3WalUpgradeSnapshot(Wal *pWal){ + assert( pWal->writeLock ); + memcpy(&pWal->hdr, (void*)walIndexHdr(pWal), sizeof(WalIndexHdr)); +} + /* ** This function is only ever called while committing an UNLOCKED ** transaction, after the caller has already obtained the WRITER lock @@ -2890,7 +2920,6 @@ int sqlite3WalFrames( int szFrame; /* The size of a single frame */ i64 iOffset; /* Next byte to write in WAL file */ WalWriter w; /* The writer */ - int bUpgrade = 0; /* True if commit requires snapshot upgrade */ assert( pList ); assert( pWal->writeLock ); @@ -2906,22 +2935,6 @@ int sqlite3WalFrames( } #endif - if( isCommit ){ - volatile WalIndexHdr *pHead = walIndexHdr(pWal); - if( pHead->mxFrame>pWal->hdr.mxFrame ){ - if( memcmp((void*)&pHead[0], (void*)&pHead[1], sizeof(WalIndexHdr))!=0 ){ - /* TODO: Deal with this case. It's quite possible, but fiddly. */ - return SQLITE_CORRUPT_BKPT; - } - memcpy(&pWal->hdr, (void*)pHead, sizeof(WalIndexHdr)); - if( nTruncatehdr.nPage ){ - /* Do not truncate the database file in this case */ - nTruncate = pWal->hdr.nPage; - } - bUpgrade = 1; - } - } - /* See if it is possible to write these frames into the start of the ** log file, instead of appending to it at pWal->hdr.mxFrame. */ @@ -3070,14 +3083,6 @@ int sqlite3WalFrames( } } - if( rc==SQLITE_OK && bUpgrade ){ - /* If this commit required a snapshot upgrade, the pager cache is - ** not currently consistent with the head of the wal file. Zeroing - ** Wal.hdr here forces the next transaction to reset the cache - ** before beginning to read the db. */ - memset(&pWal->hdr, 0, sizeof(WalIndexHdr)); - } - WALTRACE(("WAL%p: frame write %s\n", pWal, rc ? "failed" : "ok")); return rc; } diff --git a/src/wal.h b/src/wal.h index fe85a52cc0..5b4ca15943 100644 --- a/src/wal.h +++ b/src/wal.h @@ -127,8 +127,9 @@ int sqlite3WalExclusiveMode(Wal *pWal, int op); int sqlite3WalHeapMemory(Wal *pWal); /* Return true if the WRITER lock is held. False otherwise. */ -int sqlite3WalLockForCommit(Wal *pWal, Bitvec *pRead); +int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPg, Bitvec *pRead); int sqlite3WalCommitRequiresUpgrade(Wal *pWal); +void sqlite3WalUpgradeSnapshot(Wal *pWal); #ifdef SQLITE_ENABLE_ZIPVFS /* If the WAL file is not empty, return the number of bytes of content diff --git a/test/unlocked.test b/test/unlocked.test index 23eb5a5064..c743cc6328 100644 --- a/test/unlocked.test +++ b/test/unlocked.test @@ -399,10 +399,9 @@ do_multiclient_test tn { do_test 2.$tn.7.3 { list [catch { sql1 { COMMIT } } msg] $msg [sqlite3_errcode db] - } {1 {database is locked} SQLITE_BUSY_SNAPSHOT} - sql1 ROLLBACK - + } {0 {} SQLITE_OK} + do_test 2.$tn.7.4 { sql3 { PRAGMA integrity_check } } ok } diff --git a/test/unlocked2.test b/test/unlocked2.test new file mode 100644 index 0000000000..f808a84e7b --- /dev/null +++ b/test/unlocked2.test @@ -0,0 +1,101 @@ +# 2015 July 26 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/lock_common.tcl +set ::testprefix unlocked2 + + +do_multiclient_test tn { + + do_test 1.$tn.1 { + sql1 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(x); + CREATE TABLE t2(y); + } + } {wal} + + # Test that an UNLOCKED transaction that allocates/frees no pages does + # not conflict with a transaction that does allocate pages. + do_test 1.$tn.2 { + sql1 { + BEGIN UNLOCKED; + INSERT INTO t1 VALUES(4); + } + sql2 { + INSERT INTO t2 VALUES(randomblob(1500)); + } + sql1 { + COMMIT; + } + } {} + + # But that an UNLOCKED transaction does conflict with a transaction + # that modifies the db schema. + do_test 1.$tn.3 { + sql1 { + BEGIN UNLOCKED; + INSERT INTO t1 VALUES(5); + } + sql2 { + CREATE TABLE t3(z); + } + list [catch { sql1 COMMIT } msg] $msg + } {1 {database is locked}} + + # Test that an UNLOCKED transaction that allocates at least one page + # does not conflict with a transaction that allocates no pages. + do_test 1.$tn.4 { + sql1 { + ROLLBACK; + BEGIN UNLOCKED; + INSERT INTO t1 VALUES(randomblob(1500)); + } + sql2 { + INSERT INTO t2 VALUES(8); + } + sql1 { + COMMIT; + } + } {} + + do_test 1.$tn.5 { sql3 { PRAGMA integrity_check } } {ok} +} + +do_multiclient_test tn { + do_test 2.$tn.1 { + sql1 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(x UNIQUE); + CREATE TABLE t2(y UNIQUE); + } + } {wal} + + do_test 2.$tn.2 { + sql1 { + BEGIN UNLOCKED; + INSERT INTO t1 VALUES(randomblob(1500)); + } + sql2 { + INSERT INTO t2 VALUES(randomblob(1500)); + } + sql1 { + COMMIT; + } + } {} + + do_test 2.$tn.3 { sql3 { PRAGMA integrity_check } } {ok} +} + +finish_test From 699bdf056b62070d2cf5d47b8678ddf4bcb72479 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 20 Aug 2015 20:25:56 +0000 Subject: [PATCH 006/113] Fix a problem causing corruption when an UNLOCKED transaction is rolled back. FossilOrigin-Name: 7c36147846484c96023939864417b5624f3bc5f8 --- manifest | 14 +++++----- manifest.uuid | 2 +- src/pager.c | 9 +++++++ test/unlocked2.test | 64 +++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 79 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 92f5317a3d..ba7247bf36 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\scommitting\san\sunlocked\stransaction,\srelocate\snewly\sallocated\sdatabase\spages\swithin\sthe\sfile\sto\savoid\sconflicting\swith\scommitted\stransactions.\sThere\sare\slots\sof\sthings\sstill\sto\sfix\sin\sthis\scode. -D 2015-08-19T20:27:05.840 +C Fix\sa\sproblem\scausing\scorruption\swhen\san\sUNLOCKED\stransaction\sis\srolled\sback. +D 2015-08-20T20:25:56.029 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 4de3ef40c8b3b75c0c55ff4242a43c8ce1ad90ee F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -315,7 +315,7 @@ F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa F src/os_unix.c 388c023582b17890f10c980b30ec1922b471753b F src/os_win.c 40b3af7a47eb1107d0d69e592bec345a3b7b798a F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca -F src/pager.c fe82e368600278cfd35024c20b888e945236f675 +F src/pager.c 48a76f16a75112c9b064e21e1d1ecf0b4d87b5cd F src/pager.h 3fc23bca2e7d606ca4fbdd923713cdcdcec48297 F src/parse.y 199145cd982587d70fa3db2f9b11f7ab118f0acd F src/pcache.c cde06aa50962595e412d497e22fd2e07878ba1f0 @@ -1216,7 +1216,7 @@ F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 41e7f83c6827605991160a31380148a9fc5f1339 F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825 F test/unlocked.test d143a871bd874311d4e5c98ce458218ca6b579fd -F test/unlocked2.test fc4c730a44c3650250467ecacca6ddb969f64405 +F test/unlocked2.test 06a7d5a366bfc6fcaf472a2411f6d45fd9255ed4 F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 F test/uri.test 23662b7b61958b0f0e47082de7d06341ccf85d5b @@ -1368,7 +1368,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P de1ea450db33b140b11af5b801ea6a15875e774e -R db05422c8fb37e882a7e6cc4bd7c8ffb +P 3bbc31d515ba9fc920c5cbc7059d3eb1ba9c7f8e +R 9ac18b47cee85e97c9fcd4362b958c7d U dan -Z cccfd407eb244cf1cd3b5cab72e65fda +Z 032a41c4b1c95657db216d02c5116d23 diff --git a/manifest.uuid b/manifest.uuid index 7d70f3c411..ce9cb89059 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3bbc31d515ba9fc920c5cbc7059d3eb1ba9c7f8e \ No newline at end of file +7c36147846484c96023939864417b5624f3bc5f8 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index efbea0ab8e..ac2f6bf1a6 100644 --- a/src/pager.c +++ b/src/pager.c @@ -3021,6 +3021,7 @@ static int pagerUndoCallback(void *pCtx, Pgno iPg){ static int pagerRollbackWal(Pager *pPager){ int rc; /* Return Code */ PgHdr *pList; /* List of dirty pages to revert */ + int bPage1 = 0; /* True if page 1 has been undone */ /* For all pages in the cache that are currently dirty or have already ** been written (but not committed) to the log file, do one of the @@ -3034,10 +3035,18 @@ static int pagerRollbackWal(Pager *pPager){ pList = sqlite3PcacheDirtyList(pPager->pPCache); while( pList && rc==SQLITE_OK ){ PgHdr *pNext = pList->pDirty; + if( pList->pgno==1 ) bPage1 = 1; rc = pagerUndoCallback((void *)pPager, pList->pgno); pList = pNext; } + /* If this is an UNLOCKED transaction, then page 1 must be reread from the + ** db file, even if it is not dirty. This is because the b-tree layer may + ** have already zeroed the nFree and iTrunk header fields. */ + if( rc==SQLITE_OK && bPage1==0 && pPager->pAllRead ){ + rc = pagerUndoCallback((void*)pPager, 1); + } + return rc; } diff --git a/test/unlocked2.test b/test/unlocked2.test index f808a84e7b..e9c62194a0 100644 --- a/test/unlocked2.test +++ b/test/unlocked2.test @@ -90,12 +90,72 @@ do_multiclient_test tn { sql2 { INSERT INTO t2 VALUES(randomblob(1500)); } + sql1 COMMIT + } {} + + do_test 2.$tn.3 { sql3 { PRAGMA integrity_check } } {ok} + + do_test 2.$tn.4 { + sql1 { + BEGIN UNLOCKED; + DELETE FROM t1; + } + sql2 { + DELETE FROM t2; + } + sql1 COMMIT + } {} + + do_test 2.$tn.5 { sql3 { PRAGMA integrity_check } } {ok} + + do_test 2.$tn.6 { sql1 { - COMMIT; + INSERT INTO t1 VALUES(randomblob(1500)); + INSERT INTO t1 VALUES(randomblob(1500)); + INSERT INTO t2 VALUES(randomblob(1500)); + DELETE FROM t1 WHERE rowid=1; + } + + sql1 { + BEGIN UNLOCKED; + DELETE FROM t1 WHERE rowid=2; + } + + sql2 { + DELETE FROM t2; } + + sql1 COMMIT } {} - do_test 2.$tn.3 { sql3 { PRAGMA integrity_check } } {ok} + do_test 2.$tn.7 { sql3 { PRAGMA integrity_check } } {ok} } +reset_db +do_execsql_test 3.0 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(x, y); + INSERT INTO t1 VALUES(randomblob(1500), randomblob(1500)); + DELETE FROM t1; +} {wal} + +db close +sqlite3 db test.db +breakpoint + +do_execsql_test 3.1 { + BEGIN UNLOCKED; + INSERT INTO t1 VALUES(1, 2); + ROLLBACK; +} + +do_execsql_test 3.2 { + PRAGMA integrity_check; +} {ok} + +do_execsql_test 3.3 { + PRAGMA freelist_count; +} {2} + finish_test + From 64b310ed1aae9043983c81f7175d984024ce1717 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 21 Aug 2015 14:21:22 +0000 Subject: [PATCH 007/113] Add extra tests and a fix for rollbacks of UNLOCKED transactions. FossilOrigin-Name: 82cd837e72ed4cf5821be717369694be29a2997e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wal.c | 21 ++++++++++++++++++--- test/unlocked2.test | 46 +++++++++++++++++++++++++++++++++++++-------- 4 files changed, 64 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index ba7247bf36..dd80228576 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\scausing\scorruption\swhen\san\sUNLOCKED\stransaction\sis\srolled\sback. -D 2015-08-20T20:25:56.029 +C Add\sextra\stests\sand\sa\sfix\sfor\srollbacks\sof\sUNLOCKED\stransactions. +D 2015-08-21T14:21:22.365 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 4de3ef40c8b3b75c0c55ff4242a43c8ce1ad90ee F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -402,7 +402,7 @@ F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 F src/vtab.c 082b35a25a26e3d36f365ca8cd73c1922532f05e F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb -F src/wal.c 8bb1130dc1876e1c1c3fa082a5b0ec6437feb8e8 +F src/wal.c 37b25bbb52d6a736397d11e85068b1a496970fb2 F src/wal.h 5aaed8ca6cad1406088042ff8767951a6a3c7b56 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804 F src/where.c 909eba3b6db984eb2adfbca9de2c237ee7056adb @@ -1216,7 +1216,7 @@ F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 41e7f83c6827605991160a31380148a9fc5f1339 F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825 F test/unlocked.test d143a871bd874311d4e5c98ce458218ca6b579fd -F test/unlocked2.test 06a7d5a366bfc6fcaf472a2411f6d45fd9255ed4 +F test/unlocked2.test aca373d7639fd11c946a8e1a78c57bab0f18bc8e F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 F test/uri.test 23662b7b61958b0f0e47082de7d06341ccf85d5b @@ -1368,7 +1368,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 3bbc31d515ba9fc920c5cbc7059d3eb1ba9c7f8e -R 9ac18b47cee85e97c9fcd4362b958c7d +P 7c36147846484c96023939864417b5624f3bc5f8 +R d431131c35d67ee146c27b397321fd1c U dan -Z 032a41c4b1c95657db216d02c5116d23 +Z 6bf329345f5b33de62ef6fd5bfd9b35f diff --git a/manifest.uuid b/manifest.uuid index ce9cb89059..f765222789 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7c36147846484c96023939864417b5624f3bc5f8 \ No newline at end of file +82cd837e72ed4cf5821be717369694be29a2997e \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index 809ce2b109..ac7e522ff5 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2635,10 +2635,25 @@ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPage1, Bitvec *pAllRead){ ); rc = SQLITE_BUSY_SNAPSHOT; }else if( (pPg = sqlite3PagerLookup(pPager, aPgno[i])) ){ - if( sqlite3PagerIswriteable(pPg)==0 ){ - sqlite3PcacheDrop(pPg); - }else{ + /* Page aPgno[i], which is present in the pager cache, has been + ** modified since the current UNLOCKED transaction was started. + ** However it was not read by the current transaction, so is not + ** a conflict. There are two possibilities: (a) the page was + ** allocated at the of the file by the current transaction or + ** (b) was present in the cache at the start of the transaction. + ** + ** For case (a), do nothing. This page will be moved within the + ** database file by the commit code to avoid the conflict. The + ** call to PagerUnref() is to release the reference grabbed by + ** the sqlite3PagerLookup() above. + ** + ** In case (b), drop the page from the cache - otherwise + ** following the snapshot upgrade the cache would be inconsistent + ** with the database as stored on disk. */ + if( sqlite3PagerIswriteable(pPg) ){ sqlite3PagerUnref(pPg); + }else{ + sqlite3PcacheDrop(pPg); } } } diff --git a/test/unlocked2.test b/test/unlocked2.test index e9c62194a0..1ec9050b60 100644 --- a/test/unlocked2.test +++ b/test/unlocked2.test @@ -131,6 +131,18 @@ do_multiclient_test tn { do_test 2.$tn.7 { sql3 { PRAGMA integrity_check } } {ok} } +#------------------------------------------------------------------------- +# When an UNLOCKED transaction is opened on a database, the nFree and +# iTrunk header fields of the cached version of page 1 are both set +# to 0. This allows an UNLOCKED transaction to use its own private +# free-page-list, which is merged with the main database free-list when +# the transaction is committed. +# +# The following tests check that nFree/iTrunk are correctly restored if +# an UNLOCKED transaction is rolled back, and that savepoint rollbacks +# that occur within UNLOCKED transactions do not incorrectly restore +# these fields to their on-disk values. +# reset_db do_execsql_test 3.0 { PRAGMA journal_mode = wal; @@ -139,23 +151,41 @@ do_execsql_test 3.0 { DELETE FROM t1; } {wal} -db close -sqlite3 db test.db -breakpoint - do_execsql_test 3.1 { BEGIN UNLOCKED; INSERT INTO t1 VALUES(1, 2); ROLLBACK; } -do_execsql_test 3.2 { - PRAGMA integrity_check; -} {ok} +do_execsql_test 3.2 { PRAGMA integrity_check } {ok} +do_execsql_test 3.3 { PRAGMA freelist_count } {2} -do_execsql_test 3.3 { +do_execsql_test 3.4.1 { + BEGIN UNLOCKED; + PRAGMA freelist_count; +} {2} +do_execsql_test 3.4.2 { + SAVEPOINT xyz; + INSERT INTO t1 VALUES(randomblob(1500), NULL); + PRAGMA freelist_count; +} {0} +do_execsql_test 3.4.3 { + ROLLBACK TO xyz; +} {} +do_execsql_test 3.4.4 { PRAGMA freelist_count } {0} +do_execsql_test 3.4.5 { COMMIT; PRAGMA freelist_count } {2} +do_execsql_test 3.4.6 { PRAGMA integrity_check } {ok} + +do_execsql_test 3.5.1 { + BEGIN UNLOCKED; + UPDATE t1 SET x=randomblob(10) WHERE y=555; + PRAGMA freelist_count; +} {0} +do_execsql_test 3.5.2 { + ROLLBACK; PRAGMA freelist_count; } {2} +do_execsql_test 3.5.3 { PRAGMA integrity_check } {ok} finish_test From 70af25d03de9e183ee914cceedbdfbe5feb7bd7c Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 21 Aug 2015 17:57:16 +0000 Subject: [PATCH 008/113] Fix a problem with UNLOCKED transactions that free pages allocated within the same transaction. FossilOrigin-Name: 227bb8a1815c4dc6084970f06b0a6bfccdff3fd2 --- manifest | 14 +++++----- manifest.uuid | 2 +- src/btree.c | 62 ++++++++++++++++++++++++++++----------------- test/unlocked2.test | 34 +++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 31 deletions(-) diff --git a/manifest b/manifest index f5c3e2811a..ed83b7c162 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\strunk\schanges\swith\sthis\sbranch. -D 2015-08-21T16:22:04.553 +C Fix\sa\sproblem\swith\sUNLOCKED\stransactions\sthat\sfree\spages\sallocated\swithin\sthe\ssame\stransaction. +D 2015-08-21T17:57:16.096 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 4f663b6b4954b9b1eb0e6f08387688a93b57542d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -278,7 +278,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 4d9134dc988a87838c06056c89c0e8c4700a0452 F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c a00a7c4809d642bf6c63979e73face9fed53dc66 +F src/btree.c fca7884ea849190eff530f358f96c7304fcd2595 F src/btree.h 00d4cdb747c4172a5566faf037116985dbbc377e F src/btreeInt.h 1f7258e1f35ba3cc2197f9019f523dd20d59a0d8 F src/build.c e47b6fffe14a28d9050e6747beebb01597d37542 @@ -1226,7 +1226,7 @@ F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 41e7f83c6827605991160a31380148a9fc5f1339 F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825 F test/unlocked.test d143a871bd874311d4e5c98ce458218ca6b579fd -F test/unlocked2.test aca373d7639fd11c946a8e1a78c57bab0f18bc8e +F test/unlocked2.test 4861218039ca2481613d7e6a999226185222c93a F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 F test/uri.test 23662b7b61958b0f0e47082de7d06341ccf85d5b @@ -1378,7 +1378,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 82cd837e72ed4cf5821be717369694be29a2997e 7b8d17dd840f64dac9a018a4547a97de799e94ab -R a6aada1e15ca09028aeff07fdb262305 +P deaf3b18569025d8d168da29fae76142cfffe9e5 +R f09b37f1aebb9ccbb19d5d48d89374eb U dan -Z 957a88b73b652ebea177f80c25ee0401 +Z 1ea7f2e6e188cedc2dae0825d7ceb725 diff --git a/manifest.uuid b/manifest.uuid index ee7b5e2772..4ee4bbbd4b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -deaf3b18569025d8d168da29fae76142cfffe9e5 \ No newline at end of file +227bb8a1815c4dc6084970f06b0a6bfccdff3fd2 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index cc97fd8623..0bd34c7439 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3870,7 +3870,7 @@ static int btreeFixUnlocked(Btree *p){ if( rc==SQLITE_OK ){ Pgno nHPage = get4byte(&p1[28]); - Pgno nFinal = nHPage; + Pgno nFinal = nHPage; /* Size of db after transaction merge */ if( sqlite3PagerIswriteable(pPage1->pDbPage) ){ Pgno iHTrunk = get4byte(&p1[32]); @@ -3892,6 +3892,9 @@ static int btreeFixUnlocked(Btree *p){ } if( nHPageiFirst through @@ -3902,22 +3905,28 @@ static int btreeFixUnlocked(Btree *p){ Pgno iLast = MIN(nPage, nHPage); /* Last page to move */ Pgno iPg; - nFinal = MAX(nPage, nHPage); /* Final size of database */ + nFinal = MAX(nPage, nHPage); for(iPg=pMap->iFirst; iPg<=iLast && rc==SQLITE_OK; iPg++){ MemPage *pPg = 0; Pgno iNew; /* New page number for pPg */ PtrmapEntry *pEntry; /* Pointer map entry for page iPg */ - btreeGetPage(pBt, iPg, &pPg, 0); - assert( sqlite3PagerIswriteable(pPg->pDbPage) ); - assert( sqlite3PagerPageRefcount(pPg->pDbPage)==1 ); pEntry = &pMap->aPtr[iPg - pMap->iFirst]; - iNew = ++nFinal; - - rc = relocatePage(pBt, pPg, pEntry->eType, pEntry->parent, iNew, 1); - releasePageNotNull(pPg); + if( pEntry->eType==PTRMAP_FREEPAGE ){ + MemPage *pFree = 0; + Pgno dummy; + rc = allocateBtreePage(pBt, &pFree, &dummy, iPg, BTALLOC_EXACT); + releasePage(pFree); + assert( rc!=SQLITE_OK || dummy==iPg ); + }else{ + btreeGetPage(pBt, iPg, &pPg, 0); + assert( sqlite3PagerIswriteable(pPg->pDbPage) ); + assert( sqlite3PagerPageRefcount(pPg->pDbPage)==1 ); + iNew = ++nFinal; + rc = relocatePage(pBt, pPg, pEntry->eType, pEntry->parent, iNew, 1); + releasePageNotNull(pPg); + } } - put4byte(&p1[28], nFinal); } } @@ -5775,14 +5784,16 @@ static int allocateBtreePage( Pgno mxPage; /* Total size of the database file */ assert( sqlite3_mutex_held(pBt->mutex) ); - assert( eMode==BTALLOC_ANY || (nearby>0 && IfNotOmitAV(pBt->autoVacuum)) ); + assert( eMode==BTALLOC_ANY || (nearby>0 && ISAUTOVACUUM) + || (eMode==BTALLOC_EXACT && sqlite3PagerIsUnlocked(pBt->pPager)) + ); pPage1 = pBt->pPage1; mxPage = btreePagecount(pBt); /* EVIDENCE-OF: R-05119-02637 The 4-byte big-endian integer at offset 36 ** stores stores the total number of pages on the freelist. */ n = get4byte(&pPage1->aData[36]); testcase( n==mxPage-1 ); - if( n>=mxPage ){ + if( sqlite3PagerIsUnlocked(pBt->pPager)==0 && n>=mxPage ){ return SQLITE_CORRUPT_BKPT; } @@ -5791,7 +5802,6 @@ static int allocateBtreePage( ** of these operations involve modifying page 1 header fields, page 1 ** will definitely be written by this transaction. If this is an UNLOCKED ** transaction, ensure the BtreePtrmap structure has been allocated. */ - assert( eMode!=BTALLOC_EXACT || sqlite3PagerIsUnlocked(pBt->pPager)==0 ); rc = sqlite3PagerWrite(pPage1->pDbPage); if( rc ) return rc; @@ -5805,19 +5815,25 @@ static int allocateBtreePage( ** shows that the page 'nearby' is somewhere on the free-list, then ** the entire-list will be searched for that page. */ -#ifndef SQLITE_OMIT_AUTOVACUUM if( eMode==BTALLOC_EXACT ){ - if( nearby<=mxPage ){ - u8 eType; - assert( nearby>0 ); - assert( pBt->autoVacuum ); - rc = ptrmapGet(pBt, nearby, &eType, 0); - if( rc ) return rc; - if( eType==PTRMAP_FREEPAGE ){ - searchList = 1; + assert( ISAUTOVACUUM==!sqlite3PagerIsUnlocked(pBt->pPager) ); + if( ISAUTOVACUUM ){ + if( nearby<=mxPage ){ + u8 eType; + assert( nearby>0 ); + assert( pBt->autoVacuum ); + rc = ptrmapGet(pBt, nearby, &eType, 0); + if( rc ) return rc; + if( eType==PTRMAP_FREEPAGE ){ + searchList = 1; + } } + }else{ + searchList = 1; } - }else if( eMode==BTALLOC_LE ){ + } +#ifndef SQLITE_OMIT_AUTOVACUUM + else if( eMode==BTALLOC_LE ){ searchList = 1; } #endif diff --git a/test/unlocked2.test b/test/unlocked2.test index 1ec9050b60..42742111c8 100644 --- a/test/unlocked2.test +++ b/test/unlocked2.test @@ -187,5 +187,39 @@ do_execsql_test 3.5.2 { } {2} do_execsql_test 3.5.3 { PRAGMA integrity_check } {ok} +#------------------------------------------------------------------------- +# Test that nothing goes wrong if an UNLOCKED transaction allocates a +# page at the end of the file, frees it within the same transaction, and +# then has to move the same page to avoid a conflict on COMMIT. +# +do_multiclient_test tn { + do_test 4.$tn.1 { + sql1 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(x); + CREATE TABLE t2(x); + } + } {wal} + + do_test 4.$tn.2 { + sql1 { + BEGIN UNLOCKED; + INSERT INTO t1 VALUES(randomblob(1500)); + INSERT INTO t1 VALUES(randomblob(1500)); + DELETE FROM t1 WHERE rowid = 1; + } + + sql2 { + INSERT INTO t2 VALUES(randomblob(1500)); + INSERT INTO t2 VALUES(randomblob(1500)); + INSERT INTO t2 VALUES(randomblob(1500)); + INSERT INTO t2 VALUES(randomblob(1500)); + DELETE FROM t2 WHERE rowid IN (1, 2); + } + + sql1 COMMIT + } {} +} + finish_test From 572a21c8e99373636abb5a76f019794bcc57c7a9 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 21 Aug 2015 18:55:22 +0000 Subject: [PATCH 009/113] When committing an UNLOCKED transaction, try to move pages allocated at the end of the file to free slots within the file (like an incremental-vacuum operation does). FossilOrigin-Name: 069679162d8d50e9731831e658aa58f280dbb3e7 --- manifest | 14 ++++++------- manifest.uuid | 2 +- src/btree.c | 49 ++++++++++++++++++++++++++++++++------------- test/unlocked2.test | 4 ++++ 4 files changed, 47 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index ed83b7c162..ce414f1bbb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sUNLOCKED\stransactions\sthat\sfree\spages\sallocated\swithin\sthe\ssame\stransaction. -D 2015-08-21T17:57:16.096 +C When\scommitting\san\sUNLOCKED\stransaction,\stry\sto\smove\spages\sallocated\sat\sthe\send\sof\sthe\sfile\sto\sfree\sslots\swithin\sthe\sfile\s(like\san\sincremental-vacuum\soperation\sdoes). +D 2015-08-21T18:55:22.935 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 4f663b6b4954b9b1eb0e6f08387688a93b57542d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -278,7 +278,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 4d9134dc988a87838c06056c89c0e8c4700a0452 F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c fca7884ea849190eff530f358f96c7304fcd2595 +F src/btree.c e455c3dbe8534aae357eab8ede1e280b6e838af0 F src/btree.h 00d4cdb747c4172a5566faf037116985dbbc377e F src/btreeInt.h 1f7258e1f35ba3cc2197f9019f523dd20d59a0d8 F src/build.c e47b6fffe14a28d9050e6747beebb01597d37542 @@ -1226,7 +1226,7 @@ F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 41e7f83c6827605991160a31380148a9fc5f1339 F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825 F test/unlocked.test d143a871bd874311d4e5c98ce458218ca6b579fd -F test/unlocked2.test 4861218039ca2481613d7e6a999226185222c93a +F test/unlocked2.test 1e645e6f6808e4303f1766d8c615c22714f31541 F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 F test/uri.test 23662b7b61958b0f0e47082de7d06341ccf85d5b @@ -1378,7 +1378,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P deaf3b18569025d8d168da29fae76142cfffe9e5 -R f09b37f1aebb9ccbb19d5d48d89374eb +P 227bb8a1815c4dc6084970f06b0a6bfccdff3fd2 +R 59f0ca349927e5f594c9b22ba4f42852 U dan -Z 1ea7f2e6e188cedc2dae0825d7ceb725 +Z 06941d0e9b57ce8c4c11e26554097e38 diff --git a/manifest.uuid b/manifest.uuid index 4ee4bbbd4b..167dab9ea2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -227bb8a1815c4dc6084970f06b0a6bfccdff3fd2 \ No newline at end of file +069679162d8d50e9731831e658aa58f280dbb3e7 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 0bd34c7439..bf76254afe 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3860,7 +3860,6 @@ static int btreeFixUnlocked(Btree *p){ BtreePtrmap *pMap = pBt->pMap; Pgno iTrunk = get4byte(&p1[32]); Pgno nPage = btreePagecount(pBt); - Pgno nOrig = pMap->iFirst-1; u32 nFree = get4byte(&p1[36]); assert( sqlite3PagerIsUnlocked(pPager) ); @@ -3891,10 +3890,12 @@ static int btreeFixUnlocked(Btree *p){ }; } - if( nHPageiFirst-1) ){ + /* The database consisted of (pMap->iFirst-1) pages when the current + ** unlocked transaction was opened. And an unlocked transaction may + ** not be executed on an auto-vacuum database - so the db should + ** not have shrunk since the transaction was opened. Therefore nHPage + ** should be set to (pMap->iFirst-1) or greater. */ rc = SQLITE_CORRUPT_BKPT; }else{ /* The current transaction allocated pages pMap->iFirst through @@ -3904,8 +3905,9 @@ static int btreeFixUnlocked(Btree *p){ */ Pgno iLast = MIN(nPage, nHPage); /* Last page to move */ Pgno iPg; + Pgno nCurrent; /* Current size of db */ - nFinal = MAX(nPage, nHPage); + nCurrent = MAX(nPage, nHPage); for(iPg=pMap->iFirst; iPg<=iLast && rc==SQLITE_OK; iPg++){ MemPage *pPg = 0; Pgno iNew; /* New page number for pPg */ @@ -3922,11 +3924,35 @@ static int btreeFixUnlocked(Btree *p){ btreeGetPage(pBt, iPg, &pPg, 0); assert( sqlite3PagerIswriteable(pPg->pDbPage) ); assert( sqlite3PagerPageRefcount(pPg->pDbPage)==1 ); - iNew = ++nFinal; + iNew = ++nCurrent; rc = relocatePage(pBt, pPg, pEntry->eType, pEntry->parent, iNew, 1); releasePageNotNull(pPg); } } + sqlite3PagerSetDbsize(pPager, nCurrent); + + nFree = get4byte(&p1[36]); + nFinal = MAX(nCurrent-nFree, nHPage); + + for(iPg=nFinal+1; rc==SQLITE_OK && iPgaPtr[iPg - pMap->iFirst]; + if( pEntry->eType==PTRMAP_FREEPAGE ){ + rc = allocateBtreePage(pBt, &pFree, &iNew, iPg, BTALLOC_EXACT); + releasePage(pFree); + }else{ + rc = allocateBtreePage(pBt, &pFree, &iNew, nFinal, BTALLOC_LE); + releasePage(pFree); + if( rc==SQLITE_OK ){ + MemPage *pPg = 0; + btreeGetPage(pBt, iPg, &pPg, 0); + rc = relocatePage(pBt, pPg, pEntry->eType, pEntry->parent,iNew,1); + } + } + } put4byte(&p1[28], nFinal); } } @@ -5784,9 +5810,7 @@ static int allocateBtreePage( Pgno mxPage; /* Total size of the database file */ assert( sqlite3_mutex_held(pBt->mutex) ); - assert( eMode==BTALLOC_ANY || (nearby>0 && ISAUTOVACUUM) - || (eMode==BTALLOC_EXACT && sqlite3PagerIsUnlocked(pBt->pPager)) - ); + assert( eMode==BTALLOC_ANY || (nearby>0 && REQUIRE_PTRMAP ) ); pPage1 = pBt->pPage1; mxPage = btreePagecount(pBt); /* EVIDENCE-OF: R-05119-02637 The 4-byte big-endian integer at offset 36 @@ -5831,12 +5855,9 @@ static int allocateBtreePage( }else{ searchList = 1; } - } -#ifndef SQLITE_OMIT_AUTOVACUUM - else if( eMode==BTALLOC_LE ){ + }else if( eMode==BTALLOC_LE ){ searchList = 1; } -#endif /* Decrement the free-list count by 1. Set iTrunk to the index of the ** first free-list trunk page. iPrevTrunk is initially 1. diff --git a/test/unlocked2.test b/test/unlocked2.test index 42742111c8..e5b102aa02 100644 --- a/test/unlocked2.test +++ b/test/unlocked2.test @@ -25,6 +25,7 @@ do_multiclient_test tn { CREATE TABLE t2(y); } } {wal} + do_test 1.$tn.5 { sql3 { PRAGMA integrity_check } } {ok} # Test that an UNLOCKED transaction that allocates/frees no pages does # not conflict with a transaction that does allocate pages. @@ -40,6 +41,7 @@ do_multiclient_test tn { COMMIT; } } {} + do_test 1.$tn.5 { sql3 { PRAGMA integrity_check } } {ok} # But that an UNLOCKED transaction does conflict with a transaction # that modifies the db schema. @@ -53,6 +55,7 @@ do_multiclient_test tn { } list [catch { sql1 COMMIT } msg] $msg } {1 {database is locked}} + do_test 1.$tn.5 { sql3 { PRAGMA integrity_check } } {ok} # Test that an UNLOCKED transaction that allocates at least one page # does not conflict with a transaction that allocates no pages. @@ -65,6 +68,7 @@ do_multiclient_test tn { sql2 { INSERT INTO t2 VALUES(8); } + breakpoint sql1 { COMMIT; } From b87b25f21926b2fad83fa28fa0bc2827ef170a1a Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 21 Aug 2015 20:11:23 +0000 Subject: [PATCH 010/113] Fix many minor issues in the unlocked transaction code. FossilOrigin-Name: 53aaeea6c98f82f3b55d4b3ab139ee41b727243c --- manifest | 26 +++++++++++++------------- manifest.uuid | 2 +- src/btree.c | 2 +- src/main.c | 1 - src/pager.c | 5 +---- src/pager.h | 5 ++--- src/vacuum.c | 2 +- src/vdbeaux.c | 2 +- src/wal.c | 19 ------------------- src/wal.h | 2 -- 10 files changed, 20 insertions(+), 46 deletions(-) diff --git a/manifest b/manifest index ce414f1bbb..4c65a4a62a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\scommitting\san\sUNLOCKED\stransaction,\stry\sto\smove\spages\sallocated\sat\sthe\send\sof\sthe\sfile\sto\sfree\sslots\swithin\sthe\sfile\s(like\san\sincremental-vacuum\soperation\sdoes). -D 2015-08-21T18:55:22.935 +C Fix\smany\sminor\sissues\sin\sthe\sunlocked\stransaction\scode. +D 2015-08-21T20:11:23.106 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 4f663b6b4954b9b1eb0e6f08387688a93b57542d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -278,7 +278,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 4d9134dc988a87838c06056c89c0e8c4700a0452 F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c e455c3dbe8534aae357eab8ede1e280b6e838af0 +F src/btree.c dc80ac8374105e3caf298a6533e3312101691330 F src/btree.h 00d4cdb747c4172a5566faf037116985dbbc377e F src/btreeInt.h 1f7258e1f35ba3cc2197f9019f523dd20d59a0d8 F src/build.c e47b6fffe14a28d9050e6747beebb01597d37542 @@ -301,7 +301,7 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e F src/lempar.c 92bafa308607dd985ca389a788cd9e0a2b608712 F src/loadext.c dfcee8c7c032cd0fd55af3e0fc1fcfb01e426df2 -F src/main.c f4a8a75649073b85048505e2bdda4419936d9eb6 +F src/main.c e17fcffae4306a9b8334faf3bac80d7396850b54 F src/malloc.c 19461e159bccf0e2cf06a50e867963d0a7b124a8 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c abe6ee469b6c5a35c7f22bfeb9c9bac664a1c987 @@ -323,8 +323,8 @@ F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa F src/os_unix.c 388c023582b17890f10c980b30ec1922b471753b F src/os_win.c 40b3af7a47eb1107d0d69e592bec345a3b7b798a F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca -F src/pager.c 48a76f16a75112c9b064e21e1d1ecf0b4d87b5cd -F src/pager.h 3fc23bca2e7d606ca4fbdd923713cdcdcec48297 +F src/pager.c 951b7bae30fcbc2a2d380fa68f8bc68286ae0760 +F src/pager.h 1e7b0fc3846b71bd95b4b3300820d756895cb4ef F src/parse.y e9accdb2cb1795f75f478e7ce89e17b19d7d4da7 F src/pcache.c cde06aa50962595e412d497e22fd2e07878ba1f0 F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9 @@ -398,20 +398,20 @@ F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f F src/update.c 487747b328b7216bb7f6af0695d6937d5c9e605f F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c bc9dd64b5db544218b871b66243871c202b2781f -F src/vacuum.c 4e7e18d889662eda281855a7125e56269069f215 +F src/vacuum.c d35c7291e94a470ee47695c22559a69aef9fdda1 F src/vdbe.c 97b07a1af65971dab3d326742e912ac8c12108dd F src/vdbe.h 7a75045d879118b9d3af7e8b3c108f2f27c51473 F src/vdbeInt.h 8b54e01ad0463590e7cffabce0bc36da9ee4f816 F src/vdbeapi.c bda74ef4b5103d7b4a4be36f936d3cf2b56a7d6f -F src/vdbeaux.c 0d62c6c2522d4a04e051d3862dfe7ae2f5c95598 +F src/vdbeaux.c 4fae90f55736b7537d0fcd2afe52849edbbb7ecd F src/vdbeblob.c 4f2e8e075d238392df98c5e03a64342465b03f90 F src/vdbemem.c ae38a0d35ae71cf604381a887c170466ba518090 F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 F src/vtab.c d31174e4c8f592febab3fa7f69e18320b4fd657a F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb -F src/wal.c 37b25bbb52d6a736397d11e85068b1a496970fb2 -F src/wal.h 5aaed8ca6cad1406088042ff8767951a6a3c7b56 +F src/wal.c 0ba4899f02457be91fe5bc734638fee00c807f64 +F src/wal.h a701096b9bf5761b8c5f4b07082249e1950afc9a F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba F src/where.c 66518a14a1238611aa0744d6980b6b7f544f4816 F src/whereInt.h 880a8599226ac1c00203490d934f3ed79b292572 @@ -1378,7 +1378,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 227bb8a1815c4dc6084970f06b0a6bfccdff3fd2 -R 59f0ca349927e5f594c9b22ba4f42852 +P 069679162d8d50e9731831e658aa58f280dbb3e7 +R 98654e6b793f843bd7dce43cd408dae9 U dan -Z 06941d0e9b57ce8c4c11e26554097e38 +Z 8f0a71142a3eb918cc8670c51bd39224 diff --git a/manifest.uuid b/manifest.uuid index 167dab9ea2..c4520623e3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -069679162d8d50e9731831e658aa58f280dbb3e7 \ No newline at end of file +53aaeea6c98f82f3b55d4b3ab139ee41b727243c \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index bf76254afe..fd7afc073c 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3906,8 +3906,8 @@ static int btreeFixUnlocked(Btree *p){ Pgno iLast = MIN(nPage, nHPage); /* Last page to move */ Pgno iPg; Pgno nCurrent; /* Current size of db */ - nCurrent = MAX(nPage, nHPage); + for(iPg=pMap->iFirst; iPg<=iLast && rc==SQLITE_OK; iPg++){ MemPage *pPg = 0; Pgno iNew; /* New page number for pPg */ diff --git a/src/main.c b/src/main.c index fdf1584933..575cad92c5 100644 --- a/src/main.c +++ b/src/main.c @@ -2744,7 +2744,6 @@ static int openDatabase( memcpy(db->aLimit, aHardLimit, sizeof(db->aLimit)); db->aLimit[SQLITE_LIMIT_WORKER_THREADS] = SQLITE_DEFAULT_WORKER_THREADS; db->autoCommit = 1; - db->bUnlocked = 0; db->nextAutovac = -1; db->szMmap = sqlite3GlobalConfig.szMmap; db->nextPagesize = 0; diff --git a/src/pager.c b/src/pager.c index ac2f6bf1a6..c55db40150 100644 --- a/src/pager.c +++ b/src/pager.c @@ -5631,8 +5631,6 @@ int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){ pPager->pAllRead = sqlite3BitvecCreate(pPager->dbSize); if( pPager->pAllRead==0 ){ rc = SQLITE_NOMEM; - }else{ - rc = sqlite3BitvecSet(pPager->pAllRead, 1); } } }else{ @@ -6155,8 +6153,7 @@ void sqlite3PagerDropExclusiveLock(Pager *pPager){ } /* -** Return true if this is a WAL database and snapshot upgrade is required -** before the current transaction can be committed. +** Return true if this pager is currently within an UNLOCKED transaction. */ int sqlite3PagerIsUnlocked(Pager *pPager){ return pPager->pAllRead!=0; diff --git a/src/pager.h b/src/pager.h index 92e5546282..c097c97c5b 100644 --- a/src/pager.h +++ b/src/pager.h @@ -145,7 +145,6 @@ int sqlite3PagerMovepage(Pager*,DbPage*,Pgno,int); int sqlite3PagerPageRefcount(DbPage*); void *sqlite3PagerGetData(DbPage *); void *sqlite3PagerGetExtra(DbPage *); -int sqlite3PagerIsDirty(DbPage*); /* Functions used to manage pager transactions and savepoints. */ void sqlite3PagerPagecount(Pager*, int*); @@ -159,8 +158,6 @@ int sqlite3PagerOpenSavepoint(Pager *pPager, int n); int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint); int sqlite3PagerSharedLock(Pager *pPager); -void sqlite3PagerDropExclusiveLock(Pager*); -int sqlite3PagerIsUnlocked(Pager*); #ifndef SQLITE_OMIT_WAL int sqlite3PagerCheckpoint(Pager *pPager, int, int*, int*); @@ -197,6 +194,8 @@ void sqlite3PagerTruncateImage(Pager*,Pgno); void sqlite3PagerRekey(DbPage*, Pgno, u16); +void sqlite3PagerDropExclusiveLock(Pager*); +int sqlite3PagerIsUnlocked(Pager*); int sqlite3PagerIswriteable(DbPage*); int sqlite3PagerUpgradeSnapshot(Pager *pPager, DbPage*); void sqlite3PagerSetDbsize(Pager *pPager, Pgno); diff --git a/src/vacuum.c b/src/vacuum.c index 10f14cbf47..46f2249ebb 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -356,7 +356,7 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ ** is closed by the DETACH. */ db->autoCommit = 1; - db->bUnlocked = 0; + assert( db->bUnlocked==0 ); if( pDb ){ sqlite3BtreeClose(pDb->pBt); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index ce48707be7..354deb7294 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2571,7 +2571,7 @@ int sqlite3VdbeHalt(Vdbe *p){ } assert( db->nVdbeActive>0 || db->autoCommit==0 || db->nStatement==0 ); - return ((p->rc & 0xFF)==SQLITE_BUSY ? SQLITE_BUSY : SQLITE_OK); + return (p->rc==SQLITE_BUSY ? SQLITE_BUSY : SQLITE_OK); } diff --git a/src/wal.c b/src/wal.c index ac7e522ff5..a9d8a44086 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2671,25 +2671,6 @@ void sqlite3WalUpgradeSnapshot(Wal *pWal){ memcpy(&pWal->hdr, (void*)walIndexHdr(pWal), sizeof(WalIndexHdr)); } -/* -** This function is only ever called while committing an UNLOCKED -** transaction, after the caller has already obtained the WRITER lock -** (by calling the sqlite3WalLockForCommit() routine). This function -** returns true if the transaction was prepared against a database -** snapshot older than the current head of the wal file. -** -** Note that this will only work as described if the database is -** currently executing an UNLOCKED transaction, as it assumes that -** pWal->hdr has not been modified since the beginning of the -** transaction. This may not be true for a non-UNLOCKED transaction, -** as pWal->hdr is updated if any pages are spilled to the wal file -** while the transaction is executing. -*/ -int sqlite3WalCommitRequiresUpgrade(Wal *pWal){ - assert( pWal->writeLock ); - return memcmp(&pWal->hdr, (void*)walIndexHdr(pWal), sizeof(WalIndexHdr))!=0; -} - /* ** End a write transaction. The commit has already been done. This ** routine merely releases the lock. diff --git a/src/wal.h b/src/wal.h index 5b4ca15943..0609eded27 100644 --- a/src/wal.h +++ b/src/wal.h @@ -126,9 +126,7 @@ int sqlite3WalExclusiveMode(Wal *pWal, int op); */ int sqlite3WalHeapMemory(Wal *pWal); -/* Return true if the WRITER lock is held. False otherwise. */ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPg, Bitvec *pRead); -int sqlite3WalCommitRequiresUpgrade(Wal *pWal); void sqlite3WalUpgradeSnapshot(Wal *pWal); #ifdef SQLITE_ENABLE_ZIPVFS From f5cebf71fe65cab9dc4fd5b9ce9b96467e3d283f Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 22 Aug 2015 17:28:55 +0000 Subject: [PATCH 011/113] Add further tests for deferred page allocation. And fixes for the same. FossilOrigin-Name: ed0a31be726e60115a5dd73d4ed580201b400ab7 --- manifest | 17 +-- manifest.uuid | 2 +- src/btree.c | 282 ++++++++++++++++++++++++-------------------- src/btreeInt.h | 5 +- test/unlocked2.test | 34 +++++- test/unlocked3.test | 110 +++++++++++++++++ 6 files changed, 312 insertions(+), 138 deletions(-) create mode 100644 test/unlocked3.test diff --git a/manifest b/manifest index 6840db861c..bc04296ba0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sfurther\strunk\schanges. -D 2015-08-22T07:56:49.673 +C Add\sfurther\stests\sfor\sdeferred\spage\sallocation.\sAnd\sfixes\sfor\sthe\ssame. +D 2015-08-22T17:28:55.533 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e2218eb228374422969de7b1680eda6864affcef F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -279,9 +279,9 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 4d9134dc988a87838c06056c89c0e8c4700a0452 F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c dc80ac8374105e3caf298a6533e3312101691330 +F src/btree.c 245bc696824d5107f3570905325c6ac5b05c18f8 F src/btree.h 00d4cdb747c4172a5566faf037116985dbbc377e -F src/btreeInt.h 1f7258e1f35ba3cc2197f9019f523dd20d59a0d8 +F src/btreeInt.h 0c19847f87ab82e4f5e67750a069f10829475da6 F src/build.c e47b6fffe14a28d9050e6747beebb01597d37542 F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0 F src/complete.c addcd8160b081131005d5bc2d34adf20c1c5c92f @@ -1228,7 +1228,8 @@ F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 41e7f83c6827605991160a31380148a9fc5f1339 F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825 F test/unlocked.test d143a871bd874311d4e5c98ce458218ca6b579fd -F test/unlocked2.test 1e645e6f6808e4303f1766d8c615c22714f31541 +F test/unlocked2.test 7f913b404cda03f22bc7b299e8eb82a34d2880c5 +F test/unlocked3.test 4facd06286885faa9bd53713fa3d701ca403aeb2 F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 F test/uri.test 23662b7b61958b0f0e47082de7d06341ccf85d5b @@ -1380,7 +1381,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9021f7369f4b32db6126b3dc0ac75d11039625be 213a6c5ccbcfe4495d45e3608e99a6398751aeed -R d0dd8783a44e8da0a2326d10e188c817 +P c2327a3b8e5d604ab948b1e9f6cfc401429e51db +R c62a3f455b34280d099a1332c1c4f1e4 U dan -Z dd4c495d35a4ec7386b2f6d290b0dddd +Z 1442e612d3eba52580ab50755ceb943f diff --git a/manifest.uuid b/manifest.uuid index 4a13cf0ec4..545070a432 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c2327a3b8e5d604ab948b1e9f6cfc401429e51db \ No newline at end of file +ed0a31be726e60115a5dd73d4ed580201b400ab7 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index fd7afc073c..53b769720d 100644 --- a/src/btree.c +++ b/src/btree.c @@ -439,19 +439,14 @@ static void downgradeAllSharedCacheTableLocks(Btree *p){ #endif /* SQLITE_OMIT_SHARED_CACHE */ + +#ifdef SQLITE_ENABLE_UNLOCKED /* -** The following structure stores the in-memory pointer map used for newly -** allocated pages in UNLOCKED transactions. Such pages are always allocated -** in a contiguous block (from the end of the file) starting with page -** BtreePtrmap.iFirst. -** -** The page number for the parent page iFirst is stored in aPtr[0]. For -** (iFirst+1), aPtr[1]. A zero value indicates that the page has not -** been allocated. -** -** +** The following structure - BtreePtrmap - stores the in-memory pointer map +** used for newly allocated pages in UNLOCKED transactions. Such pages are +** always allocated in a contiguous block (from the end of the file) starting +** with page BtreePtrmap.iFirst. */ - typedef struct RollbackEntry RollbackEntry; typedef struct PtrmapEntry PtrmapEntry; struct PtrmapEntry { @@ -463,7 +458,6 @@ struct RollbackEntry { Pgno parent; u8 eType; }; - struct BtreePtrmap { Pgno iFirst; /* First new page number aPtr[0] */ @@ -479,17 +473,22 @@ struct BtreePtrmap { RollbackEntry *aRollback; /* Array of rollback entries */ }; +/* +** If page number pgno is greater than or equal to BtreePtrmap.iFirst, +** store an entry for it in the pointer-map structure. +*/ static int btreePtrmapStore( - BtreePtrmap *pMap, - Pgno pgno, + BtShared *pBt, + Pgno pgno, u8 eType, Pgno parent ){ + BtreePtrmap *pMap = pBt->pMap; if( pgno>=pMap->iFirst ){ int iEntry = pgno - pMap->iFirst; - /* Grow the aPtr[] array if required */ - if( iEntry>=pMap->nPtrAlloc ){ + /* Grow the aPtr[] array as required */ + while( iEntry>=pMap->nPtrAlloc ){ int nNew = pMap->nPtrAlloc ? pMap->nPtrAlloc*2 : 16; PtrmapEntry *aNew = (PtrmapEntry*)sqlite3_realloc( pMap->aPtr, nNew*sizeof(PtrmapEntry) @@ -535,8 +534,9 @@ static int btreePtrmapStore( /* ** Open savepoint iSavepoint, if it is not already open. */ -static int btreePtrmapBegin(BtreePtrmap *pMap, int nSvpt){ - if( nSvptnSvpt ){ +static int btreePtrmapBegin(BtShared *pBt, int nSvpt){ + BtreePtrmap *pMap = pBt->pMap; + if( pMap && nSvptnSvpt ){ int i; if( nSvpt>=pMap->nSvptAlloc ){ int nNew = pMap->nSvptAlloc ? pMap->nSvptAlloc*2 : 16; @@ -562,28 +562,72 @@ static int btreePtrmapBegin(BtreePtrmap *pMap, int nSvpt){ ** Rollback (if op==SAVEPOINT_ROLLBACK) or release (if op==SAVEPOINT_RELEASE) ** savepoint iSvpt. */ -static void btreePtrmapEnd(BtreePtrmap *pMap, int op, int iSvpt){ - assert( op==SAVEPOINT_ROLLBACK || op==SAVEPOINT_RELEASE ); - assert( iSvpt>=0 || (iSvpt==-1 && op==SAVEPOINT_ROLLBACK) ); - if( iSvpt<0 ){ - pMap->nSvpt = 0; - pMap->nRollback = 0; - memset(pMap->aPtr, 0, sizeof(Pgno) * pMap->nPtrAlloc); - }else if( iSvptnSvpt ){ - if( op==SAVEPOINT_ROLLBACK ){ - int ii; - for(ii=pMap->nRollback-1; ii>=pMap->aSvpt[iSvpt]; ii--){ - RollbackEntry *p = &pMap->aRollback[ii]; - PtrmapEntry *pEntry = &pMap->aPtr[p->pgno - pMap->iFirst]; - pEntry->parent = p->parent; - pEntry->eType = p->eType; +static void btreePtrmapEnd(BtShared *pBt, int op, int iSvpt){ + BtreePtrmap *pMap = pBt->pMap; + if( pMap ){ + assert( op==SAVEPOINT_ROLLBACK || op==SAVEPOINT_RELEASE ); + assert( iSvpt>=0 || (iSvpt==-1 && op==SAVEPOINT_ROLLBACK) ); + if( iSvpt<0 ){ + pMap->nSvpt = 0; + pMap->nRollback = 0; + memset(pMap->aPtr, 0, sizeof(Pgno) * pMap->nPtrAlloc); + }else if( iSvptnSvpt ){ + if( op==SAVEPOINT_ROLLBACK ){ + int ii; + for(ii=pMap->nRollback-1; ii>=pMap->aSvpt[iSvpt]; ii--){ + RollbackEntry *p = &pMap->aRollback[ii]; + PtrmapEntry *pEntry = &pMap->aPtr[p->pgno - pMap->iFirst]; + pEntry->parent = p->parent; + pEntry->eType = p->eType; + } } + pMap->nSvpt = iSvpt + (op==SAVEPOINT_ROLLBACK); + pMap->nRollback = pMap->aSvpt[iSvpt]; } - pMap->nSvpt = iSvpt + (op==SAVEPOINT_ROLLBACK); - pMap->nRollback = pMap->aSvpt[iSvpt]; } } +/* +** This function is called after an UNLOCKED transaction is opened on the +** database. It allocates the BtreePtrmap structure used to track pointers +** to allocated pages and zeroes the nFree/iTrunk fields in the database +** header on page 1. +*/ +static int btreePtrmapAllocate(BtShared *pBt){ + int rc = SQLITE_OK; + BtreePtrmap *pMap = sqlite3_malloc(sizeof(BtreePtrmap)); + assert( pBt->pMap==0 && sqlite3PagerIsUnlocked(pBt->pPager) ); + if( pMap==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(&pBt->pPage1->aData[32], 0, sizeof(u32)*2); + memset(pMap, 0, sizeof(BtreePtrmap)); + pMap->iFirst = pBt->nPage + 1; + pBt->pMap = pMap; + } + return rc; +} + +/* +** Free any BtreePtrmap structure allocated by an earlier call to +** btreePtrmapAllocate(). +*/ +static void btreePtrmapDelete(BtShared *pBt){ + BtreePtrmap *pMap = pBt->pMap; + if( pMap ){ + sqlite3_free(pMap->aRollback); + sqlite3_free(pMap->aPtr); + sqlite3_free(pMap->aSvpt); + sqlite3_free(pMap); + pBt->pMap = 0; + } +} +#else +# define btreePtrmapAllocate(x) SQLITE_OK +# define btreePtrmapDelete(x) +# define btreePtrmapBegin(x,y) SQLITE_OK +# define btreePtrmapEnd(x,y,z) +#endif static void releasePage(MemPage *pPage); /* Forward reference */ @@ -1024,44 +1068,49 @@ static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){ int offset; /* Offset in pointer map page */ int rc; /* Return code from subfunctions */ - assert( sqlite3_mutex_held(pBt->mutex) ); if( *pRC ) return; + assert( sqlite3_mutex_held(pBt->mutex) ); + /* The master-journal page number is never added to a pointer-map page */ + assert( 0==PTRMAP_ISPAGE(pBt, PENDING_BYTE_PAGE(pBt)) ); + +#ifdef SQLITE_ENABLE_UNLOCKED if( pBt->pMap ){ - *pRC = btreePtrmapStore(pBt->pMap, key, eType, parent); - }else{ - /* The master-journal page number must never be used as a ptr map page */ - assert( 0==PTRMAP_ISPAGE(pBt, PENDING_BYTE_PAGE(pBt)) ); + *pRC = btreePtrmapStore(pBt, key, eType, parent); + return; + } +#endif - assert( pBt->autoVacuum ); - if( key==0 ){ - *pRC = SQLITE_CORRUPT_BKPT; - return; - } - iPtrmap = PTRMAP_PAGENO(pBt, key); - rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage); - if( rc!=SQLITE_OK ){ - *pRC = rc; - return; - } - offset = PTRMAP_PTROFFSET(iPtrmap, key); - if( offset<0 ){ - *pRC = SQLITE_CORRUPT_BKPT; - }else{ - assert( offset <= (int)pBt->usableSize-5 ); - pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage); + assert( pBt->autoVacuum ); + if( key==0 ){ + *pRC = SQLITE_CORRUPT_BKPT; + return; + } + iPtrmap = PTRMAP_PAGENO(pBt, key); + rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage); + if( rc!=SQLITE_OK ){ + *pRC = rc; + return; + } + offset = PTRMAP_PTROFFSET(iPtrmap, key); + if( offset<0 ){ + *pRC = SQLITE_CORRUPT_BKPT; + goto ptrmap_exit; + } + assert( offset <= (int)pBt->usableSize-5 ); + pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage); - if( eType!=pPtrmap[offset] || get4byte(&pPtrmap[offset+1])!=parent ){ - TRACE(("PTRMAP_UPDATE: %d->(%d,%d)\n", key, eType, parent)); - *pRC= rc = sqlite3PagerWrite(pDbPage); - if( rc==SQLITE_OK ){ - pPtrmap[offset] = eType; - put4byte(&pPtrmap[offset+1], parent); - } - } + if( eType!=pPtrmap[offset] || get4byte(&pPtrmap[offset+1])!=parent ){ + TRACE(("PTRMAP_UPDATE: %d->(%d,%d)\n", key, eType, parent)); + *pRC= rc = sqlite3PagerWrite(pDbPage); + if( rc==SQLITE_OK ){ + pPtrmap[offset] = eType; + put4byte(&pPtrmap[offset+1], parent); } - sqlite3PagerUnref(pDbPage); } + +ptrmap_exit: + sqlite3PagerUnref(pDbPage); } /* @@ -2072,50 +2121,6 @@ u32 sqlite3BtreeLastPage(Btree *p){ return btreePagecount(p->pBt); } -#ifdef SQLITE_ENABLE_UNLOCKED -/* -** This function is called before allocating or freeing a b-tree page. If -** the current transaction is UNLOCKED, it allocates the BtreePtrmap -** structure and zeroes the nFree/iTrunk fields in the database header -** on page 1. -*/ -static int allocatePtrmap(BtShared *pBt){ - int rc = SQLITE_OK; - if( pBt->pMap==0 && sqlite3PagerIsUnlocked(pBt->pPager) ){ - /* If this is an unlocked transaction, set the header values - ** identifying the size of the free-list and the page number - ** of the first trunk page to zero. */ - BtreePtrmap *pMap = sqlite3_malloc(sizeof(BtreePtrmap)); - if( pMap==0 ){ - rc = SQLITE_NOMEM; - }else{ - memset(&pBt->pPage1->aData[32], 0, sizeof(u32)*2); - memset(pMap, 0, sizeof(BtreePtrmap)); - pMap->iFirst = btreePagecount(pBt) + 1; - pBt->pMap = pMap; - } - } - return rc; -} - -/* -** Free a pointer-map allocated by allocatePtrmap. -*/ -static void deletePtrmap(BtShared *pBt){ - BtreePtrmap *pMap = pBt->pMap; - if( pMap ){ - sqlite3_free(pMap->aRollback); - sqlite3_free(pMap->aPtr); - sqlite3_free(pMap->aSvpt); - sqlite3_free(pMap); - pBt->pMap = 0; - } -} -#else -#define allocatePtrmap(x) SQLITE_OK -#define deletePtrmap(x) -#endif - /* ** Get a page from the pager and initialize it. ** @@ -3341,8 +3346,8 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ if( rc==SQLITE_OK ){ rc = newDatabase(pBt); } - if( rc==SQLITE_OK ){ - rc = allocatePtrmap(pBt); + if( rc==SQLITE_OK && sqlite3PagerIsUnlocked(pBt->pPager) ){ + rc = btreePtrmapAllocate(pBt); } } } @@ -3402,8 +3407,8 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ */ int nSavepoint = p->db->nSavepoint; rc = sqlite3PagerOpenSavepoint(pBt->pPager, nSavepoint); - if( pBt->pMap && rc==SQLITE_OK && nSavepoint ){ - rc = btreePtrmapBegin(pBt->pMap, nSavepoint); + if( rc==SQLITE_OK && nSavepoint ){ + rc = btreePtrmapBegin(pBt, nSavepoint); } } @@ -3841,6 +3846,7 @@ static int autoVacuumCommit(BtShared *pBt){ # define setChildPtrmaps(x) SQLITE_OK #endif +#ifdef SQLITE_ENABLE_UNLOCKED /* ** The b-tree handle passed as the only argument is about to commit an ** UNLOCKED transaction. At this point it is guaranteed that this is @@ -3913,6 +3919,7 @@ static int btreeFixUnlocked(Btree *p){ Pgno iNew; /* New page number for pPg */ PtrmapEntry *pEntry; /* Pointer map entry for page iPg */ + if( iPg==PENDING_BYTE_PAGE(pBt) ) continue; pEntry = &pMap->aPtr[iPg - pMap->iFirst]; if( pEntry->eType==PTRMAP_FREEPAGE ){ MemPage *pFree = 0; @@ -3925,31 +3932,39 @@ static int btreeFixUnlocked(Btree *p){ assert( sqlite3PagerIswriteable(pPg->pDbPage) ); assert( sqlite3PagerPageRefcount(pPg->pDbPage)==1 ); iNew = ++nCurrent; + if( iNew==PENDING_BYTE_PAGE(pBt) ) iNew = ++nCurrent; rc = relocatePage(pBt, pPg, pEntry->eType, pEntry->parent, iNew, 1); releasePageNotNull(pPg); } } sqlite3PagerSetDbsize(pPager, nCurrent); + assert( nCurrent!=PENDING_BYTE_PAGE(pBt) ); nFree = get4byte(&p1[36]); nFinal = MAX(nCurrent-nFree, nHPage); + if( nCurrent>PENDING_BYTE_PAGE(pBt) && nFinal<=PENDING_BYTE_PAGE(pBt) ){ + nFinal--; + } - for(iPg=nFinal+1; rc==SQLITE_OK && iPgaPtr[iPg - pMap->iFirst]; if( pEntry->eType==PTRMAP_FREEPAGE ){ rc = allocateBtreePage(pBt, &pFree, &iNew, iPg, BTALLOC_EXACT); releasePage(pFree); }else{ rc = allocateBtreePage(pBt, &pFree, &iNew, nFinal, BTALLOC_LE); + assert( rc!=SQLITE_OK || iNew<=nFinal ); releasePage(pFree); if( rc==SQLITE_OK ){ MemPage *pPg = 0; btreeGetPage(pBt, iPg, &pPg, 0); rc = relocatePage(pBt, pPg, pEntry->eType, pEntry->parent,iNew,1); + releasePage(pPg); } } } @@ -3961,6 +3976,7 @@ static int btreeFixUnlocked(Btree *p){ return rc; } +#endif /* ** This routine does the first phase of a two-phase commit. This routine @@ -3995,11 +4011,8 @@ int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zMaster){ sqlite3BtreeEnter(p); #ifndef SQLITE_OMIT_AUTOVACUUM - /* Figure out if this is a commit of an UNLOCKED transaction that - ** requires a snapshot upgrade. If so, skip any auto-vacuum - ** processing. */ if( pBt->autoVacuum ){ - assert( sqlite3PagerIsUnlocked(pBt->pPager)==0 ); + assert( ISUNLOCKED==0 ); rc = autoVacuumCommit(pBt); if( rc!=SQLITE_OK ){ sqlite3BtreeLeave(p); @@ -4010,7 +4023,7 @@ int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zMaster){ sqlite3PagerTruncateImage(pBt->pPager, pBt->nPage); } #endif - if( rc==SQLITE_OK && sqlite3PagerIsUnlocked(pBt->pPager) ){ + if( rc==SQLITE_OK && ISUNLOCKED ){ rc = btreeFixUnlocked(p); } if( rc==SQLITE_OK ){ @@ -4059,7 +4072,7 @@ static void btreeEndTransaction(Btree *p){ } /* If this was an UNLOCKED transaction, delete the pBt->pMap object */ - deletePtrmap(pBt); + btreePtrmapDelete(pBt); btreeIntegrity(p); } @@ -4285,8 +4298,8 @@ int sqlite3BtreeBeginStmt(Btree *p, int iStatement){ ** such savepoints while the statement transaction savepoint is active. */ rc = sqlite3PagerOpenSavepoint(pBt->pPager, iStatement); - if( rc==SQLITE_OK && pBt->pMap ){ - rc = btreePtrmapBegin(pBt->pMap, iStatement); + if( rc==SQLITE_OK ){ + rc = btreePtrmapBegin(pBt, iStatement); } sqlite3BtreeLeave(p); return rc; @@ -4311,7 +4324,7 @@ int sqlite3BtreeSavepoint(Btree *p, int op, int iSavepoint){ assert( op==SAVEPOINT_RELEASE || op==SAVEPOINT_ROLLBACK ); assert( iSavepoint>=0 || (iSavepoint==-1 && op==SAVEPOINT_ROLLBACK) ); sqlite3BtreeEnter(p); - if( pBt->pMap ) btreePtrmapEnd(pBt->pMap, op, iSavepoint); + btreePtrmapEnd(pBt, op, iSavepoint); rc = sqlite3PagerSavepoint(pBt->pPager, op, iSavepoint); if( rc==SQLITE_OK ){ if( iSavepoint<0 && (pBt->btsFlags & BTS_INITIALLY_EMPTY)!=0 ){ @@ -5817,7 +5830,7 @@ static int allocateBtreePage( ** stores stores the total number of pages on the freelist. */ n = get4byte(&pPage1->aData[36]); testcase( n==mxPage-1 ); - if( sqlite3PagerIsUnlocked(pBt->pPager)==0 && n>=mxPage ){ + if( ISUNLOCKED==0 && n>=mxPage ){ return SQLITE_CORRUPT_BKPT; } @@ -5840,7 +5853,7 @@ static int allocateBtreePage( ** the entire-list will be searched for that page. */ if( eMode==BTALLOC_EXACT ){ - assert( ISAUTOVACUUM==!sqlite3PagerIsUnlocked(pBt->pPager) ); + assert( ISAUTOVACUUM!=ISUNLOCKED ); if( ISAUTOVACUUM ){ if( nearby<=mxPage ){ u8 eType; @@ -9926,6 +9939,23 @@ int sqlite3BtreeIsReadonly(Btree *p){ */ int sqlite3HeaderSizeBtree(void){ return ROUND8(sizeof(MemPage)); } +/* +** This function is called to ensure that all locks required to commit the +** current write-transaction to the database file are held. If the db is +** in rollback mode, this means the EXCLUSIVE lock on the database file. +** +** Or, if this is an UNLOCKED transaction on a wal-mode database, the WRITER +** lock on the wal file. In this case this function also checks that the +** UNLOCKED transaction can be safely committed (does not commit with any +** other transaction committed since it was opened). +** +** SQLITE_OK is returned if successful. SQLITE_BUSY if the required locks +** cannot be obtained due to a conflicting lock. If the locks cannot be +** obtained for an UNLOCKED transaction due to a conflict with an already +** committed transaction, SQLITE_BUSY_SNAPSHOT is returned. Otherwise, if +** some other error (OOM, IO, etc.) occurs, the relevant SQLite error code +** is returned. +*/ int sqlite3BtreeExclusiveLock(Btree *p){ int rc; BtShared *pBt = p->pBt; diff --git a/src/btreeInt.h b/src/btreeInt.h index a60f2d5c17..4c23629cc8 100644 --- a/src/btreeInt.h +++ b/src/btreeInt.h @@ -664,11 +664,12 @@ struct BtCursor { #endif #ifdef SQLITE_ENABLE_UNLOCKED -# define REQUIRE_PTRMAP (ISAUTOVACUUM || pBt->pMap) +# define ISUNLOCKED (pBt->pMap!=0) #else -# define REQUIRE_PTRMAP ISAUTOVACUUM +# define ISUNLOCKED 0 #endif +#define REQUIRE_PTRMAP (ISAUTOVACUUM || ISUNLOCKED) /* ** This structure is passed around through all the sanity checking routines diff --git a/test/unlocked2.test b/test/unlocked2.test index e5b102aa02..927fe3e675 100644 --- a/test/unlocked2.test +++ b/test/unlocked2.test @@ -68,7 +68,6 @@ do_multiclient_test tn { sql2 { INSERT INTO t2 VALUES(8); } - breakpoint sql1 { COMMIT; } @@ -225,5 +224,38 @@ do_multiclient_test tn { } {} } +#------------------------------------------------------------------------- +# +do_multiclient_test tn { + do_test 5.$tn.1 { + sql1 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(x); + CREATE TABLE t2(x); + INSERT INTO t1 VALUES(randomblob(1500)); + PRAGMA page_count; + } + } {wal 4} + + do_test 5.$tn.2 { + sql1 { + BEGIN UNLOCKED; + INSERT INTO t2 VALUES(randomblob(1500)); + PRAGMA page_count; + } + } {5} + + do_test 5.$tn.3 { + sql2 { + DELETE FROM t1; + PRAGMA freelist_count; + PRAGMA page_count; + } + } {1 4} + + do_test 5.$tn.4 { sql1 COMMIT } {} + do_test 5.$tn.5 { sql3 { PRAGMA integrity_check } } {ok} +} + finish_test diff --git a/test/unlocked3.test b/test/unlocked3.test new file mode 100644 index 0000000000..04e741dc5b --- /dev/null +++ b/test/unlocked3.test @@ -0,0 +1,110 @@ +# 2015 July 26 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# Tests for transactions started with BEGIN UNLOCKED. The tests in this +# file focus on testing that deferred page allocation works properly. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/lock_common.tcl +set ::testprefix unlocked3 + +if {$AUTOVACUUM} { finish_test ; return } + +proc create_schema {} { + db eval { + PRAGMA journal_mode = wal; + + CREATE TABLE t1(x, y); + CREATE TABLE t2(x, y); + CREATE TABLE t3(x, y); + CREATE TABLE t4(x, y); + + CREATE INDEX i1 ON t1(y, x); + CREATE INDEX i2 ON t2(y, x); + CREATE INDEX i3 ON t3(y, x); + CREATE INDEX i4 ON t4(y, x); + } +} + +proc do_sql_op {iTbl iOp} { + set db "db$iTbl" + + switch $iOp { + "i" { + set sql " + WITH cnt(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM cnt WHERE i<10) + INSERT INTO t$iTbl SELECT randomblob(800), randomblob(800) FROM cnt; + " + } + + "d" { + set sql " + DELETE FROM t$iTbl WHERE rowid IN ( + SELECT rowid FROM t$iTbl ORDER BY 1 ASC LIMIT 10 + ) + " + } + + default { + error "bad iOp parameter: $iOp" + } + } + + $db eval $sql +} + + +set DBLIST {db1 db2 db3 db4} + +create_schema +foreach {tn oplist} { + 1 {1i 2i 3i 4i} + 2 {1iii 2iii 3iii 4iii} + 3 {1d 2d 3d 4d} + . ----------------------- + 4 {1i} + 5 {1d 2i} + . ----------------------- + 6 {1iii 2iii 3iii 4iii} + 7 {1di 2id 3iii 4ddd} + 8 {1iii 2iii 3iii 4iii} +} { + if {[string range $oplist 0 0]=="-"} { + reset_db + create_schema + continue + } + foreach db $DBLIST { sqlite3 $db test.db } + + do_test 1.$tn { + foreach db $DBLIST { $db eval "BEGIN UNLOCKED" } + + foreach op $oplist { + set iTbl [string range $op 0 0] + foreach char [split [string range $op 1 end] {}] { + do_sql_op $iTbl $char + } + } + + foreach db $DBLIST { $db eval "COMMIT" } + db eval {PRAGMA integrity_check} + } {ok} + + foreach db $DBLIST { + if {$db=="db2"} breakpoint + $db close + } +} + +finish_test + From 0c52b373a0d3606ca4475f506d67be9c568a7186 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 22 Aug 2015 20:32:39 +0000 Subject: [PATCH 012/113] Fix a problem to do with detecting unlocked transaction conflicts if another client restarts the wal while the transaction is running. FossilOrigin-Name: e3968b256282d8c0a87c26667b1ba02faf7a5a17 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/wal.c | 13 +++++++------ test/unlocked2.test | 35 +++++++++++++++++++++++++++++++++++ test/unlocked3.test | 18 ++++++++++++++++++ 5 files changed, 69 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index bc04296ba0..1778b94253 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sfurther\stests\sfor\sdeferred\spage\sallocation.\sAnd\sfixes\sfor\sthe\ssame. -D 2015-08-22T17:28:55.533 +C Fix\sa\sproblem\sto\sdo\swith\sdetecting\sunlocked\stransaction\sconflicts\sif\sanother\sclient\srestarts\sthe\swal\swhile\sthe\stransaction\sis\srunning. +D 2015-08-22T20:32:39.272 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e2218eb228374422969de7b1680eda6864affcef F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -411,7 +411,7 @@ F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 F src/vtab.c d31174e4c8f592febab3fa7f69e18320b4fd657a F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb -F src/wal.c 0ba4899f02457be91fe5bc734638fee00c807f64 +F src/wal.c 4c69d27ed7ec7006008d8309dc5c9ab742273c12 F src/wal.h a701096b9bf5761b8c5f4b07082249e1950afc9a F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba F src/where.c 66518a14a1238611aa0744d6980b6b7f544f4816 @@ -1228,8 +1228,8 @@ F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 41e7f83c6827605991160a31380148a9fc5f1339 F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825 F test/unlocked.test d143a871bd874311d4e5c98ce458218ca6b579fd -F test/unlocked2.test 7f913b404cda03f22bc7b299e8eb82a34d2880c5 -F test/unlocked3.test 4facd06286885faa9bd53713fa3d701ca403aeb2 +F test/unlocked2.test aaa42a08052a146466220b6c3a062ff3c4776ad6 +F test/unlocked3.test 06173e406a8c1a550448f79329ed4c3311905062 F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 F test/uri.test 23662b7b61958b0f0e47082de7d06341ccf85d5b @@ -1381,7 +1381,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c2327a3b8e5d604ab948b1e9f6cfc401429e51db -R c62a3f455b34280d099a1332c1c4f1e4 +P ed0a31be726e60115a5dd73d4ed580201b400ab7 +R 4d5e4d57de949c83b8660752ea3918ee U dan -Z 1442e612d3eba52580ab50755ceb943f +Z 75094882a86841f2760b97ee8543ae22 diff --git a/manifest.uuid b/manifest.uuid index 545070a432..c18cc52736 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ed0a31be726e60115a5dd73d4ed580201b400ab7 \ No newline at end of file +e3968b256282d8c0a87c26667b1ba02faf7a5a17 \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index a9d8a44086..fcf5a15044 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2594,13 +2594,14 @@ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPage1, Bitvec *pAllRead){ /* TODO: Check header checksum is good here. */ if( memcmp(&pWal->hdr, (void*)pHead, sizeof(WalIndexHdr))!=0 ){ - /* TODO: Is this safe? Because it holds the WRITER lock this thread - ** has exclusive access to the live header, but might it be corrupt? - ** This code should check that the wal-index-header is Ok, and return - ** SQLITE_BUSY_SNAPSHOT if it is not. */ int iHash; int iLastHash = walFramePage(pHead->mxFrame); - for(iHash=walFramePage(pWal->hdr.mxFrame+1); iHash<=iLastHash; iHash++){ + u32 iFirst = pWal->hdr.mxFrame+1; /* First wal frame to check */ + if( memcmp(pWal->hdr.aSalt, (u32*)pHead->aSalt, sizeof(u32)*2) ){ + assert( pWal->readLock==0 ); + iFirst = 1; + } + for(iHash=walFramePage(iFirst); iHash<=iLastHash; iHash++){ volatile ht_slot *aHash; volatile u32 *aPgno; u32 iZero; @@ -2608,7 +2609,7 @@ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPage1, Bitvec *pAllRead){ rc = walHashGet(pWal, iHash, &aHash, &aPgno, &iZero); if( rc==SQLITE_OK ){ int i; - int iMin = (pWal->hdr.mxFrame+1 - iZero); + int iMin = (iFirst - iZero); int iMax = (iHash==0) ? HASHTABLE_NPAGE_ONE : HASHTABLE_NPAGE; if( iMin<1 ) iMin = 1; if( iMax>pHead->mxFrame ) iMax = pHead->mxFrame; diff --git a/test/unlocked2.test b/test/unlocked2.test index 927fe3e675..6953753643 100644 --- a/test/unlocked2.test +++ b/test/unlocked2.test @@ -257,5 +257,40 @@ do_multiclient_test tn { do_test 5.$tn.5 { sql3 { PRAGMA integrity_check } } {ok} } +#------------------------------------------------------------------------- +# +do_multiclient_test tn { + do_test 6.$tn.1 { + sql1 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(x); + INSERT INTO t1 VALUES(randomblob(1500)); + PRAGMA wal_checkpoint; + } + } {wal 0 5 5} + + do_test 6.$tn.2 { + sql1 { + BEGIN UNLOCKED; + INSERT INTO t1 VALUES(randomblob(1500)); + INSERT INTO t1 VALUES(randomblob(1500)); + } + } {} + + do_test 6.$tn.3 { + sql2 { + BEGIN; + INSERT INTO t1 VALUES(randomblob(1500)); + INSERT INTO t1 VALUES(randomblob(1500)); + COMMIT; + } + } {} + + do_test 6.$tn.4 { + list [catch { sql1 COMMIT } msg] $msg + } {1 {database is locked}} + do_test 6.$tn.5 { sql3 { PRAGMA integrity_check } } {ok} + do_test 6.$tn.5 { sql3 { SELECT count(*) from t1 } } {3} +} finish_test diff --git a/test/unlocked3.test b/test/unlocked3.test index 04e741dc5b..b4deaf9a92 100644 --- a/test/unlocked3.test +++ b/test/unlocked3.test @@ -55,6 +55,22 @@ proc do_sql_op {iTbl iOp} { " } + "D" { + set sql " + DELETE FROM t$iTbl WHERE rowid IN ( + SELECT rowid FROM t$iTbl o WHERE ( + SELECT count(*) FROM t$iTbl i WHERE i.rowid Date: Mon, 24 Aug 2015 06:43:25 +0000 Subject: [PATCH 013/113] Fix another problem involving unlocked transactions and wal-file restarts. FossilOrigin-Name: 4460764ea8fc948fe02f0a09476857839b3aa1ae --- manifest | 18 +++++++------- manifest.uuid | 2 +- src/pager.c | 6 +++-- src/wal.c | 59 +++++++++++++++++++++++++++++++++++---------- src/wal.h | 2 +- test/unlocked3.test | 4 +-- 6 files changed, 62 insertions(+), 29 deletions(-) diff --git a/manifest b/manifest index 1778b94253..1285f64e76 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sto\sdo\swith\sdetecting\sunlocked\stransaction\sconflicts\sif\sanother\sclient\srestarts\sthe\swal\swhile\sthe\stransaction\sis\srunning. -D 2015-08-22T20:32:39.272 +C Fix\sanother\sproblem\sinvolving\sunlocked\stransactions\sand\swal-file\srestarts. +D 2015-08-24T06:43:25.273 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e2218eb228374422969de7b1680eda6864affcef F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -324,7 +324,7 @@ F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa F src/os_unix.c 388c023582b17890f10c980b30ec1922b471753b F src/os_win.c 40b3af7a47eb1107d0d69e592bec345a3b7b798a F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca -F src/pager.c 951b7bae30fcbc2a2d380fa68f8bc68286ae0760 +F src/pager.c a952e4b4c2e85e1588df5972688de9b6c989dbdd F src/pager.h 1e7b0fc3846b71bd95b4b3300820d756895cb4ef F src/parse.y e9accdb2cb1795f75f478e7ce89e17b19d7d4da7 F src/pcache.c cde06aa50962595e412d497e22fd2e07878ba1f0 @@ -411,8 +411,8 @@ F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 F src/vtab.c d31174e4c8f592febab3fa7f69e18320b4fd657a F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb -F src/wal.c 4c69d27ed7ec7006008d8309dc5c9ab742273c12 -F src/wal.h a701096b9bf5761b8c5f4b07082249e1950afc9a +F src/wal.c b8811f666d785820437d95386c12b85951418c50 +F src/wal.h 903ef67e17f8b466dc7cfc4186fc23e80be10ff8 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba F src/where.c 66518a14a1238611aa0744d6980b6b7f544f4816 F src/whereInt.h 880a8599226ac1c00203490d934f3ed79b292572 @@ -1229,7 +1229,7 @@ F test/unique2.test 41e7f83c6827605991160a31380148a9fc5f1339 F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825 F test/unlocked.test d143a871bd874311d4e5c98ce458218ca6b579fd F test/unlocked2.test aaa42a08052a146466220b6c3a062ff3c4776ad6 -F test/unlocked3.test 06173e406a8c1a550448f79329ed4c3311905062 +F test/unlocked3.test 1bc4e3ad8693302639e50b4833a527807ee4863b F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 F test/uri.test 23662b7b61958b0f0e47082de7d06341ccf85d5b @@ -1381,7 +1381,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P ed0a31be726e60115a5dd73d4ed580201b400ab7 -R 4d5e4d57de949c83b8660752ea3918ee +P e3968b256282d8c0a87c26667b1ba02faf7a5a17 +R 616e25ded22fb9d47c944cb40768f03a U dan -Z 75094882a86841f2760b97ee8543ae22 +Z 4efd00eba0478d425d47255076a7c364 diff --git a/manifest.uuid b/manifest.uuid index c18cc52736..75583c940a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e3968b256282d8c0a87c26667b1ba02faf7a5a17 \ No newline at end of file +4460764ea8fc948fe02f0a09476857839b3aa1ae \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index c55db40150..c2344e3747 100644 --- a/src/pager.c +++ b/src/pager.c @@ -6129,8 +6129,10 @@ int sqlite3PagerUpgradeSnapshot(Pager *pPager, DbPage *pPage1){ u32 iFrame = 0; assert( pPager->pWal && pPager->pAllRead ); - sqlite3WalUpgradeSnapshot(pPager->pWal); - rc = sqlite3WalFindFrame(pPager->pWal, 1, &iFrame); + rc = sqlite3WalUpgradeSnapshot(pPager->pWal); + if( rc==SQLITE_OK ){ + rc = sqlite3WalFindFrame(pPager->pWal, 1, &iFrame); + } if( rc==SQLITE_OK ){ rc = readDbPage(pPage1, iFrame); } diff --git a/src/wal.c b/src/wal.c index fcf5a15044..d43f939f00 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2667,9 +2667,44 @@ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPage1, Bitvec *pAllRead){ return rc; } -void sqlite3WalUpgradeSnapshot(Wal *pWal){ +/* +** This function is called by a writer that has a read-lock on aReadmark[0] +** (pWal->readLock==0). This function relinquishes that lock and takes a +** lock on a different aReadmark[] slot. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +static int walUpgradeReadlock(Wal *pWal){ + int cnt; + int rc; + assert( pWal->writeLock && pWal->readLock==0 ); + walUnlockShared(pWal, WAL_READ_LOCK(0)); + pWal->readLock = -1; + cnt = 0; + do{ + int notUsed; + rc = walTryBeginRead(pWal, ¬Used, 1, ++cnt); + }while( rc==WAL_RETRY ); + assert( (rc&0xff)!=SQLITE_BUSY ); /* BUSY not possible when useWal==1 */ + testcase( (rc&0xff)==SQLITE_IOERR ); + testcase( rc==SQLITE_PROTOCOL ); + testcase( rc==SQLITE_OK ); + return rc; +} + +int sqlite3WalUpgradeSnapshot(Wal *pWal){ + int rc = SQLITE_OK; assert( pWal->writeLock ); memcpy(&pWal->hdr, (void*)walIndexHdr(pWal), sizeof(WalIndexHdr)); + + /* If this client has its read-lock on slot aReadmark[0] and the entire + ** wal has not been checkpointed, switch it to a different slot. Otherwise + ** any reads performed between now and committing the transaction will + ** read from the old snapshot - not the one just upgraded to. */ + if( pWal->readLock==0 && pWal->hdr.mxFrame!=walCkptInfo(pWal)->nBackfill ){ + rc = walUpgradeReadlock(pWal); + } + return rc; } /* @@ -2789,7 +2824,6 @@ int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData){ */ static int walRestartLog(Wal *pWal){ int rc = SQLITE_OK; - int cnt; if( pWal->readLock==0 ){ volatile WalCkptInfo *pInfo = walCkptInfo(pWal); @@ -2814,17 +2848,16 @@ static int walRestartLog(Wal *pWal){ return rc; } } - walUnlockShared(pWal, WAL_READ_LOCK(0)); - pWal->readLock = -1; - cnt = 0; - do{ - int notUsed; - rc = walTryBeginRead(pWal, ¬Used, 1, ++cnt); - }while( rc==WAL_RETRY ); - assert( (rc&0xff)!=SQLITE_BUSY ); /* BUSY not possible when useWal==1 */ - testcase( (rc&0xff)==SQLITE_IOERR ); - testcase( rc==SQLITE_PROTOCOL ); - testcase( rc==SQLITE_OK ); + + /* Regardless of whether or not the wal file was restarted, change the + ** read-lock held by this client to a slot other than aReadmark[0]. + ** Clients with a lock on aReadmark[0] read from the database file + ** only - never from the wal file. This means that if a writer holding + ** a lock on aReadmark[0] were to commit a transaction but not close the + ** read-transaction, subsequent read operations would read directly from + ** the database file - ignoring the new pages just appended + ** to the wal file. */ + rc = walUpgradeReadlock(pWal); } return rc; } diff --git a/src/wal.h b/src/wal.h index 0609eded27..35ffe4d38c 100644 --- a/src/wal.h +++ b/src/wal.h @@ -127,7 +127,7 @@ int sqlite3WalExclusiveMode(Wal *pWal, int op); int sqlite3WalHeapMemory(Wal *pWal); int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPg, Bitvec *pRead); -void sqlite3WalUpgradeSnapshot(Wal *pWal); +int sqlite3WalUpgradeSnapshot(Wal *pWal); #ifdef SQLITE_ENABLE_ZIPVFS /* If the WAL file is not empty, return the number of bytes of content diff --git a/test/unlocked3.test b/test/unlocked3.test index b4deaf9a92..9cde078833 100644 --- a/test/unlocked3.test +++ b/test/unlocked3.test @@ -94,9 +94,8 @@ foreach {tn oplist} { 6 {1iii 2iii 3iii 4iii} 7 {1di 2id 3iii 4ddd} 8 {1iii 2iii 3iii 4iii} - + 9 {1D 2II} } { - # 9 {1D 2II} if {[string range $oplist 0 0]=="-"} { reset_db create_schema @@ -119,7 +118,6 @@ foreach {tn oplist} { } {ok} foreach db $DBLIST { - if {$db=="db2"} breakpoint $db close } } From 5cf03728a6d33823bb55cbab69f5e4b415e4d1ae Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 24 Aug 2015 10:05:03 +0000 Subject: [PATCH 014/113] Consolidate two blocks of similar code in btreeFixUnlocked(). FossilOrigin-Name: 701302b4bd62ca7aefe643eac096a0ee672a62fa --- manifest | 14 ++--- manifest.uuid | 2 +- src/btree.c | 142 ++++++++++++++++++++++++++------------------ test/unlocked3.test | 24 ++++---- 4 files changed, 106 insertions(+), 76 deletions(-) diff --git a/manifest b/manifest index 06617c4d57..fbf1b20715 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\strunk\schanges\swith\sthis\sbranch. -D 2015-08-24T06:44:17.840 +C Consolidate\stwo\sblocks\sof\ssimilar\scode\sin\sbtreeFixUnlocked(). +D 2015-08-24T10:05:03.012 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e2218eb228374422969de7b1680eda6864affcef F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -279,7 +279,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 4d9134dc988a87838c06056c89c0e8c4700a0452 F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c 245bc696824d5107f3570905325c6ac5b05c18f8 +F src/btree.c e807409602996359211c855078fa5cbcf59da032 F src/btree.h 00d4cdb747c4172a5566faf037116985dbbc377e F src/btreeInt.h 0c19847f87ab82e4f5e67750a069f10829475da6 F src/build.c e47b6fffe14a28d9050e6747beebb01597d37542 @@ -1229,7 +1229,7 @@ F test/unique2.test 41e7f83c6827605991160a31380148a9fc5f1339 F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825 F test/unlocked.test d143a871bd874311d4e5c98ce458218ca6b579fd F test/unlocked2.test aaa42a08052a146466220b6c3a062ff3c4776ad6 -F test/unlocked3.test 1bc4e3ad8693302639e50b4833a527807ee4863b +F test/unlocked3.test 2cacc31742561f6924706ed9472d0095839da9e4 F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 F test/uri.test 23662b7b61958b0f0e47082de7d06341ccf85d5b @@ -1381,7 +1381,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4460764ea8fc948fe02f0a09476857839b3aa1ae f0aba0e120074430cd7ad93291fcc97b8a25a054 -R c9a4c2c74a91d952dffb223e6caf31f7 +P 876810c28b3ad573ae46050ec699ef7eea4e313d +R 11d77b8f4d3f6d9b5ad54020bb4092ee U dan -Z 9a4849fb712895f27dbf139db01b2763 +Z 46d9657b2162cb9e544c380eb188ec18 diff --git a/manifest.uuid b/manifest.uuid index 9e718e4bc3..93c1197630 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -876810c28b3ad573ae46050ec699ef7eea4e313d \ No newline at end of file +701302b4bd62ca7aefe643eac096a0ee672a62fa \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 53b769720d..0b6b1305ae 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3847,6 +3847,73 @@ static int autoVacuumCommit(BtShared *pBt){ #endif #ifdef SQLITE_ENABLE_UNLOCKED +/* +** This function is called as part of merging an UNLOCKED transaction with +** the snapshot at the head of the wal file. It relocates all pages in the +** range iFirst..iLast, inclusive. It is assumed that the BtreePtrmap +** structure at BtShared.pMap contains the location of the pointers to each +** page in the range. +** +** If pnCurrent is NULL, then all pages in the range are moved to currently +** free locations (i.e. free-list entries) within the database file before page +** iFirst. +** +** Or, if pnCurrent is not NULL, then it points to a value containing the +** current size of the database file in pages. In this case, all pages are +** relocated to the end of the database file - page iFirst is relocated to +** page (*pnCurrent+1), page iFirst+1 to page (*pnCurrent+2), and so on. +** Value *pnCurrent is set to the new size of the database before this +** function returns. +** +** If no error occurs, SQLITE_OK is returned. Otherwise, an SQLite error code. +*/ +static int btreeRelocateRange( + BtShared *pBt, /* B-tree handle */ + Pgno iFirst, /* First page to relocate */ + Pgno iLast, /* Last page to relocate */ + Pgno *pnCurrent /* If not NULL, IN/OUT: Database size */ +){ + int rc = SQLITE_OK; + BtreePtrmap *pMap = pBt->pMap; + Pgno iPg; + + for(iPg=iFirst; iPg<=iLast && rc==SQLITE_OK; iPg++){ + MemPage *pFree = 0; /* Page allocated from free-list */ + MemPage *pPg = 0; + Pgno iNew; /* New page number for pPg */ + PtrmapEntry *pEntry; /* Pointer map entry for page iPg */ + + if( iPg==PENDING_BYTE_PAGE(pBt) ) continue; + pEntry = &pMap->aPtr[iPg - pMap->iFirst]; + + if( pEntry->eType==PTRMAP_FREEPAGE ){ + Pgno dummy; + rc = allocateBtreePage(pBt, &pFree, &dummy, iPg, BTALLOC_EXACT); + releasePage(pFree); + assert( rc!=SQLITE_OK || dummy==iPg ); + }else if( pnCurrent ){ + btreeGetPage(pBt, iPg, &pPg, 0); + assert( sqlite3PagerIswriteable(pPg->pDbPage) ); + assert( sqlite3PagerPageRefcount(pPg->pDbPage)==1 ); + iNew = ++(*pnCurrent); + if( iNew==PENDING_BYTE_PAGE(pBt) ) iNew = ++(*pnCurrent); + rc = relocatePage(pBt, pPg, pEntry->eType, pEntry->parent, iNew, 1); + releasePageNotNull(pPg); + }else{ + rc = allocateBtreePage(pBt, &pFree, &iNew, iFirst-1, BTALLOC_LE); + assert( rc!=SQLITE_OK || iNeweType, pEntry->parent,iNew,1); + releasePage(pPg); + } + } + } + return rc; +} + /* ** The b-tree handle passed as the only argument is about to commit an ** UNLOCKED transaction. At this point it is guaranteed that this is @@ -3875,7 +3942,7 @@ static int btreeFixUnlocked(Btree *p){ if( rc==SQLITE_OK ){ Pgno nHPage = get4byte(&p1[28]); - Pgno nFinal = nHPage; /* Size of db after transaction merge */ + Pgno nFin = nHPage; /* Size of db after transaction merge */ if( sqlite3PagerIswriteable(pPage1->pDbPage) ){ Pgno iHTrunk = get4byte(&p1[32]); @@ -3907,71 +3974,32 @@ static int btreeFixUnlocked(Btree *p){ /* The current transaction allocated pages pMap->iFirst through ** nPage (inclusive) at the end of the database file. Meanwhile, ** other transactions have allocated (iFirst..nHPage). So move - ** pages (iFirst..MIN(nPage,nHPage)) to (MAX(nPage,nHPage)+1). - */ + ** pages (iFirst..MIN(nPage,nHPage)) to (MAX(nPage,nHPage)+1). */ Pgno iLast = MIN(nPage, nHPage); /* Last page to move */ - Pgno iPg; Pgno nCurrent; /* Current size of db */ nCurrent = MAX(nPage, nHPage); + rc = btreeRelocateRange(pBt, pMap->iFirst, iLast, &nCurrent); - for(iPg=pMap->iFirst; iPg<=iLast && rc==SQLITE_OK; iPg++){ - MemPage *pPg = 0; - Pgno iNew; /* New page number for pPg */ - PtrmapEntry *pEntry; /* Pointer map entry for page iPg */ - - if( iPg==PENDING_BYTE_PAGE(pBt) ) continue; - pEntry = &pMap->aPtr[iPg - pMap->iFirst]; - if( pEntry->eType==PTRMAP_FREEPAGE ){ - MemPage *pFree = 0; - Pgno dummy; - rc = allocateBtreePage(pBt, &pFree, &dummy, iPg, BTALLOC_EXACT); - releasePage(pFree); - assert( rc!=SQLITE_OK || dummy==iPg ); - }else{ - btreeGetPage(pBt, iPg, &pPg, 0); - assert( sqlite3PagerIswriteable(pPg->pDbPage) ); - assert( sqlite3PagerPageRefcount(pPg->pDbPage)==1 ); - iNew = ++nCurrent; - if( iNew==PENDING_BYTE_PAGE(pBt) ) iNew = ++nCurrent; - rc = relocatePage(pBt, pPg, pEntry->eType, pEntry->parent, iNew, 1); - releasePageNotNull(pPg); + /* There are now no collisions with the snapshot at the head of the + ** database file. So at this point it would be possible to write + ** the transaction out to disk. Before doing so though, attempt to + ** relocate some of the new pages to free locations within the body + ** of the database file (i.e. free-list entries). */ + if( rc==SQLITE_OK ){ + assert( nCurrent!=PENDING_BYTE_PAGE(pBt) ); + sqlite3PagerSetDbsize(pBt->pPager, nCurrent); + nFree = get4byte(&p1[36]); + nFin = MAX(nCurrent-nFree, nHPage); + if( nCurrent>PENDING_BYTE_PAGE(pBt) && nFin<=PENDING_BYTE_PAGE(pBt) ){ + nFin--; } - } - sqlite3PagerSetDbsize(pPager, nCurrent); - assert( nCurrent!=PENDING_BYTE_PAGE(pBt) ); - - nFree = get4byte(&p1[36]); - nFinal = MAX(nCurrent-nFree, nHPage); - if( nCurrent>PENDING_BYTE_PAGE(pBt) && nFinal<=PENDING_BYTE_PAGE(pBt) ){ - nFinal--; + rc = btreeRelocateRange(pBt, nFin+1, nCurrent, 0); } - for(iPg=nFinal+1; rc==SQLITE_OK && iPg<=nCurrent; iPg++){ - Pgno iNew; /* New page number for pPg */ - MemPage *pFree; - PtrmapEntry *pEntry; /* Pointer map entry for page iPg */ - - if( iPg==PENDING_BYTE_PAGE(pBt) ) continue; - pEntry = &pMap->aPtr[iPg - pMap->iFirst]; - if( pEntry->eType==PTRMAP_FREEPAGE ){ - rc = allocateBtreePage(pBt, &pFree, &iNew, iPg, BTALLOC_EXACT); - releasePage(pFree); - }else{ - rc = allocateBtreePage(pBt, &pFree, &iNew, nFinal, BTALLOC_LE); - assert( rc!=SQLITE_OK || iNew<=nFinal ); - releasePage(pFree); - if( rc==SQLITE_OK ){ - MemPage *pPg = 0; - btreeGetPage(pBt, iPg, &pPg, 0); - rc = relocatePage(pBt, pPg, pEntry->eType, pEntry->parent,iNew,1); - releasePage(pPg); - } - } - } - put4byte(&p1[28], nFinal); + put4byte(&p1[28], nFin); } } - sqlite3PagerSetDbsize(pPager, nFinal); + sqlite3PagerSetDbsize(pPager, nFin); } return rc; diff --git a/test/unlocked3.test b/test/unlocked3.test index 9cde078833..61e71c87c3 100644 --- a/test/unlocked3.test +++ b/test/unlocked3.test @@ -84,17 +84,19 @@ set DBLIST {db1 db2 db3 db4} create_schema foreach {tn oplist} { - 1 {1i 2i 3i 4i} - 2 {1iii 2iii 3iii 4iii} - 3 {1d 2d 3d 4d} - . ----------------------- - 4 {1i} - 5 {1d 2i} - . ----------------------- - 6 {1iii 2iii 3iii 4iii} - 7 {1di 2id 3iii 4ddd} - 8 {1iii 2iii 3iii 4iii} - 9 {1D 2II} + 1 {1i 2i 3i 4i} + 2 {1iii 2iii 3iii 4iii} + 3 {1d 2d 3d 4d} + . ----------------------- + 4 {1i} + 5 {1d 2i} + . ----------------------- + 6 {1iii 2iii 3iii 4iii} + 7 {1di 2id 3iii 4ddd} + 8 {1iii 2iii 3iii 4iii} + 9 {1D 2II} + 10 {1I 2D 3I 4D} + 11 {1III 3dddddd 4III} } { if {[string range $oplist 0 0]=="-"} { reset_db From 0408529b48af957c0860fc61848e1b24386c7332 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 24 Aug 2015 16:00:08 +0000 Subject: [PATCH 015/113] Fix compilation without SQLITE_ENABLE_UNLOCKED. Also other code organization issues. FossilOrigin-Name: 041135575417201bbcf0544cc69dcb7369c7fb34 --- manifest | 26 +++++------ manifest.uuid | 2 +- src/btree.c | 2 + src/pager.c | 107 ++++++++++++++++++++++++++++++-------------- src/test_config.c | 6 +++ src/vdbeaux.c | 2 + src/wal.c | 84 ++++++++++++++++++++++++---------- test/unlocked.test | 4 ++ test/unlocked2.test | 4 ++ test/unlocked3.test | 4 ++ 10 files changed, 170 insertions(+), 71 deletions(-) diff --git a/manifest b/manifest index fbf1b20715..7e91525501 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Consolidate\stwo\sblocks\sof\ssimilar\scode\sin\sbtreeFixUnlocked(). -D 2015-08-24T10:05:03.012 +C Fix\scompilation\swithout\sSQLITE_ENABLE_UNLOCKED.\sAlso\sother\scode\sorganization\sissues. +D 2015-08-24T16:00:08.023 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e2218eb228374422969de7b1680eda6864affcef F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -279,7 +279,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 4d9134dc988a87838c06056c89c0e8c4700a0452 F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c e807409602996359211c855078fa5cbcf59da032 +F src/btree.c 13f924763ebd6bd55e0b74d139ee363a42abbe0f F src/btree.h 00d4cdb747c4172a5566faf037116985dbbc377e F src/btreeInt.h 0c19847f87ab82e4f5e67750a069f10829475da6 F src/build.c e47b6fffe14a28d9050e6747beebb01597d37542 @@ -324,7 +324,7 @@ F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa F src/os_unix.c 388c023582b17890f10c980b30ec1922b471753b F src/os_win.c 40b3af7a47eb1107d0d69e592bec345a3b7b798a F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca -F src/pager.c a952e4b4c2e85e1588df5972688de9b6c989dbdd +F src/pager.c 57e5775ba3d8059e37e760f8a6f064079196eb9d F src/pager.h 1e7b0fc3846b71bd95b4b3300820d756895cb4ef F src/parse.y e9accdb2cb1795f75f478e7ce89e17b19d7d4da7 F src/pcache.c cde06aa50962595e412d497e22fd2e07878ba1f0 @@ -361,7 +361,7 @@ F src/test_autoext.c dea8a01a7153b9adc97bd26161e4226329546e12 F src/test_backup.c 2e6e6a081870150f20c526a2e9d0d29cda47d803 F src/test_blob.c e5a7a81d61a780da79101aeb1e60d300af169e07 F src/test_btree.c 2e9978eca99a9a4bfa8cae949efb00886860a64f -F src/test_config.c fb2e5d354d9a077f5fbb261652eff4787deb104f +F src/test_config.c 8870dbb8809e2bf7f766828934db7d70c907f346 F src/test_demovfs.c 0de72c2c89551629f58486fde5734b7d90758852 F src/test_devsym.c e7498904e72ba7491d142d5c83b476c4e76993bc F src/test_fs.c ced436e3d4b8e4681328409b8081051ce614e28f @@ -404,14 +404,14 @@ F src/vdbe.c 97b07a1af65971dab3d326742e912ac8c12108dd F src/vdbe.h 7a75045d879118b9d3af7e8b3c108f2f27c51473 F src/vdbeInt.h 8b54e01ad0463590e7cffabce0bc36da9ee4f816 F src/vdbeapi.c bda74ef4b5103d7b4a4be36f936d3cf2b56a7d6f -F src/vdbeaux.c 4fae90f55736b7537d0fcd2afe52849edbbb7ecd +F src/vdbeaux.c 5a07e354850fcc96c535f9b0b6ded4c705483a01 F src/vdbeblob.c 4f2e8e075d238392df98c5e03a64342465b03f90 F src/vdbemem.c ae38a0d35ae71cf604381a887c170466ba518090 F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 F src/vtab.c d31174e4c8f592febab3fa7f69e18320b4fd657a F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb -F src/wal.c b8811f666d785820437d95386c12b85951418c50 +F src/wal.c 7b8c8d1cb09f128d014a1677bc3d3935f729a2f9 F src/wal.h 903ef67e17f8b466dc7cfc4186fc23e80be10ff8 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba F src/where.c 66518a14a1238611aa0744d6980b6b7f544f4816 @@ -1227,9 +1227,9 @@ F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 41e7f83c6827605991160a31380148a9fc5f1339 F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825 -F test/unlocked.test d143a871bd874311d4e5c98ce458218ca6b579fd -F test/unlocked2.test aaa42a08052a146466220b6c3a062ff3c4776ad6 -F test/unlocked3.test 2cacc31742561f6924706ed9472d0095839da9e4 +F test/unlocked.test 51be7f150c8d3bad50b22693e87a91a628e654be +F test/unlocked2.test 2d969d1b4c3e832169d0c97f522fa5955877785a +F test/unlocked3.test 6c99bc0c3f19ad8ca8c1632b09b089164718dc35 F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 F test/uri.test 23662b7b61958b0f0e47082de7d06341ccf85d5b @@ -1381,7 +1381,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 876810c28b3ad573ae46050ec699ef7eea4e313d -R 11d77b8f4d3f6d9b5ad54020bb4092ee +P 701302b4bd62ca7aefe643eac096a0ee672a62fa +R 736937b7bbb824036427389285348275 U dan -Z 46d9657b2162cb9e544c380eb188ec18 +Z a958ab41b63a16e8331a9ac18c76c8a0 diff --git a/manifest.uuid b/manifest.uuid index 93c1197630..1f1213c7c1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -701302b4bd62ca7aefe643eac096a0ee672a62fa \ No newline at end of file +041135575417201bbcf0544cc69dcb7369c7fb34 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 0b6b1305ae..8a99dbde14 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3346,9 +3346,11 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ if( rc==SQLITE_OK ){ rc = newDatabase(pBt); } +#ifdef SQLITE_ENABLE_UNLOCKED if( rc==SQLITE_OK && sqlite3PagerIsUnlocked(pBt->pPager) ){ rc = btreePtrmapAllocate(pBt); } +#endif } } diff --git a/src/pager.c b/src/pager.c index c2344e3747..9942211edb 100644 --- a/src/pager.c +++ b/src/pager.c @@ -1746,9 +1746,11 @@ static int addToSavepointBitvecs(Pager *pPager, Pgno pgno){ */ static void pagerFreeBitvecs(Pager *pPager){ sqlite3BitvecDestroy(pPager->pInJournal); - sqlite3BitvecDestroy(pPager->pAllRead); pPager->pInJournal = 0; +#ifdef SQLITE_ENABLE_UNLOCKED + sqlite3BitvecDestroy(pPager->pAllRead); pPager->pAllRead = 0; +#endif } /* @@ -3021,7 +3023,6 @@ static int pagerUndoCallback(void *pCtx, Pgno iPg){ static int pagerRollbackWal(Pager *pPager){ int rc; /* Return Code */ PgHdr *pList; /* List of dirty pages to revert */ - int bPage1 = 0; /* True if page 1 has been undone */ /* For all pages in the cache that are currently dirty or have already ** been written (but not committed) to the log file, do one of the @@ -3033,20 +3034,22 @@ static int pagerRollbackWal(Pager *pPager){ pPager->dbSize = pPager->dbOrigSize; rc = sqlite3WalUndo(pPager->pWal, pagerUndoCallback, (void *)pPager); pList = sqlite3PcacheDirtyList(pPager->pPCache); + + /* If this is an UNLOCKED transaction, then page 1 must be reread from + ** the db file, even if it is not dirty. This is because the b-tree layer + ** may have already zeroed the nFree and iTrunk header fields. */ +#ifdef SQLITE_ENABLE_UNLOCKED + if( rc==SQLITE_OK && (pList==0 || pList->pgno!=1) && pPager->pAllRead ){ + rc = pagerUndoCallback((void*)pPager, 1); + } +#endif + while( pList && rc==SQLITE_OK ){ PgHdr *pNext = pList->pDirty; - if( pList->pgno==1 ) bPage1 = 1; rc = pagerUndoCallback((void *)pPager, pList->pgno); pList = pNext; } - /* If this is an UNLOCKED transaction, then page 1 must be reread from the - ** db file, even if it is not dirty. This is because the b-tree layer may - ** have already zeroed the nFree and iTrunk header fields. */ - if( rc==SQLITE_OK && bPage1==0 && pPager->pAllRead ){ - rc = pagerUndoCallback((void*)pPager, 1); - } - return rc; } @@ -3086,7 +3089,6 @@ static int pagerWalFrames( ** list here. */ PgHdr **ppNext = &pList; nList = 0; - for(p=pList; (*ppNext = p)!=0; p=p->pDirty){ if( p->pgno<=nTruncate ){ ppNext = &p->pDirty; @@ -4452,7 +4454,9 @@ static int pagerStress(void *p, PgHdr *pPg){ if( pagerUseWal(pPager) ){ /* If the transaction is a "BEGIN UNLOCKED" transaction, the page ** cannot be flushed to disk. Return early in this case. */ +#ifdef SQLITE_ENABLE_UNLOCKED if( pPager->pAllRead ) return SQLITE_OK; +#endif /* Write a single frame for this page to the log. */ rc = subjournalPageIfRequired(pPg); @@ -5297,10 +5301,12 @@ int sqlite3PagerAcquire( /* If this is an UNLOCKED transaction and the page being read was ** present in the database file when the transaction was opened, ** mark it as read in the pAllRead vector. */ +#ifdef SQLITE_ENABLE_UNLOCKED if( pPager->pAllRead && pgno<=pPager->dbOrigSize ){ rc = sqlite3BitvecSet(pPager->pAllRead, pgno); if( rc!=SQLITE_OK ) goto pager_acquire_err; } +#endif /* If the pager is in the error state, return an error immediately. ** Otherwise, request the page from the PCache layer. */ @@ -5606,7 +5612,9 @@ int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){ if( ALWAYS(pPager->eState==PAGER_READER) ){ assert( pPager->pInJournal==0 ); +#ifdef SQLITE_ENABLE_UNLOCKED assert( pPager->pAllRead==0 ); +#endif if( pagerUseWal(pPager) ){ /* If the pager is configured to use locking_mode=exclusive, and an @@ -5625,13 +5633,16 @@ int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){ ** The busy-handler is not invoked if another connection already ** holds the write-lock. If possible, the upper layer will call it. */ - if( exFlag>=0 ){ - rc = sqlite3WalBeginWriteTransaction(pPager->pWal); - }else{ +#ifdef SQLITE_ENABLE_UNLOCKED + if( exFlag<0 ){ pPager->pAllRead = sqlite3BitvecCreate(pPager->dbSize); if( pPager->pAllRead==0 ){ rc = SQLITE_NOMEM; } + }else +#endif + { + rc = sqlite3WalBeginWriteTransaction(pPager->pWal); } }else{ /* Obtain a RESERVED lock on the database file. If the exFlag parameter @@ -5938,9 +5949,11 @@ int sqlite3PagerWrite(PgHdr *pPg){ ** to sqlite3PagerWrite(). In other words, return TRUE if it is ok ** to change the content of the page. */ +#if defined(SQLITE_ENABLE_UNLOCKED) || !defined(NDEBUG) int sqlite3PagerIswriteable(DbPage *pPg){ return pPg->flags & PGHDR_WRITEABLE; } +#endif /* ** A call to this routine tells the pager that it is not necessary to @@ -6088,15 +6101,24 @@ int sqlite3PagerSync(Pager *pPager, const char *zMaster){ } /* -** This function may only be called while a write-transaction is active in -** rollback. If the connection is in WAL mode, this call is a no-op. -** Otherwise, if the connection does not already have an EXCLUSIVE lock on -** the database file, an attempt is made to obtain one. +** This function is called to ensure that all locks required to commit the +** current write-transaction to the database file are held. If the db is +** in rollback mode, this means the EXCLUSIVE lock on the database file. ** -** If the EXCLUSIVE lock is already held or the attempt to obtain it is -** successful, or the connection is in WAL mode, SQLITE_OK is returned. -** Otherwise, either SQLITE_BUSY or an SQLITE_IOERR_XXX error code is -** returned. +** Or, if this is a non-UNLOCKED transaction on a wal-mode database, this +** function is a no-op. +** +** If this is an UNLOCKED transaction on a wal-mode database, this function +** attempts to obtain the WRITER lock on the wal file and also checks to +** see that the transaction can be safely committed (does not commit with +** any other transaction committed since it was opened). +** +** If the required locks are already held or successfully obtained and +** the transaction can be committed, SQLITE_OK is returned. If a required lock +** cannot be obtained, SQLITE_BUSY is returned. Or, if the current transaction +** is UNLOCKED and cannot be committed due to a conflict, SQLITE_BUSY_SNAPSHOT +** is returned. Otherwise, if some other error occurs (IO error, OOM etc.), +** and SQLite error code is returned. */ int sqlite3PagerExclusiveLock(Pager *pPager, PgHdr *pPage1){ int rc = SQLITE_OK; @@ -6107,23 +6129,38 @@ int sqlite3PagerExclusiveLock(Pager *pPager, PgHdr *pPage1){ assert( assert_pager_state(pPager) ); if( 0==pagerUseWal(pPager) ){ rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); - }else{ + } +#ifdef SQLITE_ENABLE_UNLOCKED + else{ if( pPager->pAllRead ){ /* This is an UNLOCKED transaction. Attempt to lock the wal database ** here. If SQLITE_BUSY (but not SQLITE_BUSY_SNAPSHOT) is returned, ** invoke the busy-handler and try again for as long as it returns ** non-zero. */ do { - /* rc = sqlite3WalBeginWriteTransaction(pWal); */ rc = sqlite3WalLockForCommit(pPager->pWal, pPage1, pPager->pAllRead); }while( rc==SQLITE_BUSY && pPager->xBusyHandler(pPager->pBusyHandlerArg) ); } } +#endif return rc; } +#ifdef SQLITE_ENABLE_UNLOCKED +/* +** This function is called as part of committing an UNLOCKED transaction. +** At this point the wal WRITER lock is held, and all pages in the cache +** except for page 1 are compatible with the snapshot at the head of the +** wal file. +** +** This function updates the in-memory data structures and reloads the +** contents of page 1 so that the client is operating on the snapshot +** at the head of the wal file. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ int sqlite3PagerUpgradeSnapshot(Pager *pPager, DbPage *pPage1){ int rc; u32 iFrame = 0; @@ -6140,8 +6177,18 @@ int sqlite3PagerUpgradeSnapshot(Pager *pPager, DbPage *pPage1){ return rc; } -void sqlite3PagerSetDbsize(Pager *pPager, Pgno nFinal){ - pPager->dbSize = nFinal; +/* +** Set the in-memory cache of the database file size to nSz pages. +*/ +void sqlite3PagerSetDbsize(Pager *pPager, Pgno nSz){ + pPager->dbSize = nSz; +} + +/* +** Return true if this pager is currently within an UNLOCKED transaction. +*/ +int sqlite3PagerIsUnlocked(Pager *pPager){ + return pPager->pAllRead!=0; } /* @@ -6153,13 +6200,7 @@ void sqlite3PagerDropExclusiveLock(Pager *pPager){ sqlite3WalEndWriteTransaction(pPager->pWal); } } - -/* -** Return true if this pager is currently within an UNLOCKED transaction. -*/ -int sqlite3PagerIsUnlocked(Pager *pPager){ - return pPager->pAllRead!=0; -} +#endif /* ifdef SQLITE_ENABLE_UNLOCKED */ /* diff --git a/src/test_config.c b/src/test_config.c index 0aa29c70d7..4d2dece83a 100644 --- a/src/test_config.c +++ b/src/test_config.c @@ -573,6 +573,12 @@ Tcl_SetVar2(interp, "sqlite_options", "mergesort", "1", TCL_GLOBAL_ONLY); Tcl_SetVar2(interp, "sqlite_options", "truncate_opt", "1", TCL_GLOBAL_ONLY); #endif +#ifdef SQLITE_ENABLE_UNLOCKED + Tcl_SetVar2(interp, "sqlite_options", "unlocked", "1", TCL_GLOBAL_ONLY); +#else + Tcl_SetVar2(interp, "sqlite_options", "unlocked", "0", TCL_GLOBAL_ONLY); +#endif + #ifdef SQLITE_OMIT_UTF16 Tcl_SetVar2(interp, "sqlite_options", "utf16", "0", TCL_GLOBAL_ONLY); #else diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 354deb7294..ea467e08a3 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2025,6 +2025,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ } } +#ifdef SQLITE_ENABLE_UNLOCKED if( db->bUnlocked && (rc & 0xFF)==SQLITE_BUSY ){ /* An SQLITE_BUSY or SQLITE_BUSY_SNAPSHOT was encountered while ** attempting to take the WRITER lock on a wal file. Release the @@ -2038,6 +2039,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ } } } +#endif if( rc!=SQLITE_OK ){ return rc; diff --git a/src/wal.c b/src/wal.c index d43f939f00..033d33b083 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2566,12 +2566,60 @@ int sqlite3WalBeginWriteTransaction(Wal *pWal){ return rc; } -/* -** TODO: Combine some code with BeginWriteTransaction() +/* +** This function is called by a writer that has a read-lock on aReadmark[0] +** (pWal->readLock==0). This function relinquishes that lock and takes a +** lock on a different aReadmark[] slot. ** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +static int walUpgradeReadlock(Wal *pWal){ + int cnt; + int rc; + assert( pWal->writeLock && pWal->readLock==0 ); + walUnlockShared(pWal, WAL_READ_LOCK(0)); + pWal->readLock = -1; + cnt = 0; + do{ + int notUsed; + rc = walTryBeginRead(pWal, ¬Used, 1, ++cnt); + }while( rc==WAL_RETRY ); + assert( (rc&0xff)!=SQLITE_BUSY ); /* BUSY not possible when useWal==1 */ + testcase( (rc&0xff)==SQLITE_IOERR ); + testcase( rc==SQLITE_PROTOCOL ); + testcase( rc==SQLITE_OK ); + return rc; +} + + +#ifdef SQLITE_ENABLE_UNLOCKED +/* ** This function is only ever called when committing a "BEGIN UNLOCKED" ** transaction. It may be assumed that no frames have been written to -** the wal file. +** the wal file. The second parameter is a pointer to the in-memory +** representation of page 1 of the database (which may or may not be +** dirty). The third is a bitvec with a bit set for each page in the +** database file that was read by the current unlocked transaction. +** +** This function performs three tasks: +** +** 1) It obtains the WRITER lock on the wal file, +** +** 2) It checks that there are no conflicts between the current +** transaction and any transactions committed to the wal file since +** it was opened, and +** +** 3) It ejects any non-dirty pages from the page-cache that have been +** written by another client since the UNLOCKED transaction was started +** (so as to avoid ending up with an inconsistent cache after the +** current transaction is committed). +** +** If no error occurs and the caller may proceed with committing the +** transaction, SQLITE_OK is returned. SQLITE_BUSY is returned if the WRITER +** lock cannot be obtained. Or, if the WRITER lock can be obtained but there +** are conflicts with a committed transaction, SQLITE_BUSY_SNAPSHOT. Finally, +** if an error (i.e. an OOM condition or IO error), an SQLite error code +** is returned. */ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPage1, Bitvec *pAllRead){ Pager *pPager = pPage1->pPager; @@ -2668,30 +2716,17 @@ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPage1, Bitvec *pAllRead){ } /* -** This function is called by a writer that has a read-lock on aReadmark[0] -** (pWal->readLock==0). This function relinquishes that lock and takes a -** lock on a different aReadmark[] slot. +** This function is called as part of committing an UNLOCKED transaction. +** It is assumed that sqlite3WalLockForCommit() has already been successfully +** called and so (a) the WRITER lock is held and (b) it is known that the +** wal-index-header stored in shared memory is not corrupt. +** +** Before returning, this function upgrades the client so that it is +** operating on the database snapshot currently at the head of the wal file +** (even if the UNLOCKED transaction ran against an older snapshot). ** ** SQLITE_OK is returned if successful, or an SQLite error code otherwise. */ -static int walUpgradeReadlock(Wal *pWal){ - int cnt; - int rc; - assert( pWal->writeLock && pWal->readLock==0 ); - walUnlockShared(pWal, WAL_READ_LOCK(0)); - pWal->readLock = -1; - cnt = 0; - do{ - int notUsed; - rc = walTryBeginRead(pWal, ¬Used, 1, ++cnt); - }while( rc==WAL_RETRY ); - assert( (rc&0xff)!=SQLITE_BUSY ); /* BUSY not possible when useWal==1 */ - testcase( (rc&0xff)==SQLITE_IOERR ); - testcase( rc==SQLITE_PROTOCOL ); - testcase( rc==SQLITE_OK ); - return rc; -} - int sqlite3WalUpgradeSnapshot(Wal *pWal){ int rc = SQLITE_OK; assert( pWal->writeLock ); @@ -2706,6 +2741,7 @@ int sqlite3WalUpgradeSnapshot(Wal *pWal){ } return rc; } +#endif /* SQLITE_ENABLE_UNLOCKED */ /* ** End a write transaction. The commit has already been done. This diff --git a/test/unlocked.test b/test/unlocked.test index c743cc6328..5cbb31dbb9 100644 --- a/test/unlocked.test +++ b/test/unlocked.test @@ -15,6 +15,10 @@ source $testdir/tester.tcl source $testdir/lock_common.tcl set ::testprefix unlocked +ifcapable !unlocked { + finish_test + return +} do_execsql_test 1.0 { PRAGMA journal_mode = wal; diff --git a/test/unlocked2.test b/test/unlocked2.test index 6953753643..f28d62e0a1 100644 --- a/test/unlocked2.test +++ b/test/unlocked2.test @@ -15,6 +15,10 @@ source $testdir/tester.tcl source $testdir/lock_common.tcl set ::testprefix unlocked2 +ifcapable !unlocked { + finish_test + return +} do_multiclient_test tn { diff --git a/test/unlocked3.test b/test/unlocked3.test index 61e71c87c3..36299db381 100644 --- a/test/unlocked3.test +++ b/test/unlocked3.test @@ -19,6 +19,10 @@ source $testdir/lock_common.tcl set ::testprefix unlocked3 if {$AUTOVACUUM} { finish_test ; return } +ifcapable !unlocked { + finish_test + return +} proc create_schema {} { db eval { From f5e89dba9d70a4e1b94b8b7b6a519afae839d285 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 24 Aug 2015 19:08:10 +0000 Subject: [PATCH 016/113] Fix handling of attempts to modify the database schema, application_id or user_version within an UNLOCKED transaction. FossilOrigin-Name: 5b9f272113d21fd606903509d6f830fe60fac039 --- manifest | 16 +++++----- manifest.uuid | 2 +- src/vdbe.c | 34 ++++++++++++++------ src/wal.c | 79 ++++++++++++++++++++++++++++------------------ test/unlocked.test | 45 ++++++++++++++++++++++++-- 5 files changed, 124 insertions(+), 52 deletions(-) diff --git a/manifest b/manifest index 7e91525501..c33005f21e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\scompilation\swithout\sSQLITE_ENABLE_UNLOCKED.\sAlso\sother\scode\sorganization\sissues. -D 2015-08-24T16:00:08.023 +C Fix\shandling\sof\sattempts\sto\smodify\sthe\sdatabase\sschema,\sapplication_id\sor\suser_version\swithin\san\sUNLOCKED\stransaction. +D 2015-08-24T19:08:10.037 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e2218eb228374422969de7b1680eda6864affcef F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -400,7 +400,7 @@ F src/update.c 487747b328b7216bb7f6af0695d6937d5c9e605f F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c bc9dd64b5db544218b871b66243871c202b2781f F src/vacuum.c d35c7291e94a470ee47695c22559a69aef9fdda1 -F src/vdbe.c 97b07a1af65971dab3d326742e912ac8c12108dd +F src/vdbe.c cb555e4a802ec96e16f48c54b57bf15b94616567 F src/vdbe.h 7a75045d879118b9d3af7e8b3c108f2f27c51473 F src/vdbeInt.h 8b54e01ad0463590e7cffabce0bc36da9ee4f816 F src/vdbeapi.c bda74ef4b5103d7b4a4be36f936d3cf2b56a7d6f @@ -411,7 +411,7 @@ F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 F src/vtab.c d31174e4c8f592febab3fa7f69e18320b4fd657a F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb -F src/wal.c 7b8c8d1cb09f128d014a1677bc3d3935f729a2f9 +F src/wal.c fd9a3b9fa79042377f3e5e42a91fd6e0daf1037e F src/wal.h 903ef67e17f8b466dc7cfc4186fc23e80be10ff8 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba F src/where.c 66518a14a1238611aa0744d6980b6b7f544f4816 @@ -1227,7 +1227,7 @@ F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 41e7f83c6827605991160a31380148a9fc5f1339 F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825 -F test/unlocked.test 51be7f150c8d3bad50b22693e87a91a628e654be +F test/unlocked.test fecdc8d76e3495664c74961e6cd1aef9b59439c1 F test/unlocked2.test 2d969d1b4c3e832169d0c97f522fa5955877785a F test/unlocked3.test 6c99bc0c3f19ad8ca8c1632b09b089164718dc35 F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 @@ -1381,7 +1381,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 701302b4bd62ca7aefe643eac096a0ee672a62fa -R 736937b7bbb824036427389285348275 +P 041135575417201bbcf0544cc69dcb7369c7fb34 +R c0f10d85f21cf03acdf9208c7581f1d4 U dan -Z a958ab41b63a16e8331a9ac18c76c8a0 +Z 17437f740072ebd0dda6cab278d01c48 diff --git a/manifest.uuid b/manifest.uuid index 1f1213c7c1..e52ba34ef9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -041135575417201bbcf0544cc69dcb7369c7fb34 \ No newline at end of file +5b9f272113d21fd606903509d6f830fe60fac039 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index b63194655c..3cdb252fdf 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3227,19 +3227,24 @@ case OP_SetCookie: { /* in3 */ assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) ); pIn3 = &aMem[pOp->p3]; sqlite3VdbeMemIntegerify(pIn3); +#ifdef SQLITE_ENABLE_UNLOCKED + if( db->bUnlocked + && (pOp->p2==BTREE_USER_VERSION || pOp->p2==BTREE_APPLICATION_ID) + ){ + rc = SQLITE_ERROR; + sqlite3VdbeError(p, "cannot modify %s within UNLOCKED transaction", + pOp->p2==BTREE_USER_VERSION ? "user_version" : "application_id" + ); + break; + } +#endif /* See note about index shifting on OP_ReadCookie */ rc = sqlite3BtreeUpdateMeta(pDb->pBt, pOp->p2, (int)pIn3->u.i); if( pOp->p2==BTREE_SCHEMA_VERSION ){ - if( db->bUnlocked ){ - sqlite3VdbeError(p, "cannot modify database schema - " - "UNLOCKED transaction" - ); - rc = SQLITE_ERROR; - }else{ - /* When the schema cookie changes, record the new cookie internally */ - pDb->pSchema->schema_cookie = (int)pIn3->u.i; - db->flags |= SQLITE_InternChanges; - } + /* When the schema cookie changes, record the new cookie internally */ + assert( db->bUnlocked==0 ); + pDb->pSchema->schema_cookie = (int)pIn3->u.i; + db->flags |= SQLITE_InternChanges; }else if( pOp->p2==BTREE_FILE_FORMAT ){ /* Record changes in the file format */ pDb->pSchema->file_format = (u8)pIn3->u.i; @@ -6110,6 +6115,15 @@ case OP_Expire: { */ case OP_TableLock: { u8 isWriteLock = (u8)pOp->p3; +#ifdef SQLITE_ENABLE_UNLOCKED + if( isWriteLock && db->bUnlocked && pOp->p2==1 ){ + rc = SQLITE_ERROR; + sqlite3VdbeError(p, + "cannot modify database schema within UNLOCKED transaction"); + rc = SQLITE_ERROR; + break; + } +#endif if( isWriteLock || 0==(db->flags&SQLITE_ReadUncommitted) ){ int p1 = pOp->p1; assert( p1>=0 && p1nDb ); diff --git a/src/wal.c b/src/wal.c index 033d33b083..9a2152424a 100644 --- a/src/wal.c +++ b/src/wal.c @@ -1950,25 +1950,14 @@ int sqlite3WalClose( } /* -** Try to read the wal-index header. Return 0 on success and 1 if -** there is a problem. -** -** The wal-index is in shared memory. Another thread or process might -** be writing the header at the same time this procedure is trying to -** read it, which might result in inconsistency. A dirty read is detected -** by verifying that both copies of the header are the same and also by -** a checksum on the header. -** -** If and only if the read is consistent and the header is different from -** pWal->hdr, then pWal->hdr is updated to the content of the new header -** and *pChanged is set to 1. -** -** If the checksum cannot be verified return non-zero. If the header -** is read successfully and the checksum verified, return zero. +** Try to copy the wal-index header from shared-memory into (*pHdr). Return +** zero if successful or non-zero otherwise. If the header is corrupted +** (either because the two copies are inconsistent or because the checksum +** values are incorrect), the read fails and non-zero is returned. */ -static int walIndexTryHdr(Wal *pWal, int *pChanged){ +static int walIndexLoadHdr(Wal *pWal, WalIndexHdr *pHdr){ u32 aCksum[2]; /* Checksum on the header content */ - WalIndexHdr h1, h2; /* Two copies of the header content */ + WalIndexHdr h2; /* Second copy of the header content */ WalIndexHdr volatile *aHdr; /* Header in shared memory */ /* The first page of the wal-index must be mapped at this point. */ @@ -1985,21 +1974,48 @@ static int walIndexTryHdr(Wal *pWal, int *pChanged){ ** reordering the reads and writes. */ aHdr = walIndexHdr(pWal); - memcpy(&h1, (void *)&aHdr[0], sizeof(h1)); + memcpy(pHdr, (void *)&aHdr[0], sizeof(h2)); walShmBarrier(pWal); memcpy(&h2, (void *)&aHdr[1], sizeof(h2)); - if( memcmp(&h1, &h2, sizeof(h1))!=0 ){ + if( memcmp(&h2, pHdr, sizeof(h2))!=0 ){ return 1; /* Dirty read */ } - if( h1.isInit==0 ){ + if( h2.isInit==0 ){ return 1; /* Malformed header - probably all zeros */ } - walChecksumBytes(1, (u8*)&h1, sizeof(h1)-sizeof(h1.aCksum), 0, aCksum); - if( aCksum[0]!=h1.aCksum[0] || aCksum[1]!=h1.aCksum[1] ){ + walChecksumBytes(1, (u8*)&h2, sizeof(h2)-sizeof(h2.aCksum), 0, aCksum); + if( aCksum[0]!=h2.aCksum[0] || aCksum[1]!=h2.aCksum[1] ){ return 1; /* Checksum does not match */ } + return 0; +} + +/* +** Try to read the wal-index header. Return 0 on success and 1 if +** there is a problem. +** +** The wal-index is in shared memory. Another thread or process might +** be writing the header at the same time this procedure is trying to +** read it, which might result in inconsistency. A dirty read is detected +** by verifying that both copies of the header are the same and also by +** a checksum on the header. +** +** If and only if the read is consistent and the header is different from +** pWal->hdr, then pWal->hdr is updated to the content of the new header +** and *pChanged is set to 1. +** +** If the checksum cannot be verified return non-zero. If the header +** is read successfully and the checksum verified, return zero. +*/ +static int walIndexTryHdr(Wal *pWal, int *pChanged){ + WalIndexHdr h1; /* Copy of the header content */ + + if( walIndexLoadHdr(pWal, &h1) ){ + return 1; + } + if( memcmp(&pWal->hdr, &h1, sizeof(WalIndexHdr)) ){ *pChanged = 1; memcpy(&pWal->hdr, &h1, sizeof(WalIndexHdr)); @@ -2636,16 +2652,19 @@ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPage1, Bitvec *pAllRead){ ** transaction was started. */ if( rc==SQLITE_OK ){ - volatile WalIndexHdr *pHead; /* Head of the wal file */ - pHead = walIndexHdr(pWal); + WalIndexHdr head; - /* TODO: Check header checksum is good here. */ - - if( memcmp(&pWal->hdr, (void*)pHead, sizeof(WalIndexHdr))!=0 ){ + if( walIndexLoadHdr(pWal, &head) ){ + /* This branch is taken if the wal-index header is corrupted. This + ** occurs if some other writer has crashed while committing a + ** transaction to this database since the current unlocked transaction + ** was opened. */ + rc = SQLITE_BUSY_SNAPSHOT; + }else if( memcmp(&pWal->hdr, (void*)&head, sizeof(WalIndexHdr))!=0 ){ int iHash; - int iLastHash = walFramePage(pHead->mxFrame); + int iLastHash = walFramePage(head.mxFrame); u32 iFirst = pWal->hdr.mxFrame+1; /* First wal frame to check */ - if( memcmp(pWal->hdr.aSalt, (u32*)pHead->aSalt, sizeof(u32)*2) ){ + if( memcmp(pWal->hdr.aSalt, (u32*)head.aSalt, sizeof(u32)*2) ){ assert( pWal->readLock==0 ); iFirst = 1; } @@ -2660,7 +2679,7 @@ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPage1, Bitvec *pAllRead){ int iMin = (iFirst - iZero); int iMax = (iHash==0) ? HASHTABLE_NPAGE_ONE : HASHTABLE_NPAGE; if( iMin<1 ) iMin = 1; - if( iMax>pHead->mxFrame ) iMax = pHead->mxFrame; + if( iMax>head.mxFrame ) iMax = head.mxFrame; for(i=iMin; i<=iMax; i++){ PgHdr *pPg; if( aPgno[i]==1 ){ diff --git a/test/unlocked.test b/test/unlocked.test index 5cbb31dbb9..0e22b97fa1 100644 --- a/test/unlocked.test +++ b/test/unlocked.test @@ -110,13 +110,21 @@ foreach {tn trans commit_ok} { foreach {tn sql} { 1 { CREATE TABLE xx(a, b) } 2 { DROP TABLE t1 } + 3 { CREATE INDEX i1 ON t1(a) } + 4 { CREATE VIEW v1 AS SELECT * FROM t1 } + 5 { CREATE TEMP TABLE xx(a, b) } } { do_catchsql_test 1.7.$tn.1 " BEGIN UNLOCKED; $sql - " {1 {cannot modify database schema - UNLOCKED transaction}} + " {1 {cannot modify database schema within UNLOCKED transaction}} - do_execsql_test 1.7.$tn.2 ROLLBACK + do_execsql_test 1.7.$tn.2 { + SELECT sql FROM sqlite_master; + SELECT sql FROM sqlite_temp_master; + } {{CREATE TABLE t1(a, b)}} + + do_execsql_test 1.7.$tn.3 COMMIT } #------------------------------------------------------------------------- @@ -408,6 +416,37 @@ do_multiclient_test tn { do_test 2.$tn.7.4 { sql3 { PRAGMA integrity_check } } ok } - +#------------------------------------------------------------------------- +# Unlocked transactions may not modify the user_version or application_id. +# +reset_db +do_execsql_test 3.0 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(x, y); + INSERT INTO t1 VALUES('a', 'b'); + PRAGMA user_version = 10; +} {wal} +do_execsql_test 3.1 { + BEGIN UNLOCKED; + INSERT INTO t1 VALUES('c', 'd'); + SELECT * FROM t1; +} {a b c d} +do_catchsql_test 3.2 { + PRAGMA user_version = 11; +} {1 {cannot modify user_version within UNLOCKED transaction}} +do_execsql_test 3.3 { + PRAGMA user_version; + SELECT * FROM t1; +} {10 a b c d} +do_catchsql_test 3.4 { + PRAGMA application_id = 11; +} {1 {cannot modify application_id within UNLOCKED transaction}} +do_execsql_test 3.5 { + COMMIT; + PRAGMA user_version; + PRAGMA application_id; + SELECT * FROM t1; +} {10 0 a b c d} finish_test + From bf3cf57e15a16805f5dfa200c3bfa800d7b6bb2d Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 24 Aug 2015 19:56:04 +0000 Subject: [PATCH 017/113] Change "BEGIN UNLOCKED" to "BEGIN CONCURRENT". FossilOrigin-Name: ba1ab858e2997c88dd7eee6e6893a8616d85c665 --- manifest | 42 ++++++------- manifest.uuid | 2 +- src/btree.c | 46 +++++++------- src/btreeInt.h | 10 +-- src/build.c | 2 +- src/pager.c | 46 +++++++------- src/pager.h | 2 +- src/parse.y | 2 +- src/sqliteInt.h | 2 +- src/test_config.c | 6 +- src/vacuum.c | 2 +- src/vdbe.c | 34 +++++------ src/vdbeaux.c | 10 +-- src/wal.c | 24 ++++---- test/{unlocked.test => concurrent.test} | 74 +++++++++++------------ test/{unlocked2.test => concurrent2.test} | 44 +++++++------- test/{unlocked3.test => concurrent3.test} | 8 +-- tool/mkkeywordhash.c | 2 +- 18 files changed, 179 insertions(+), 179 deletions(-) rename test/{unlocked.test => concurrent.test} (85%) rename test/{unlocked2.test => concurrent2.test} (87%) rename test/{unlocked3.test => concurrent3.test} (93%) diff --git a/manifest b/manifest index c33005f21e..ceae322d8a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\shandling\sof\sattempts\sto\smodify\sthe\sdatabase\sschema,\sapplication_id\sor\suser_version\swithin\san\sUNLOCKED\stransaction. -D 2015-08-24T19:08:10.037 +C Change\s"BEGIN\sUNLOCKED"\sto\s"BEGIN\sCONCURRENT". +D 2015-08-24T19:56:04.567 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e2218eb228374422969de7b1680eda6864affcef F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -279,10 +279,10 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 4d9134dc988a87838c06056c89c0e8c4700a0452 F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c 13f924763ebd6bd55e0b74d139ee363a42abbe0f +F src/btree.c f4db20fab7bf5ebd9f12ef7e3a925ca3c2c34fa8 F src/btree.h 00d4cdb747c4172a5566faf037116985dbbc377e -F src/btreeInt.h 0c19847f87ab82e4f5e67750a069f10829475da6 -F src/build.c e47b6fffe14a28d9050e6747beebb01597d37542 +F src/btreeInt.h 171864bcd81635583dab7b8a04b19b454b18ef80 +F src/build.c 2890c89e0dc274171c18195ff2a6364be47c2b1d F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0 F src/complete.c addcd8160b081131005d5bc2d34adf20c1c5c92f F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b @@ -324,9 +324,9 @@ F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa F src/os_unix.c 388c023582b17890f10c980b30ec1922b471753b F src/os_win.c 40b3af7a47eb1107d0d69e592bec345a3b7b798a F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca -F src/pager.c 57e5775ba3d8059e37e760f8a6f064079196eb9d -F src/pager.h 1e7b0fc3846b71bd95b4b3300820d756895cb4ef -F src/parse.y e9accdb2cb1795f75f478e7ce89e17b19d7d4da7 +F src/pager.c 2e2559e64e825e39c033c0744237733cec70d636 +F src/pager.h 1335b624cd540815c8c977172589d208d1c251a6 +F src/parse.y dc3dda4b191ed54ae7d3662ffc9ee21ba91850ae F src/pcache.c cde06aa50962595e412d497e22fd2e07878ba1f0 F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9 F src/pcache1.c a3fe31b17e841ec70beee72a2c960e9c787a8857 @@ -342,7 +342,7 @@ F src/shell.c b1f91e60918df3a68efad1e3a11696b9a7e23d23 F src/sqlite.h.in 378bebc8fe6a88bade25e5f23b7e6123fdc64b00 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h f700e6a9dd1fdcccc9951ab022b366fb66b9e413 -F src/sqliteInt.h d4963f5f6b985b8f967be8e6e103be3cf36f1f42 +F src/sqliteInt.h 54c3393fc26737db60ed369881d91fa54b71987d F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46 F src/status.c f266ad8a2892d659b74f0f50cb6a88b6e7c12179 F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e @@ -361,7 +361,7 @@ F src/test_autoext.c dea8a01a7153b9adc97bd26161e4226329546e12 F src/test_backup.c 2e6e6a081870150f20c526a2e9d0d29cda47d803 F src/test_blob.c e5a7a81d61a780da79101aeb1e60d300af169e07 F src/test_btree.c 2e9978eca99a9a4bfa8cae949efb00886860a64f -F src/test_config.c 8870dbb8809e2bf7f766828934db7d70c907f346 +F src/test_config.c f853203a1d2035370ea26ad48248f6d00a10b752 F src/test_demovfs.c 0de72c2c89551629f58486fde5734b7d90758852 F src/test_devsym.c e7498904e72ba7491d142d5c83b476c4e76993bc F src/test_fs.c ced436e3d4b8e4681328409b8081051ce614e28f @@ -399,19 +399,19 @@ F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f F src/update.c 487747b328b7216bb7f6af0695d6937d5c9e605f F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c bc9dd64b5db544218b871b66243871c202b2781f -F src/vacuum.c d35c7291e94a470ee47695c22559a69aef9fdda1 -F src/vdbe.c cb555e4a802ec96e16f48c54b57bf15b94616567 +F src/vacuum.c 983cc3754718ef169a6ea9aef86798bd28106f21 +F src/vdbe.c 84ac0688d7e1921d8e802f2e4e1a38273e069d0c F src/vdbe.h 7a75045d879118b9d3af7e8b3c108f2f27c51473 F src/vdbeInt.h 8b54e01ad0463590e7cffabce0bc36da9ee4f816 F src/vdbeapi.c bda74ef4b5103d7b4a4be36f936d3cf2b56a7d6f -F src/vdbeaux.c 5a07e354850fcc96c535f9b0b6ded4c705483a01 +F src/vdbeaux.c 9c59b0604489ebe62869a59f3b627c822d32b278 F src/vdbeblob.c 4f2e8e075d238392df98c5e03a64342465b03f90 F src/vdbemem.c ae38a0d35ae71cf604381a887c170466ba518090 F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 F src/vtab.c d31174e4c8f592febab3fa7f69e18320b4fd657a F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb -F src/wal.c fd9a3b9fa79042377f3e5e42a91fd6e0daf1037e +F src/wal.c a21412a803f0eafecf48e707fb97c64368a0d267 F src/wal.h 903ef67e17f8b466dc7cfc4186fc23e80be10ff8 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba F src/where.c 66518a14a1238611aa0744d6980b6b7f544f4816 @@ -523,6 +523,9 @@ F test/collate9.test 3adcc799229545940df2f25308dd1ad65869145a F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6 F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 08948a4809d22817e0e5de89c7c0a8bd90cb551b +F test/concurrent.test 631e398b127a13ddfbcc8e64f438d9f82b261ffe w test/unlocked.test +F test/concurrent2.test 21a15630192ba92287070a1a58a6e497d393c55d w test/unlocked2.test +F test/concurrent3.test 7dcf81372c06cbac58e7e630aebf7292945947bb w test/unlocked3.test F test/conflict.test 841bcf7cabbfca39c577eb8411ea8601843b46a8 F test/conflict2.test 0d3af4fb534fa1bd020c79960bb56e4d52655f09 F test/conflict3.test dec0634c0f31dec9a4b01c63063e939f0cd21b6b @@ -1227,9 +1230,6 @@ F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 41e7f83c6827605991160a31380148a9fc5f1339 F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825 -F test/unlocked.test fecdc8d76e3495664c74961e6cd1aef9b59439c1 -F test/unlocked2.test 2d969d1b4c3e832169d0c97f522fa5955877785a -F test/unlocked3.test 6c99bc0c3f19ad8ca8c1632b09b089164718dc35 F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 F test/uri.test 23662b7b61958b0f0e47082de7d06341ccf85d5b @@ -1341,7 +1341,7 @@ F tool/lempar.c 01ca97f87610d1dac6d8cd96ab109ab1130e76dc F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c eef612f8adf4d0993dafed0416064cf50d5d33c6 F tool/mkautoconfamal.sh d1a2da0e15b2ed33d60af35c7e9d483f13a8eb9f -F tool/mkkeywordhash.c de4a823fe66f9e8c39c86e465ac7285fd6935bb8 +F tool/mkkeywordhash.c 8d78ea188240bc08ec080adf3af84717f013e69a F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e F tool/mkpragmatab.tcl 84af2b180484323a2ea22a2279e8bd9e3e1e492e F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 @@ -1381,7 +1381,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 041135575417201bbcf0544cc69dcb7369c7fb34 -R c0f10d85f21cf03acdf9208c7581f1d4 +P 5b9f272113d21fd606903509d6f830fe60fac039 +R 7a2246f9f176c887e1e1da04647372c5 U dan -Z 17437f740072ebd0dda6cab278d01c48 +Z f0bce293b4f554fd07229d405fb3ff97 diff --git a/manifest.uuid b/manifest.uuid index e52ba34ef9..e856c7e395 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5b9f272113d21fd606903509d6f830fe60fac039 \ No newline at end of file +ba1ab858e2997c88dd7eee6e6893a8616d85c665 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 8a99dbde14..e391255a41 100644 --- a/src/btree.c +++ b/src/btree.c @@ -440,10 +440,10 @@ static void downgradeAllSharedCacheTableLocks(Btree *p){ #endif /* SQLITE_OMIT_SHARED_CACHE */ -#ifdef SQLITE_ENABLE_UNLOCKED +#ifdef SQLITE_ENABLE_CONCURRENT /* ** The following structure - BtreePtrmap - stores the in-memory pointer map -** used for newly allocated pages in UNLOCKED transactions. Such pages are +** used for newly allocated pages in CONCURRENT transactions. Such pages are ** always allocated in a contiguous block (from the end of the file) starting ** with page BtreePtrmap.iFirst. */ @@ -588,7 +588,7 @@ static void btreePtrmapEnd(BtShared *pBt, int op, int iSvpt){ } /* -** This function is called after an UNLOCKED transaction is opened on the +** This function is called after an CONCURRENT transaction is opened on the ** database. It allocates the BtreePtrmap structure used to track pointers ** to allocated pages and zeroes the nFree/iTrunk fields in the database ** header on page 1. @@ -596,7 +596,7 @@ static void btreePtrmapEnd(BtShared *pBt, int op, int iSvpt){ static int btreePtrmapAllocate(BtShared *pBt){ int rc = SQLITE_OK; BtreePtrmap *pMap = sqlite3_malloc(sizeof(BtreePtrmap)); - assert( pBt->pMap==0 && sqlite3PagerIsUnlocked(pBt->pPager) ); + assert( pBt->pMap==0 && sqlite3PagerIsConcurrent(pBt->pPager) ); if( pMap==0 ){ rc = SQLITE_NOMEM; }else{ @@ -1074,7 +1074,7 @@ static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){ /* The master-journal page number is never added to a pointer-map page */ assert( 0==PTRMAP_ISPAGE(pBt, PENDING_BYTE_PAGE(pBt)) ); -#ifdef SQLITE_ENABLE_UNLOCKED +#ifdef SQLITE_ENABLE_CONCURRENT if( pBt->pMap ){ *pRC = btreePtrmapStore(pBt, key, eType, parent); return; @@ -3339,15 +3339,15 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ if( (pBt->btsFlags & BTS_READ_ONLY)!=0 ){ rc = SQLITE_READONLY; }else{ - int exFlag = (p->db->bUnlocked && !ISAUTOVACUUM) ? -1 : (wrflag>1); + int exFlag = (p->db->bConcurrent && !ISAUTOVACUUM) ? -1 : (wrflag>1); int bSubjInMem = sqlite3TempInMemory(p->db); - assert( p->db->bUnlocked==0 || wrflag==1 ); + assert( p->db->bConcurrent==0 || wrflag==1 ); rc = sqlite3PagerBegin(pBt->pPager, exFlag, bSubjInMem); if( rc==SQLITE_OK ){ rc = newDatabase(pBt); } -#ifdef SQLITE_ENABLE_UNLOCKED - if( rc==SQLITE_OK && sqlite3PagerIsUnlocked(pBt->pPager) ){ +#ifdef SQLITE_ENABLE_CONCURRENT + if( rc==SQLITE_OK && sqlite3PagerIsConcurrent(pBt->pPager) ){ rc = btreePtrmapAllocate(pBt); } #endif @@ -3848,9 +3848,9 @@ static int autoVacuumCommit(BtShared *pBt){ # define setChildPtrmaps(x) SQLITE_OK #endif -#ifdef SQLITE_ENABLE_UNLOCKED +#ifdef SQLITE_ENABLE_CONCURRENT /* -** This function is called as part of merging an UNLOCKED transaction with +** This function is called as part of merging an CONCURRENT transaction with ** the snapshot at the head of the wal file. It relocates all pages in the ** range iFirst..iLast, inclusive. It is assumed that the BtreePtrmap ** structure at BtShared.pMap contains the location of the pointers to each @@ -3918,7 +3918,7 @@ static int btreeRelocateRange( /* ** The b-tree handle passed as the only argument is about to commit an -** UNLOCKED transaction. At this point it is guaranteed that this is +** CONCURRENT transaction. At this point it is guaranteed that this is ** possible - the wal WRITER lock is held and it is known that there are ** no conflicts with committed transactions. */ @@ -3937,7 +3937,7 @@ static int btreeFixUnlocked(Btree *p){ Pgno nPage = btreePagecount(pBt); u32 nFree = get4byte(&p1[36]); - assert( sqlite3PagerIsUnlocked(pPager) ); + assert( sqlite3PagerIsConcurrent(pPager) ); assert( pBt->pMap ); rc = sqlite3PagerUpgradeSnapshot(pPager, pPage1->pDbPage); assert( p1==pPage1->aData ); @@ -3967,7 +3967,7 @@ static int btreeFixUnlocked(Btree *p){ if( nHPage<(pMap->iFirst-1) ){ /* The database consisted of (pMap->iFirst-1) pages when the current - ** unlocked transaction was opened. And an unlocked transaction may + ** concurrent transaction was opened. And an concurrent transaction may ** not be executed on an auto-vacuum database - so the db should ** not have shrunk since the transaction was opened. Therefore nHPage ** should be set to (pMap->iFirst-1) or greater. */ @@ -4042,7 +4042,7 @@ int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zMaster){ #ifndef SQLITE_OMIT_AUTOVACUUM if( pBt->autoVacuum ){ - assert( ISUNLOCKED==0 ); + assert( ISCONCURRENT==0 ); rc = autoVacuumCommit(pBt); if( rc!=SQLITE_OK ){ sqlite3BtreeLeave(p); @@ -4053,7 +4053,7 @@ int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zMaster){ sqlite3PagerTruncateImage(pBt->pPager, pBt->nPage); } #endif - if( rc==SQLITE_OK && ISUNLOCKED ){ + if( rc==SQLITE_OK && ISCONCURRENT ){ rc = btreeFixUnlocked(p); } if( rc==SQLITE_OK ){ @@ -4101,7 +4101,7 @@ static void btreeEndTransaction(Btree *p){ unlockBtreeIfUnused(pBt); } - /* If this was an UNLOCKED transaction, delete the pBt->pMap object */ + /* If this was an CONCURRENT transaction, delete the pBt->pMap object */ btreePtrmapDelete(pBt); btreeIntegrity(p); } @@ -5860,14 +5860,14 @@ static int allocateBtreePage( ** stores stores the total number of pages on the freelist. */ n = get4byte(&pPage1->aData[36]); testcase( n==mxPage-1 ); - if( ISUNLOCKED==0 && n>=mxPage ){ + if( ISCONCURRENT==0 && n>=mxPage ){ return SQLITE_CORRUPT_BKPT; } /* Ensure page 1 is writable. This function will either change the number ** of pages in the free-list or the size of the database file. Since both ** of these operations involve modifying page 1 header fields, page 1 - ** will definitely be written by this transaction. If this is an UNLOCKED + ** will definitely be written by this transaction. If this is an CONCURRENT ** transaction, ensure the BtreePtrmap structure has been allocated. */ rc = sqlite3PagerWrite(pPage1->pDbPage); if( rc ) return rc; @@ -5883,7 +5883,7 @@ static int allocateBtreePage( ** the entire-list will be searched for that page. */ if( eMode==BTALLOC_EXACT ){ - assert( ISAUTOVACUUM!=ISUNLOCKED ); + assert( ISAUTOVACUUM!=ISCONCURRENT ); if( ISAUTOVACUUM ){ if( nearby<=mxPage ){ u8 eType; @@ -9974,14 +9974,14 @@ int sqlite3HeaderSizeBtree(void){ return ROUND8(sizeof(MemPage)); } ** current write-transaction to the database file are held. If the db is ** in rollback mode, this means the EXCLUSIVE lock on the database file. ** -** Or, if this is an UNLOCKED transaction on a wal-mode database, the WRITER +** Or, if this is an CONCURRENT transaction on a wal-mode database, the WRITER ** lock on the wal file. In this case this function also checks that the -** UNLOCKED transaction can be safely committed (does not commit with any +** CONCURRENT transaction can be safely committed (does not commit with any ** other transaction committed since it was opened). ** ** SQLITE_OK is returned if successful. SQLITE_BUSY if the required locks ** cannot be obtained due to a conflicting lock. If the locks cannot be -** obtained for an UNLOCKED transaction due to a conflict with an already +** obtained for an CONCURRENT transaction due to a conflict with an already ** committed transaction, SQLITE_BUSY_SNAPSHOT is returned. Otherwise, if ** some other error (OOM, IO, etc.) occurs, the relevant SQLite error code ** is returned. diff --git a/src/btreeInt.h b/src/btreeInt.h index 4c23629cc8..e686466e81 100644 --- a/src/btreeInt.h +++ b/src/btreeInt.h @@ -448,7 +448,7 @@ struct BtShared { Btree *pWriter; /* Btree with currently open write transaction */ #endif u8 *pTmpSpace; /* Temp space sufficient to hold a single cell */ -#ifdef SQLITE_ENABLE_UNLOCKED +#ifdef SQLITE_ENABLE_CONCURRENT BtreePtrmap *pMap; #endif }; @@ -663,13 +663,13 @@ struct BtCursor { #define ISAUTOVACUUM 0 #endif -#ifdef SQLITE_ENABLE_UNLOCKED -# define ISUNLOCKED (pBt->pMap!=0) +#ifdef SQLITE_ENABLE_CONCURRENT +# define ISCONCURRENT (pBt->pMap!=0) #else -# define ISUNLOCKED 0 +# define ISCONCURRENT 0 #endif -#define REQUIRE_PTRMAP (ISAUTOVACUUM || ISUNLOCKED) +#define REQUIRE_PTRMAP (ISAUTOVACUUM || ISCONCURRENT) /* ** This structure is passed around through all the sanity checking routines diff --git a/src/build.c b/src/build.c index ed216cb292..d37ddde269 100644 --- a/src/build.c +++ b/src/build.c @@ -3862,7 +3862,7 @@ void sqlite3BeginTransaction(Parse *pParse, int type){ sqlite3VdbeUsesBtree(v, i); } } - sqlite3VdbeAddOp3(v, OP_AutoCommit, 0, 0, (type==TK_UNLOCKED)); + sqlite3VdbeAddOp3(v, OP_AutoCommit, 0, 0, (type==TK_CONCURRENT)); } /* diff --git a/src/pager.c b/src/pager.c index 9942211edb..ecdad403dc 100644 --- a/src/pager.c +++ b/src/pager.c @@ -657,8 +657,8 @@ struct Pager { u32 cksumInit; /* Quasi-random value added to every checksum */ u32 nSubRec; /* Number of records written to sub-journal */ Bitvec *pInJournal; /* One bit for each page in the database file */ -#ifdef SQLITE_ENABLE_UNLOCKED - Bitvec *pAllRead; /* Pages read within current UNLOCKED trans. */ +#ifdef SQLITE_ENABLE_CONCURRENT + Bitvec *pAllRead; /* Pages read within current CONCURRENT trans. */ #endif sqlite3_file *fd; /* File descriptor for database */ sqlite3_file *jfd; /* File descriptor for main journal */ @@ -1747,7 +1747,7 @@ static int addToSavepointBitvecs(Pager *pPager, Pgno pgno){ static void pagerFreeBitvecs(Pager *pPager){ sqlite3BitvecDestroy(pPager->pInJournal); pPager->pInJournal = 0; -#ifdef SQLITE_ENABLE_UNLOCKED +#ifdef SQLITE_ENABLE_CONCURRENT sqlite3BitvecDestroy(pPager->pAllRead); pPager->pAllRead = 0; #endif @@ -3035,10 +3035,10 @@ static int pagerRollbackWal(Pager *pPager){ rc = sqlite3WalUndo(pPager->pWal, pagerUndoCallback, (void *)pPager); pList = sqlite3PcacheDirtyList(pPager->pPCache); - /* If this is an UNLOCKED transaction, then page 1 must be reread from + /* If this is an CONCURRENT transaction, then page 1 must be reread from ** the db file, even if it is not dirty. This is because the b-tree layer ** may have already zeroed the nFree and iTrunk header fields. */ -#ifdef SQLITE_ENABLE_UNLOCKED +#ifdef SQLITE_ENABLE_CONCURRENT if( rc==SQLITE_OK && (pList==0 || pList->pgno!=1) && pPager->pAllRead ){ rc = pagerUndoCallback((void*)pPager, 1); } @@ -4452,9 +4452,9 @@ static int pagerStress(void *p, PgHdr *pPg){ pPg->pDirty = 0; if( pagerUseWal(pPager) ){ - /* If the transaction is a "BEGIN UNLOCKED" transaction, the page + /* If the transaction is a "BEGIN CONCURRENT" transaction, the page ** cannot be flushed to disk. Return early in this case. */ -#ifdef SQLITE_ENABLE_UNLOCKED +#ifdef SQLITE_ENABLE_CONCURRENT if( pPager->pAllRead ) return SQLITE_OK; #endif @@ -5298,10 +5298,10 @@ int sqlite3PagerAcquire( } pPager->hasBeenUsed = 1; - /* If this is an UNLOCKED transaction and the page being read was + /* If this is an CONCURRENT transaction and the page being read was ** present in the database file when the transaction was opened, ** mark it as read in the pAllRead vector. */ -#ifdef SQLITE_ENABLE_UNLOCKED +#ifdef SQLITE_ENABLE_CONCURRENT if( pPager->pAllRead && pgno<=pPager->dbOrigSize ){ rc = sqlite3BitvecSet(pPager->pAllRead, pgno); if( rc!=SQLITE_OK ) goto pager_acquire_err; @@ -5593,7 +5593,7 @@ static int pager_open_journal(Pager *pPager){ ** functions need be called. ** ** If (exFlag<0) and the database is in WAL mode, do not take any locks. -** The transaction will run in UNLOCKED mode instead. +** The transaction will run in CONCURRENT mode instead. ** ** If the subjInMemory argument is non-zero, then any sub-journal opened ** within this transaction will be opened as an in-memory file. This @@ -5612,7 +5612,7 @@ int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){ if( ALWAYS(pPager->eState==PAGER_READER) ){ assert( pPager->pInJournal==0 ); -#ifdef SQLITE_ENABLE_UNLOCKED +#ifdef SQLITE_ENABLE_CONCURRENT assert( pPager->pAllRead==0 ); #endif @@ -5633,7 +5633,7 @@ int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){ ** The busy-handler is not invoked if another connection already ** holds the write-lock. If possible, the upper layer will call it. */ -#ifdef SQLITE_ENABLE_UNLOCKED +#ifdef SQLITE_ENABLE_CONCURRENT if( exFlag<0 ){ pPager->pAllRead = sqlite3BitvecCreate(pPager->dbSize); if( pPager->pAllRead==0 ){ @@ -5949,7 +5949,7 @@ int sqlite3PagerWrite(PgHdr *pPg){ ** to sqlite3PagerWrite(). In other words, return TRUE if it is ok ** to change the content of the page. */ -#if defined(SQLITE_ENABLE_UNLOCKED) || !defined(NDEBUG) +#if defined(SQLITE_ENABLE_CONCURRENT) || !defined(NDEBUG) int sqlite3PagerIswriteable(DbPage *pPg){ return pPg->flags & PGHDR_WRITEABLE; } @@ -6105,10 +6105,10 @@ int sqlite3PagerSync(Pager *pPager, const char *zMaster){ ** current write-transaction to the database file are held. If the db is ** in rollback mode, this means the EXCLUSIVE lock on the database file. ** -** Or, if this is a non-UNLOCKED transaction on a wal-mode database, this +** Or, if this is a non-CONCURRENT transaction on a wal-mode database, this ** function is a no-op. ** -** If this is an UNLOCKED transaction on a wal-mode database, this function +** If this is an CONCURRENT transaction on a wal-mode database, this function ** attempts to obtain the WRITER lock on the wal file and also checks to ** see that the transaction can be safely committed (does not commit with ** any other transaction committed since it was opened). @@ -6116,7 +6116,7 @@ int sqlite3PagerSync(Pager *pPager, const char *zMaster){ ** If the required locks are already held or successfully obtained and ** the transaction can be committed, SQLITE_OK is returned. If a required lock ** cannot be obtained, SQLITE_BUSY is returned. Or, if the current transaction -** is UNLOCKED and cannot be committed due to a conflict, SQLITE_BUSY_SNAPSHOT +** is CONCURRENT and cannot be committed due to a conflict, SQLITE_BUSY_SNAPSHOT ** is returned. Otherwise, if some other error occurs (IO error, OOM etc.), ** and SQLite error code is returned. */ @@ -6130,10 +6130,10 @@ int sqlite3PagerExclusiveLock(Pager *pPager, PgHdr *pPage1){ if( 0==pagerUseWal(pPager) ){ rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); } -#ifdef SQLITE_ENABLE_UNLOCKED +#ifdef SQLITE_ENABLE_CONCURRENT else{ if( pPager->pAllRead ){ - /* This is an UNLOCKED transaction. Attempt to lock the wal database + /* This is an CONCURRENT transaction. Attempt to lock the wal database ** here. If SQLITE_BUSY (but not SQLITE_BUSY_SNAPSHOT) is returned, ** invoke the busy-handler and try again for as long as it returns ** non-zero. */ @@ -6148,9 +6148,9 @@ int sqlite3PagerExclusiveLock(Pager *pPager, PgHdr *pPage1){ return rc; } -#ifdef SQLITE_ENABLE_UNLOCKED +#ifdef SQLITE_ENABLE_CONCURRENT /* -** This function is called as part of committing an UNLOCKED transaction. +** This function is called as part of committing an CONCURRENT transaction. ** At this point the wal WRITER lock is held, and all pages in the cache ** except for page 1 are compatible with the snapshot at the head of the ** wal file. @@ -6185,9 +6185,9 @@ void sqlite3PagerSetDbsize(Pager *pPager, Pgno nSz){ } /* -** Return true if this pager is currently within an UNLOCKED transaction. +** Return true if this pager is currently within an CONCURRENT transaction. */ -int sqlite3PagerIsUnlocked(Pager *pPager){ +int sqlite3PagerIsConcurrent(Pager *pPager){ return pPager->pAllRead!=0; } @@ -6200,7 +6200,7 @@ void sqlite3PagerDropExclusiveLock(Pager *pPager){ sqlite3WalEndWriteTransaction(pPager->pWal); } } -#endif /* ifdef SQLITE_ENABLE_UNLOCKED */ +#endif /* ifdef SQLITE_ENABLE_CONCURRENT */ /* diff --git a/src/pager.h b/src/pager.h index c097c97c5b..c9ebaf1116 100644 --- a/src/pager.h +++ b/src/pager.h @@ -195,7 +195,7 @@ void sqlite3PagerTruncateImage(Pager*,Pgno); void sqlite3PagerRekey(DbPage*, Pgno, u16); void sqlite3PagerDropExclusiveLock(Pager*); -int sqlite3PagerIsUnlocked(Pager*); +int sqlite3PagerIsConcurrent(Pager*); int sqlite3PagerIswriteable(DbPage*); int sqlite3PagerUpgradeSnapshot(Pager *pPager, DbPage*); void sqlite3PagerSetDbsize(Pager *pPager, Pgno); diff --git a/src/parse.y b/src/parse.y index 2dd58bdf55..1fc72f753d 100644 --- a/src/parse.y +++ b/src/parse.y @@ -121,7 +121,7 @@ transtype(A) ::= . {A = TK_DEFERRED;} transtype(A) ::= DEFERRED(X). {A = @X;} transtype(A) ::= IMMEDIATE(X). {A = @X;} transtype(A) ::= EXCLUSIVE(X). {A = @X;} -transtype(A) ::= UNLOCKED(X). {A = @X;} +transtype(A) ::= CONCURRENT(X). {A = @X;} cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);} cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);} cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);} diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 2d295b01fa..39931f0870 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1150,7 +1150,7 @@ struct sqlite3 { u16 dbOptFlags; /* Flags to enable/disable optimizations */ u8 enc; /* Text encoding */ u8 autoCommit; /* The auto-commit flag. */ - u8 bUnlocked; /* Current transaction is "UNLOCKED" */ + u8 bConcurrent; /* Current transaction is "CONCURRENT" */ u8 temp_store; /* 1: file 2: memory 0: default */ u8 mallocFailed; /* True if we have seen a malloc failure */ u8 dfltLockMode; /* Default locking-mode for attached dbs */ diff --git a/src/test_config.c b/src/test_config.c index 4d2dece83a..d153697715 100644 --- a/src/test_config.c +++ b/src/test_config.c @@ -573,10 +573,10 @@ Tcl_SetVar2(interp, "sqlite_options", "mergesort", "1", TCL_GLOBAL_ONLY); Tcl_SetVar2(interp, "sqlite_options", "truncate_opt", "1", TCL_GLOBAL_ONLY); #endif -#ifdef SQLITE_ENABLE_UNLOCKED - Tcl_SetVar2(interp, "sqlite_options", "unlocked", "1", TCL_GLOBAL_ONLY); +#ifdef SQLITE_ENABLE_CONCURRENT + Tcl_SetVar2(interp, "sqlite_options", "concurrent", "1", TCL_GLOBAL_ONLY); #else - Tcl_SetVar2(interp, "sqlite_options", "unlocked", "0", TCL_GLOBAL_ONLY); + Tcl_SetVar2(interp, "sqlite_options", "concurrent", "0", TCL_GLOBAL_ONLY); #endif #ifdef SQLITE_OMIT_UTF16 diff --git a/src/vacuum.c b/src/vacuum.c index 46f2249ebb..eafaa66165 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -356,7 +356,7 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ ** is closed by the DETACH. */ db->autoCommit = 1; - assert( db->bUnlocked==0 ); + assert( db->bConcurrent==0 ); if( pDb ){ sqlite3BtreeClose(pDb->pBt); diff --git a/src/vdbe.c b/src/vdbe.c index 3cdb252fdf..67703a781a 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2895,7 +2895,7 @@ case OP_Savepoint: { ** is committed. */ int isTransaction = pSavepoint->pNext==0 && db->isTransactionSavepoint; - assert( db->bUnlocked==0 || db->isTransactionSavepoint==0 ); + assert( db->bConcurrent==0 || db->isTransactionSavepoint==0 ); if( isTransaction && p1==SAVEPOINT_RELEASE ){ if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ goto vdbe_return; @@ -2979,7 +2979,7 @@ case OP_Savepoint: { ** there are active writing VMs or active VMs that use shared cache. ** ** If P3 is non-zero, then this instruction is being executed as part of -** a "BEGIN UNLOCKED" command. +** a "BEGIN CONCURRENT" command. ** ** This instruction causes the VM to halt. */ @@ -2987,25 +2987,25 @@ case OP_AutoCommit: { int desiredAutoCommit; int iRollback; int turnOnAC; - int bUnlocked; + int bConcurrent; int hrc; desiredAutoCommit = pOp->p1; iRollback = pOp->p2; - bUnlocked = pOp->p3; + bConcurrent = pOp->p3; turnOnAC = desiredAutoCommit && !db->autoCommit; assert( desiredAutoCommit==1 || desiredAutoCommit==0 ); assert( desiredAutoCommit==1 || iRollback==0 ); - assert( desiredAutoCommit==0 || bUnlocked==0 ); - assert( db->autoCommit==0 || db->bUnlocked==0 ); + assert( desiredAutoCommit==0 || bConcurrent==0 ); + assert( db->autoCommit==0 || db->bConcurrent==0 ); assert( db->nVdbeActive>0 ); /* At least this one VM is active */ assert( p->bIsReader ); if( turnOnAC && !iRollback - && (db->nVdbeWrite>0 || (db->bUnlocked && db->nVdbeActive>1)) + && (db->nVdbeWrite>0 || (db->bConcurrent && db->nVdbeActive>1)) ){ /* A transaction may only be committed if there are no other active - ** writer VMs. If the transaction is UNLOCKED, then it may only be + ** writer VMs. If the transaction is CONCURRENT, then it may only be ** committed if there are no active VMs at all (readers or writers). ** ** If this instruction is a COMMIT and the transaction may not be @@ -3020,7 +3020,7 @@ case OP_AutoCommit: { assert( desiredAutoCommit==1 ); sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); db->autoCommit = 1; - db->bUnlocked = 0; + db->bConcurrent = 0; }else if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ goto vdbe_return; }else{ @@ -3034,7 +3034,7 @@ case OP_AutoCommit: { rc = SQLITE_BUSY; goto vdbe_return; } - db->bUnlocked = (u8)bUnlocked; + db->bConcurrent = (u8)bConcurrent; assert( db->nStatement==0 ); sqlite3CloseSavepoints(db); if( p->rc==SQLITE_OK ){ @@ -3227,12 +3227,12 @@ case OP_SetCookie: { /* in3 */ assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) ); pIn3 = &aMem[pOp->p3]; sqlite3VdbeMemIntegerify(pIn3); -#ifdef SQLITE_ENABLE_UNLOCKED - if( db->bUnlocked +#ifdef SQLITE_ENABLE_CONCURRENT + if( db->bConcurrent && (pOp->p2==BTREE_USER_VERSION || pOp->p2==BTREE_APPLICATION_ID) ){ rc = SQLITE_ERROR; - sqlite3VdbeError(p, "cannot modify %s within UNLOCKED transaction", + sqlite3VdbeError(p, "cannot modify %s within CONCURRENT transaction", pOp->p2==BTREE_USER_VERSION ? "user_version" : "application_id" ); break; @@ -3242,7 +3242,7 @@ case OP_SetCookie: { /* in3 */ rc = sqlite3BtreeUpdateMeta(pDb->pBt, pOp->p2, (int)pIn3->u.i); if( pOp->p2==BTREE_SCHEMA_VERSION ){ /* When the schema cookie changes, record the new cookie internally */ - assert( db->bUnlocked==0 ); + assert( db->bConcurrent==0 ); pDb->pSchema->schema_cookie = (int)pIn3->u.i; db->flags |= SQLITE_InternChanges; }else if( pOp->p2==BTREE_FILE_FORMAT ){ @@ -6115,11 +6115,11 @@ case OP_Expire: { */ case OP_TableLock: { u8 isWriteLock = (u8)pOp->p3; -#ifdef SQLITE_ENABLE_UNLOCKED - if( isWriteLock && db->bUnlocked && pOp->p2==1 ){ +#ifdef SQLITE_ENABLE_CONCURRENT + if( isWriteLock && db->bConcurrent && pOp->p2==1 ){ rc = SQLITE_ERROR; sqlite3VdbeError(p, - "cannot modify database schema within UNLOCKED transaction"); + "cannot modify database schema within CONCURRENT transaction"); rc = SQLITE_ERROR; break; } diff --git a/src/vdbeaux.c b/src/vdbeaux.c index ea467e08a3..4aef2ee08e 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2025,8 +2025,8 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ } } -#ifdef SQLITE_ENABLE_UNLOCKED - if( db->bUnlocked && (rc & 0xFF)==SQLITE_BUSY ){ +#ifdef SQLITE_ENABLE_CONCURRENT + if( db->bConcurrent && (rc & 0xFF)==SQLITE_BUSY ){ /* An SQLITE_BUSY or SQLITE_BUSY_SNAPSHOT was encountered while ** attempting to take the WRITER lock on a wal file. Release the ** WRITER locks on all wal files and return early. */ @@ -2443,7 +2443,7 @@ int sqlite3VdbeHalt(Vdbe *p){ sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); sqlite3CloseSavepoints(db); db->autoCommit = 1; - db->bUnlocked = 0; + db->bConcurrent = 0; p->nChange = 0; } } @@ -2506,7 +2506,7 @@ int sqlite3VdbeHalt(Vdbe *p){ sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); sqlite3CloseSavepoints(db); db->autoCommit = 1; - db->bUnlocked = 0; + db->bConcurrent = 0; p->nChange = 0; } } @@ -2528,7 +2528,7 @@ int sqlite3VdbeHalt(Vdbe *p){ sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); sqlite3CloseSavepoints(db); db->autoCommit = 1; - db->bUnlocked = 0; + db->bConcurrent = 0; p->nChange = 0; } } diff --git a/src/wal.c b/src/wal.c index 9a2152424a..4db4209750 100644 --- a/src/wal.c +++ b/src/wal.c @@ -768,7 +768,7 @@ static const char *walLockName(int lockIdx){ /* ** Set or release locks on the WAL. Locks are either shared or exclusive. ** A lock cannot be moved directly between shared and exclusive - it must go -** through the unlocked state first. +** through the concurrent state first. ** ** In locking_mode=EXCLUSIVE, all of these routines become no-ops. */ @@ -1068,7 +1068,7 @@ static int walIndexRecover(Wal *pWal){ /* Obtain an exclusive lock on all byte in the locking range not already ** locked by the caller. The caller is guaranteed to have locked the ** WAL_WRITE_LOCK byte, and may have also locked the WAL_CKPT_LOCK byte. - ** If successful, the same bytes that are locked here are unlocked before + ** If successful, the same bytes that are locked here are concurrent before ** this function returns. */ assert( pWal->ckptLock==1 || pWal->ckptLock==0 ); @@ -2608,14 +2608,14 @@ static int walUpgradeReadlock(Wal *pWal){ } -#ifdef SQLITE_ENABLE_UNLOCKED +#ifdef SQLITE_ENABLE_CONCURRENT /* -** This function is only ever called when committing a "BEGIN UNLOCKED" +** This function is only ever called when committing a "BEGIN CONCURRENT" ** transaction. It may be assumed that no frames have been written to ** the wal file. The second parameter is a pointer to the in-memory ** representation of page 1 of the database (which may or may not be ** dirty). The third is a bitvec with a bit set for each page in the -** database file that was read by the current unlocked transaction. +** database file that was read by the current concurrent transaction. ** ** This function performs three tasks: ** @@ -2626,7 +2626,7 @@ static int walUpgradeReadlock(Wal *pWal){ ** it was opened, and ** ** 3) It ejects any non-dirty pages from the page-cache that have been -** written by another client since the UNLOCKED transaction was started +** written by another client since the CONCURRENT transaction was started ** (so as to avoid ending up with an inconsistent cache after the ** current transaction is committed). ** @@ -2657,7 +2657,7 @@ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPage1, Bitvec *pAllRead){ if( walIndexLoadHdr(pWal, &head) ){ /* This branch is taken if the wal-index header is corrupted. This ** occurs if some other writer has crashed while committing a - ** transaction to this database since the current unlocked transaction + ** transaction to this database since the current concurrent transaction ** was opened. */ rc = SQLITE_BUSY_SNAPSHOT; }else if( memcmp(&pWal->hdr, (void*)&head, sizeof(WalIndexHdr))!=0 ){ @@ -2698,13 +2698,13 @@ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPage1, Bitvec *pAllRead){ } }else if( sqlite3BitvecTestNotNull(pAllRead, aPgno[i]) ){ sqlite3_log(SQLITE_OK, - "cannot commit UNLOCKED transaction (conflict at page %d)", + "cannot commit CONCURRENT transaction (conflict at page %d)", (int)aPgno[i] ); rc = SQLITE_BUSY_SNAPSHOT; }else if( (pPg = sqlite3PagerLookup(pPager, aPgno[i])) ){ /* Page aPgno[i], which is present in the pager cache, has been - ** modified since the current UNLOCKED transaction was started. + ** modified since the current CONCURRENT transaction was started. ** However it was not read by the current transaction, so is not ** a conflict. There are two possibilities: (a) the page was ** allocated at the of the file by the current transaction or @@ -2735,14 +2735,14 @@ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPage1, Bitvec *pAllRead){ } /* -** This function is called as part of committing an UNLOCKED transaction. +** This function is called as part of committing an CONCURRENT transaction. ** It is assumed that sqlite3WalLockForCommit() has already been successfully ** called and so (a) the WRITER lock is held and (b) it is known that the ** wal-index-header stored in shared memory is not corrupt. ** ** Before returning, this function upgrades the client so that it is ** operating on the database snapshot currently at the head of the wal file -** (even if the UNLOCKED transaction ran against an older snapshot). +** (even if the CONCURRENT transaction ran against an older snapshot). ** ** SQLITE_OK is returned if successful, or an SQLite error code otherwise. */ @@ -2760,7 +2760,7 @@ int sqlite3WalUpgradeSnapshot(Wal *pWal){ } return rc; } -#endif /* SQLITE_ENABLE_UNLOCKED */ +#endif /* SQLITE_ENABLE_CONCURRENT */ /* ** End a write transaction. The commit has already been done. This diff --git a/test/unlocked.test b/test/concurrent.test similarity index 85% rename from test/unlocked.test rename to test/concurrent.test index 0e22b97fa1..4f542ee797 100644 --- a/test/unlocked.test +++ b/test/concurrent.test @@ -13,9 +13,9 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl source $testdir/lock_common.tcl -set ::testprefix unlocked +set ::testprefix concurrent -ifcapable !unlocked { +ifcapable !concurrent { finish_test return } @@ -26,7 +26,7 @@ do_execsql_test 1.0 { do_execsql_test 1.1 { CREATE TABLE t1(k INTEGER PRIMARY KEY, v); - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t1 VALUES(1, 'abcd'); COMMIT; } @@ -36,7 +36,7 @@ do_execsql_test 1.2 { } {1 abcd} do_execsql_test 1.3 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t1 VALUES(2, 'efgh'); ROLLBACK; } @@ -47,10 +47,10 @@ do_execsql_test 1.4 { #------------------------------------------------------------------------- -# UNLOCKED transactions cannot do cache spills. +# CONCURRENT transactions cannot do cache spills. # foreach {tn trans spill} { - 1 {BEGIN UNLOCKED} 0 + 1 {BEGIN CONCURRENT} 0 2 {BEGIN} 1 } { do_test 1.5.$tn { @@ -72,7 +72,7 @@ foreach {tn trans spill} { } #------------------------------------------------------------------------- -# UNLOCKED transactions man not be committed while there are active +# CONCURRENT transactions man not be committed while there are active # readers. do_execsql_test 1.6.setup { DROP TABLE t1; @@ -82,7 +82,7 @@ do_execsql_test 1.6.setup { INSERT INTO t1 VALUES(5, 6); } foreach {tn trans commit_ok} { - 1 {BEGIN UNLOCKED} 0 + 1 {BEGIN CONCURRENT} 0 2 {BEGIN} 1 } { do_test 1.6.$tn.1 { @@ -105,7 +105,7 @@ foreach {tn trans commit_ok} { } #------------------------------------------------------------------------- -# UNLOCKED transactions may not modify the db schema. +# CONCURRENT transactions may not modify the db schema. # foreach {tn sql} { 1 { CREATE TABLE xx(a, b) } @@ -115,9 +115,9 @@ foreach {tn sql} { 5 { CREATE TEMP TABLE xx(a, b) } } { do_catchsql_test 1.7.$tn.1 " - BEGIN UNLOCKED; + BEGIN CONCURRENT; $sql - " {1 {cannot modify database schema within UNLOCKED transaction}} + " {1 {cannot modify database schema within CONCURRENT transaction}} do_execsql_test 1.7.$tn.2 { SELECT sql FROM sqlite_master; @@ -128,8 +128,8 @@ foreach {tn sql} { } #------------------------------------------------------------------------- -# If an auto-vacuum database is written within an UNLOCKED transaction, it -# is handled in the same way as for a non-UNLOCKED transaction. +# If an auto-vacuum database is written within an CONCURRENT transaction, it +# is handled in the same way as for a non-CONCURRENT transaction. # reset_db do_execsql_test 1.8.1 { @@ -140,20 +140,20 @@ do_execsql_test 1.8.1 { } {wal} do_execsql_test 1.8.2 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; SELECT * FROM t1; COMMIT; } {x y} do_catchsql_test 1.8.3 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t1 VALUES('a', 'b'); } {0 {}} do_test 1.8.4 { sqlite3 db2 test.db catchsql { - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t1 VALUES('c', 'd'); } db2 } {1 {database is locked}} @@ -166,10 +166,10 @@ do_test 1.8.5 { do_multiclient_test tn { #----------------------------------------------------------------------- - # 1. Start an UNLOCKED transaction using [db1]. + # 1. Start an CONCURRENT transaction using [db1]. # # 2. Start and then rollback a regular transaction using [db2]. This - # can be done as the ongoing [db1] transaction is UNLOCKED. + # can be done as the ongoing [db1] transaction is CONCURRENT. # # 3. The [db1] transaction can now be committed, as [db2] has relinquished # the write lock. @@ -181,7 +181,7 @@ do_multiclient_test tn { INSERT INTO t1 VALUES(1, 'one'); } sql1 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t1 VALUES(2, 'two'); } code1 { sqlite3_get_autocommit db } @@ -201,7 +201,7 @@ do_multiclient_test tn { } {1 one 2 two} #----------------------------------------------------------------------- - # 1. Start an UNLOCKED transaction using [db1]. + # 1. Start an CONCURRENT transaction using [db1]. # # 2. Commit a transaction using [db2]. # @@ -210,7 +210,7 @@ do_multiclient_test tn { # do_test 2.$tn.2.1 { sql1 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t1 VALUES(-1, 'hello world'); } } {} @@ -238,7 +238,7 @@ do_multiclient_test tn { } {-1 {hello world} 1 one 2 two} #----------------------------------------------------------------------- - # 1. Start an UNLOCKED transaction using [db1]. + # 1. Start an CONCURRENT transaction using [db1]. # # 2. Open a transaction using [db2]. # @@ -250,7 +250,7 @@ do_multiclient_test tn { # do_test 2.$tn.3.1 { sql1 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t1 VALUES(4, 'four'); } } {} @@ -293,12 +293,12 @@ do_multiclient_test tn { } {} do_test 2.$tn.4.2 { sql2 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t2 VALUES('i', 'n'); } sql1 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t1 VALUES(5, 'five'); COMMIT; } @@ -319,16 +319,16 @@ do_multiclient_test tn { #----------------------------------------------------------------------- # The "schema cookie" issue. # - # 1. Begin and UNLOCKED write to "t1" using [db] + # 1. Begin and CONCURRENT write to "t1" using [db] # # 2. Create an index on t1 using [db2]. # - # 3. Attempt to commit the UNLOCKED write. This is an SQLITE_BUSY_SNAPSHOT, + # 3. Attempt to commit the CONCURRENT write. This is an SQLITE_BUSY_SNAPSHOT, # even though there is no page collision. # do_test 2.$tn.5.1 { sql1 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t1 VALUES(6, 'six'); } } {} @@ -348,15 +348,15 @@ do_multiclient_test tn { #----------------------------------------------------------------------- # - # 1. Begin an UNLOCKED write to "t1" using [db] + # 1. Begin an CONCURRENT write to "t1" using [db] # # 2. Lots of inserts into t2. Enough to grow the db file and modify page 1. # - # 3. Check that the UNLOCKED transaction can not be committed. + # 3. Check that the CONCURRENT transaction can not be committed. # do_test 2.$tn.6.1 { sql1 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t1 VALUES(6, 'six'); } } {} @@ -384,17 +384,17 @@ do_multiclient_test tn { #----------------------------------------------------------------------- # - # 1. Begin an big UNLOCKED write to "t1" using [db] - large enough to + # 1. Begin an big CONCURRENT write to "t1" using [db] - large enough to # grow the db file. # # 2. Lots of inserts into t2. Also enough to grow the db file. # - # 3. Check that the UNLOCKED transaction cannot be committed (due to a clash + # 3. Check that the CONCURRENT transaction cannot be committed (due to a clash # on page 1 - the db size field). # do_test 2.$tn.7.1 { sql1 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; WITH src(a,b) AS ( VALUES(10000,10000) UNION ALL SELECT a+1,b+1 FROM src WHERE a<20000 ) INSERT INTO t1 SELECT * FROM src; @@ -427,20 +427,20 @@ do_execsql_test 3.0 { PRAGMA user_version = 10; } {wal} do_execsql_test 3.1 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t1 VALUES('c', 'd'); SELECT * FROM t1; } {a b c d} do_catchsql_test 3.2 { PRAGMA user_version = 11; -} {1 {cannot modify user_version within UNLOCKED transaction}} +} {1 {cannot modify user_version within CONCURRENT transaction}} do_execsql_test 3.3 { PRAGMA user_version; SELECT * FROM t1; } {10 a b c d} do_catchsql_test 3.4 { PRAGMA application_id = 11; -} {1 {cannot modify application_id within UNLOCKED transaction}} +} {1 {cannot modify application_id within CONCURRENT transaction}} do_execsql_test 3.5 { COMMIT; PRAGMA user_version; diff --git a/test/unlocked2.test b/test/concurrent2.test similarity index 87% rename from test/unlocked2.test rename to test/concurrent2.test index f28d62e0a1..d058733e48 100644 --- a/test/unlocked2.test +++ b/test/concurrent2.test @@ -13,9 +13,9 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl source $testdir/lock_common.tcl -set ::testprefix unlocked2 +set ::testprefix concurrent2 -ifcapable !unlocked { +ifcapable !concurrent { finish_test return } @@ -31,11 +31,11 @@ do_multiclient_test tn { } {wal} do_test 1.$tn.5 { sql3 { PRAGMA integrity_check } } {ok} - # Test that an UNLOCKED transaction that allocates/frees no pages does + # Test that an CONCURRENT transaction that allocates/frees no pages does # not conflict with a transaction that does allocate pages. do_test 1.$tn.2 { sql1 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t1 VALUES(4); } sql2 { @@ -47,11 +47,11 @@ do_multiclient_test tn { } {} do_test 1.$tn.5 { sql3 { PRAGMA integrity_check } } {ok} - # But that an UNLOCKED transaction does conflict with a transaction + # But that an CONCURRENT transaction does conflict with a transaction # that modifies the db schema. do_test 1.$tn.3 { sql1 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t1 VALUES(5); } sql2 { @@ -61,12 +61,12 @@ do_multiclient_test tn { } {1 {database is locked}} do_test 1.$tn.5 { sql3 { PRAGMA integrity_check } } {ok} - # Test that an UNLOCKED transaction that allocates at least one page + # Test that an CONCURRENT transaction that allocates at least one page # does not conflict with a transaction that allocates no pages. do_test 1.$tn.4 { sql1 { ROLLBACK; - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t1 VALUES(randomblob(1500)); } sql2 { @@ -91,7 +91,7 @@ do_multiclient_test tn { do_test 2.$tn.2 { sql1 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t1 VALUES(randomblob(1500)); } sql2 { @@ -104,7 +104,7 @@ do_multiclient_test tn { do_test 2.$tn.4 { sql1 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; DELETE FROM t1; } sql2 { @@ -124,7 +124,7 @@ do_multiclient_test tn { } sql1 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; DELETE FROM t1 WHERE rowid=2; } @@ -139,15 +139,15 @@ do_multiclient_test tn { } #------------------------------------------------------------------------- -# When an UNLOCKED transaction is opened on a database, the nFree and +# When an CONCURRENT transaction is opened on a database, the nFree and # iTrunk header fields of the cached version of page 1 are both set -# to 0. This allows an UNLOCKED transaction to use its own private +# to 0. This allows an CONCURRENT transaction to use its own private # free-page-list, which is merged with the main database free-list when # the transaction is committed. # # The following tests check that nFree/iTrunk are correctly restored if -# an UNLOCKED transaction is rolled back, and that savepoint rollbacks -# that occur within UNLOCKED transactions do not incorrectly restore +# an CONCURRENT transaction is rolled back, and that savepoint rollbacks +# that occur within CONCURRENT transactions do not incorrectly restore # these fields to their on-disk values. # reset_db @@ -159,7 +159,7 @@ do_execsql_test 3.0 { } {wal} do_execsql_test 3.1 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t1 VALUES(1, 2); ROLLBACK; } @@ -168,7 +168,7 @@ do_execsql_test 3.2 { PRAGMA integrity_check } {ok} do_execsql_test 3.3 { PRAGMA freelist_count } {2} do_execsql_test 3.4.1 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; PRAGMA freelist_count; } {2} do_execsql_test 3.4.2 { @@ -184,7 +184,7 @@ do_execsql_test 3.4.5 { COMMIT; PRAGMA freelist_count } {2} do_execsql_test 3.4.6 { PRAGMA integrity_check } {ok} do_execsql_test 3.5.1 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; UPDATE t1 SET x=randomblob(10) WHERE y=555; PRAGMA freelist_count; } {0} @@ -195,7 +195,7 @@ do_execsql_test 3.5.2 { do_execsql_test 3.5.3 { PRAGMA integrity_check } {ok} #------------------------------------------------------------------------- -# Test that nothing goes wrong if an UNLOCKED transaction allocates a +# Test that nothing goes wrong if an CONCURRENT transaction allocates a # page at the end of the file, frees it within the same transaction, and # then has to move the same page to avoid a conflict on COMMIT. # @@ -210,7 +210,7 @@ do_multiclient_test tn { do_test 4.$tn.2 { sql1 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t1 VALUES(randomblob(1500)); INSERT INTO t1 VALUES(randomblob(1500)); DELETE FROM t1 WHERE rowid = 1; @@ -243,7 +243,7 @@ do_multiclient_test tn { do_test 5.$tn.2 { sql1 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t2 VALUES(randomblob(1500)); PRAGMA page_count; } @@ -275,7 +275,7 @@ do_multiclient_test tn { do_test 6.$tn.2 { sql1 { - BEGIN UNLOCKED; + BEGIN CONCURRENT; INSERT INTO t1 VALUES(randomblob(1500)); INSERT INTO t1 VALUES(randomblob(1500)); } diff --git a/test/unlocked3.test b/test/concurrent3.test similarity index 93% rename from test/unlocked3.test rename to test/concurrent3.test index 36299db381..25e5d7c6c9 100644 --- a/test/unlocked3.test +++ b/test/concurrent3.test @@ -9,17 +9,17 @@ # #*********************************************************************** # -# Tests for transactions started with BEGIN UNLOCKED. The tests in this +# Tests for transactions started with BEGIN CONCURRENT. The tests in this # file focus on testing that deferred page allocation works properly. # set testdir [file dirname $argv0] source $testdir/tester.tcl source $testdir/lock_common.tcl -set ::testprefix unlocked3 +set ::testprefix concurrent3 if {$AUTOVACUUM} { finish_test ; return } -ifcapable !unlocked { +ifcapable !concurrent { finish_test return } @@ -110,7 +110,7 @@ foreach {tn oplist} { foreach db $DBLIST { sqlite3 $db test.db } do_test 1.$tn { - foreach db $DBLIST { $db eval "BEGIN UNLOCKED" } + foreach db $DBLIST { $db eval "BEGIN CONCURRENT" } foreach op $oplist { set iTbl [string range $op 0 0] diff --git a/tool/mkkeywordhash.c b/tool/mkkeywordhash.c index d1810cbeb9..50585b1d09 100644 --- a/tool/mkkeywordhash.c +++ b/tool/mkkeywordhash.c @@ -171,6 +171,7 @@ static Keyword aKeywordTable[] = { { "COLLATE", "TK_COLLATE", ALWAYS }, { "COLUMN", "TK_COLUMNKW", ALTER }, { "COMMIT", "TK_COMMIT", ALWAYS }, + { "CONCURRENT", "TK_CONCURRENT", ALWAYS }, { "CONFLICT", "TK_CONFLICT", CONFLICT }, { "CONSTRAINT", "TK_CONSTRAINT", ALWAYS }, { "CREATE", "TK_CREATE", ALWAYS }, @@ -262,7 +263,6 @@ static Keyword aKeywordTable[] = { { "TRIGGER", "TK_TRIGGER", TRIGGER }, { "UNION", "TK_UNION", COMPOUND }, { "UNIQUE", "TK_UNIQUE", ALWAYS }, - { "UNLOCKED", "TK_UNLOCKED", ALWAYS }, { "UPDATE", "TK_UPDATE", ALWAYS }, { "USING", "TK_USING", ALWAYS }, { "VACUUM", "TK_VACUUM", VACUUM }, From 0cd4f69c0cbb5d0e1eb6582564f91cc10f2c91fd Mon Sep 17 00:00:00 2001 From: mistachkin Date: Mon, 24 Aug 2015 22:06:02 +0000 Subject: [PATCH 018/113] Remove duplicated line of code. FossilOrigin-Name: 47280f2a2b7cc83bf11ab86284204f565c278c55 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/vdbe.c | 1 - 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index ceae322d8a..ee49634063 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\s"BEGIN\sUNLOCKED"\sto\s"BEGIN\sCONCURRENT". -D 2015-08-24T19:56:04.567 +C Remove\sduplicated\sline\sof\scode. +D 2015-08-24T22:06:02.586 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e2218eb228374422969de7b1680eda6864affcef F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -400,7 +400,7 @@ F src/update.c 487747b328b7216bb7f6af0695d6937d5c9e605f F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c bc9dd64b5db544218b871b66243871c202b2781f F src/vacuum.c 983cc3754718ef169a6ea9aef86798bd28106f21 -F src/vdbe.c 84ac0688d7e1921d8e802f2e4e1a38273e069d0c +F src/vdbe.c 791a28761cf6176d11ec3e41cdf8e749c65384ff F src/vdbe.h 7a75045d879118b9d3af7e8b3c108f2f27c51473 F src/vdbeInt.h 8b54e01ad0463590e7cffabce0bc36da9ee4f816 F src/vdbeapi.c bda74ef4b5103d7b4a4be36f936d3cf2b56a7d6f @@ -523,9 +523,9 @@ F test/collate9.test 3adcc799229545940df2f25308dd1ad65869145a F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6 F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 08948a4809d22817e0e5de89c7c0a8bd90cb551b -F test/concurrent.test 631e398b127a13ddfbcc8e64f438d9f82b261ffe w test/unlocked.test -F test/concurrent2.test 21a15630192ba92287070a1a58a6e497d393c55d w test/unlocked2.test -F test/concurrent3.test 7dcf81372c06cbac58e7e630aebf7292945947bb w test/unlocked3.test +F test/concurrent.test 631e398b127a13ddfbcc8e64f438d9f82b261ffe +F test/concurrent2.test 21a15630192ba92287070a1a58a6e497d393c55d +F test/concurrent3.test 7dcf81372c06cbac58e7e630aebf7292945947bb F test/conflict.test 841bcf7cabbfca39c577eb8411ea8601843b46a8 F test/conflict2.test 0d3af4fb534fa1bd020c79960bb56e4d52655f09 F test/conflict3.test dec0634c0f31dec9a4b01c63063e939f0cd21b6b @@ -1381,7 +1381,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 5b9f272113d21fd606903509d6f830fe60fac039 -R 7a2246f9f176c887e1e1da04647372c5 -U dan -Z f0bce293b4f554fd07229d405fb3ff97 +P ba1ab858e2997c88dd7eee6e6893a8616d85c665 +R 9abcd1f9df86b1795253bff8998d1e7d +U mistachkin +Z ced970d02bef7e6e65b8cf8ae80899c7 diff --git a/manifest.uuid b/manifest.uuid index e856c7e395..408e86fc5b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ba1ab858e2997c88dd7eee6e6893a8616d85c665 \ No newline at end of file +47280f2a2b7cc83bf11ab86284204f565c278c55 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 67703a781a..bf14bd1173 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -6120,7 +6120,6 @@ case OP_TableLock: { rc = SQLITE_ERROR; sqlite3VdbeError(p, "cannot modify database schema within CONCURRENT transaction"); - rc = SQLITE_ERROR; break; } #endif From ac0a42233adf135f0cd1ac66e4f8dbc17f7e500a Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 25 Aug 2015 14:37:39 +0000 Subject: [PATCH 019/113] Fix a segfault that could occur following an OOM condition in the concurrent transaction code. FossilOrigin-Name: 231b5880228cf01efe3981bc8be3150d79b422e5 --- manifest | 15 ++++---- manifest.uuid | 2 +- src/btree.c | 2 +- test/concfault.test | 86 ++++++++++++++++++++++++++++++++++++++++++++ test/concurrent.test | 1 + 5 files changed, 97 insertions(+), 9 deletions(-) create mode 100644 test/concfault.test diff --git a/manifest b/manifest index acbd257352..b28ae7786e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\slatest\strunk\schanges\swith\sthis\sbranch. -D 2015-08-25T11:16:02.604 +C Fix\sa\ssegfault\sthat\scould\soccur\sfollowing\san\sOOM\scondition\sin\sthe\sconcurrent\stransaction\scode. +D 2015-08-25T14:37:39.823 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e2218eb228374422969de7b1680eda6864affcef F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -279,7 +279,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 4d9134dc988a87838c06056c89c0e8c4700a0452 F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c f4db20fab7bf5ebd9f12ef7e3a925ca3c2c34fa8 +F src/btree.c a76329691503fc68ec374791aaf4074dc8686b3a F src/btree.h 00d4cdb747c4172a5566faf037116985dbbc377e F src/btreeInt.h 171864bcd81635583dab7b8a04b19b454b18ef80 F src/build.c 1b5814e0eeaba096ae3ee17ebd139d2a25af7250 @@ -523,7 +523,8 @@ F test/collate9.test 3adcc799229545940df2f25308dd1ad65869145a F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6 F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 08948a4809d22817e0e5de89c7c0a8bd90cb551b -F test/concurrent.test 631e398b127a13ddfbcc8e64f438d9f82b261ffe +F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 +F test/concurrent.test 26c2d49abbf4847ceed9bf8cf7fbe9a2a4ffc70c F test/concurrent2.test 21a15630192ba92287070a1a58a6e497d393c55d F test/concurrent3.test 7dcf81372c06cbac58e7e630aebf7292945947bb F test/conflict.test 841bcf7cabbfca39c577eb8411ea8601843b46a8 @@ -1381,7 +1382,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 47280f2a2b7cc83bf11ab86284204f565c278c55 8f1d9f1f308518522ebb1eaebb9b184b4ac30924 -R 4996e84b0ad088ebe2e29da93ebd1db4 +P 3e7d6dd62dfa63d7def00bd00ac055a606a0c80d +R 7e8bf99bd9ee49e1baaabce6c0c30e59 U dan -Z 753c22f173f485729e70306b30e77d72 +Z 16262c3600df8d68cd85cb26ef84be69 diff --git a/manifest.uuid b/manifest.uuid index fa55886f4f..9e2c009bc9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3e7d6dd62dfa63d7def00bd00ac055a606a0c80d \ No newline at end of file +231b5880228cf01efe3981bc8be3150d79b422e5 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index e391255a41..9b90f58d07 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3904,9 +3904,9 @@ static int btreeRelocateRange( }else{ rc = allocateBtreePage(pBt, &pFree, &iNew, iFirst-1, BTALLOC_LE); assert( rc!=SQLITE_OK || iNeweType, pEntry->parent,iNew,1); releasePage(pPg); diff --git a/test/concfault.test b/test/concfault.test new file mode 100644 index 0000000000..6d409c8d74 --- /dev/null +++ b/test/concfault.test @@ -0,0 +1,86 @@ +# 2015 Aug 25 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# This file contains fault injection tests designed to test the concurrent +# transactions feature. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/malloc_common.tcl +set testprefix concfault + +# This test will not work with an in-memory journal, as the database will +# become corrupt if an error is injected into a transaction after it starts +# writing data out to the db file. +ifcapable !concurrent { + finish_test + return +} + +do_test 1-pre1 { + execsql { + PRAGMA journal_mode = wal; + CREATE TABLE t1(a PRIMARY KEY, b); + INSERT INTO t1 VALUES(randomblob(1000), randomblob(100)); + INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1; + INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1; + INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1; + INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1; + DELETE FROM t1 WHERE rowid%2; + } + faultsim_save_and_close +} {} + +do_faultsim_test 1.1 -prep { + faultsim_restore_and_reopen +} -body { + execsql { + BEGIN CONCURRENT; + INSERT INTO t1 VALUES(randomblob(1000), randomblob(100)); + COMMIT; + } +} -test { + faultsim_test_result {0 {}} + catchsql { ROLLBACK } + faultsim_integrity_check +} + +do_faultsim_test 1.2 -prep { + faultsim_restore_and_reopen +} -body { + execsql { + BEGIN CONCURRENT; + INSERT INTO t1 VALUES(randomblob(1000), randomblob(100)); + ROLLBACK; + } +} -test { + faultsim_test_result {0 {}} + catchsql { ROLLBACK } + faultsim_integrity_check +} + +do_faultsim_test 1.3 -prep { + faultsim_restore_and_reopen +} -body { + execsql { + BEGIN CONCURRENT; + DELETE FROM t1; + COMMIT; + } +} -test { + faultsim_test_result {0 {}} + catchsql { ROLLBACK } + faultsim_integrity_check +} + +finish_test + diff --git a/test/concurrent.test b/test/concurrent.test index 4f542ee797..cf7d59257c 100644 --- a/test/concurrent.test +++ b/test/concurrent.test @@ -448,5 +448,6 @@ do_execsql_test 3.5 { SELECT * FROM t1; } {10 0 a b c d} + finish_test From 4073b26a20526e08ddadd3137d641cb8b6a627ae Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 25 Aug 2015 16:01:04 +0000 Subject: [PATCH 020/113] Test that if a corrupt wal-index header is encountered when attempting to commit a concurrent transaction, SQLITE_BUSY_SNAPSHOT is returned to the caller. FossilOrigin-Name: c746e0bd20cb136eed2b691f326657d266e2f1ed --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/concurrent2.test | 41 +++++++++++++++++++++++++++++++++++++++++ test/wal2.test | 37 ------------------------------------- test/wal_common.tcl | 40 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 90 insertions(+), 46 deletions(-) diff --git a/manifest b/manifest index b28ae7786e..57a2877c15 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\ssegfault\sthat\scould\soccur\sfollowing\san\sOOM\scondition\sin\sthe\sconcurrent\stransaction\scode. -D 2015-08-25T14:37:39.823 +C Test\sthat\sif\sa\scorrupt\swal-index\sheader\sis\sencountered\swhen\sattempting\sto\scommit\sa\sconcurrent\stransaction,\sSQLITE_BUSY_SNAPSHOT\sis\sreturned\sto\sthe\scaller. +D 2015-08-25T16:01:04.106 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e2218eb228374422969de7b1680eda6864affcef F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -525,7 +525,7 @@ F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 08948a4809d22817e0e5de89c7c0a8bd90cb551b F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 F test/concurrent.test 26c2d49abbf4847ceed9bf8cf7fbe9a2a4ffc70c -F test/concurrent2.test 21a15630192ba92287070a1a58a6e497d393c55d +F test/concurrent2.test 4b9d1cc7126bb83bb08aca0e7fa10e0eab54b0c7 F test/concurrent3.test 7dcf81372c06cbac58e7e630aebf7292945947bb F test/conflict.test 841bcf7cabbfca39c577eb8411ea8601843b46a8 F test/conflict2.test 0d3af4fb534fa1bd020c79960bb56e4d52655f09 @@ -1262,7 +1262,7 @@ F test/vtab_alter.test 9e374885248f69e251bdaacf480b04a197f125e5 F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8 F test/vtab_shared.test ea8778d5b0df200adef2ca7c00c3c37d4375f772 F test/wal.test dbfc482e10c7263298833bb1fc60b3ac9d6340a1 -F test/wal2.test 1f841d2048080d32f552942e333fd99ce541dada +F test/wal2.test dc801f6d3f8f39d1534ffbd15a715b0b287508db F test/wal3.test 2b5445e5da44780b9b44712f5a38523f7aeb0941 F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c F test/wal5.test 88b5d9a6a3d1532497ee9f4296f010d66f07e33c @@ -1271,7 +1271,7 @@ F test/wal64k.test 163655ecd2cb8afef4737cac2a40fdd2eeaf20b8 F test/wal7.test 2ae8f427d240099cc4b2dfef63cff44e2a68a1bd F test/wal8.test 75c42e1bc4545c277fed212f8fc9b7723cd02216 F test/wal9.test 378e76a9ad09cd9bee06c172ad3547b0129a6750 -F test/wal_common.tcl a98f17fba96206122eff624db0ab13ec377be4fe +F test/wal_common.tcl 37902864b63794e9bf59393b8887e21a9cbd4db8 F test/walbak.test b9f68e39646375c2b877be906babcc15d38b4877 F test/walbig.test f437473a16cfb314867c6b5d1dbcd519e73e3434 F test/walblock.test be48f3a75eff0b4456209f26b3ce186c2015497d @@ -1382,7 +1382,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 3e7d6dd62dfa63d7def00bd00ac055a606a0c80d -R 7e8bf99bd9ee49e1baaabce6c0c30e59 +P 231b5880228cf01efe3981bc8be3150d79b422e5 +R f2d97f3b3defb10cf5a80dc03134f727 U dan -Z 16262c3600df8d68cd85cb26ef84be69 +Z ef5936cdf16a4565acadeed2265c73bc diff --git a/manifest.uuid b/manifest.uuid index 9e2c009bc9..203a63006a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -231b5880228cf01efe3981bc8be3150d79b422e5 \ No newline at end of file +c746e0bd20cb136eed2b691f326657d266e2f1ed \ No newline at end of file diff --git a/test/concurrent2.test b/test/concurrent2.test index d058733e48..f254e6d2aa 100644 --- a/test/concurrent2.test +++ b/test/concurrent2.test @@ -9,10 +9,13 @@ # #*********************************************************************** # +# Miscellaneous tests for transactions started with BEGIN CONCURRENT. +# set testdir [file dirname $argv0] source $testdir/tester.tcl source $testdir/lock_common.tcl +source $testdir/wal_common.tcl set ::testprefix concurrent2 ifcapable !concurrent { @@ -296,5 +299,43 @@ do_multiclient_test tn { do_test 6.$tn.5 { sql3 { PRAGMA integrity_check } } {ok} do_test 6.$tn.5 { sql3 { SELECT count(*) from t1 } } {3} } + +#------------------------------------------------------------------------- +# Test that if a corrupt wal-index-header is encountered when attempting +# to commit a CONCURRENT transaction, the transaction is not committed +# (or rolled back) and that SQLITE_BUSY_SNAPSHOT is returned to the user. +# +catch { db close } +forcedelete test.db +testvfs tvfs +sqlite3 db test.db -vfs tvfs +do_execsql_test 7.1 { + PRAGMA journal_mode = wal; + BEGIN; + CREATE TABLE t1(a, b, PRIMARY KEY(a)); + INSERT INTO t1 VALUES(1, 2); + INSERT INTO t1 VALUES(3, 4); + COMMIT; + BEGIN CONCURRENT; + INSERT INTO t1 VALUES(5, 6); + INSERT INTO t1 VALUES(7, 8); + SELECT * FROM t1; +} {wal 1 2 3 4 5 6 7 8} + +# Corrupt the wal-index header +incr_tvfs_hdr test.db 11 1 + +do_catchsql_test 7.2.1 { COMMIT } {1 {database is locked}} +do_test 7.2.2 { sqlite3_extended_errcode db } SQLITE_BUSY_SNAPSHOT + +do_execsql_test 7.3.1 { + SELECT * FROM t1; + ROLLBACK; +} {1 2 3 4 5 6 7 8} +do_execsql_test 7.3.2 { + SELECT * FROM t1; +} {1 2 3 4} + + finish_test diff --git a/test/wal2.test b/test/wal2.test index 9d45444d6a..ad2147c2bc 100644 --- a/test/wal2.test +++ b/test/wal2.test @@ -35,43 +35,6 @@ proc cond_incr_sync_count {adj} { } } -proc set_tvfs_hdr {file args} { - - # Set $nHdr to the number of bytes in the wal-index header: - set nHdr 48 - set nInt [expr {$nHdr/4}] - - if {[llength $args]>2} { - error {wrong # args: should be "set_tvfs_hdr fileName ?val1? ?val2?"} - } - - set blob [tvfs shm $file] - if {$::tcl_platform(byteOrder)=="bigEndian"} {set fmt I} {set fmt i} - - if {[llength $args]} { - set ia [lindex $args 0] - set ib $ia - if {[llength $args]==2} { - set ib [lindex $args 1] - } - binary scan $blob a[expr $nHdr*2]a* dummy tail - set blob [binary format ${fmt}${nInt}${fmt}${nInt}a* $ia $ib $tail] - tvfs shm $file $blob - } - - binary scan $blob ${fmt}${nInt} ints - return $ints -} - -proc incr_tvfs_hdr {file idx incrval} { - set ints [set_tvfs_hdr $file] - set v [lindex $ints $idx] - incr v $incrval - lset ints $idx $v - set_tvfs_hdr $file $ints -} - - #------------------------------------------------------------------------- # Test case wal2-1.*: # diff --git a/test/wal_common.tcl b/test/wal_common.tcl index 917ad598f6..e39bffdc26 100644 --- a/test/wal_common.tcl +++ b/test/wal_common.tcl @@ -90,4 +90,44 @@ proc wal_fix_walindex_cksum {hdrvar} { lset hdr 11 $c2 } +# This command assumes that $file is the name of a database file opened +# in wal mode using a [testvfs] VFS. It returns a list of the 12 32-bit +# integers that make up the wal-index-header for the named file. +# +proc set_tvfs_hdr {file args} { + + # Set $nHdr to the number of bytes in the wal-index header: + set nHdr 48 + set nInt [expr {$nHdr/4}] + + if {[llength $args]>2} { + error {wrong # args: should be "set_tvfs_hdr fileName ?val1? ?val2?"} + } + + set blob [tvfs shm $file] + if {$::tcl_platform(byteOrder)=="bigEndian"} {set fmt I} {set fmt i} + + if {[llength $args]} { + set ia [lindex $args 0] + set ib $ia + if {[llength $args]==2} { + set ib [lindex $args 1] + } + binary scan $blob a[expr $nHdr*2]a* dummy tail + set blob [binary format ${fmt}${nInt}${fmt}${nInt}a* $ia $ib $tail] + tvfs shm $file $blob + } + + binary scan $blob ${fmt}${nInt} ints + return $ints +} + +proc incr_tvfs_hdr {file idx incrval} { + set ints [set_tvfs_hdr $file] + set v [lindex $ints $idx] + incr v $incrval + lset ints $idx $v + set_tvfs_hdr $file $ints +} + From 57888f73007001d764dcb950cf5d862dbee30eb4 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 25 Aug 2015 17:16:33 +0000 Subject: [PATCH 021/113] If "PRAGMA integrity_check" is run while the database is being written by a CONCURRENT transaction, do not consider unreferenced pages to be an error. They may be part of the free-page list, which is not visible at the b-tree layer when running a CONCURRENT transaction. FossilOrigin-Name: f32b57b49311693eb0c0c9f6f14859e7b1fa93d8 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 8 +++++--- test/concurrent2.test | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 57a2877c15..8c41809276 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Test\sthat\sif\sa\scorrupt\swal-index\sheader\sis\sencountered\swhen\sattempting\sto\scommit\sa\sconcurrent\stransaction,\sSQLITE_BUSY_SNAPSHOT\sis\sreturned\sto\sthe\scaller. -D 2015-08-25T16:01:04.106 +C If\s"PRAGMA\sintegrity_check"\sis\srun\swhile\sthe\sdatabase\sis\sbeing\swritten\sby\sa\sCONCURRENT\stransaction,\sdo\snot\sconsider\sunreferenced\spages\sto\sbe\san\serror.\sThey\smay\sbe\spart\sof\sthe\sfree-page\slist,\swhich\sis\snot\svisible\sat\sthe\sb-tree\slayer\swhen\srunning\sa\sCONCURRENT\stransaction. +D 2015-08-25T17:16:33.362 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e2218eb228374422969de7b1680eda6864affcef F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -279,7 +279,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 4d9134dc988a87838c06056c89c0e8c4700a0452 F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c a76329691503fc68ec374791aaf4074dc8686b3a +F src/btree.c aacef0cd0c57c2a1b2ed8a27794fc9e20b6e7a90 F src/btree.h 00d4cdb747c4172a5566faf037116985dbbc377e F src/btreeInt.h 171864bcd81635583dab7b8a04b19b454b18ef80 F src/build.c 1b5814e0eeaba096ae3ee17ebd139d2a25af7250 @@ -525,7 +525,7 @@ F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 08948a4809d22817e0e5de89c7c0a8bd90cb551b F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 F test/concurrent.test 26c2d49abbf4847ceed9bf8cf7fbe9a2a4ffc70c -F test/concurrent2.test 4b9d1cc7126bb83bb08aca0e7fa10e0eab54b0c7 +F test/concurrent2.test fa570bf9723f5c30fe40d9f2b1faa55c3c712c41 F test/concurrent3.test 7dcf81372c06cbac58e7e630aebf7292945947bb F test/conflict.test 841bcf7cabbfca39c577eb8411ea8601843b46a8 F test/conflict2.test 0d3af4fb534fa1bd020c79960bb56e4d52655f09 @@ -1382,7 +1382,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 231b5880228cf01efe3981bc8be3150d79b422e5 -R f2d97f3b3defb10cf5a80dc03134f727 +P c746e0bd20cb136eed2b691f326657d266e2f1ed +R e20e0a06f63966f8ec3b7d9acf7660a9 U dan -Z ef5936cdf16a4565acadeed2265c73bc +Z 220f77062430ec96f6fa5ad5d41eac8b diff --git a/manifest.uuid b/manifest.uuid index 203a63006a..5bcd4bc5e7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c746e0bd20cb136eed2b691f326657d266e2f1ed \ No newline at end of file +f32b57b49311693eb0c0c9f6f14859e7b1fa93d8 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 9b90f58d07..70c36a933c 100644 --- a/src/btree.c +++ b/src/btree.c @@ -9653,9 +9653,11 @@ char *sqlite3BtreeIntegrityCheck( } pBt->db->flags = savedDbFlags; - /* Make sure every page in the file is referenced - */ - for(i=1; i<=sCheck.nPage && sCheck.mxErr; i++){ + /* Make sure every page in the file is referenced. Skip this if the + ** database is currently being written by a CONCURRENT transaction (it + ** may fail as pages that were part of the free-list when the transaction + ** was opened cannot be counted). */ + for(i=1; ISCONCURRENT==0 && i<=sCheck.nPage && sCheck.mxErr; i++){ #ifdef SQLITE_OMIT_AUTOVACUUM if( getPageReferenced(&sCheck, i)==0 ){ checkAppendMsg(&sCheck, "Page %d is never used", i); diff --git a/test/concurrent2.test b/test/concurrent2.test index f254e6d2aa..3472db61f4 100644 --- a/test/concurrent2.test +++ b/test/concurrent2.test @@ -336,6 +336,38 @@ do_execsql_test 7.3.2 { SELECT * FROM t1; } {1 2 3 4} +#------------------------------------------------------------------------- +# Test that "PRAGMA integrity_check" works within a concurrent +# transaction. Within a concurrent transaction, "PRAGMA integrity_check" +# is unable to detect unused database pages, but can detect other types +# of corruption. +# +reset_db +do_execsql_test 8.1 { + PRAGMA journal_mode = wal; + CREATE TABLE kv(k INTEGER PRIMARY KEY, v UNIQUE); + INSERT INTO kv VALUES(NULL, randomblob(750)); + INSERT INTO kv SELECT NULL, randomblob(750) FROM kv; + INSERT INTO kv SELECT NULL, randomblob(750) FROM kv; + INSERT INTO kv SELECT NULL, randomblob(750) FROM kv; + INSERT INTO kv SELECT NULL, randomblob(750) FROM kv; + INSERT INTO kv SELECT NULL, randomblob(750) FROM kv; + DELETE FROM kv WHERE rowid%2; + PRAGMA freelist_count; +} {wal 33} +do_execsql_test 8.2 { PRAGMA integrity_check } ok +do_execsql_test 8.3 { + BEGIN CONCURRENT; + PRAGMA integrity_check; +} {ok} +do_execsql_test 8.4 { + INSERT INTO kv VALUES(1100, 1100); + PRAGMA integrity_check; +} {ok} +do_execsql_test 8.5 { + COMMIT; + PRAGMA integrity_check; +} {ok} finish_test From fef3410f7ff75d88a478c221495017f0fbae2e82 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 25 Aug 2015 19:10:29 +0000 Subject: [PATCH 022/113] Add miscellaneous test cases for concurrent transactions. FossilOrigin-Name: 779b1d0e17bc54062b2b09cdbf94e9e2f4bae4f7 --- manifest | 14 +++++----- manifest.uuid | 2 +- test/concurrent.test | 58 +++++++++++++++++++++++++++++++++++++++++- test/concurrent2.test | 59 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 124 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 8c41809276..452016bd91 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C If\s"PRAGMA\sintegrity_check"\sis\srun\swhile\sthe\sdatabase\sis\sbeing\swritten\sby\sa\sCONCURRENT\stransaction,\sdo\snot\sconsider\sunreferenced\spages\sto\sbe\san\serror.\sThey\smay\sbe\spart\sof\sthe\sfree-page\slist,\swhich\sis\snot\svisible\sat\sthe\sb-tree\slayer\swhen\srunning\sa\sCONCURRENT\stransaction. -D 2015-08-25T17:16:33.362 +C Add\smiscellaneous\stest\scases\sfor\sconcurrent\stransactions. +D 2015-08-25T19:10:29.114 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e2218eb228374422969de7b1680eda6864affcef F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -524,8 +524,8 @@ F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6 F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 08948a4809d22817e0e5de89c7c0a8bd90cb551b F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 -F test/concurrent.test 26c2d49abbf4847ceed9bf8cf7fbe9a2a4ffc70c -F test/concurrent2.test fa570bf9723f5c30fe40d9f2b1faa55c3c712c41 +F test/concurrent.test ecf97fdcfb11dda1db52b2714d7d52d0922789f1 +F test/concurrent2.test de43cd6703360dc6268907f1617f0d353d8a43c1 F test/concurrent3.test 7dcf81372c06cbac58e7e630aebf7292945947bb F test/conflict.test 841bcf7cabbfca39c577eb8411ea8601843b46a8 F test/conflict2.test 0d3af4fb534fa1bd020c79960bb56e4d52655f09 @@ -1382,7 +1382,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c746e0bd20cb136eed2b691f326657d266e2f1ed -R e20e0a06f63966f8ec3b7d9acf7660a9 +P f32b57b49311693eb0c0c9f6f14859e7b1fa93d8 +R cbe24c6dda59af48460d1125c5ffff88 U dan -Z 220f77062430ec96f6fa5ad5d41eac8b +Z 967a64b7790792e3ecfbe18cee7c81a2 diff --git a/manifest.uuid b/manifest.uuid index 5bcd4bc5e7..16d88ba06c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f32b57b49311693eb0c0c9f6f14859e7b1fa93d8 \ No newline at end of file +779b1d0e17bc54062b2b09cdbf94e9e2f4bae4f7 \ No newline at end of file diff --git a/test/concurrent.test b/test/concurrent.test index cf7d59257c..4bc2852c60 100644 --- a/test/concurrent.test +++ b/test/concurrent.test @@ -417,7 +417,7 @@ do_multiclient_test tn { } #------------------------------------------------------------------------- -# Unlocked transactions may not modify the user_version or application_id. +# Concurrent transactions may not modify the user_version or application_id. # reset_db do_execsql_test 3.0 { @@ -448,6 +448,62 @@ do_execsql_test 3.5 { SELECT * FROM t1; } {10 0 a b c d} +#------------------------------------------------------------------------- +# However, another transaction modifying the user_version or application_id +# should not cause a conflict. And committing a concurrent transaction does not +# clobber the modification - even if the concurrent transaction allocates or +# frees database pages. +# +do_multiclient_test tn { + do_test 4.$tn.1 { + sql1 { + PRAGMA journal_mode = wal; + CREATE TABLE ttt(y UNIQUE, z UNIQUE); + PRAGMA user_version = 14; + BEGIN CONCURRENT; + INSERT INTO ttt VALUES('y', 'z'); + } + } {wal} + do_test 4.$tn.2 { + sql2 { PRAGMA user_version = 16 } + sql1 COMMIT + sql1 { PRAGMA user_version } + } {16} + + do_test 4.$tn.3 { + sql1 { + BEGIN CONCURRENT; + INSERT INTO ttt VALUES(randomblob(10000), randomblob(4)); + PRAGMA user_version; + } + } {16} + do_test 4.$tn.4 { + sql2 { PRAGMA user_version = 1234 } + sql1 { + PRAGMA user_version; + COMMIT; + PRAGMA user_version; + PRAGMA integrity_check; + } + } {16 1234 ok} + + do_test 4.$tn.5 { + sql1 { + BEGIN CONCURRENT; + DELETE FROM ttt; + PRAGMA user_version; + } + } {1234} + do_test 4.$tn.4 { + sql2 { PRAGMA user_version = 5678 } + sql1 { + PRAGMA user_version; + COMMIT; + PRAGMA user_version; + PRAGMA integrity_check; + } + } {1234 5678 ok} +} finish_test diff --git a/test/concurrent2.test b/test/concurrent2.test index 3472db61f4..7f04a06b31 100644 --- a/test/concurrent2.test +++ b/test/concurrent2.test @@ -369,5 +369,64 @@ do_execsql_test 8.5 { PRAGMA integrity_check; } {ok} +#------------------------------------------------------------------------- +# Test that concurrent transactions do not allow foreign-key constraints +# to be bypassed. +# +do_multiclient_test tn { + do_test 9.$tn.1 { + sql1 { + PRAGMA journal_mode = wal; + CREATE TABLE pp(i INTEGER PRIMARY KEY, j); + CREATE TABLE cc(a, b REFERENCES pp); + + WITH seq(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM seq WHERE i<100) + INSERT INTO pp SELECT i, randomblob(1000) FROM seq; + + PRAGMA foreign_keys = 1; + } + } {wal} + + + do_test 9.$tn.2.1 { + sql1 { + BEGIN CONCURRENT; + INSERT INTO cc VALUES(42, 42); + } + } {} + do_test 9.$tn.2.2 { + sql2 { DELETE FROM pp WHERE i=42 } + list [catch { sql1 COMMIT } msg] $msg + } {1 {database is locked}} + do_test 9.$tn.2.3 { + sql1 ROLLBACK + } {} + + do_test 9.$tn.3.1 { + sql1 { + PRAGMA foreign_keys = 0; + BEGIN CONCURRENT; + INSERT INTO cc VALUES(43, 43); + } + } {} + do_test 9.$tn.3.2 { + sql2 { DELETE FROM pp WHERE i=43 } + list [catch { sql1 COMMIT } msg] $msg + } {0 {}} + + do_test 9.$tn.4.1 { + sql1 { + PRAGMA foreign_keys = on; + BEGIN CONCURRENT; + INSERT INTO cc VALUES(44, 44); + } + } {} + do_test 9.$tn.4.2 { + sql2 { DELETE FROM pp WHERE i=1 } + list [catch { sql1 COMMIT } msg] $msg + } {0 {}} +} + + finish_test From de36c76a2369c76d6edf53f11381357685dff889 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 26 Aug 2015 18:02:20 +0000 Subject: [PATCH 023/113] Fix a problem allowing some conflicting transactions to be committed. FossilOrigin-Name: a0566382d564ca17fd13475a44fed8f714742d97 --- manifest | 14 +++---- manifest.uuid | 2 +- src/wal.c | 2 +- test/concurrent3.test | 97 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 452016bd91..79ab2b14bc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\smiscellaneous\stest\scases\sfor\sconcurrent\stransactions. -D 2015-08-25T19:10:29.114 +C Fix\sa\sproblem\sallowing\ssome\sconflicting\stransactions\sto\sbe\scommitted. +D 2015-08-26T18:02:20.162 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e2218eb228374422969de7b1680eda6864affcef F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -411,7 +411,7 @@ F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 F src/vtab.c d31174e4c8f592febab3fa7f69e18320b4fd657a F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb -F src/wal.c a21412a803f0eafecf48e707fb97c64368a0d267 +F src/wal.c 44ec009f7742a660d3558845e47e870af4542689 F src/wal.h 903ef67e17f8b466dc7cfc4186fc23e80be10ff8 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba F src/where.c 66518a14a1238611aa0744d6980b6b7f544f4816 @@ -526,7 +526,7 @@ F test/colname.test 08948a4809d22817e0e5de89c7c0a8bd90cb551b F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 F test/concurrent.test ecf97fdcfb11dda1db52b2714d7d52d0922789f1 F test/concurrent2.test de43cd6703360dc6268907f1617f0d353d8a43c1 -F test/concurrent3.test 7dcf81372c06cbac58e7e630aebf7292945947bb +F test/concurrent3.test 8474b7ac80bc977bab4fe014c0b036c16779d8cb F test/conflict.test 841bcf7cabbfca39c577eb8411ea8601843b46a8 F test/conflict2.test 0d3af4fb534fa1bd020c79960bb56e4d52655f09 F test/conflict3.test dec0634c0f31dec9a4b01c63063e939f0cd21b6b @@ -1382,7 +1382,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f32b57b49311693eb0c0c9f6f14859e7b1fa93d8 -R cbe24c6dda59af48460d1125c5ffff88 +P 779b1d0e17bc54062b2b09cdbf94e9e2f4bae4f7 +R 522c73a54721e2428308711f9566b92e U dan -Z 967a64b7790792e3ecfbe18cee7c81a2 +Z 5afacf522fa16d68d46082708ed9d148 diff --git a/manifest.uuid b/manifest.uuid index 16d88ba06c..5d4bfea3dc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -779b1d0e17bc54062b2b09cdbf94e9e2f4bae4f7 \ No newline at end of file +a0566382d564ca17fd13475a44fed8f714742d97 \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index 4db4209750..445d084628 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2680,7 +2680,7 @@ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPage1, Bitvec *pAllRead){ int iMax = (iHash==0) ? HASHTABLE_NPAGE_ONE : HASHTABLE_NPAGE; if( iMin<1 ) iMin = 1; if( iMax>head.mxFrame ) iMax = head.mxFrame; - for(i=iMin; i<=iMax; i++){ + for(i=iMin; rc==SQLITE_OK && i<=iMax; i++){ PgHdr *pPg; if( aPgno[i]==1 ){ /* Check that the schema cookie has not been modified. If diff --git a/test/concurrent3.test b/test/concurrent3.test index 25e5d7c6c9..a90fa2b973 100644 --- a/test/concurrent3.test +++ b/test/concurrent3.test @@ -24,6 +24,12 @@ ifcapable !concurrent { return } +db close +sqlite3_shutdown +#test_sqlite3_log xLog +#proc xLog {error_code msg} { puts "$error_code: $msg" } +reset_db + proc create_schema {} { db eval { PRAGMA journal_mode = wal; @@ -128,5 +134,96 @@ foreach {tn oplist} { } } +#------------------------------------------------------------------------- +# +proc create_schema2 {} { + db eval { + PRAGMA journal_mode = wal; + CREATE TABLE t1(x INTEGER PRIMARY KEY, y); + CREATE INDEX i1 ON t1(y); + } +} + +proc randint {nMax} { + db eval {SELECT abs(random() % $nMax)} +} + +proc do_sql_op2 {db iOp} { + switch -- $iOp { + i { + # Insert 1 rows. + set r [randint 1000000000] + set ::rows($r) 1 + #puts "insert row $r" + $db eval { INSERT OR IGNORE INTO t1 VALUES($r, randomblob(50)); } + } + + d { + # Insert 1 row + set keys [array names ::rows] + set r [randint [llength $keys]] + set rowid [lindex $keys $r] + $db eval { DELETE FROM t1 WHERE x=$rowid } + unset ::rows($rowid) + } + } +} + +foreach {tn nRepeat oplist} { + - - ---------------------------- + 1 100 { 1iiiiiiiiii } + 2 100 { 1i 2d } + 3 100 { 1d 2i } + 4 50 { 1d 2i 3d } + 5 500 { 1i 2i 3i 4i } +} { + if {[string range $oplist 0 0]=="-"} { + array unset rows + reset_db + create_schema2 + continue + } + + foreach db $DBLIST { + sqlite3 $db test.db + set stats($db,0) 0 + set stats($db,1) 0 + } + array unset used + + do_test 2.$tn { + + for {set i 0} {$i < $nRepeat} {incr i} { + foreach db $DBLIST { $db eval "BEGIN CONCURRENT" } + + foreach op $oplist { + set iDb [string range $op 0 0] + set used(db$iDb) 1 + foreach char [split [string range $op 1 end] {}] { + do_sql_op2 "db$iDb" $char + } + } + + foreach db $DBLIST { + if {$i==272 && $db=="db4"} breakpoint + set rc [catch { $db eval COMMIT } msg] + if {$rc} { $db eval ROLLBACK } + incr stats($db,$rc) + } + set res [db eval {PRAGMA integrity_check}] + if {$res != "ok"} { puts "after $db $rc: $res" ; after 1000000 } + } + } {} + + foreach db $DBLIST { + $db close + } + foreach k [lsort [array names used]] { + puts "$k: $stats($k,0) committed, $stats($k,1) rolled back" + } +} + + + finish_test From f6cf5ea790764b524c3339a1ba1d06be00f1ae3f Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 26 Aug 2015 18:54:45 +0000 Subject: [PATCH 024/113] Fix an assert() in pager.c that could fail in a concurrent transaction. FossilOrigin-Name: 69394ddaa2bc9d26477b4359c676c598b733ac9f --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/pager.c | 2 +- test/concurrent.test | 21 +++++++++++++++++++++ test/concurrent3.test | 2 +- 5 files changed, 32 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 79ab2b14bc..4792a3a28f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sallowing\ssome\sconflicting\stransactions\sto\sbe\scommitted. -D 2015-08-26T18:02:20.162 +C Fix\san\sassert()\sin\spager.c\sthat\scould\sfail\sin\sa\sconcurrent\stransaction. +D 2015-08-26T18:54:45.787 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e2218eb228374422969de7b1680eda6864affcef F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -324,7 +324,7 @@ F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa F src/os_unix.c 388c023582b17890f10c980b30ec1922b471753b F src/os_win.c 40b3af7a47eb1107d0d69e592bec345a3b7b798a F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca -F src/pager.c 2e2559e64e825e39c033c0744237733cec70d636 +F src/pager.c bb8e237a54d162a6cc22503f71895851dae9a0bb F src/pager.h 1335b624cd540815c8c977172589d208d1c251a6 F src/parse.y 1e645cacb93979c59f2a510ee2c100e769bd5e3c F src/pcache.c cde06aa50962595e412d497e22fd2e07878ba1f0 @@ -524,9 +524,9 @@ F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6 F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 08948a4809d22817e0e5de89c7c0a8bd90cb551b F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 -F test/concurrent.test ecf97fdcfb11dda1db52b2714d7d52d0922789f1 +F test/concurrent.test 634b6a88f1942f5d68cc89d4d5efa2b11ba7913c F test/concurrent2.test de43cd6703360dc6268907f1617f0d353d8a43c1 -F test/concurrent3.test 8474b7ac80bc977bab4fe014c0b036c16779d8cb +F test/concurrent3.test 0a5f7e3036d1eccf0782d7153ac21f5f222e9468 F test/conflict.test 841bcf7cabbfca39c577eb8411ea8601843b46a8 F test/conflict2.test 0d3af4fb534fa1bd020c79960bb56e4d52655f09 F test/conflict3.test dec0634c0f31dec9a4b01c63063e939f0cd21b6b @@ -1382,7 +1382,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 779b1d0e17bc54062b2b09cdbf94e9e2f4bae4f7 -R 522c73a54721e2428308711f9566b92e +P a0566382d564ca17fd13475a44fed8f714742d97 +R 82cb8297df85a5e2338dab90f8e6448e U dan -Z 5afacf522fa16d68d46082708ed9d148 +Z 29e210082fd7b7d5f83c5decd49ba489 diff --git a/manifest.uuid b/manifest.uuid index 5d4bfea3dc..fc6505589c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a0566382d564ca17fd13475a44fed8f714742d97 \ No newline at end of file +69394ddaa2bc9d26477b4359c676c598b733ac9f \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index ecdad403dc..9e6c2a0b9c 100644 --- a/src/pager.c +++ b/src/pager.c @@ -906,7 +906,7 @@ static int assert_pager_state(Pager *p){ if( !pagerUseWal(pPager) ){ assert( p->eLock>=RESERVED_LOCK ); } - assert( pPager->dbSize==pPager->dbOrigSize ); + assert( pPager->dbSize==pPager->dbOrigSize || pPager->pAllRead ); assert( pPager->dbOrigSize==pPager->dbFileSize ); assert( pPager->dbOrigSize==pPager->dbHintSize ); assert( pPager->setMaster==0 ); diff --git a/test/concurrent.test b/test/concurrent.test index 4bc2852c60..4e62d9e33f 100644 --- a/test/concurrent.test +++ b/test/concurrent.test @@ -505,5 +505,26 @@ do_multiclient_test tn { } {1234 5678 ok} } +do_multiclient_test tn { + do_test 5.$tn.1 { + sql1 { + PRAGMA journal_mode = wal; + CREATE TABLE tt(a INTEGER PRIMARY KEY, b); + CREATE TABLE t2(a INTEGER PRIMARY KEY, b); + INSERT INTO tt VALUES(1, randomblob(400)); + BEGIN CONCURRENT; + } + } {wal} + + do_test 5.$tn.2 { + sql1 { UPDATE t2 SET b=5 WHERE a=3 } + sql2 { INSERT INTO tt VALUES(2, randomblob(6000)) } + } {} + + do_test 5.$tn.3 { + sql1 { COMMIT } + } {} +} + finish_test diff --git a/test/concurrent3.test b/test/concurrent3.test index a90fa2b973..3ad6a1cce4 100644 --- a/test/concurrent3.test +++ b/test/concurrent3.test @@ -176,6 +176,7 @@ foreach {tn nRepeat oplist} { 3 100 { 1d 2i } 4 50 { 1d 2i 3d } 5 500 { 1i 2i 3i 4i } + 6 500 { 1i 2d 3d 4d } } { if {[string range $oplist 0 0]=="-"} { array unset rows @@ -205,7 +206,6 @@ foreach {tn nRepeat oplist} { } foreach db $DBLIST { - if {$i==272 && $db=="db4"} breakpoint set rc [catch { $db eval COMMIT } msg] if {$rc} { $db eval ROLLBACK } incr stats($db,$rc) From 987f821f791502cc5ccb83caa8bf399427c4d94d Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 27 Aug 2015 17:42:38 +0000 Subject: [PATCH 025/113] Fix a problem whereby concurrent transactions would not consider pages read by the transaction before the first write statement. FossilOrigin-Name: fc17f73170a27c2fe511ed6b6d488535c4e35bae --- manifest | 18 +++++++-------- manifest.uuid | 2 +- src/btree.c | 46 +++++++++++++++++++++----------------- src/pager.c | 51 +++++++++++++++++++++---------------------- src/pager.h | 10 +++++++-- test/concurrent2.test | 25 +++++++++++++++++++++ 6 files changed, 94 insertions(+), 58 deletions(-) diff --git a/manifest b/manifest index 4792a3a28f..4440e87c40 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sin\spager.c\sthat\scould\sfail\sin\sa\sconcurrent\stransaction. -D 2015-08-26T18:54:45.787 +C Fix\sa\sproblem\swhereby\sconcurrent\stransactions\swould\snot\sconsider\spages\sread\sby\sthe\stransaction\sbefore\sthe\sfirst\swrite\sstatement. +D 2015-08-27T17:42:38.260 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e2218eb228374422969de7b1680eda6864affcef F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -279,7 +279,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 4d9134dc988a87838c06056c89c0e8c4700a0452 F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c aacef0cd0c57c2a1b2ed8a27794fc9e20b6e7a90 +F src/btree.c 88ff0f5bdcd200e4b8cdc2f49a89369112a592d7 F src/btree.h 00d4cdb747c4172a5566faf037116985dbbc377e F src/btreeInt.h 171864bcd81635583dab7b8a04b19b454b18ef80 F src/build.c 1b5814e0eeaba096ae3ee17ebd139d2a25af7250 @@ -324,8 +324,8 @@ F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa F src/os_unix.c 388c023582b17890f10c980b30ec1922b471753b F src/os_win.c 40b3af7a47eb1107d0d69e592bec345a3b7b798a F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca -F src/pager.c bb8e237a54d162a6cc22503f71895851dae9a0bb -F src/pager.h 1335b624cd540815c8c977172589d208d1c251a6 +F src/pager.c 732f3b107ac7180e4c628114a5d06dda00393080 +F src/pager.h f00930ca3bfc0f3298b08a69ed7b920e89b531de F src/parse.y 1e645cacb93979c59f2a510ee2c100e769bd5e3c F src/pcache.c cde06aa50962595e412d497e22fd2e07878ba1f0 F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9 @@ -525,7 +525,7 @@ F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 08948a4809d22817e0e5de89c7c0a8bd90cb551b F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 F test/concurrent.test 634b6a88f1942f5d68cc89d4d5efa2b11ba7913c -F test/concurrent2.test de43cd6703360dc6268907f1617f0d353d8a43c1 +F test/concurrent2.test d42aaa1d0aaf2c41c8d5de204962b125b411557d F test/concurrent3.test 0a5f7e3036d1eccf0782d7153ac21f5f222e9468 F test/conflict.test 841bcf7cabbfca39c577eb8411ea8601843b46a8 F test/conflict2.test 0d3af4fb534fa1bd020c79960bb56e4d52655f09 @@ -1382,7 +1382,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P a0566382d564ca17fd13475a44fed8f714742d97 -R 82cb8297df85a5e2338dab90f8e6448e +P 69394ddaa2bc9d26477b4359c676c598b733ac9f +R aacab69ab35db4167de1724271774606 U dan -Z 29e210082fd7b7d5f83c5decd49ba489 +Z d9ef073e0b6bc6533e113c00c2daa9fc diff --git a/manifest.uuid b/manifest.uuid index fc6505589c..72a90a6e05 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -69394ddaa2bc9d26477b4359c676c598b733ac9f \ No newline at end of file +fc17f73170a27c2fe511ed6b6d488535c4e35bae \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 70c36a933c..9986c95325 100644 --- a/src/btree.c +++ b/src/btree.c @@ -595,15 +595,16 @@ static void btreePtrmapEnd(BtShared *pBt, int op, int iSvpt){ */ static int btreePtrmapAllocate(BtShared *pBt){ int rc = SQLITE_OK; - BtreePtrmap *pMap = sqlite3_malloc(sizeof(BtreePtrmap)); - assert( pBt->pMap==0 && sqlite3PagerIsConcurrent(pBt->pPager) ); - if( pMap==0 ){ - rc = SQLITE_NOMEM; - }else{ - memset(&pBt->pPage1->aData[32], 0, sizeof(u32)*2); - memset(pMap, 0, sizeof(BtreePtrmap)); - pMap->iFirst = pBt->nPage + 1; - pBt->pMap = pMap; + if( pBt->pMap==0 ){ + BtreePtrmap *pMap = sqlite3_malloc(sizeof(BtreePtrmap)); + if( pMap==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(&pBt->pPage1->aData[32], 0, sizeof(u32)*2); + memset(pMap, 0, sizeof(BtreePtrmap)); + pMap->iFirst = pBt->nPage + 1; + pBt->pMap = pMap; + } } return rc; } @@ -3273,6 +3274,7 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ sqlite3 *pBlock = 0; BtShared *pBt = p->pBt; int rc = SQLITE_OK; + int bConcurrent = (p->db->bConcurrent && !ISAUTOVACUUM); sqlite3BtreeEnter(p); btreeIntegrity(p); @@ -3339,18 +3341,11 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ if( (pBt->btsFlags & BTS_READ_ONLY)!=0 ){ rc = SQLITE_READONLY; }else{ - int exFlag = (p->db->bConcurrent && !ISAUTOVACUUM) ? -1 : (wrflag>1); - int bSubjInMem = sqlite3TempInMemory(p->db); - assert( p->db->bConcurrent==0 || wrflag==1 ); - rc = sqlite3PagerBegin(pBt->pPager, exFlag, bSubjInMem); + int exFlag = bConcurrent ? -1 : (wrflag>1); + rc = sqlite3PagerBegin(pBt->pPager, exFlag, sqlite3TempInMemory(p->db)); if( rc==SQLITE_OK ){ rc = newDatabase(pBt); } -#ifdef SQLITE_ENABLE_CONCURRENT - if( rc==SQLITE_OK && sqlite3PagerIsConcurrent(pBt->pPager) ){ - rc = btreePtrmapAllocate(pBt); - } -#endif } } @@ -3402,6 +3397,15 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ trans_begun: +#ifdef SQLITE_ENABLE_CONCURRENT + if( bConcurrent && rc==SQLITE_OK && sqlite3PagerIsWal(pBt->pPager) ){ + rc = sqlite3PagerBeginConcurrent(pBt->pPager); + if( rc==SQLITE_OK && wrflag ){ + rc = btreePtrmapAllocate(pBt); + } + } +#endif + if( rc==SQLITE_OK && wrflag ){ /* This call makes sure that the pager has the correct number of ** open savepoints. If the second parameter is greater than 0 and @@ -3937,7 +3941,6 @@ static int btreeFixUnlocked(Btree *p){ Pgno nPage = btreePagecount(pBt); u32 nFree = get4byte(&p1[36]); - assert( sqlite3PagerIsConcurrent(pPager) ); assert( pBt->pMap ); rc = sqlite3PagerUpgradeSnapshot(pPager, pPage1->pDbPage); assert( p1==pPage1->aData ); @@ -4101,8 +4104,11 @@ static void btreeEndTransaction(Btree *p){ unlockBtreeIfUnused(pBt); } - /* If this was an CONCURRENT transaction, delete the pBt->pMap object */ + /* If this was an CONCURRENT transaction, delete the pBt->pMap object. + ** Also call PagerEndConcurrent() to ensure that the pager has discarded + ** the record of all pages read within the transaction. */ btreePtrmapDelete(pBt); + sqlite3PagerEndConcurrent(pBt->pPager); btreeIntegrity(p); } diff --git a/src/pager.c b/src/pager.c index 9e6c2a0b9c..7db7544552 100644 --- a/src/pager.c +++ b/src/pager.c @@ -1741,16 +1741,35 @@ static int addToSavepointBitvecs(Pager *pPager, Pgno pgno){ return rc; } +#ifdef SQLITE_ENABLE_CONCURRENT +int sqlite3PagerBeginConcurrent(Pager *pPager){ + int rc = SQLITE_OK; + if( pPager->pAllRead==0 ){ + pPager->pAllRead = sqlite3BitvecCreate(pPager->dbSize); + if( pPager->pAllRead==0 ){ + rc = SQLITE_NOMEM; + } + } + return rc; +} + +void sqlite3PagerEndConcurrent(Pager *pPager){ + sqlite3BitvecDestroy(pPager->pAllRead); + pPager->pAllRead = 0; +} + +int sqlite3PagerIsWal(Pager *pPager){ + return pPager->pWal!=0; +} +#endif + /* ** Free the Pager.pInJournal and Pager.pAllRead bitvec objects. */ static void pagerFreeBitvecs(Pager *pPager){ sqlite3BitvecDestroy(pPager->pInJournal); pPager->pInJournal = 0; -#ifdef SQLITE_ENABLE_CONCURRENT - sqlite3BitvecDestroy(pPager->pAllRead); - pPager->pAllRead = 0; -#endif + sqlite3PagerEndConcurrent(pPager); } /* @@ -5612,10 +5631,6 @@ int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){ if( ALWAYS(pPager->eState==PAGER_READER) ){ assert( pPager->pInJournal==0 ); -#ifdef SQLITE_ENABLE_CONCURRENT - assert( pPager->pAllRead==0 ); -#endif - if( pagerUseWal(pPager) ){ /* If the pager is configured to use locking_mode=exclusive, and an ** exclusive lock on the database is not already held, obtain it now. @@ -5631,17 +5646,8 @@ int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){ /* Grab the write lock on the log file. If successful, upgrade to ** PAGER_RESERVED state. Otherwise, return an error code to the caller. ** The busy-handler is not invoked if another connection already - ** holds the write-lock. If possible, the upper layer will call it. - */ -#ifdef SQLITE_ENABLE_CONCURRENT - if( exFlag<0 ){ - pPager->pAllRead = sqlite3BitvecCreate(pPager->dbSize); - if( pPager->pAllRead==0 ){ - rc = SQLITE_NOMEM; - } - }else -#endif - { + ** holds the write-lock. If possible, the upper layer will call it. */ + if( exFlag>=0 ){ rc = sqlite3WalBeginWriteTransaction(pPager->pWal); } }else{ @@ -6184,13 +6190,6 @@ void sqlite3PagerSetDbsize(Pager *pPager, Pgno nSz){ pPager->dbSize = nSz; } -/* -** Return true if this pager is currently within an CONCURRENT transaction. -*/ -int sqlite3PagerIsConcurrent(Pager *pPager){ - return pPager->pAllRead!=0; -} - /* ** If this is a WAL mode connection and the WRITER lock is currently held, ** relinquish it. diff --git a/src/pager.h b/src/pager.h index c9ebaf1116..1df91bbca0 100644 --- a/src/pager.h +++ b/src/pager.h @@ -194,11 +194,17 @@ void sqlite3PagerTruncateImage(Pager*,Pgno); void sqlite3PagerRekey(DbPage*, Pgno, u16); +#ifdef SQLITE_ENABLE_CONCURRENT +void sqlite3PagerEndConcurrent(Pager*); +int sqlite3PagerBeginConcurrent(Pager*); void sqlite3PagerDropExclusiveLock(Pager*); -int sqlite3PagerIsConcurrent(Pager*); -int sqlite3PagerIswriteable(DbPage*); int sqlite3PagerUpgradeSnapshot(Pager *pPager, DbPage*); void sqlite3PagerSetDbsize(Pager *pPager, Pgno); +#else +# define sqlite3PagerEndConcurrent(x) +#endif + +int sqlite3PagerIswriteable(DbPage*); #if defined(SQLITE_HAS_CODEC) && !defined(SQLITE_OMIT_WAL) void *sqlite3PagerCodec(DbPage *); diff --git a/test/concurrent2.test b/test/concurrent2.test index 7f04a06b31..8650caea20 100644 --- a/test/concurrent2.test +++ b/test/concurrent2.test @@ -427,6 +427,31 @@ do_multiclient_test tn { } {0 {}} } +do_multiclient_test tn { + do_test 10.$tn.1 { + sql1 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(a); + CREATE TABLE t2(b); + INSERT INTO t1 VALUES(1), (2), (3); + INSERT INTO t2 VALUES(1), (2), (3); + } + } {wal} + + do_test 10.$tn.2 { + sql1 { + BEGIN CONCURRENT; + SELECT * FROM t1; + INSERT INTO t2 VALUES(4); + } + } {1 2 3} + + do_test 10.$tn.3 { + sql2 { INSERT INTO t1 VALUES(4) } + list [catch {sql1 COMMIT} msg] $msg + } {1 {database is locked}} +} + finish_test From 6b3e51bd330c9510695fbbd6443ab3f7a5e3d029 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 27 Aug 2015 19:22:56 +0000 Subject: [PATCH 026/113] Add test cases for concurrent transactions and long-lived SELECT statements. FossilOrigin-Name: fd4798cb7af263409c20d3cf81236b830bd68570 --- manifest | 12 ++--- manifest.uuid | 2 +- test/concurrent2.test | 102 ++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 106 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 4440e87c40..a9bcad179f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swhereby\sconcurrent\stransactions\swould\snot\sconsider\spages\sread\sby\sthe\stransaction\sbefore\sthe\sfirst\swrite\sstatement. -D 2015-08-27T17:42:38.260 +C Add\stest\scases\sfor\sconcurrent\stransactions\sand\slong-lived\sSELECT\sstatements. +D 2015-08-27T19:22:56.303 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e2218eb228374422969de7b1680eda6864affcef F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -525,7 +525,7 @@ F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 08948a4809d22817e0e5de89c7c0a8bd90cb551b F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 F test/concurrent.test 634b6a88f1942f5d68cc89d4d5efa2b11ba7913c -F test/concurrent2.test d42aaa1d0aaf2c41c8d5de204962b125b411557d +F test/concurrent2.test f20913d376d993a85f28ef3323f09d4cba37206a F test/concurrent3.test 0a5f7e3036d1eccf0782d7153ac21f5f222e9468 F test/conflict.test 841bcf7cabbfca39c577eb8411ea8601843b46a8 F test/conflict2.test 0d3af4fb534fa1bd020c79960bb56e4d52655f09 @@ -1382,7 +1382,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 69394ddaa2bc9d26477b4359c676c598b733ac9f -R aacab69ab35db4167de1724271774606 +P fc17f73170a27c2fe511ed6b6d488535c4e35bae +R 54233c250c37b5d4c5cad57267aa2abd U dan -Z d9ef073e0b6bc6533e113c00c2daa9fc +Z 1ef37227dc1b9c5caa6e609be7886347 diff --git a/manifest.uuid b/manifest.uuid index 72a90a6e05..55734e47ba 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fc17f73170a27c2fe511ed6b6d488535c4e35bae \ No newline at end of file +fd4798cb7af263409c20d3cf81236b830bd68570 \ No newline at end of file diff --git a/test/concurrent2.test b/test/concurrent2.test index 8650caea20..aa2cd62217 100644 --- a/test/concurrent2.test +++ b/test/concurrent2.test @@ -427,18 +427,25 @@ do_multiclient_test tn { } {0 {}} } +#------------------------------------------------------------------------- +# Test that even if a SELECT statement appears before all writes within +# a CONCURRENT transaction, the pages it reads are still considered when +# considering whether or not the transaction may be committed. +# do_multiclient_test tn { - do_test 10.$tn.1 { + do_test 10.$tn.1.1 { sql1 { PRAGMA journal_mode = wal; CREATE TABLE t1(a); CREATE TABLE t2(b); + CREATE TABLE t3(c); INSERT INTO t1 VALUES(1), (2), (3); INSERT INTO t2 VALUES(1), (2), (3); + INSERT INTO t3 VALUES(1), (2), (3); } } {wal} - do_test 10.$tn.2 { + do_test 10.$tn.1.2 { sql1 { BEGIN CONCURRENT; SELECT * FROM t1; @@ -446,10 +453,99 @@ do_multiclient_test tn { } } {1 2 3} - do_test 10.$tn.3 { + do_test 10.$tn.1.3 { sql2 { INSERT INTO t1 VALUES(4) } list [catch {sql1 COMMIT} msg] $msg } {1 {database is locked}} + sql1 ROLLBACK + + # In this case, because the "SELECT * FROM t1" is first stepped before + # the "BEGIN CONCURRENT", the pages it reads are not recorded by the + # pager object. And so the transaction can be committed. Technically + # this behaviour (the effect of an ongoing SELECT on a BEGIN CONCURRENT + # transacation) is undefined. + # + do_test 10.$tn.2.1 { + code1 { + set ::stmt [sqlite3_prepare db "SELECT * FROM t1" -1 dummy] + sqlite3_step $::stmt + } + } {SQLITE_ROW} + do_test 10.$tn.2.2 { + sql1 { + BEGIN CONCURRENT; + INSERT INTO t2 VALUES(4); + } + code1 { + set res [list] + lappend res [sqlite3_column_int $::stmt 0] + while {[sqlite3_step $::stmt]=="SQLITE_ROW"} { + lappend res [sqlite3_column_int $::stmt 0] + } + sqlite3_finalize $::stmt + set res + } + } {1 2 3 4} + do_test 10.$tn.2.3 { + sql2 { INSERT INTO t1 VALUES(5) } + sql1 COMMIT + } {} + + # More tests surrounding long-lived prepared statements and concurrent + # transactions. + do_test 10.$tn.3.1 { + sql1 { + BEGIN CONCURRENT; + SELECT * FROM t1; + COMMIT; + } + sql1 { + BEGIN CONCURRENT; + INSERT INTO t2 VALUES(5); + } + sql2 { + INSERT INTO t1 VALUES(5); + } + sql1 COMMIT + sql3 { + SELECT * FROM t2; + } + } {1 2 3 4 5} + do_test 10.$tn.3.2 { + sql1 { + BEGIN CONCURRENT; + SELECT * FROM t1; + ROLLBACK; + } + sql1 { + BEGIN CONCURRENT; + INSERT INTO t2 VALUES(6); + } + sql2 { + INSERT INTO t1 VALUES(6); + } + sql1 COMMIT + sql3 { SELECT * FROM t2 } + } {1 2 3 4 5 6} + do_test 10.$tn.3.3 { + sql1 { BEGIN CONCURRENT } + code1 { + set ::stmt [sqlite3_prepare db "SELECT * FROM t1" -1 dummy] + sqlite3_step $::stmt + } + sql1 { + INSERT INTO t2 VALUES(7); + SELECT * FROM t3; + ROLLBACK; + BEGIN CONCURRENT; + } + sql2 { INSERT INTO t3 VALUES(5) } + code1 { sqlite3_finalize $::stmt } + sql1 { + INSERT INTO t2 VALUES(8); + COMMIT; + } + } {} } From c8a9d15887ea35beaaa6357bb73fac24cd91a679 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 27 Aug 2015 19:57:16 +0000 Subject: [PATCH 027/113] Add header comments for new methods in pager.c. FossilOrigin-Name: 437c7e219d3240767a28f73487bc26c3be3044b3 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pager.c | 13 +++++++++++++ 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index a9bcad179f..605728fd86 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stest\scases\sfor\sconcurrent\stransactions\sand\slong-lived\sSELECT\sstatements. -D 2015-08-27T19:22:56.303 +C Add\sheader\scomments\sfor\snew\smethods\sin\spager.c. +D 2015-08-27T19:57:16.810 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e2218eb228374422969de7b1680eda6864affcef F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -324,7 +324,7 @@ F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa F src/os_unix.c 388c023582b17890f10c980b30ec1922b471753b F src/os_win.c 40b3af7a47eb1107d0d69e592bec345a3b7b798a F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca -F src/pager.c 732f3b107ac7180e4c628114a5d06dda00393080 +F src/pager.c 4343baff2f7e35f11988deb9c213870432ded1b1 F src/pager.h f00930ca3bfc0f3298b08a69ed7b920e89b531de F src/parse.y 1e645cacb93979c59f2a510ee2c100e769bd5e3c F src/pcache.c cde06aa50962595e412d497e22fd2e07878ba1f0 @@ -1382,7 +1382,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P fc17f73170a27c2fe511ed6b6d488535c4e35bae -R 54233c250c37b5d4c5cad57267aa2abd +P fd4798cb7af263409c20d3cf81236b830bd68570 +R f446f1e219f1b69d13fe21a44df99a43 U dan -Z 1ef37227dc1b9c5caa6e609be7886347 +Z 0a2b89af585f5781988dd453201696be diff --git a/manifest.uuid b/manifest.uuid index 55734e47ba..da0a46abb3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fd4798cb7af263409c20d3cf81236b830bd68570 \ No newline at end of file +437c7e219d3240767a28f73487bc26c3be3044b3 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 7db7544552..2b20603379 100644 --- a/src/pager.c +++ b/src/pager.c @@ -1742,6 +1742,12 @@ static int addToSavepointBitvecs(Pager *pPager, Pgno pgno){ } #ifdef SQLITE_ENABLE_CONCURRENT +/* +** If they are not already, begin recording all pages read from the pager layer +** by the b-tree layer This is used by concurrent transactions. Return +** SQLITE_OK if successful, or an SQLite error code (SQLITE_NOMEM) if an error +** occurs. +*/ int sqlite3PagerBeginConcurrent(Pager *pPager){ int rc = SQLITE_OK; if( pPager->pAllRead==0 ){ @@ -1753,11 +1759,18 @@ int sqlite3PagerBeginConcurrent(Pager *pPager){ return rc; } +/* +** Stop recording all pages read from the pager layer by the b-tree layer +** and discard any current records. +*/ void sqlite3PagerEndConcurrent(Pager *pPager){ sqlite3BitvecDestroy(pPager->pAllRead); pPager->pAllRead = 0; } +/* +** Return true if the database is in wal mode. False otherwise. +*/ int sqlite3PagerIsWal(Pager *pPager){ return pPager->pWal!=0; } From 3f531da5648e7f774d44562cfb855f0322423004 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 1 Sep 2015 17:48:54 +0000 Subject: [PATCH 028/113] Fixes so that it builds without warnings both with and without SQLITE_ENABLE_CONCURRENT. FossilOrigin-Name: 5ed2a445a164f0f0c2669c6681ea76618e639961 --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/btree.c | 4 +++- src/pager.c | 2 ++ src/pager.h | 1 + src/wal.c | 2 +- src/wal.h | 6 ++++++ 7 files changed, 25 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 98f9a5d524..9d924de776 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\slatest\strunk\schanges\swith\sthis\sbranch. -D 2015-08-28T09:27:51.910 +C Fixes\sso\sthat\sit\sbuilds\swithout\swarnings\sboth\swith\sand\swithout\nSQLITE_ENABLE_CONCURRENT. +D 2015-09-01T17:48:54.487 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e2218eb228374422969de7b1680eda6864affcef F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -279,7 +279,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 4d9134dc988a87838c06056c89c0e8c4700a0452 F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c 88ff0f5bdcd200e4b8cdc2f49a89369112a592d7 +F src/btree.c ca6c7e4bbbf91b6c91d0278942b917e81d3fc18d F src/btree.h 00d4cdb747c4172a5566faf037116985dbbc377e F src/btreeInt.h 171864bcd81635583dab7b8a04b19b454b18ef80 F src/build.c bb9335e06a6f308c595e0507ce97daf791735a6e @@ -324,8 +324,8 @@ F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa F src/os_unix.c 388c023582b17890f10c980b30ec1922b471753b F src/os_win.c 40b3af7a47eb1107d0d69e592bec345a3b7b798a F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca -F src/pager.c 4343baff2f7e35f11988deb9c213870432ded1b1 -F src/pager.h f00930ca3bfc0f3298b08a69ed7b920e89b531de +F src/pager.c 284edd20ae51f1f52a539685ce42c7a1e61ac716 +F src/pager.h 174fd2cd7091c87418616c62582a5c00cb8da2ac F src/parse.y 1e645cacb93979c59f2a510ee2c100e769bd5e3c F src/pcache.c cde06aa50962595e412d497e22fd2e07878ba1f0 F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9 @@ -411,8 +411,8 @@ F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 F src/vtab.c d31174e4c8f592febab3fa7f69e18320b4fd657a F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb -F src/wal.c 44ec009f7742a660d3558845e47e870af4542689 -F src/wal.h 903ef67e17f8b466dc7cfc4186fc23e80be10ff8 +F src/wal.c d632ee33340554888a7848a253a580167a031cdb +F src/wal.h ec78c303882bc04b3d0b86f0ddbc87309401595a F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba F src/where.c 91e73ffc699c140a59baa03a6b7b060db02bed81 F src/whereInt.h 901c17c1e3c82745ad9b85b4471543fa59c980e9 @@ -1383,7 +1383,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 437c7e219d3240767a28f73487bc26c3be3044b3 64abb65d4df11e5b3bcc4afc8e7c18e907c6080a -R d1f878aab8d7c75cbf15e5d6b4c78c00 -U dan -Z 64a6a9bedfd1c579ad90113faf74b29f +P 57bc0194f41dbcd2c343e665e7af475cd4dd7328 +R 3e87a7400b2863c0ecf368784d9e77cc +U drh +Z 6775a99654ddab524e15a28b9025b05e diff --git a/manifest.uuid b/manifest.uuid index dabc379273..407c9dbaa4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -57bc0194f41dbcd2c343e665e7af475cd4dd7328 \ No newline at end of file +5ed2a445a164f0f0c2669c6681ea76618e639961 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 9986c95325..d2b6cdd4ab 100644 --- a/src/btree.c +++ b/src/btree.c @@ -4009,7 +4009,9 @@ static int btreeFixUnlocked(Btree *p){ return rc; } -#endif +#else +# define btreeFixUnlocked(X) SQLITE_OK +#endif /* ENABLE_CONCURRENT */ /* ** This routine does the first phase of a two-phase commit. This routine diff --git a/src/pager.c b/src/pager.c index 2b20603379..5b1788ef4f 100644 --- a/src/pager.c +++ b/src/pager.c @@ -906,7 +906,9 @@ static int assert_pager_state(Pager *p){ if( !pagerUseWal(pPager) ){ assert( p->eLock>=RESERVED_LOCK ); } +#ifdef SQLITE_ENABLE_CONCURRENT assert( pPager->dbSize==pPager->dbOrigSize || pPager->pAllRead ); +#endif assert( pPager->dbOrigSize==pPager->dbFileSize ); assert( pPager->dbOrigSize==pPager->dbHintSize ); assert( pPager->setMaster==0 ); diff --git a/src/pager.h b/src/pager.h index 1df91bbca0..538a611cf9 100644 --- a/src/pager.h +++ b/src/pager.h @@ -200,6 +200,7 @@ int sqlite3PagerBeginConcurrent(Pager*); void sqlite3PagerDropExclusiveLock(Pager*); int sqlite3PagerUpgradeSnapshot(Pager *pPager, DbPage*); void sqlite3PagerSetDbsize(Pager *pPager, Pgno); +int sqlite3PagerIsWal(Pager*); #else # define sqlite3PagerEndConcurrent(x) #endif diff --git a/src/wal.c b/src/wal.c index 445d084628..fbc92238bb 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2489,7 +2489,7 @@ int sqlite3WalFindFrame( #endif *piRead = iRead; - return SQLITE_OK; + return rc; } /* diff --git a/src/wal.h b/src/wal.h index 35ffe4d38c..4d9e1b0816 100644 --- a/src/wal.h +++ b/src/wal.h @@ -126,8 +126,14 @@ int sqlite3WalExclusiveMode(Wal *pWal, int op); */ int sqlite3WalHeapMemory(Wal *pWal); +#ifdef SQLITE_ENABLE_CONCURRENT +/* Tell the wal layer that we want to commit a concurrent transaction */ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPg, Bitvec *pRead); + +/* Upgrade the state of the client to take into account changes written +** by other connections */ int sqlite3WalUpgradeSnapshot(Wal *pWal); +#endif #ifdef SQLITE_ENABLE_ZIPVFS /* If the WAL file is not empty, return the number of bytes of content From 01be463eeb60f3bf29c0d4f7819aeb366fd08645 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 3 Sep 2015 15:17:12 +0000 Subject: [PATCH 029/113] Changes from ENABLE_CONCURRENT (default off) to OMIT_CONCURRENT (default on). This is not a clear-cut decision and might be changed back. FossilOrigin-Name: f8ae9bfd05abc35293ad6bc62ab1bdbe357d964e --- manifest | 28 ++++++++++++++-------------- manifest.uuid | 2 +- src/btree.c | 32 +++++++++++++++++++------------- src/btreeInt.h | 14 +++++++------- src/pager.c | 36 ++++++++++++++++++++---------------- src/pager.h | 2 +- src/test_config.c | 2 +- src/vdbe.c | 4 ++-- src/vdbeaux.c | 2 +- src/wal.c | 7 ++++--- src/wal.h | 4 ++-- 11 files changed, 72 insertions(+), 61 deletions(-) diff --git a/manifest b/manifest index 0ab2bd2e03..5e033198ad 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\strunk\soptimizations. -D 2015-09-03T14:04:05.544 +C Changes\sfrom\sENABLE_CONCURRENT\s(default\soff)\sto\sOMIT_CONCURRENT\s(default\son).\nThis\sis\snot\sa\sclear-cut\sdecision\sand\smight\sbe\schanged\sback. +D 2015-09-03T15:17:12.457 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -279,9 +279,9 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 4d9134dc988a87838c06056c89c0e8c4700a0452 F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c 89f97b912a959d82c1ab399da3057c93505cfa8f +F src/btree.c 7663d05467277379fd29ae44eb82bcbdee7f618f F src/btree.h 00d4cdb747c4172a5566faf037116985dbbc377e -F src/btreeInt.h 171864bcd81635583dab7b8a04b19b454b18ef80 +F src/btreeInt.h df0e92901c6fbb01aa8fab3cfbcdaaba2654fd04 F src/build.c 565d84cf1d80e054e15907641985584bbd5eadf6 F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0 F src/complete.c addcd8160b081131005d5bc2d34adf20c1c5c92f @@ -324,8 +324,8 @@ F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa F src/os_unix.c 76f493ed71c4154338049dee1bf6e47f69c74a55 F src/os_win.c 40b3af7a47eb1107d0d69e592bec345a3b7b798a F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca -F src/pager.c 284edd20ae51f1f52a539685ce42c7a1e61ac716 -F src/pager.h 174fd2cd7091c87418616c62582a5c00cb8da2ac +F src/pager.c 567093b5d35cba6e5a4316e1611f6bd44415c0d7 +F src/pager.h 244606cccd4293a2bc4be20bb37bf730028c5c18 F src/parse.y 1e645cacb93979c59f2a510ee2c100e769bd5e3c F src/pcache.c cde06aa50962595e412d497e22fd2e07878ba1f0 F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9 @@ -361,7 +361,7 @@ F src/test_autoext.c dea8a01a7153b9adc97bd26161e4226329546e12 F src/test_backup.c 2e6e6a081870150f20c526a2e9d0d29cda47d803 F src/test_blob.c e5a7a81d61a780da79101aeb1e60d300af169e07 F src/test_btree.c 2e9978eca99a9a4bfa8cae949efb00886860a64f -F src/test_config.c f853203a1d2035370ea26ad48248f6d00a10b752 +F src/test_config.c 24f1c8415e57d709ae603cbde42a93990192c8fd F src/test_demovfs.c 0de72c2c89551629f58486fde5734b7d90758852 F src/test_devsym.c e7498904e72ba7491d142d5c83b476c4e76993bc F src/test_fs.c ced436e3d4b8e4681328409b8081051ce614e28f @@ -400,19 +400,19 @@ F src/update.c 795fba8ebadeb194285b0a73a07f7ad5ae4d0410 F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c fc612367108b74573c5fd13a85d0a23027f438bd F src/vacuum.c 983cc3754718ef169a6ea9aef86798bd28106f21 -F src/vdbe.c 791a28761cf6176d11ec3e41cdf8e749c65384ff +F src/vdbe.c 8e1d159743af4b17fce88037a46d68b280aaa729 F src/vdbe.h 4bc88bd0e06f8046ee6ab7487c0015e85ad949ad F src/vdbeInt.h 8b54e01ad0463590e7cffabce0bc36da9ee4f816 F src/vdbeapi.c bda74ef4b5103d7b4a4be36f936d3cf2b56a7d6f -F src/vdbeaux.c 33e2973796a016956887466c2b3a1991eab3af6c +F src/vdbeaux.c 4988b83d1e1989ee554b2fa4ca18f3606a78437c F src/vdbeblob.c 4f2e8e075d238392df98c5e03a64342465b03f90 F src/vdbemem.c ae38a0d35ae71cf604381a887c170466ba518090 F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 F src/vtab.c 2ecfe020c10e0a0c7b078203fdba2fae844744bc F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb -F src/wal.c 00352cb9d23c5599f219496d4b22f30d4e30f8ac -F src/wal.h ec78c303882bc04b3d0b86f0ddbc87309401595a +F src/wal.c 5a86298540935981eea840050f66e516dbe536af +F src/wal.h 361b16891d2772294b138054c84f5a3bad6e9d05 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba F src/where.c f0e08e4f1f66ba1a0f5b70c5161cb031ce1fb858 F src/whereInt.h 901c17c1e3c82745ad9b85b4471543fa59c980e9 @@ -1383,7 +1383,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 3dea047465fa8e3031046a33016b6ed760336ddc 847387ec8e6fef283899578fb232b2c23b00ee5b -R 7c90873b273aeaf2eed231afaea97e29 +P 71e7299e8d501618b10f8c1f78572789b1b6853a +R cf8206aeb5613d1354992f43b08834e8 U drh -Z 99e28d5734be346b4e9234313f30bb5e +Z 1d56cb0a736729e62628d2ca4ac46f41 diff --git a/manifest.uuid b/manifest.uuid index 3c32784a23..1701931440 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -71e7299e8d501618b10f8c1f78572789b1b6853a \ No newline at end of file +f8ae9bfd05abc35293ad6bc62ab1bdbe357d964e \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 99051e40c4..0c6ccd403a 100644 --- a/src/btree.c +++ b/src/btree.c @@ -440,7 +440,7 @@ static void downgradeAllSharedCacheTableLocks(Btree *p){ #endif /* SQLITE_OMIT_SHARED_CACHE */ -#ifdef SQLITE_ENABLE_CONCURRENT +#ifndef SQLITE_OMIT_CONCURRENT /* ** The following structure - BtreePtrmap - stores the in-memory pointer map ** used for newly allocated pages in CONCURRENT transactions. Such pages are @@ -473,7 +473,8 @@ struct BtreePtrmap { RollbackEntry *aRollback; /* Array of rollback entries */ }; -/* +/* !defined(SQLITE_OMIT_CONCURRENT) +** ** If page number pgno is greater than or equal to BtreePtrmap.iFirst, ** store an entry for it in the pointer-map structure. */ @@ -531,7 +532,8 @@ static int btreePtrmapStore( return SQLITE_OK; } -/* +/* !defined(SQLITE_OMIT_CONCURRENT) +** ** Open savepoint iSavepoint, if it is not already open. */ static int btreePtrmapBegin(BtShared *pBt, int nSvpt){ @@ -558,7 +560,8 @@ static int btreePtrmapBegin(BtShared *pBt, int nSvpt){ return SQLITE_OK; } -/* +/* !defined(SQLITE_OMIT_CONCURRENT) +** ** Rollback (if op==SAVEPOINT_ROLLBACK) or release (if op==SAVEPOINT_RELEASE) ** savepoint iSvpt. */ @@ -587,7 +590,8 @@ static void btreePtrmapEnd(BtShared *pBt, int op, int iSvpt){ } } -/* +/* !defined(SQLITE_OMIT_CONCURRENT) +** ** This function is called after an CONCURRENT transaction is opened on the ** database. It allocates the BtreePtrmap structure used to track pointers ** to allocated pages and zeroes the nFree/iTrunk fields in the database @@ -609,7 +613,8 @@ static int btreePtrmapAllocate(BtShared *pBt){ return rc; } -/* +/* !defined(SQLITE_OMIT_CONCURRENT) +** ** Free any BtreePtrmap structure allocated by an earlier call to ** btreePtrmapAllocate(). */ @@ -623,12 +628,12 @@ static void btreePtrmapDelete(BtShared *pBt){ pBt->pMap = 0; } } -#else +#else /* SQLITE_OMIT_CONCURRENT */ # define btreePtrmapAllocate(x) SQLITE_OK # define btreePtrmapDelete(x) # define btreePtrmapBegin(x,y) SQLITE_OK # define btreePtrmapEnd(x,y,z) -#endif +#endif /* SQLITE_OMIT_CONCURRENT */ static void releasePage(MemPage *pPage); /* Forward reference */ @@ -1075,7 +1080,7 @@ static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){ /* The master-journal page number is never added to a pointer-map page */ assert( 0==PTRMAP_ISPAGE(pBt, PENDING_BYTE_PAGE(pBt)) ); -#ifdef SQLITE_ENABLE_CONCURRENT +#ifndef SQLITE_OMIT_CONCURRENT if( pBt->pMap ){ *pRC = btreePtrmapStore(pBt, key, eType, parent); return; @@ -3397,7 +3402,7 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ trans_begun: -#ifdef SQLITE_ENABLE_CONCURRENT +#ifndef SQLITE_OMIT_CONCURRENT if( bConcurrent && rc==SQLITE_OK && sqlite3PagerIsWal(pBt->pPager) ){ rc = sqlite3PagerBeginConcurrent(pBt->pPager); if( rc==SQLITE_OK && wrflag ){ @@ -3852,7 +3857,7 @@ static int autoVacuumCommit(BtShared *pBt){ # define setChildPtrmaps(x) SQLITE_OK #endif -#ifdef SQLITE_ENABLE_CONCURRENT +#ifndef SQLITE_OMIT_CONCURRENT /* ** This function is called as part of merging an CONCURRENT transaction with ** the snapshot at the head of the wal file. It relocates all pages in the @@ -3920,7 +3925,8 @@ static int btreeRelocateRange( return rc; } -/* +/* !defined(SQLITE_OMIT_CONCURRENT) +** ** The b-tree handle passed as the only argument is about to commit an ** CONCURRENT transaction. At this point it is guaranteed that this is ** possible - the wal WRITER lock is held and it is known that there are @@ -4011,7 +4017,7 @@ static int btreeFixUnlocked(Btree *p){ } #else # define btreeFixUnlocked(X) SQLITE_OK -#endif /* ENABLE_CONCURRENT */ +#endif /* SQLITE_OMIT_CONCURRENT */ /* ** This routine does the first phase of a two-phase commit. This routine diff --git a/src/btreeInt.h b/src/btreeInt.h index e686466e81..e1af63f0bb 100644 --- a/src/btreeInt.h +++ b/src/btreeInt.h @@ -448,7 +448,7 @@ struct BtShared { Btree *pWriter; /* Btree with currently open write transaction */ #endif u8 *pTmpSpace; /* Temp space sufficient to hold a single cell */ -#ifdef SQLITE_ENABLE_CONCURRENT +#ifndef SQLITE_OMIT_CONCURRENT BtreePtrmap *pMap; #endif }; @@ -657,16 +657,16 @@ struct BtCursor { ** (sqliteMallocRaw), it is not possible to use conditional compilation. ** So, this macro is defined instead. */ -#ifndef SQLITE_OMIT_AUTOVACUUM -#define ISAUTOVACUUM (pBt->autoVacuum) -#else +#ifdef SQLITE_OMIT_AUTOVACUUM #define ISAUTOVACUUM 0 +#else +#define ISAUTOVACUUM (pBt->autoVacuum) #endif -#ifdef SQLITE_ENABLE_CONCURRENT -# define ISCONCURRENT (pBt->pMap!=0) -#else +#ifdef SQLITE_OMIT_CONCURRENT # define ISCONCURRENT 0 +#else +# define ISCONCURRENT (pBt->pMap!=0) #endif #define REQUIRE_PTRMAP (ISAUTOVACUUM || ISCONCURRENT) diff --git a/src/pager.c b/src/pager.c index 5b1788ef4f..c72069bbf6 100644 --- a/src/pager.c +++ b/src/pager.c @@ -657,7 +657,7 @@ struct Pager { u32 cksumInit; /* Quasi-random value added to every checksum */ u32 nSubRec; /* Number of records written to sub-journal */ Bitvec *pInJournal; /* One bit for each page in the database file */ -#ifdef SQLITE_ENABLE_CONCURRENT +#ifndef SQLITE_OMIT_CONCURRENT Bitvec *pAllRead; /* Pages read within current CONCURRENT trans. */ #endif sqlite3_file *fd; /* File descriptor for database */ @@ -906,7 +906,7 @@ static int assert_pager_state(Pager *p){ if( !pagerUseWal(pPager) ){ assert( p->eLock>=RESERVED_LOCK ); } -#ifdef SQLITE_ENABLE_CONCURRENT +#ifndef SQLITE_OMIT_CONCURRENT assert( pPager->dbSize==pPager->dbOrigSize || pPager->pAllRead ); #endif assert( pPager->dbOrigSize==pPager->dbFileSize ); @@ -1743,7 +1743,7 @@ static int addToSavepointBitvecs(Pager *pPager, Pgno pgno){ return rc; } -#ifdef SQLITE_ENABLE_CONCURRENT +#ifndef SQLITE_OMIT_CONCURRENT /* ** If they are not already, begin recording all pages read from the pager layer ** by the b-tree layer This is used by concurrent transactions. Return @@ -1761,7 +1761,8 @@ int sqlite3PagerBeginConcurrent(Pager *pPager){ return rc; } -/* +/* !defined(SQLITE_OMIT_CONCURRENT) +** ** Stop recording all pages read from the pager layer by the b-tree layer ** and discard any current records. */ @@ -1770,13 +1771,14 @@ void sqlite3PagerEndConcurrent(Pager *pPager){ pPager->pAllRead = 0; } -/* +/* !defined(SQLITE_OMIT_CONCURRENT) +** ** Return true if the database is in wal mode. False otherwise. */ int sqlite3PagerIsWal(Pager *pPager){ return pPager->pWal!=0; } -#endif +#endif /* SQLITE_OMIT_CONCURRENT */ /* ** Free the Pager.pInJournal and Pager.pAllRead bitvec objects. @@ -3069,10 +3071,10 @@ static int pagerRollbackWal(Pager *pPager){ rc = sqlite3WalUndo(pPager->pWal, pagerUndoCallback, (void *)pPager); pList = sqlite3PcacheDirtyList(pPager->pPCache); +#ifndef SQLITE_OMIT_CONCURRENT /* If this is an CONCURRENT transaction, then page 1 must be reread from ** the db file, even if it is not dirty. This is because the b-tree layer ** may have already zeroed the nFree and iTrunk header fields. */ -#ifdef SQLITE_ENABLE_CONCURRENT if( rc==SQLITE_OK && (pList==0 || pList->pgno!=1) && pPager->pAllRead ){ rc = pagerUndoCallback((void*)pPager, 1); } @@ -4486,9 +4488,9 @@ static int pagerStress(void *p, PgHdr *pPg){ pPg->pDirty = 0; if( pagerUseWal(pPager) ){ +#ifndef SQLITE_OMIT_CONCURRENT /* If the transaction is a "BEGIN CONCURRENT" transaction, the page ** cannot be flushed to disk. Return early in this case. */ -#ifdef SQLITE_ENABLE_CONCURRENT if( pPager->pAllRead ) return SQLITE_OK; #endif @@ -5332,10 +5334,10 @@ int sqlite3PagerAcquire( } pPager->hasBeenUsed = 1; +#ifndef SQLITE_OMIT_CONCURRENT /* If this is an CONCURRENT transaction and the page being read was ** present in the database file when the transaction was opened, ** mark it as read in the pAllRead vector. */ -#ifdef SQLITE_ENABLE_CONCURRENT if( pPager->pAllRead && pgno<=pPager->dbOrigSize ){ rc = sqlite3BitvecSet(pPager->pAllRead, pgno); if( rc!=SQLITE_OK ) goto pager_acquire_err; @@ -5970,7 +5972,7 @@ int sqlite3PagerWrite(PgHdr *pPg){ ** to sqlite3PagerWrite(). In other words, return TRUE if it is ok ** to change the content of the page. */ -#if defined(SQLITE_ENABLE_CONCURRENT) || !defined(NDEBUG) +#if !defined(SQLITE_OMIT_CONCURRENT) || !defined(NDEBUG) int sqlite3PagerIswriteable(DbPage *pPg){ return pPg->flags & PGHDR_WRITEABLE; } @@ -6151,7 +6153,7 @@ int sqlite3PagerExclusiveLock(Pager *pPager, PgHdr *pPage1){ if( 0==pagerUseWal(pPager) ){ rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); } -#ifdef SQLITE_ENABLE_CONCURRENT +#ifndef SQLITE_OMIT_CONCURRENT else{ if( pPager->pAllRead ){ /* This is an CONCURRENT transaction. Attempt to lock the wal database @@ -6165,11 +6167,11 @@ int sqlite3PagerExclusiveLock(Pager *pPager, PgHdr *pPage1){ ); } } -#endif +#endif /* SQLITE_OMIT_CONCURRENT */ return rc; } -#ifdef SQLITE_ENABLE_CONCURRENT +#ifndef SQLITE_OMIT_CONCURRENT /* ** This function is called as part of committing an CONCURRENT transaction. ** At this point the wal WRITER lock is held, and all pages in the cache @@ -6198,14 +6200,16 @@ int sqlite3PagerUpgradeSnapshot(Pager *pPager, DbPage *pPage1){ return rc; } -/* +/* !defined(SQLITE_OMIT_CONCURRENT) +** ** Set the in-memory cache of the database file size to nSz pages. */ void sqlite3PagerSetDbsize(Pager *pPager, Pgno nSz){ pPager->dbSize = nSz; } -/* +/* !defined(SQLITE_OMIT_CONCURRENT) +** ** If this is a WAL mode connection and the WRITER lock is currently held, ** relinquish it. */ @@ -6214,7 +6218,7 @@ void sqlite3PagerDropExclusiveLock(Pager *pPager){ sqlite3WalEndWriteTransaction(pPager->pWal); } } -#endif /* ifdef SQLITE_ENABLE_CONCURRENT */ +#endif /* SQLITE_OMIT_CONCURRENT */ /* diff --git a/src/pager.h b/src/pager.h index 538a611cf9..510ce85b3d 100644 --- a/src/pager.h +++ b/src/pager.h @@ -194,7 +194,7 @@ void sqlite3PagerTruncateImage(Pager*,Pgno); void sqlite3PagerRekey(DbPage*, Pgno, u16); -#ifdef SQLITE_ENABLE_CONCURRENT +#ifndef SQLITE_OMIT_CONCURRENT void sqlite3PagerEndConcurrent(Pager*); int sqlite3PagerBeginConcurrent(Pager*); void sqlite3PagerDropExclusiveLock(Pager*); diff --git a/src/test_config.c b/src/test_config.c index d153697715..d9752ae237 100644 --- a/src/test_config.c +++ b/src/test_config.c @@ -573,7 +573,7 @@ Tcl_SetVar2(interp, "sqlite_options", "mergesort", "1", TCL_GLOBAL_ONLY); Tcl_SetVar2(interp, "sqlite_options", "truncate_opt", "1", TCL_GLOBAL_ONLY); #endif -#ifdef SQLITE_ENABLE_CONCURRENT +#ifndef SQLITE_OMIT_CONCURRENT Tcl_SetVar2(interp, "sqlite_options", "concurrent", "1", TCL_GLOBAL_ONLY); #else Tcl_SetVar2(interp, "sqlite_options", "concurrent", "0", TCL_GLOBAL_ONLY); diff --git a/src/vdbe.c b/src/vdbe.c index bf14bd1173..e07c89779a 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3227,7 +3227,7 @@ case OP_SetCookie: { /* in3 */ assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) ); pIn3 = &aMem[pOp->p3]; sqlite3VdbeMemIntegerify(pIn3); -#ifdef SQLITE_ENABLE_CONCURRENT +#ifndef SQLITE_OMIT_CONCURRENT if( db->bConcurrent && (pOp->p2==BTREE_USER_VERSION || pOp->p2==BTREE_APPLICATION_ID) ){ @@ -6115,7 +6115,7 @@ case OP_Expire: { */ case OP_TableLock: { u8 isWriteLock = (u8)pOp->p3; -#ifdef SQLITE_ENABLE_CONCURRENT +#ifndef SQLITE_OMIT_CONCURRENT if( isWriteLock && db->bConcurrent && pOp->p2==1 ){ rc = SQLITE_ERROR; sqlite3VdbeError(p, diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 61f0774878..e085f313c0 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2041,7 +2041,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ } } -#ifdef SQLITE_ENABLE_CONCURRENT +#ifndef SQLITE_OMIT_CONCURRENT if( db->bConcurrent && (rc & 0xFF)==SQLITE_BUSY ){ /* An SQLITE_BUSY or SQLITE_BUSY_SNAPSHOT was encountered while ** attempting to take the WRITER lock on a wal file. Release the diff --git a/src/wal.c b/src/wal.c index 07f06293ac..23281740ed 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2626,7 +2626,7 @@ static int walUpgradeReadlock(Wal *pWal){ } -#ifdef SQLITE_ENABLE_CONCURRENT +#ifndef SQLITE_OMIT_CONCURRENT /* ** This function is only ever called when committing a "BEGIN CONCURRENT" ** transaction. It may be assumed that no frames have been written to @@ -2752,7 +2752,8 @@ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPage1, Bitvec *pAllRead){ return rc; } -/* +/* !defined(SQLITE_OMIT_CONCURRENT) +** ** This function is called as part of committing an CONCURRENT transaction. ** It is assumed that sqlite3WalLockForCommit() has already been successfully ** called and so (a) the WRITER lock is held and (b) it is known that the @@ -2778,7 +2779,7 @@ int sqlite3WalUpgradeSnapshot(Wal *pWal){ } return rc; } -#endif /* SQLITE_ENABLE_CONCURRENT */ +#endif /* SQLITE_OMIT_CONCURRENT */ /* ** End a write transaction. The commit has already been done. This diff --git a/src/wal.h b/src/wal.h index 4d9e1b0816..db6426392a 100644 --- a/src/wal.h +++ b/src/wal.h @@ -126,14 +126,14 @@ int sqlite3WalExclusiveMode(Wal *pWal, int op); */ int sqlite3WalHeapMemory(Wal *pWal); -#ifdef SQLITE_ENABLE_CONCURRENT +#ifndef SQLITE_OMIT_CONCURRENT /* Tell the wal layer that we want to commit a concurrent transaction */ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPg, Bitvec *pRead); /* Upgrade the state of the client to take into account changes written ** by other connections */ int sqlite3WalUpgradeSnapshot(Wal *pWal); -#endif +#endif /* SQLITE_OMIT_CONCURRENT */ #ifdef SQLITE_ENABLE_ZIPVFS /* If the WAL file is not empty, return the number of bytes of content From 144cd3df05e069c256d05553dd39da505353ede2 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 4 Sep 2015 16:39:16 +0000 Subject: [PATCH 030/113] Remove the EXCLUSIVE and CONCURRENT tokens from the tokenizer. Let the BEGIN statement be followed by an ID, but throw a syntax error if the ID is anything other than EXCLUSIVE or CONCURRENT. FossilOrigin-Name: c0bf92eca4d3d4666e8a0476ef30fa8123de1cb0 --- addopcodes.awk | 2 ++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/parse.y | 32 ++++++++++++++++++++++++-------- tool/mkkeywordhash.c | 2 -- 5 files changed, 35 insertions(+), 19 deletions(-) diff --git a/addopcodes.awk b/addopcodes.awk index dcd31eff84..c5be40b74b 100644 --- a/addopcodes.awk +++ b/addopcodes.awk @@ -31,4 +31,6 @@ END { printf "#define TK_%-29s %4d\n", "UMINUS", ++max printf "#define TK_%-29s %4d\n", "UPLUS", ++max printf "#define TK_%-29s %4d\n", "REGISTER", ++max + printf "#define TK_%-29s %4d\n", "EXCLUSIVE", ++max + printf "#define TK_%-29s %4d\n", "CONCURRENT", ++max } diff --git a/manifest b/manifest index 2eb676f458..d8ae9b24e4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sperformance\senhancements\sfrom\strunk.\s\sThis\sbranch\snow\sruns\s(slightly)\nfaster\sthan\sthe\s3.8.11.1\srelease,\sthough\sstill\sslightly\sslower\sthan\strunk. -D 2015-09-03T20:52:44.863 +C Remove\sthe\sEXCLUSIVE\sand\sCONCURRENT\stokens\sfrom\sthe\stokenizer.\s\sLet\sthe\nBEGIN\sstatement\sbe\sfollowed\sby\san\sID,\sbut\sthrow\sa\ssyntax\serror\sif\sthe\sID\nis\sanything\sother\sthan\sEXCLUSIVE\sor\sCONCURRENT. +D 2015-09-04T16:39:16.988 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -8,7 +8,7 @@ F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ccfc4d1576dbfdeece0a4372a2e6a2e37d3e7975 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 -F addopcodes.awk 9eb448a552d5c0185cf62c463f9c173cedae3811 +F addopcodes.awk 694f522754f0a32dc53bc73ccebf02f28ab10a54 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 @@ -326,7 +326,7 @@ F src/os_win.c 40b3af7a47eb1107d0d69e592bec345a3b7b798a F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca F src/pager.c 06e10a0b736ba22df52e0f56fa67a42de41a0445 F src/pager.h 244606cccd4293a2bc4be20bb37bf730028c5c18 -F src/parse.y 1e645cacb93979c59f2a510ee2c100e769bd5e3c +F src/parse.y 0dcce0ae4e106cdaad4053f73b3bc2dedca9c6d6 F src/pcache.c 24be750c79272e0ca7b6e007bc94999700f3e5ef F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9 F src/pcache1.c e1529369c047ac645e6a28196f25b7e936c46b82 @@ -1343,7 +1343,7 @@ F tool/lempar.c 01ca97f87610d1dac6d8cd96ab109ab1130e76dc F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c eef612f8adf4d0993dafed0416064cf50d5d33c6 F tool/mkautoconfamal.sh d1a2da0e15b2ed33d60af35c7e9d483f13a8eb9f -F tool/mkkeywordhash.c 8d78ea188240bc08ec080adf3af84717f013e69a +F tool/mkkeywordhash.c ff6fc41e733204e289b38b9cd3808701725c6793 F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e F tool/mkpragmatab.tcl 84af2b180484323a2ea22a2279e8bd9e3e1e492e F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 @@ -1383,7 +1383,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f8ae9bfd05abc35293ad6bc62ab1bdbe357d964e f00a9e1e998c4bd249a45444dc2d71a7e4903b8b -R 26478d9405c36063665d5a8b96df78bb +P c490bfb150c66763226a35e30ba289abbf29906d +R 1a77cff5bf225c8f1af4050df926d2bd U drh -Z 60e0d06fc5e4f945ca55d9cbf383722d +Z 4bd187d1d0f74fd2a4074d09ae209a9a diff --git a/manifest.uuid b/manifest.uuid index bf8f7c634e..9cb3d0d03e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c490bfb150c66763226a35e30ba289abbf29906d \ No newline at end of file +c0bf92eca4d3d4666e8a0476ef30fa8123de1cb0 \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index 7a05ecab6a..63bf5e4715 100644 --- a/src/parse.y +++ b/src/parse.y @@ -32,7 +32,7 @@ %syntax_error { UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */ assert( TOKEN.z[0] ); /* The tokenizer always gives us a token */ - sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); + parserSyntaxError(pParse, &TOKEN); } %stack_overflow { UNUSED_PARAMETER(yypMinor); /* Silence some compiler warnings */ @@ -94,6 +94,13 @@ struct TrigEvent { int a; IdList * b; }; */ struct AttachKey { int type; Token key; }; +/* +** Generate a syntax error +*/ +static void parserSyntaxError(Parse *pParse, Token *p){ + sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", p); +} + } // end %include // Input is a single SQL command @@ -118,10 +125,18 @@ trans_opt ::= TRANSACTION. trans_opt ::= TRANSACTION nm. %type transtype {int} transtype(A) ::= . {A = TK_DEFERRED;} -transtype(A) ::= DEFERRED(X). {A = @X;} -transtype(A) ::= IMMEDIATE(X). {A = @X;} -transtype(A) ::= EXCLUSIVE(X). {A = @X;} -transtype(A) ::= CONCURRENT(X). {A = @X;} +transtype(A) ::= DEFERRED(X). {A = @X;} +transtype(A) ::= IMMEDIATE(X). {A = @X;} +transtype(A) ::= ID(X). { + Token *p = &X; + if( p->n==9 && sqlite3_strnicmp(p->z,"exclusive",9)==0 ){ + A = TK_EXCLUSIVE; + }else if( p->n==10 && sqlite3_strnicmp(p->z,"concurrent",10)==0 ){ + A = TK_CONCURRENT; + }else{ + parserSyntaxError(pParse, p); + } +} cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);} cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);} cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);} @@ -203,10 +218,11 @@ columnid(A) ::= nm(X). { // %fallback ID ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW - CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR + CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXPLAIN FAIL FOR IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN QUERY KEY OF OFFSET PRAGMA RAISE RECURSIVE RELEASE REPLACE RESTRICT ROW - ROLLBACK SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL WITH WITHOUT + ROLLBACK SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL + WITH WITHOUT %ifdef SQLITE_OMIT_COMPOUND_SELECT EXCEPT INTERSECT UNION %endif SQLITE_OMIT_COMPOUND_SELECT @@ -873,7 +889,7 @@ expr(A) ::= VARIABLE(X). { ** that look like this: #1 #2 ... These terms refer to registers ** in the virtual machine. #N is the N-th register. */ if( pParse->nested==0 ){ - sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &X); + parserSyntaxError(pParse, &X); A.pExpr = 0; }else{ A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &X); diff --git a/tool/mkkeywordhash.c b/tool/mkkeywordhash.c index 50585b1d09..044ebb6721 100644 --- a/tool/mkkeywordhash.c +++ b/tool/mkkeywordhash.c @@ -171,7 +171,6 @@ static Keyword aKeywordTable[] = { { "COLLATE", "TK_COLLATE", ALWAYS }, { "COLUMN", "TK_COLUMNKW", ALTER }, { "COMMIT", "TK_COMMIT", ALWAYS }, - { "CONCURRENT", "TK_CONCURRENT", ALWAYS }, { "CONFLICT", "TK_CONFLICT", CONFLICT }, { "CONSTRAINT", "TK_CONSTRAINT", ALWAYS }, { "CREATE", "TK_CREATE", ALWAYS }, @@ -193,7 +192,6 @@ static Keyword aKeywordTable[] = { { "ELSE", "TK_ELSE", ALWAYS }, { "ESCAPE", "TK_ESCAPE", ALWAYS }, { "EXCEPT", "TK_EXCEPT", COMPOUND }, - { "EXCLUSIVE", "TK_EXCLUSIVE", ALWAYS }, { "EXISTS", "TK_EXISTS", ALWAYS }, { "EXPLAIN", "TK_EXPLAIN", EXPLAIN }, { "FAIL", "TK_FAIL", CONFLICT|TRIGGER }, From b00083429adf5d73c78c803a2617f67d4e95371f Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 6 May 2016 21:04:47 +0000 Subject: [PATCH 031/113] Add test/bc_test1.c, for testing the degree of concurrency provided by this branch under various conditions. FossilOrigin-Name: 128c7eaed5479b615d75ebce1d781ea661e0fb2d --- main.mk | 3 + manifest | 18 +- manifest.uuid | 2 +- test/bc_test1.c | 137 +++++++ test/threadtest3.c | 867 +------------------------------------------- test/tt3_core.c | 883 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 1035 insertions(+), 875 deletions(-) create mode 100644 test/bc_test1.c create mode 100644 test/tt3_core.c diff --git a/main.mk b/main.mk index 1e791416d8..f4f6287753 100644 --- a/main.mk +++ b/main.mk @@ -819,6 +819,9 @@ THREADTEST3_SRC = $(TOP)/test/threadtest3.c \ threadtest3$(EXE): sqlite3.o $(THREADTEST3_SRC) $(TOP)/src/test_multiplex.c $(TCCX) $(TOP)/test/threadtest3.c $(TOP)/src/test_multiplex.c sqlite3.o -o $@ $(THREADLIB) +bc_test1$(EXE): sqlite3.o $(TOP)/test/bc_test1.c $(TOP)/test/tt3_core.c + $(TCCX) $(TOP)/test/bc_test1.c sqlite3.o -o $@ $(THREADLIB) + threadtest: threadtest3$(EXE) ./threadtest3$(EXE) diff --git a/manifest b/manifest index cc7dd90dc4..161feb3e40 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sthe\slatest\senhancements\sfrom\strunk. -D 2016-04-29T16:01:18.190 +C Add\stest/bc_test1.c,\sfor\stesting\sthe\sdegree\sof\sconcurrency\sprovided\sby\sthis\sbranch\sunder\svarious\sconditions. +D 2016-05-06T21:04:47.598 F Makefile.in 9e816d0323e418fbc0f8b2c05fc14e0b3763d9e8 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 71b8b16cf9393f68e2e2035486ca104872558836 @@ -302,7 +302,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk a283660f75c3c4b75d8c9d12a40fa38a066eee9d +F main.mk 968ad49af90277060b8ec7a15915273b76ee1d4d F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -521,6 +521,7 @@ F test/backup_malloc.test 7162d604ec2b4683c4b3799a48657fb8b5e2d450 F test/badutf.test d5360fc31f643d37a973ab0d8b4fb85799c3169f F test/badutf2.test f5bc7f2d280670ecd79b9cf4f0f1760c607fe51f F test/bc_common.tcl b5e42d80305be95697e6370e015af571e5333a1c +F test/bc_test1.c d67cb1a933ae3a9116c8dc6da31e9ebf1c06ac23 F test/bestindex1.test 0cf1bd2d7b97d3a3a8c10736125274f64765c4ee F test/bestindex2.test 4a06b8922ab2fd09434870da8d1cdf525aaf7060 F test/between.test 34d375fb5ce1ae283ffe82b6b233e9f38e84fc6c @@ -1129,7 +1130,7 @@ F test/thread2.test f35d2106452b77523b3a2b7d1dcde2e5ee8f9e46 F test/thread_common.tcl 334639cadcb9f912bf82aa73f49efd5282e6cadd F test/threadtest1.c 6029d9c5567db28e6dc908a0c63099c3ba6c383b F test/threadtest2.c a70a8e94bef23339d34226eb9521015ef99f4df8 -F test/threadtest3.c 38a612ea62854349ed66372f330a40d73c5cf956 +F test/threadtest3.c 4b413718ab3ef5e4f9f1ab0502b89707c5a9ccdc F test/threadtest4.c c1e67136ceb6c7ec8184e56ac61db28f96bd2925 F test/tkt-02a8e81d44.test 6c80d9c7514e2a42d4918bf87bf6bc54f379110c F test/tkt-26ff0c2d1e.test 888324e751512972c6e0d1a09df740d8f5aaf660 @@ -1294,6 +1295,7 @@ F test/triggerC.test 302d8995f5ffe63bbc15053abb3ef7a39cf5a092 F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650 F test/triggerE.test 15fa63f1097db1f83dd62d121616006978063d1f F test/tt3_checkpoint.c 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1 +F test/tt3_core.c 13c19feb4fe127bc86ae86d2c1237eb71c73f2ab F test/tt3_index.c 39eec10a35f57672225be4d182862152896dee4a F test/tt3_lookaside1.c 0377e202c3c2a50d688cb65ba203afeda6fafeb9 F test/tt3_stress.c c57d804716165811d979d4a719e05baccd79277f @@ -1489,7 +1491,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1f709fbf931e4d75848fc90532e2bc67ccd47cd4 9d0a5ae00273686ea35b43bc2ffaa8775c176363 -R 53ca713e0bf5b0eed86d88e36153628f -U drh -Z e98bb20abec63c17e483c921950d1a1a +P 91e5c07eaf884d3598df8eb54f0910a80df48397 +R 4bab1825e8924fd8c0c1d12f2130ddfc +U dan +Z 8e9093e5b020040f9bd55508cf282679 diff --git a/manifest.uuid b/manifest.uuid index 43d7e4a998..86543cee78 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -91e5c07eaf884d3598df8eb54f0910a80df48397 \ No newline at end of file +128c7eaed5479b615d75ebce1d781ea661e0fb2d \ No newline at end of file diff --git a/test/bc_test1.c b/test/bc_test1.c new file mode 100644 index 0000000000..dd8ab30440 --- /dev/null +++ b/test/bc_test1.c @@ -0,0 +1,137 @@ + + +#include + +#include + +#include "tt3_core.c" + + +typedef struct Config Config; + +struct Config { + int nIPT; /* --inserts-per-transaction */ + int nThread; /* --threads */ + int nSecond; /* --seconds */ + int bMutex; /* --mutex */ + + int bRm; /* --rm */ + sqlite3_mutex *pMutex; +}; + +static char *thread_main(int iTid, void *pArg){ + Config *pConfig = (Config*)pArg; + Error err = {0}; /* Error code and message */ + Sqlite db = {0}; /* SQLite database connection */ + int nAttempt = 0; /* Attempted transactions */ + int nCommit = 0; /* Successful transactions */ + int j; + + opendb(&err, &db, "xyz.db", 0); + sqlite3_busy_handler(db.db, 0, 0); + execsql(&err, &db, "PRAGMA wal_autocheckpoint = 0"); + + while( !timetostop(&err) ){ + execsql(&err, &db, "BEGIN CONCURRENT"); + for(j=0; jnIPT; j++){ + execsql(&err, &db, + "INSERT INTO t1 VALUES" + "(randomblob(10), randomblob(20), randomblob(30), randomblob(200))" + ); + } + sqlite3_mutex_enter(pConfig->pMutex); + execsql(&err, &db, "COMMIT"); + sqlite3_mutex_leave(pConfig->pMutex); + nAttempt++; + if( err.rc==SQLITE_OK ){ + nCommit++; + }else{ + clear_error(&err, SQLITE_BUSY); + execsql(&err, &db, "ROLLBACK"); + } + } + + closedb(&err, &db); + return sqlite3_mprintf("%d/%d successful commits", nCommit, nAttempt); +} + +static void usage(char *zName){ + fprintf(stderr, "Usage: %s ?SWITCHES?\n", zName); + fprintf(stderr, "\n"); + fprintf(stderr, "where switches are\n"); + fprintf(stderr, " --seconds N\n"); + fprintf(stderr, " --inserts N\n"); + fprintf(stderr, " --threads N\n"); + fprintf(stderr, " --rm BOOL\n"); + fprintf(stderr, " --mutex BOOL\n"); + fprintf(stderr, "\n"); + exit(-1); +} + +int main(int argc, char **argv){ + Error err = {0}; /* Error code and message */ + Sqlite db = {0}; /* SQLite database connection */ + Threadset threads = {0}; /* Test threads */ + Config sConfig = {5, 3, 5}; + int i; + + for(i=1; i=3 && 0==sqlite3_strnicmp(z, "--seconds", n) ){ + if( (++i)==argc ) usage(argv[0]); + sConfig.nSecond = atoi(argv[i]); + } + + else if( n>=3 && 0==sqlite3_strnicmp(z, "--inserts", n) ){ + if( (++i)==argc ) usage(argv[0]); + sConfig.nIPT = atoi(argv[i]); + } + + else if( n>=3 && 0==sqlite3_strnicmp(z, "--threads", n) ){ + if( (++i)==argc ) usage(argv[0]); + sConfig.nThread = atoi(argv[i]); + } + + else if( n>=3 && 0==sqlite3_strnicmp(z, "--rm", n) ){ + if( (++i)==argc ) usage(argv[0]); + sConfig.bRm = atoi(argv[i]); + } + + else if( n>=3 && 0==sqlite3_strnicmp(z, "--mutex", n) ){ + if( (++i)==argc ) usage(argv[0]); + sConfig.bMutex = atoi(argv[i]); + } + + else usage(argv[0]); + } + + printf("With: --threads %d --inserts %d --seconds %d --rm %d --mutex %d\n", + sConfig.nThread, sConfig.nIPT, sConfig.nSecond, sConfig.bRm, + sConfig.bMutex + ); + + /* Ensure the schema has been created */ + if( sConfig.bMutex ){ + sConfig.pMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_RECURSIVE); + } + opendb(&err, &db, "xyz.db", sConfig.bRm); + + sql_script(&err, &db, + "PRAGMA journal_mode = wal;" + "CREATE TABLE IF NOT EXISTS t1(a PRIMARY KEY, b, c, d) WITHOUT ROWID;" + "CREATE INDEX IF NOT EXISTS t1b ON t1(b);" + "CREATE INDEX IF NOT EXISTS t1c ON t1(c);" + ); + closedb(&err, &db); + + setstoptime(&err, sConfig.nSecond*1000); + for(i=0; iiLine = ((e)->rc ? (e)->iLine : __LINE__)) - -/* Database functions */ -#define opendb(w,x,y,z) (SEL(w), opendb_x(w,x,y,z)) -#define closedb(y,z) (SEL(y), closedb_x(y,z)) - -/* Functions to execute SQL */ -#define sql_script(x,y,z) (SEL(x), sql_script_x(x,y,z)) -#define integrity_check(x,y) (SEL(x), integrity_check_x(x,y)) -#define execsql_i64(x,y,...) (SEL(x), execsql_i64_x(x,y,__VA_ARGS__)) -#define execsql_text(x,y,z,...) (SEL(x), execsql_text_x(x,y,z,__VA_ARGS__)) -#define execsql(x,y,...) (SEL(x), (void)execsql_i64_x(x,y,__VA_ARGS__)) -#define sql_script_printf(x,y,z,...) ( \ - SEL(x), sql_script_printf_x(x,y,z,__VA_ARGS__) \ -) - -/* Thread functions */ -#define launch_thread(w,x,y,z) (SEL(w), launch_thread_x(w,x,y,z)) -#define join_all_threads(y,z) (SEL(y), join_all_threads_x(y,z)) - -/* Timer functions */ -#define setstoptime(y,z) (SEL(y), setstoptime_x(y,z)) -#define timetostop(z) (SEL(z), timetostop_x(z)) - -/* Report/clear errors. */ -#define test_error(z, ...) test_error_x(z, sqlite3_mprintf(__VA_ARGS__)) -#define clear_error(y,z) clear_error_x(y, z) - -/* File-system operations */ -#define filesize(y,z) (SEL(y), filesize_x(y,z)) -#define filecopy(x,y,z) (SEL(x), filecopy_x(x,y,z)) - -#define PTR2INT(x) ((int)((intptr_t)x)) -#define INT2PTR(x) ((void*)((intptr_t)x)) - -/* -** End of test code/infrastructure interface macros. -*************************************************************************/ #include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include "test_multiplex.h" +#include "tt3_core.c" /* Required to link test_multiplex.c */ #ifndef SQLITE_OMIT_WSD int sqlite3PendingByte = 0x40000000; #endif -/* - * This code implements the MD5 message-digest algorithm. - * The algorithm is due to Ron Rivest. This code was - * written by Colin Plumb in 1993, no copyright is claimed. - * This code is in the public domain; do with it what you wish. - * - * Equivalent code is available from RSA Data Security, Inc. - * This code has been tested against that, and is equivalent, - * except that you don't need to include two pages of legalese - * with every copy. - * - * To compute the message digest of a chunk of bytes, declare an - * MD5Context structure, pass it to MD5Init, call MD5Update as - * needed on buffers full of bytes, and then call MD5Final, which - * will fill a supplied 16-byte array with the digest. - */ - -/* - * If compiled on a machine that doesn't have a 32-bit integer, - * you just set "uint32" to the appropriate datatype for an - * unsigned 32-bit integer. For example: - * - * cc -Duint32='unsigned long' md5.c - * - */ -#ifndef uint32 -# define uint32 unsigned int -#endif - -struct MD5Context { - int isInit; - uint32 buf[4]; - uint32 bits[2]; - union { - unsigned char in[64]; - uint32 in32[16]; - } u; -}; -typedef struct MD5Context MD5Context; - -/* - * Note: this code is harmless on little-endian machines. - */ -static void byteReverse (unsigned char *buf, unsigned longs){ - uint32 t; - do { - t = (uint32)((unsigned)buf[3]<<8 | buf[2]) << 16 | - ((unsigned)buf[1]<<8 | buf[0]); - *(uint32 *)buf = t; - buf += 4; - } while (--longs); -} -/* The four core functions - F1 is optimized somewhat */ - -/* #define F1(x, y, z) (x & y | ~x & z) */ -#define F1(x, y, z) (z ^ (x & (y ^ z))) -#define F2(x, y, z) F1(z, x, y) -#define F3(x, y, z) (x ^ y ^ z) -#define F4(x, y, z) (y ^ (x | ~z)) - -/* This is the central step in the MD5 algorithm. */ -#define MD5STEP(f, w, x, y, z, data, s) \ - ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) - -/* - * The core of the MD5 algorithm, this alters an existing MD5 hash to - * reflect the addition of 16 longwords of new data. MD5Update blocks - * the data and converts bytes into longwords for this routine. - */ -static void MD5Transform(uint32 buf[4], const uint32 in[16]){ - register uint32 a, b, c, d; - - a = buf[0]; - b = buf[1]; - c = buf[2]; - d = buf[3]; - - MD5STEP(F1, a, b, c, d, in[ 0]+0xd76aa478, 7); - MD5STEP(F1, d, a, b, c, in[ 1]+0xe8c7b756, 12); - MD5STEP(F1, c, d, a, b, in[ 2]+0x242070db, 17); - MD5STEP(F1, b, c, d, a, in[ 3]+0xc1bdceee, 22); - MD5STEP(F1, a, b, c, d, in[ 4]+0xf57c0faf, 7); - MD5STEP(F1, d, a, b, c, in[ 5]+0x4787c62a, 12); - MD5STEP(F1, c, d, a, b, in[ 6]+0xa8304613, 17); - MD5STEP(F1, b, c, d, a, in[ 7]+0xfd469501, 22); - MD5STEP(F1, a, b, c, d, in[ 8]+0x698098d8, 7); - MD5STEP(F1, d, a, b, c, in[ 9]+0x8b44f7af, 12); - MD5STEP(F1, c, d, a, b, in[10]+0xffff5bb1, 17); - MD5STEP(F1, b, c, d, a, in[11]+0x895cd7be, 22); - MD5STEP(F1, a, b, c, d, in[12]+0x6b901122, 7); - MD5STEP(F1, d, a, b, c, in[13]+0xfd987193, 12); - MD5STEP(F1, c, d, a, b, in[14]+0xa679438e, 17); - MD5STEP(F1, b, c, d, a, in[15]+0x49b40821, 22); - - MD5STEP(F2, a, b, c, d, in[ 1]+0xf61e2562, 5); - MD5STEP(F2, d, a, b, c, in[ 6]+0xc040b340, 9); - MD5STEP(F2, c, d, a, b, in[11]+0x265e5a51, 14); - MD5STEP(F2, b, c, d, a, in[ 0]+0xe9b6c7aa, 20); - MD5STEP(F2, a, b, c, d, in[ 5]+0xd62f105d, 5); - MD5STEP(F2, d, a, b, c, in[10]+0x02441453, 9); - MD5STEP(F2, c, d, a, b, in[15]+0xd8a1e681, 14); - MD5STEP(F2, b, c, d, a, in[ 4]+0xe7d3fbc8, 20); - MD5STEP(F2, a, b, c, d, in[ 9]+0x21e1cde6, 5); - MD5STEP(F2, d, a, b, c, in[14]+0xc33707d6, 9); - MD5STEP(F2, c, d, a, b, in[ 3]+0xf4d50d87, 14); - MD5STEP(F2, b, c, d, a, in[ 8]+0x455a14ed, 20); - MD5STEP(F2, a, b, c, d, in[13]+0xa9e3e905, 5); - MD5STEP(F2, d, a, b, c, in[ 2]+0xfcefa3f8, 9); - MD5STEP(F2, c, d, a, b, in[ 7]+0x676f02d9, 14); - MD5STEP(F2, b, c, d, a, in[12]+0x8d2a4c8a, 20); - - MD5STEP(F3, a, b, c, d, in[ 5]+0xfffa3942, 4); - MD5STEP(F3, d, a, b, c, in[ 8]+0x8771f681, 11); - MD5STEP(F3, c, d, a, b, in[11]+0x6d9d6122, 16); - MD5STEP(F3, b, c, d, a, in[14]+0xfde5380c, 23); - MD5STEP(F3, a, b, c, d, in[ 1]+0xa4beea44, 4); - MD5STEP(F3, d, a, b, c, in[ 4]+0x4bdecfa9, 11); - MD5STEP(F3, c, d, a, b, in[ 7]+0xf6bb4b60, 16); - MD5STEP(F3, b, c, d, a, in[10]+0xbebfbc70, 23); - MD5STEP(F3, a, b, c, d, in[13]+0x289b7ec6, 4); - MD5STEP(F3, d, a, b, c, in[ 0]+0xeaa127fa, 11); - MD5STEP(F3, c, d, a, b, in[ 3]+0xd4ef3085, 16); - MD5STEP(F3, b, c, d, a, in[ 6]+0x04881d05, 23); - MD5STEP(F3, a, b, c, d, in[ 9]+0xd9d4d039, 4); - MD5STEP(F3, d, a, b, c, in[12]+0xe6db99e5, 11); - MD5STEP(F3, c, d, a, b, in[15]+0x1fa27cf8, 16); - MD5STEP(F3, b, c, d, a, in[ 2]+0xc4ac5665, 23); - - MD5STEP(F4, a, b, c, d, in[ 0]+0xf4292244, 6); - MD5STEP(F4, d, a, b, c, in[ 7]+0x432aff97, 10); - MD5STEP(F4, c, d, a, b, in[14]+0xab9423a7, 15); - MD5STEP(F4, b, c, d, a, in[ 5]+0xfc93a039, 21); - MD5STEP(F4, a, b, c, d, in[12]+0x655b59c3, 6); - MD5STEP(F4, d, a, b, c, in[ 3]+0x8f0ccc92, 10); - MD5STEP(F4, c, d, a, b, in[10]+0xffeff47d, 15); - MD5STEP(F4, b, c, d, a, in[ 1]+0x85845dd1, 21); - MD5STEP(F4, a, b, c, d, in[ 8]+0x6fa87e4f, 6); - MD5STEP(F4, d, a, b, c, in[15]+0xfe2ce6e0, 10); - MD5STEP(F4, c, d, a, b, in[ 6]+0xa3014314, 15); - MD5STEP(F4, b, c, d, a, in[13]+0x4e0811a1, 21); - MD5STEP(F4, a, b, c, d, in[ 4]+0xf7537e82, 6); - MD5STEP(F4, d, a, b, c, in[11]+0xbd3af235, 10); - MD5STEP(F4, c, d, a, b, in[ 2]+0x2ad7d2bb, 15); - MD5STEP(F4, b, c, d, a, in[ 9]+0xeb86d391, 21); - - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; -} - -/* - * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious - * initialization constants. - */ -static void MD5Init(MD5Context *ctx){ - ctx->isInit = 1; - ctx->buf[0] = 0x67452301; - ctx->buf[1] = 0xefcdab89; - ctx->buf[2] = 0x98badcfe; - ctx->buf[3] = 0x10325476; - ctx->bits[0] = 0; - ctx->bits[1] = 0; -} - -/* - * Update context to reflect the concatenation of another buffer full - * of bytes. - */ -static -void MD5Update(MD5Context *ctx, const unsigned char *buf, unsigned int len){ - uint32 t; - - /* Update bitcount */ - - t = ctx->bits[0]; - if ((ctx->bits[0] = t + ((uint32)len << 3)) < t) - ctx->bits[1]++; /* Carry from low to high */ - ctx->bits[1] += len >> 29; - - t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ - - /* Handle any leading odd-sized chunks */ - - if ( t ) { - unsigned char *p = (unsigned char *)ctx->u.in + t; - - t = 64-t; - if (len < t) { - memcpy(p, buf, len); - return; - } - memcpy(p, buf, t); - byteReverse(ctx->u.in, 16); - MD5Transform(ctx->buf, (uint32 *)ctx->u.in); - buf += t; - len -= t; - } - - /* Process data in 64-byte chunks */ - - while (len >= 64) { - memcpy(ctx->u.in, buf, 64); - byteReverse(ctx->u.in, 16); - MD5Transform(ctx->buf, (uint32 *)ctx->u.in); - buf += 64; - len -= 64; - } - - /* Handle any remaining bytes of data. */ - - memcpy(ctx->u.in, buf, len); -} - -/* - * Final wrapup - pad to 64-byte boundary with the bit pattern - * 1 0* (64-bit count of bits processed, MSB-first) - */ -static void MD5Final(unsigned char digest[16], MD5Context *ctx){ - unsigned count; - unsigned char *p; - - /* Compute number of bytes mod 64 */ - count = (ctx->bits[0] >> 3) & 0x3F; - - /* Set the first char of padding to 0x80. This is safe since there is - always at least one byte free */ - p = ctx->u.in + count; - *p++ = 0x80; - - /* Bytes of padding needed to make 64 bytes */ - count = 64 - 1 - count; - - /* Pad out to 56 mod 64 */ - if (count < 8) { - /* Two lots of padding: Pad the first block to 64 bytes */ - memset(p, 0, count); - byteReverse(ctx->u.in, 16); - MD5Transform(ctx->buf, (uint32 *)ctx->u.in); - - /* Now fill the next block with 56 bytes */ - memset(ctx->u.in, 0, 56); - } else { - /* Pad block to 56 bytes */ - memset(p, 0, count-8); - } - byteReverse(ctx->u.in, 14); - - /* Append length in bits and transform */ - ctx->u.in32[14] = ctx->bits[0]; - ctx->u.in32[15] = ctx->bits[1]; - - MD5Transform(ctx->buf, (uint32 *)ctx->u.in); - byteReverse((unsigned char *)ctx->buf, 4); - memcpy(digest, ctx->buf, 16); - memset(ctx, 0, sizeof(*ctx)); /* In case it is sensitive */ -} - -/* -** Convert a 128-bit MD5 digest into a 32-digit base-16 number. -*/ -static void MD5DigestToBase16(unsigned char *digest, char *zBuf){ - static char const zEncode[] = "0123456789abcdef"; - int i, j; - - for(j=i=0; i<16; i++){ - int a = digest[i]; - zBuf[j++] = zEncode[(a>>4)&0xf]; - zBuf[j++] = zEncode[a & 0xf]; - } - zBuf[j] = 0; -} - -/* -** During testing, the special md5sum() aggregate function is available. -** inside SQLite. The following routines implement that function. -*/ -static void md5step(sqlite3_context *context, int argc, sqlite3_value **argv){ - MD5Context *p; - int i; - if( argc<1 ) return; - p = sqlite3_aggregate_context(context, sizeof(*p)); - if( p==0 ) return; - if( !p->isInit ){ - MD5Init(p); - } - for(i=0; izErr); - p->zErr = 0; - p->rc = 0; -} - -static void print_err(Error *p){ - if( p->rc!=SQLITE_OK ){ - int isWarn = 0; - if( p->rc==SQLITE_SCHEMA ) isWarn = 1; - if( sqlite3_strglob("* - no such table: *",p->zErr)==0 ) isWarn = 1; - printf("%s: (%d) \"%s\" at line %d\n", isWarn ? "Warning" : "Error", - p->rc, p->zErr, p->iLine); - if( !isWarn ) nGlobalErr++; - fflush(stdout); - } -} - -static void print_and_free_err(Error *p){ - print_err(p); - free_err(p); -} - -static void system_error(Error *pErr, int iSys){ - pErr->rc = iSys; - pErr->zErr = (char *)sqlite3_malloc(512); - strerror_r(iSys, pErr->zErr, 512); - pErr->zErr[511] = '\0'; -} - -static void sqlite_error( - Error *pErr, - Sqlite *pDb, - const char *zFunc -){ - pErr->rc = sqlite3_errcode(pDb->db); - pErr->zErr = sqlite3_mprintf( - "sqlite3_%s() - %s (%d)", zFunc, sqlite3_errmsg(pDb->db), - sqlite3_extended_errcode(pDb->db) - ); -} - -static void test_error_x( - Error *pErr, - char *zErr -){ - if( pErr->rc==SQLITE_OK ){ - pErr->rc = 1; - pErr->zErr = zErr; - }else{ - sqlite3_free(zErr); - } -} - -static void clear_error_x( - Error *pErr, - int rc -){ - if( pErr->rc==rc ){ - pErr->rc = SQLITE_OK; - sqlite3_free(pErr->zErr); - pErr->zErr = 0; - } -} - -static int busyhandler(void *pArg, int n){ - usleep(10*1000); - return 1; -} - -static void opendb_x( - Error *pErr, /* IN/OUT: Error code */ - Sqlite *pDb, /* OUT: Database handle */ - const char *zFile, /* Database file name */ - int bDelete /* True to delete db file before opening */ -){ - if( pErr->rc==SQLITE_OK ){ - int rc; - int flags = SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE | SQLITE_OPEN_URI; - if( bDelete ) unlink(zFile); - rc = sqlite3_open_v2(zFile, &pDb->db, flags, 0); - if( rc ){ - sqlite_error(pErr, pDb, "open"); - sqlite3_close(pDb->db); - pDb->db = 0; - }else{ - sqlite3_create_function( - pDb->db, "md5sum", -1, SQLITE_UTF8, 0, 0, md5step, md5finalize - ); - sqlite3_busy_handler(pDb->db, busyhandler, 0); - sqlite3_exec(pDb->db, "PRAGMA synchronous=OFF", 0, 0, 0); - } - } -} - -static void closedb_x( - Error *pErr, /* IN/OUT: Error code */ - Sqlite *pDb /* OUT: Database handle */ -){ - int rc; - int i; - Statement *pIter; - Statement *pNext; - for(pIter=pDb->pCache; pIter; pIter=pNext){ - pNext = pIter->pNext; - sqlite3_finalize(pIter->pStmt); - sqlite3_free(pIter); - } - for(i=0; inText; i++){ - sqlite3_free(pDb->aText[i]); - } - sqlite3_free(pDb->aText); - rc = sqlite3_close(pDb->db); - if( rc && pErr->rc==SQLITE_OK ){ - pErr->zErr = sqlite3_mprintf("%s", sqlite3_errmsg(pDb->db)); - } - memset(pDb, 0, sizeof(Sqlite)); -} - -static void sql_script_x( - Error *pErr, /* IN/OUT: Error code */ - Sqlite *pDb, /* Database handle */ - const char *zSql /* SQL script to execute */ -){ - if( pErr->rc==SQLITE_OK ){ - pErr->rc = sqlite3_exec(pDb->db, zSql, 0, 0, &pErr->zErr); - } -} - -static void sql_script_printf_x( - Error *pErr, /* IN/OUT: Error code */ - Sqlite *pDb, /* Database handle */ - const char *zFormat, /* SQL printf format string */ - ... /* Printf args */ -){ - va_list ap; /* ... printf arguments */ - va_start(ap, zFormat); - if( pErr->rc==SQLITE_OK ){ - char *zSql = sqlite3_vmprintf(zFormat, ap); - pErr->rc = sqlite3_exec(pDb->db, zSql, 0, 0, &pErr->zErr); - sqlite3_free(zSql); - } - va_end(ap); -} - -static Statement *getSqlStatement( - Error *pErr, /* IN/OUT: Error code */ - Sqlite *pDb, /* Database handle */ - const char *zSql /* SQL statement */ -){ - Statement *pRet; - int rc; - - for(pRet=pDb->pCache; pRet; pRet=pRet->pNext){ - if( 0==strcmp(sqlite3_sql(pRet->pStmt), zSql) ){ - return pRet; - } - } - - pRet = sqlite3_malloc(sizeof(Statement)); - rc = sqlite3_prepare_v2(pDb->db, zSql, -1, &pRet->pStmt, 0); - if( rc!=SQLITE_OK ){ - sqlite_error(pErr, pDb, "prepare_v2"); - return 0; - } - assert( 0==strcmp(sqlite3_sql(pRet->pStmt), zSql) ); - - pRet->pNext = pDb->pCache; - pDb->pCache = pRet; - return pRet; -} - -static sqlite3_stmt *getAndBindSqlStatement( - Error *pErr, /* IN/OUT: Error code */ - Sqlite *pDb, /* Database handle */ - va_list ap /* SQL followed by parameters */ -){ - Statement *pStatement; /* The SQLite statement wrapper */ - sqlite3_stmt *pStmt; /* The SQLite statement to return */ - int i; /* Used to iterate through parameters */ - - pStatement = getSqlStatement(pErr, pDb, va_arg(ap, const char *)); - if( !pStatement ) return 0; - pStmt = pStatement->pStmt; - for(i=1; i<=sqlite3_bind_parameter_count(pStmt); i++){ - const char *zName = sqlite3_bind_parameter_name(pStmt, i); - void * pArg = va_arg(ap, void*); - - switch( zName[1] ){ - case 'i': - sqlite3_bind_int64(pStmt, i, *(i64 *)pArg); - break; - - default: - pErr->rc = 1; - pErr->zErr = sqlite3_mprintf("Cannot discern type: \"%s\"", zName); - pStmt = 0; - break; - } - } - - return pStmt; -} - -static i64 execsql_i64_x( - Error *pErr, /* IN/OUT: Error code */ - Sqlite *pDb, /* Database handle */ - ... /* SQL and pointers to parameter values */ -){ - i64 iRet = 0; - if( pErr->rc==SQLITE_OK ){ - sqlite3_stmt *pStmt; /* SQL statement to execute */ - va_list ap; /* ... arguments */ - va_start(ap, pDb); - pStmt = getAndBindSqlStatement(pErr, pDb, ap); - if( pStmt ){ - int first = 1; - while( SQLITE_ROW==sqlite3_step(pStmt) ){ - if( first && sqlite3_column_count(pStmt)>0 ){ - iRet = sqlite3_column_int64(pStmt, 0); - } - first = 0; - } - if( SQLITE_OK!=sqlite3_reset(pStmt) ){ - sqlite_error(pErr, pDb, "reset"); - } - } - va_end(ap); - } - return iRet; -} - -static char * execsql_text_x( - Error *pErr, /* IN/OUT: Error code */ - Sqlite *pDb, /* Database handle */ - int iSlot, /* Db handle slot to store text in */ - ... /* SQL and pointers to parameter values */ -){ - char *zRet = 0; - - if( iSlot>=pDb->nText ){ - int nByte = sizeof(char *)*(iSlot+1); - pDb->aText = (char **)sqlite3_realloc(pDb->aText, nByte); - memset(&pDb->aText[pDb->nText], 0, sizeof(char*)*(iSlot+1-pDb->nText)); - pDb->nText = iSlot+1; - } - - if( pErr->rc==SQLITE_OK ){ - sqlite3_stmt *pStmt; /* SQL statement to execute */ - va_list ap; /* ... arguments */ - va_start(ap, iSlot); - pStmt = getAndBindSqlStatement(pErr, pDb, ap); - if( pStmt ){ - int first = 1; - while( SQLITE_ROW==sqlite3_step(pStmt) ){ - if( first && sqlite3_column_count(pStmt)>0 ){ - zRet = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); - sqlite3_free(pDb->aText[iSlot]); - pDb->aText[iSlot] = zRet; - } - first = 0; - } - if( SQLITE_OK!=sqlite3_reset(pStmt) ){ - sqlite_error(pErr, pDb, "reset"); - } - } - va_end(ap); - } - - return zRet; -} - -static void integrity_check_x( - Error *pErr, /* IN/OUT: Error code */ - Sqlite *pDb /* Database handle */ -){ - if( pErr->rc==SQLITE_OK ){ - Statement *pStatement; /* Statement to execute */ - char *zErr = 0; /* Integrity check error */ - - pStatement = getSqlStatement(pErr, pDb, "PRAGMA integrity_check"); - if( pStatement ){ - sqlite3_stmt *pStmt = pStatement->pStmt; - while( SQLITE_ROW==sqlite3_step(pStmt) ){ - const char *z = (const char*)sqlite3_column_text(pStmt, 0); - if( strcmp(z, "ok") ){ - if( zErr==0 ){ - zErr = sqlite3_mprintf("%s", z); - }else{ - zErr = sqlite3_mprintf("%z\n%s", zErr, z); - } - } - } - sqlite3_reset(pStmt); - - if( zErr ){ - pErr->zErr = zErr; - pErr->rc = 1; - } - } - } -} - -static void *launch_thread_main(void *pArg){ - Thread *p = (Thread *)pArg; - return (void *)p->xProc(p->iTid, p->pArg); -} - -static void launch_thread_x( - Error *pErr, /* IN/OUT: Error code */ - Threadset *pThreads, /* Thread set */ - char *(*xProc)(int, void*), /* Proc to run */ - void *pArg /* Argument passed to thread proc */ -){ - if( pErr->rc==SQLITE_OK ){ - int iTid = ++pThreads->iMaxTid; - Thread *p; - int rc; - - p = (Thread *)sqlite3_malloc(sizeof(Thread)); - memset(p, 0, sizeof(Thread)); - p->iTid = iTid; - p->pArg = pArg; - p->xProc = xProc; - - rc = pthread_create(&p->tid, NULL, launch_thread_main, (void *)p); - if( rc!=0 ){ - system_error(pErr, rc); - sqlite3_free(p); - }else{ - p->pNext = pThreads->pThread; - pThreads->pThread = p; - } - } -} - -static void join_all_threads_x( - Error *pErr, /* IN/OUT: Error code */ - Threadset *pThreads /* Thread set */ -){ - Thread *p; - Thread *pNext; - for(p=pThreads->pThread; p; p=pNext){ - void *ret; - pNext = p->pNext; - int rc; - rc = pthread_join(p->tid, &ret); - if( rc!=0 ){ - if( pErr->rc==SQLITE_OK ) system_error(pErr, rc); - }else{ - printf("Thread %d says: %s\n", p->iTid, (ret==0 ? "..." : (char *)ret)); - fflush(stdout); - } - sqlite3_free(p); - } - pThreads->pThread = 0; -} - -static i64 filesize_x( - Error *pErr, - const char *zFile -){ - i64 iRet = 0; - if( pErr->rc==SQLITE_OK ){ - struct stat sStat; - if( stat(zFile, &sStat) ){ - iRet = -1; - }else{ - iRet = sStat.st_size; - } - } - return iRet; -} - -static void filecopy_x( - Error *pErr, - const char *zFrom, - const char *zTo -){ - if( pErr->rc==SQLITE_OK ){ - i64 nByte = filesize_x(pErr, zFrom); - if( nByte<0 ){ - test_error_x(pErr, sqlite3_mprintf("no such file: %s", zFrom)); - }else{ - i64 iOff; - char aBuf[1024]; - int fd1; - int fd2; - unlink(zTo); - - fd1 = open(zFrom, O_RDONLY); - if( fd1<0 ){ - system_error(pErr, errno); - return; - } - fd2 = open(zTo, O_RDWR|O_CREAT|O_EXCL, 0644); - if( fd2<0 ){ - system_error(pErr, errno); - close(fd1); - return; - } - - iOff = 0; - while( iOffnByte ){ - nCopy = nByte - iOff; - } - if( nCopy!=read(fd1, aBuf, nCopy) ){ - system_error(pErr, errno); - break; - } - if( nCopy!=write(fd2, aBuf, nCopy) ){ - system_error(pErr, errno); - break; - } - iOff += nCopy; - } - - close(fd1); - close(fd2); - } - } -} - -/* -** Used by setstoptime() and timetostop(). -*/ -static double timelimit = 0.0; - -static double currentTime(void){ - double t; - static sqlite3_vfs *pTimelimitVfs = 0; - if( pTimelimitVfs==0 ) pTimelimitVfs = sqlite3_vfs_find(0); - if( pTimelimitVfs->iVersion>=2 && pTimelimitVfs->xCurrentTimeInt64!=0 ){ - sqlite3_int64 tm; - pTimelimitVfs->xCurrentTimeInt64(pTimelimitVfs, &tm); - t = tm/86400000.0; - }else{ - pTimelimitVfs->xCurrentTime(pTimelimitVfs, &t); - } - return t; -} - -static void setstoptime_x( - Error *pErr, /* IN/OUT: Error code */ - int nMs /* Milliseconds until "stop time" */ -){ - if( pErr->rc==SQLITE_OK ){ - double t = currentTime(); - timelimit = t + ((double)nMs)/(1000.0*60.0*60.0*24.0); - } -} - -static int timetostop_x( - Error *pErr /* IN/OUT: Error code */ -){ - int ret = 1; - if( pErr->rc==SQLITE_OK ){ - double t = currentTime(); - ret = (t >= timelimit); - } - return ret; -} - /************************************************************************* ************************************************************************** diff --git a/test/tt3_core.c b/test/tt3_core.c new file mode 100644 index 0000000000..21de432e98 --- /dev/null +++ b/test/tt3_core.c @@ -0,0 +1,883 @@ +/* +** 2016-05-07 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* +** The "Set Error Line" macro. +*/ +#define SEL(e) ((e)->iLine = ((e)->rc ? (e)->iLine : __LINE__)) + +/* Database functions */ +#define opendb(w,x,y,z) (SEL(w), opendb_x(w,x,y,z)) +#define closedb(y,z) (SEL(y), closedb_x(y,z)) + +/* Functions to execute SQL */ +#define sql_script(x,y,z) (SEL(x), sql_script_x(x,y,z)) +#define integrity_check(x,y) (SEL(x), integrity_check_x(x,y)) +#define execsql_i64(x,y,...) (SEL(x), execsql_i64_x(x,y,__VA_ARGS__)) +#define execsql_text(x,y,z,...) (SEL(x), execsql_text_x(x,y,z,__VA_ARGS__)) +#define execsql(x,y,...) (SEL(x), (void)execsql_i64_x(x,y,__VA_ARGS__)) +#define sql_script_printf(x,y,z,...) ( \ + SEL(x), sql_script_printf_x(x,y,z,__VA_ARGS__) \ +) + +/* Thread functions */ +#define launch_thread(w,x,y,z) (SEL(w), launch_thread_x(w,x,y,z)) +#define join_all_threads(y,z) (SEL(y), join_all_threads_x(y,z)) + +/* Timer functions */ +#define setstoptime(y,z) (SEL(y), setstoptime_x(y,z)) +#define timetostop(z) (SEL(z), timetostop_x(z)) + +/* Report/clear errors. */ +#define test_error(z, ...) test_error_x(z, sqlite3_mprintf(__VA_ARGS__)) +#define clear_error(y,z) clear_error_x(y, z) + +/* File-system operations */ +#define filesize(y,z) (SEL(y), filesize_x(y,z)) +#define filecopy(x,y,z) (SEL(x), filecopy_x(x,y,z)) + +#define PTR2INT(x) ((int)((intptr_t)x)) +#define INT2PTR(x) ((void*)((intptr_t)x)) + +/* +** End of test code/infrastructure interface macros. +*************************************************************************/ + +/* + * This code implements the MD5 message-digest algorithm. + * The algorithm is due to Ron Rivest. This code was + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to MD5Init, call MD5Update as + * needed on buffers full of bytes, and then call MD5Final, which + * will fill a supplied 16-byte array with the digest. + */ + +/* + * If compiled on a machine that doesn't have a 32-bit integer, + * you just set "uint32" to the appropriate datatype for an + * unsigned 32-bit integer. For example: + * + * cc -Duint32='unsigned long' md5.c + * + */ +#ifndef uint32 +# define uint32 unsigned int +#endif + +struct MD5Context { + int isInit; + uint32 buf[4]; + uint32 bits[2]; + union { + unsigned char in[64]; + uint32 in32[16]; + } u; +}; +typedef struct MD5Context MD5Context; + +/* + * Note: this code is harmless on little-endian machines. + */ +static void byteReverse (unsigned char *buf, unsigned longs){ + uint32 t; + do { + t = (uint32)((unsigned)buf[3]<<8 | buf[2]) << 16 | + ((unsigned)buf[1]<<8 | buf[0]); + *(uint32 *)buf = t; + buf += 4; + } while (--longs); +} +/* The four core functions - F1 is optimized somewhat */ + +/* #define F1(x, y, z) (x & y | ~x & z) */ +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +/* This is the central step in the MD5 algorithm. */ +#define MD5STEP(f, w, x, y, z, data, s) \ + ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) + +/* + * The core of the MD5 algorithm, this alters an existing MD5 hash to + * reflect the addition of 16 longwords of new data. MD5Update blocks + * the data and converts bytes into longwords for this routine. + */ +static void MD5Transform(uint32 buf[4], const uint32 in[16]){ + register uint32 a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP(F1, a, b, c, d, in[ 0]+0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, in[ 1]+0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, in[ 2]+0x242070db, 17); + MD5STEP(F1, b, c, d, a, in[ 3]+0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, in[ 4]+0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, in[ 5]+0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, in[ 6]+0xa8304613, 17); + MD5STEP(F1, b, c, d, a, in[ 7]+0xfd469501, 22); + MD5STEP(F1, a, b, c, d, in[ 8]+0x698098d8, 7); + MD5STEP(F1, d, a, b, c, in[ 9]+0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, in[10]+0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, in[11]+0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, in[12]+0x6b901122, 7); + MD5STEP(F1, d, a, b, c, in[13]+0xfd987193, 12); + MD5STEP(F1, c, d, a, b, in[14]+0xa679438e, 17); + MD5STEP(F1, b, c, d, a, in[15]+0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, in[ 1]+0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, in[ 6]+0xc040b340, 9); + MD5STEP(F2, c, d, a, b, in[11]+0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, in[ 0]+0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, in[ 5]+0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, in[10]+0x02441453, 9); + MD5STEP(F2, c, d, a, b, in[15]+0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, in[ 4]+0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, in[ 9]+0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, in[14]+0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, in[ 3]+0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, in[ 8]+0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, in[13]+0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, in[ 2]+0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, in[ 7]+0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, in[12]+0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, in[ 5]+0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, in[ 8]+0x8771f681, 11); + MD5STEP(F3, c, d, a, b, in[11]+0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, in[14]+0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, in[ 1]+0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, in[ 4]+0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, in[ 7]+0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, in[10]+0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, in[13]+0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, in[ 0]+0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, in[ 3]+0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, in[ 6]+0x04881d05, 23); + MD5STEP(F3, a, b, c, d, in[ 9]+0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, in[12]+0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, in[15]+0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, in[ 2]+0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, in[ 0]+0xf4292244, 6); + MD5STEP(F4, d, a, b, c, in[ 7]+0x432aff97, 10); + MD5STEP(F4, c, d, a, b, in[14]+0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, in[ 5]+0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, in[12]+0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, in[ 3]+0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, in[10]+0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, in[ 1]+0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, in[ 8]+0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, in[15]+0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, in[ 6]+0xa3014314, 15); + MD5STEP(F4, b, c, d, a, in[13]+0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, in[ 4]+0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, in[11]+0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, in[ 2]+0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, in[ 9]+0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} + +/* + * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious + * initialization constants. + */ +static void MD5Init(MD5Context *ctx){ + ctx->isInit = 1; + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + ctx->bits[0] = 0; + ctx->bits[1] = 0; +} + +/* + * Update context to reflect the concatenation of another buffer full + * of bytes. + */ +static +void MD5Update(MD5Context *ctx, const unsigned char *buf, unsigned int len){ + uint32 t; + + /* Update bitcount */ + + t = ctx->bits[0]; + if ((ctx->bits[0] = t + ((uint32)len << 3)) < t) + ctx->bits[1]++; /* Carry from low to high */ + ctx->bits[1] += len >> 29; + + t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ + + /* Handle any leading odd-sized chunks */ + + if ( t ) { + unsigned char *p = (unsigned char *)ctx->u.in + t; + + t = 64-t; + if (len < t) { + memcpy(p, buf, len); + return; + } + memcpy(p, buf, t); + byteReverse(ctx->u.in, 16); + MD5Transform(ctx->buf, (uint32 *)ctx->u.in); + buf += t; + len -= t; + } + + /* Process data in 64-byte chunks */ + + while (len >= 64) { + memcpy(ctx->u.in, buf, 64); + byteReverse(ctx->u.in, 16); + MD5Transform(ctx->buf, (uint32 *)ctx->u.in); + buf += 64; + len -= 64; + } + + /* Handle any remaining bytes of data. */ + + memcpy(ctx->u.in, buf, len); +} + +/* + * Final wrapup - pad to 64-byte boundary with the bit pattern + * 1 0* (64-bit count of bits processed, MSB-first) + */ +static void MD5Final(unsigned char digest[16], MD5Context *ctx){ + unsigned count; + unsigned char *p; + + /* Compute number of bytes mod 64 */ + count = (ctx->bits[0] >> 3) & 0x3F; + + /* Set the first char of padding to 0x80. This is safe since there is + always at least one byte free */ + p = ctx->u.in + count; + *p++ = 0x80; + + /* Bytes of padding needed to make 64 bytes */ + count = 64 - 1 - count; + + /* Pad out to 56 mod 64 */ + if (count < 8) { + /* Two lots of padding: Pad the first block to 64 bytes */ + memset(p, 0, count); + byteReverse(ctx->u.in, 16); + MD5Transform(ctx->buf, (uint32 *)ctx->u.in); + + /* Now fill the next block with 56 bytes */ + memset(ctx->u.in, 0, 56); + } else { + /* Pad block to 56 bytes */ + memset(p, 0, count-8); + } + byteReverse(ctx->u.in, 14); + + /* Append length in bits and transform */ + ctx->u.in32[14] = ctx->bits[0]; + ctx->u.in32[15] = ctx->bits[1]; + + MD5Transform(ctx->buf, (uint32 *)ctx->u.in); + byteReverse((unsigned char *)ctx->buf, 4); + memcpy(digest, ctx->buf, 16); + memset(ctx, 0, sizeof(*ctx)); /* In case it is sensitive */ +} + +/* +** Convert a 128-bit MD5 digest into a 32-digit base-16 number. +*/ +static void MD5DigestToBase16(unsigned char *digest, char *zBuf){ + static char const zEncode[] = "0123456789abcdef"; + int i, j; + + for(j=i=0; i<16; i++){ + int a = digest[i]; + zBuf[j++] = zEncode[(a>>4)&0xf]; + zBuf[j++] = zEncode[a & 0xf]; + } + zBuf[j] = 0; +} + +/* +** During testing, the special md5sum() aggregate function is available. +** inside SQLite. The following routines implement that function. +*/ +static void md5step(sqlite3_context *context, int argc, sqlite3_value **argv){ + MD5Context *p; + int i; + if( argc<1 ) return; + p = sqlite3_aggregate_context(context, sizeof(*p)); + if( p==0 ) return; + if( !p->isInit ){ + MD5Init(p); + } + for(i=0; izErr); + p->zErr = 0; + p->rc = 0; +} + +static void print_err(Error *p){ + if( p->rc!=SQLITE_OK ){ + int isWarn = 0; + if( p->rc==SQLITE_SCHEMA ) isWarn = 1; + if( sqlite3_strglob("* - no such table: *",p->zErr)==0 ) isWarn = 1; + printf("%s: (%d) \"%s\" at line %d\n", isWarn ? "Warning" : "Error", + p->rc, p->zErr, p->iLine); + if( !isWarn ) nGlobalErr++; + fflush(stdout); + } +} + +static void print_and_free_err(Error *p){ + print_err(p); + free_err(p); +} + +static void system_error(Error *pErr, int iSys){ + pErr->rc = iSys; + pErr->zErr = (char *)sqlite3_malloc(512); + strerror_r(iSys, pErr->zErr, 512); + pErr->zErr[511] = '\0'; +} + +static void sqlite_error( + Error *pErr, + Sqlite *pDb, + const char *zFunc +){ + pErr->rc = sqlite3_errcode(pDb->db); + pErr->zErr = sqlite3_mprintf( + "sqlite3_%s() - %s (%d)", zFunc, sqlite3_errmsg(pDb->db), + sqlite3_extended_errcode(pDb->db) + ); +} + +static void test_error_x( + Error *pErr, + char *zErr +){ + if( pErr->rc==SQLITE_OK ){ + pErr->rc = 1; + pErr->zErr = zErr; + }else{ + sqlite3_free(zErr); + } +} + +static void clear_error_x( + Error *pErr, + int rc +){ + if( pErr->rc==rc ){ + pErr->rc = SQLITE_OK; + sqlite3_free(pErr->zErr); + pErr->zErr = 0; + } +} + +static int busyhandler(void *pArg, int n){ + usleep(10*1000); + return 1; +} + +static void opendb_x( + Error *pErr, /* IN/OUT: Error code */ + Sqlite *pDb, /* OUT: Database handle */ + const char *zFile, /* Database file name */ + int bDelete /* True to delete db file before opening */ +){ + if( pErr->rc==SQLITE_OK ){ + int rc; + int flags = SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE | SQLITE_OPEN_URI; + if( bDelete ) unlink(zFile); + rc = sqlite3_open_v2(zFile, &pDb->db, flags, 0); + if( rc ){ + sqlite_error(pErr, pDb, "open"); + sqlite3_close(pDb->db); + pDb->db = 0; + }else{ + sqlite3_create_function( + pDb->db, "md5sum", -1, SQLITE_UTF8, 0, 0, md5step, md5finalize + ); + sqlite3_busy_handler(pDb->db, busyhandler, 0); + sqlite3_exec(pDb->db, "PRAGMA synchronous=OFF", 0, 0, 0); + } + } +} + +static void closedb_x( + Error *pErr, /* IN/OUT: Error code */ + Sqlite *pDb /* OUT: Database handle */ +){ + int rc; + int i; + Statement *pIter; + Statement *pNext; + for(pIter=pDb->pCache; pIter; pIter=pNext){ + pNext = pIter->pNext; + sqlite3_finalize(pIter->pStmt); + sqlite3_free(pIter); + } + for(i=0; inText; i++){ + sqlite3_free(pDb->aText[i]); + } + sqlite3_free(pDb->aText); + rc = sqlite3_close(pDb->db); + if( rc && pErr->rc==SQLITE_OK ){ + pErr->zErr = sqlite3_mprintf("%s", sqlite3_errmsg(pDb->db)); + } + memset(pDb, 0, sizeof(Sqlite)); +} + +static void sql_script_x( + Error *pErr, /* IN/OUT: Error code */ + Sqlite *pDb, /* Database handle */ + const char *zSql /* SQL script to execute */ +){ + if( pErr->rc==SQLITE_OK ){ + pErr->rc = sqlite3_exec(pDb->db, zSql, 0, 0, &pErr->zErr); + } +} + +static void sql_script_printf_x( + Error *pErr, /* IN/OUT: Error code */ + Sqlite *pDb, /* Database handle */ + const char *zFormat, /* SQL printf format string */ + ... /* Printf args */ +){ + va_list ap; /* ... printf arguments */ + va_start(ap, zFormat); + if( pErr->rc==SQLITE_OK ){ + char *zSql = sqlite3_vmprintf(zFormat, ap); + pErr->rc = sqlite3_exec(pDb->db, zSql, 0, 0, &pErr->zErr); + sqlite3_free(zSql); + } + va_end(ap); +} + +static Statement *getSqlStatement( + Error *pErr, /* IN/OUT: Error code */ + Sqlite *pDb, /* Database handle */ + const char *zSql /* SQL statement */ +){ + Statement *pRet; + int rc; + + for(pRet=pDb->pCache; pRet; pRet=pRet->pNext){ + if( 0==strcmp(sqlite3_sql(pRet->pStmt), zSql) ){ + return pRet; + } + } + + pRet = sqlite3_malloc(sizeof(Statement)); + rc = sqlite3_prepare_v2(pDb->db, zSql, -1, &pRet->pStmt, 0); + if( rc!=SQLITE_OK ){ + sqlite_error(pErr, pDb, "prepare_v2"); + return 0; + } + assert( 0==strcmp(sqlite3_sql(pRet->pStmt), zSql) ); + + pRet->pNext = pDb->pCache; + pDb->pCache = pRet; + return pRet; +} + +static sqlite3_stmt *getAndBindSqlStatement( + Error *pErr, /* IN/OUT: Error code */ + Sqlite *pDb, /* Database handle */ + va_list ap /* SQL followed by parameters */ +){ + Statement *pStatement; /* The SQLite statement wrapper */ + sqlite3_stmt *pStmt; /* The SQLite statement to return */ + int i; /* Used to iterate through parameters */ + + pStatement = getSqlStatement(pErr, pDb, va_arg(ap, const char *)); + if( !pStatement ) return 0; + pStmt = pStatement->pStmt; + for(i=1; i<=sqlite3_bind_parameter_count(pStmt); i++){ + const char *zName = sqlite3_bind_parameter_name(pStmt, i); + void * pArg = va_arg(ap, void*); + + switch( zName[1] ){ + case 'i': + sqlite3_bind_int64(pStmt, i, *(i64 *)pArg); + break; + + default: + pErr->rc = 1; + pErr->zErr = sqlite3_mprintf("Cannot discern type: \"%s\"", zName); + pStmt = 0; + break; + } + } + + return pStmt; +} + +static i64 execsql_i64_x( + Error *pErr, /* IN/OUT: Error code */ + Sqlite *pDb, /* Database handle */ + ... /* SQL and pointers to parameter values */ +){ + i64 iRet = 0; + if( pErr->rc==SQLITE_OK ){ + sqlite3_stmt *pStmt; /* SQL statement to execute */ + va_list ap; /* ... arguments */ + va_start(ap, pDb); + pStmt = getAndBindSqlStatement(pErr, pDb, ap); + if( pStmt ){ + int first = 1; + while( SQLITE_ROW==sqlite3_step(pStmt) ){ + if( first && sqlite3_column_count(pStmt)>0 ){ + iRet = sqlite3_column_int64(pStmt, 0); + } + first = 0; + } + if( SQLITE_OK!=sqlite3_reset(pStmt) ){ + sqlite_error(pErr, pDb, "reset"); + } + } + va_end(ap); + } + return iRet; +} + +static char * execsql_text_x( + Error *pErr, /* IN/OUT: Error code */ + Sqlite *pDb, /* Database handle */ + int iSlot, /* Db handle slot to store text in */ + ... /* SQL and pointers to parameter values */ +){ + char *zRet = 0; + + if( iSlot>=pDb->nText ){ + int nByte = sizeof(char *)*(iSlot+1); + pDb->aText = (char **)sqlite3_realloc(pDb->aText, nByte); + memset(&pDb->aText[pDb->nText], 0, sizeof(char*)*(iSlot+1-pDb->nText)); + pDb->nText = iSlot+1; + } + + if( pErr->rc==SQLITE_OK ){ + sqlite3_stmt *pStmt; /* SQL statement to execute */ + va_list ap; /* ... arguments */ + va_start(ap, iSlot); + pStmt = getAndBindSqlStatement(pErr, pDb, ap); + if( pStmt ){ + int first = 1; + while( SQLITE_ROW==sqlite3_step(pStmt) ){ + if( first && sqlite3_column_count(pStmt)>0 ){ + zRet = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); + sqlite3_free(pDb->aText[iSlot]); + pDb->aText[iSlot] = zRet; + } + first = 0; + } + if( SQLITE_OK!=sqlite3_reset(pStmt) ){ + sqlite_error(pErr, pDb, "reset"); + } + } + va_end(ap); + } + + return zRet; +} + +static void integrity_check_x( + Error *pErr, /* IN/OUT: Error code */ + Sqlite *pDb /* Database handle */ +){ + if( pErr->rc==SQLITE_OK ){ + Statement *pStatement; /* Statement to execute */ + char *zErr = 0; /* Integrity check error */ + + pStatement = getSqlStatement(pErr, pDb, "PRAGMA integrity_check"); + if( pStatement ){ + sqlite3_stmt *pStmt = pStatement->pStmt; + while( SQLITE_ROW==sqlite3_step(pStmt) ){ + const char *z = (const char*)sqlite3_column_text(pStmt, 0); + if( strcmp(z, "ok") ){ + if( zErr==0 ){ + zErr = sqlite3_mprintf("%s", z); + }else{ + zErr = sqlite3_mprintf("%z\n%s", zErr, z); + } + } + } + sqlite3_reset(pStmt); + + if( zErr ){ + pErr->zErr = zErr; + pErr->rc = 1; + } + } + } +} + +static void *launch_thread_main(void *pArg){ + Thread *p = (Thread *)pArg; + return (void *)p->xProc(p->iTid, p->pArg); +} + +static void launch_thread_x( + Error *pErr, /* IN/OUT: Error code */ + Threadset *pThreads, /* Thread set */ + char *(*xProc)(int, void*), /* Proc to run */ + void *pArg /* Argument passed to thread proc */ +){ + if( pErr->rc==SQLITE_OK ){ + int iTid = ++pThreads->iMaxTid; + Thread *p; + int rc; + + p = (Thread *)sqlite3_malloc(sizeof(Thread)); + memset(p, 0, sizeof(Thread)); + p->iTid = iTid; + p->pArg = pArg; + p->xProc = xProc; + + rc = pthread_create(&p->tid, NULL, launch_thread_main, (void *)p); + if( rc!=0 ){ + system_error(pErr, rc); + sqlite3_free(p); + }else{ + p->pNext = pThreads->pThread; + pThreads->pThread = p; + } + } +} + +static void join_all_threads_x( + Error *pErr, /* IN/OUT: Error code */ + Threadset *pThreads /* Thread set */ +){ + Thread *p; + Thread *pNext; + for(p=pThreads->pThread; p; p=pNext){ + void *ret; + pNext = p->pNext; + int rc; + rc = pthread_join(p->tid, &ret); + if( rc!=0 ){ + if( pErr->rc==SQLITE_OK ) system_error(pErr, rc); + }else{ + printf("Thread %d says: %s\n", p->iTid, (ret==0 ? "..." : (char *)ret)); + fflush(stdout); + } + sqlite3_free(p); + } + pThreads->pThread = 0; +} + +static i64 filesize_x( + Error *pErr, + const char *zFile +){ + i64 iRet = 0; + if( pErr->rc==SQLITE_OK ){ + struct stat sStat; + if( stat(zFile, &sStat) ){ + iRet = -1; + }else{ + iRet = sStat.st_size; + } + } + return iRet; +} + +static void filecopy_x( + Error *pErr, + const char *zFrom, + const char *zTo +){ + if( pErr->rc==SQLITE_OK ){ + i64 nByte = filesize_x(pErr, zFrom); + if( nByte<0 ){ + test_error_x(pErr, sqlite3_mprintf("no such file: %s", zFrom)); + }else{ + i64 iOff; + char aBuf[1024]; + int fd1; + int fd2; + unlink(zTo); + + fd1 = open(zFrom, O_RDONLY); + if( fd1<0 ){ + system_error(pErr, errno); + return; + } + fd2 = open(zTo, O_RDWR|O_CREAT|O_EXCL, 0644); + if( fd2<0 ){ + system_error(pErr, errno); + close(fd1); + return; + } + + iOff = 0; + while( iOffnByte ){ + nCopy = nByte - iOff; + } + if( nCopy!=read(fd1, aBuf, nCopy) ){ + system_error(pErr, errno); + break; + } + if( nCopy!=write(fd2, aBuf, nCopy) ){ + system_error(pErr, errno); + break; + } + iOff += nCopy; + } + + close(fd1); + close(fd2); + } + } +} + +/* +** Used by setstoptime() and timetostop(). +*/ +static double timelimit = 0.0; + +static double currentTime(void){ + double t; + static sqlite3_vfs *pTimelimitVfs = 0; + if( pTimelimitVfs==0 ) pTimelimitVfs = sqlite3_vfs_find(0); + if( pTimelimitVfs->iVersion>=2 && pTimelimitVfs->xCurrentTimeInt64!=0 ){ + sqlite3_int64 tm; + pTimelimitVfs->xCurrentTimeInt64(pTimelimitVfs, &tm); + t = tm/86400000.0; + }else{ + pTimelimitVfs->xCurrentTime(pTimelimitVfs, &t); + } + return t; +} + +static void setstoptime_x( + Error *pErr, /* IN/OUT: Error code */ + int nMs /* Milliseconds until "stop time" */ +){ + if( pErr->rc==SQLITE_OK ){ + double t = currentTime(); + timelimit = t + ((double)nMs)/(1000.0*60.0*60.0*24.0); + } +} + +static int timetostop_x( + Error *pErr /* IN/OUT: Error code */ +){ + int ret = 1; + if( pErr->rc==SQLITE_OK ){ + double t = currentTime(); + ret = (t >= timelimit); + } + return ret; +} + From 820fc4933ba9ad6afff0adfbc88f7458689e317d Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 7 May 2016 18:02:53 +0000 Subject: [PATCH 032/113] Add options to bc_test1.c to make it more flexible. FossilOrigin-Name: ec6ef5f2c2dc18e1a19c205f365f4071f0870b68 --- manifest | 14 +++--- manifest.uuid | 2 +- test/bc_test1.c | 113 +++++++++++++++++++----------------------- test/tt3_core.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 188 insertions(+), 70 deletions(-) diff --git a/manifest b/manifest index 161feb3e40..9b43e47d70 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stest/bc_test1.c,\sfor\stesting\sthe\sdegree\sof\sconcurrency\sprovided\sby\sthis\sbranch\sunder\svarious\sconditions. -D 2016-05-06T21:04:47.598 +C Add\soptions\sto\sbc_test1.c\sto\smake\sit\smore\sflexible. +D 2016-05-07T18:02:53.432 F Makefile.in 9e816d0323e418fbc0f8b2c05fc14e0b3763d9e8 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 71b8b16cf9393f68e2e2035486ca104872558836 @@ -521,7 +521,7 @@ F test/backup_malloc.test 7162d604ec2b4683c4b3799a48657fb8b5e2d450 F test/badutf.test d5360fc31f643d37a973ab0d8b4fb85799c3169f F test/badutf2.test f5bc7f2d280670ecd79b9cf4f0f1760c607fe51f F test/bc_common.tcl b5e42d80305be95697e6370e015af571e5333a1c -F test/bc_test1.c d67cb1a933ae3a9116c8dc6da31e9ebf1c06ac23 +F test/bc_test1.c 3f10831d71c7e0bc53640c1989d31ded030a0fcc F test/bestindex1.test 0cf1bd2d7b97d3a3a8c10736125274f64765c4ee F test/bestindex2.test 4a06b8922ab2fd09434870da8d1cdf525aaf7060 F test/between.test 34d375fb5ce1ae283ffe82b6b233e9f38e84fc6c @@ -1295,7 +1295,7 @@ F test/triggerC.test 302d8995f5ffe63bbc15053abb3ef7a39cf5a092 F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650 F test/triggerE.test 15fa63f1097db1f83dd62d121616006978063d1f F test/tt3_checkpoint.c 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1 -F test/tt3_core.c 13c19feb4fe127bc86ae86d2c1237eb71c73f2ab +F test/tt3_core.c 77d7acbe43f78802284da8ef04650f6f5f32f7a0 F test/tt3_index.c 39eec10a35f57672225be4d182862152896dee4a F test/tt3_lookaside1.c 0377e202c3c2a50d688cb65ba203afeda6fafeb9 F test/tt3_stress.c c57d804716165811d979d4a719e05baccd79277f @@ -1491,7 +1491,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 91e5c07eaf884d3598df8eb54f0910a80df48397 -R 4bab1825e8924fd8c0c1d12f2130ddfc +P 128c7eaed5479b615d75ebce1d781ea661e0fb2d +R 86fffa805f6f27d07092161192388b60 U dan -Z 8e9093e5b020040f9bd55508cf282679 +Z aab288310f3155f4f7b4c6e3e47a2d89 diff --git a/manifest.uuid b/manifest.uuid index 86543cee78..c99acbf3cf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -128c7eaed5479b615d75ebce1d781ea661e0fb2d \ No newline at end of file +ec6ef5f2c2dc18e1a19c205f365f4071f0870b68 \ No newline at end of file diff --git a/test/bc_test1.c b/test/bc_test1.c index dd8ab30440..bb41e9d4ed 100644 --- a/test/bc_test1.c +++ b/test/bc_test1.c @@ -1,24 +1,35 @@ +/* +** 2016-05-07 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +*/ #include - #include - +#include #include "tt3_core.c" typedef struct Config Config; - struct Config { int nIPT; /* --inserts-per-transaction */ int nThread; /* --threads */ int nSecond; /* --seconds */ int bMutex; /* --mutex */ - + int nAutoCkpt; /* --autockpt */ int bRm; /* --rm */ sqlite3_mutex *pMutex; }; + static char *thread_main(int iTid, void *pArg){ Config *pConfig = (Config*)pArg; Error err = {0}; /* Error code and message */ @@ -29,7 +40,10 @@ static char *thread_main(int iTid, void *pArg){ opendb(&err, &db, "xyz.db", 0); sqlite3_busy_handler(db.db, 0, 0); - execsql(&err, &db, "PRAGMA wal_autocheckpoint = 0"); + sql_script_printf(&err, &db, + "PRAGMA wal_autocheckpoint = %d;" + "PRAGMA synchronous = 0;", pConfig->nAutoCkpt + ); while( !timetostop(&err) ){ execsql(&err, &db, "BEGIN CONCURRENT"); @@ -55,67 +69,35 @@ static char *thread_main(int iTid, void *pArg){ return sqlite3_mprintf("%d/%d successful commits", nCommit, nAttempt); } -static void usage(char *zName){ - fprintf(stderr, "Usage: %s ?SWITCHES?\n", zName); - fprintf(stderr, "\n"); - fprintf(stderr, "where switches are\n"); - fprintf(stderr, " --seconds N\n"); - fprintf(stderr, " --inserts N\n"); - fprintf(stderr, " --threads N\n"); - fprintf(stderr, " --rm BOOL\n"); - fprintf(stderr, " --mutex BOOL\n"); - fprintf(stderr, "\n"); - exit(-1); -} - -int main(int argc, char **argv){ +int main(int argc, const char **argv){ Error err = {0}; /* Error code and message */ Sqlite db = {0}; /* SQLite database connection */ Threadset threads = {0}; /* Test threads */ - Config sConfig = {5, 3, 5}; + Config conf = {5, 3, 5}; int i; - for(i=1; i=3 && 0==sqlite3_strnicmp(z, "--seconds", n) ){ - if( (++i)==argc ) usage(argv[0]); - sConfig.nSecond = atoi(argv[i]); - } - - else if( n>=3 && 0==sqlite3_strnicmp(z, "--inserts", n) ){ - if( (++i)==argc ) usage(argv[0]); - sConfig.nIPT = atoi(argv[i]); - } - - else if( n>=3 && 0==sqlite3_strnicmp(z, "--threads", n) ){ - if( (++i)==argc ) usage(argv[0]); - sConfig.nThread = atoi(argv[i]); - } - - else if( n>=3 && 0==sqlite3_strnicmp(z, "--rm", n) ){ - if( (++i)==argc ) usage(argv[0]); - sConfig.bRm = atoi(argv[i]); - } - - else if( n>=3 && 0==sqlite3_strnicmp(z, "--mutex", n) ){ - if( (++i)==argc ) usage(argv[0]); - sConfig.bMutex = atoi(argv[i]); - } - - else usage(argv[0]); + CmdlineArg apArg[] = { + { "--seconds", CMDLINE_INT, offsetof(Config, nSecond) }, + { "--inserts", CMDLINE_INT, offsetof(Config, nIPT) }, + { "--threads", CMDLINE_INT, offsetof(Config, nThread) }, + { "--mutex", CMDLINE_BOOL, offsetof(Config, bMutex) }, + { "--rm", CMDLINE_BOOL, offsetof(Config, bRm) }, + { "--autockpt",CMDLINE_INT, offsetof(Config, nAutoCkpt) }, + { 0, 0, 0 } + }; + + cmdline_process(apArg, argc, argv, (void*)&conf); + if( err.rc==SQLITE_OK ){ + char *z = cmdline_construct(apArg, (void*)&conf); + printf("With: %s\n", z); + sqlite3_free(z); } - printf("With: --threads %d --inserts %d --seconds %d --rm %d --mutex %d\n", - sConfig.nThread, sConfig.nIPT, sConfig.nSecond, sConfig.bRm, - sConfig.bMutex - ); - /* Ensure the schema has been created */ - if( sConfig.bMutex ){ - sConfig.pMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_RECURSIVE); + if( conf.bMutex ){ + conf.pMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_RECURSIVE); } - opendb(&err, &db, "xyz.db", sConfig.bRm); + opendb(&err, &db, "xyz.db", conf.bRm); sql_script(&err, &db, "PRAGMA journal_mode = wal;" @@ -123,15 +105,22 @@ int main(int argc, char **argv){ "CREATE INDEX IF NOT EXISTS t1b ON t1(b);" "CREATE INDEX IF NOT EXISTS t1c ON t1(c);" ); - closedb(&err, &db); - setstoptime(&err, sConfig.nSecond*1000); - for(i=0; ieType ){ + case CMDLINE_INT: { + zRet = sqlite3_mprintf("%z%s%s %d", zRet, zSpace, pArg->zSwitch, + *(int*)(p + pArg->iOffset) + ); + break; + }; + + case CMDLINE_BOOL: + if( *(int*)(p + pArg->iOffset) ){ + zRet = sqlite3_mprintf("%z%s%s", zRet, zSpace, pArg->zSwitch); + } + break; + + default: + zRet = sqlite3_mprintf("%z%s%s ???", zRet, zSpace, pArg->zSwitch); + } + } + + return zRet; +} + +static void cmdline_process( + CmdlineArg *apArg, + int argc, + const char **argv, + void *pObj +){ + int i; + int iArg; + unsigned char *p = (unsigned char*)pObj; + + for(i=1; i=0 ){ + cmdline_error("ambiguous switch: %s", z); + } + iOpt = iArg; + switch( apArg[iArg].eType ){ + case CMDLINE_INT: + i++; + if( i==argc ){ + cmdline_error("option requires an argument: %s", z); + } + *(int*)(p + apArg[iArg].iOffset) = atoi(argv[i]); + break; + + case CMDLINE_BOOL: + *(int*)(p + apArg[iArg].iOffset) = 1; + break; + + default: + assert( 0 ); + cmdline_error("internal error"); + return; + } + } + } + + if( iOpt<0 ){ + cmdline_usage(argv[0], apArg); + } + } +} + +/* +** End of command line processing utilities. +*************************************************************************/ + + /* * This code implements the MD5 message-digest algorithm. * The algorithm is due to Ron Rivest. This code was From 12891cc492331a57a5c602951ccbee94a532e034 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 21 May 2016 18:50:56 +0000 Subject: [PATCH 033/113] Use pthreads mutexes and conditions to synchronize threads in bc_test1. FossilOrigin-Name: f33aa76f074d8686a5a5c0edecabb71cb259c48d --- manifest | 12 +- manifest.uuid | 2 +- test/bc_test1.c | 353 ++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 349 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index 9b43e47d70..8db6dfd331 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\soptions\sto\sbc_test1.c\sto\smake\sit\smore\sflexible. -D 2016-05-07T18:02:53.432 +C Use\spthreads\smutexes\sand\sconditions\sto\ssynchronize\sthreads\sin\sbc_test1. +D 2016-05-21T18:50:56.299 F Makefile.in 9e816d0323e418fbc0f8b2c05fc14e0b3763d9e8 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 71b8b16cf9393f68e2e2035486ca104872558836 @@ -521,7 +521,7 @@ F test/backup_malloc.test 7162d604ec2b4683c4b3799a48657fb8b5e2d450 F test/badutf.test d5360fc31f643d37a973ab0d8b4fb85799c3169f F test/badutf2.test f5bc7f2d280670ecd79b9cf4f0f1760c607fe51f F test/bc_common.tcl b5e42d80305be95697e6370e015af571e5333a1c -F test/bc_test1.c 3f10831d71c7e0bc53640c1989d31ded030a0fcc +F test/bc_test1.c 874d03ffabbd565a6cf9a7eec23d3deafd3c8f1c F test/bestindex1.test 0cf1bd2d7b97d3a3a8c10736125274f64765c4ee F test/bestindex2.test 4a06b8922ab2fd09434870da8d1cdf525aaf7060 F test/between.test 34d375fb5ce1ae283ffe82b6b233e9f38e84fc6c @@ -1491,7 +1491,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 128c7eaed5479b615d75ebce1d781ea661e0fb2d -R 86fffa805f6f27d07092161192388b60 +P ec6ef5f2c2dc18e1a19c205f365f4071f0870b68 +R 9d74e8a08d57f3a5262646881b7fcf49 U dan -Z aab288310f3155f4f7b4c6e3e47a2d89 +Z 51f0c57ee889307d403d3ab523c9aec8 diff --git a/manifest.uuid b/manifest.uuid index c99acbf3cf..2e3f1b7111 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ec6ef5f2c2dc18e1a19c205f365f4071f0870b68 \ No newline at end of file +f33aa76f074d8686a5a5c0edecabb71cb259c48d \ No newline at end of file diff --git a/test/bc_test1.c b/test/bc_test1.c index bb41e9d4ed..290e04067b 100644 --- a/test/bc_test1.c +++ b/test/bc_test1.c @@ -26,11 +26,326 @@ struct Config { int bMutex; /* --mutex */ int nAutoCkpt; /* --autockpt */ int bRm; /* --rm */ - sqlite3_mutex *pMutex; + + pthread_cond_t cond; + pthread_mutex_t mutex; + int nCondWait; /* Number of threads waiting on hCond */ + sqlite3_vfs *pVfs; +}; + +typedef struct WalHookCtx WalHookCtx; +struct WalHookCtx { + Config *pConfig; + Sqlite *pDb; + Error *pErr; +}; + +typedef struct VfsWrapperFd VfsWrapperFd; +struct VfsWrapperFd { + sqlite3_file base; /* Base class */ + int bWriter; /* True if holding shm WRITER lock */ + Config *pConfig; + sqlite3_file *pFd; /* Underlying file descriptor */ }; +/* Methods of the wrapper VFS */ +static int vfsWrapOpen(sqlite3_vfs*, const char*, sqlite3_file*, int, int*); +static int vfsWrapDelete(sqlite3_vfs*, const char*, int); +static int vfsWrapAccess(sqlite3_vfs*, const char*, int, int*); +static int vfsWrapFullPathname(sqlite3_vfs*, const char *, int, char*); +static void *vfsWrapDlOpen(sqlite3_vfs*, const char*); +static void vfsWrapDlError(sqlite3_vfs*, int, char*); +static void (*vfsWrapDlSym(sqlite3_vfs*,void*, const char*))(void); +static void vfsWrapDlClose(sqlite3_vfs*, void*); +static int vfsWrapRandomness(sqlite3_vfs*, int, char*); +static int vfsWrapSleep(sqlite3_vfs*, int); +static int vfsWrapCurrentTime(sqlite3_vfs*, double*); +static int vfsWrapGetLastError(sqlite3_vfs*, int, char*); +static int vfsWrapCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*); +static int vfsWrapSetSystemCall(sqlite3_vfs*, const char*, sqlite3_syscall_ptr); +static sqlite3_syscall_ptr vfsWrapGetSystemCall(sqlite3_vfs*, const char*); +static const char *vfsWrapNextSystemCall(sqlite3_vfs*, const char*); + +/* Methods of wrapper sqlite3_io_methods object (see vfsWrapOpen()) */ +static int vfsWrapClose(sqlite3_file*); +static int vfsWrapRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); +static int vfsWrapWrite(sqlite3_file*, const void*, int iAmt, sqlite3_int64); +static int vfsWrapTruncate(sqlite3_file*, sqlite3_int64 size); +static int vfsWrapSync(sqlite3_file*, int flags); +static int vfsWrapFileSize(sqlite3_file*, sqlite3_int64 *pSize); +static int vfsWrapLock(sqlite3_file*, int); +static int vfsWrapUnlock(sqlite3_file*, int); +static int vfsWrapCheckReservedLock(sqlite3_file*, int *pResOut); +static int vfsWrapFileControl(sqlite3_file*, int op, void *pArg); +static int vfsWrapSectorSize(sqlite3_file*); +static int vfsWrapDeviceCharacteristics(sqlite3_file*); +static int vfsWrapShmMap(sqlite3_file*, int iPg, int, int, void volatile**); +static int vfsWrapShmLock(sqlite3_file*, int offset, int n, int flags); +static void vfsWrapShmBarrier(sqlite3_file*); +static int vfsWrapShmUnmap(sqlite3_file*, int deleteFlag); +static int vfsWrapFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **); +static int vfsWrapUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p); + +static int vfsWrapOpen( + sqlite3_vfs *pVfs, + const char *zName, + sqlite3_file *pFd, + int flags, + int *fout +){ + static sqlite3_io_methods methods = { + 3, + vfsWrapClose, vfsWrapRead, vfsWrapWrite, + vfsWrapTruncate, vfsWrapSync, vfsWrapFileSize, + vfsWrapLock, vfsWrapUnlock, vfsWrapCheckReservedLock, + vfsWrapFileControl, vfsWrapSectorSize, vfsWrapDeviceCharacteristics, + vfsWrapShmMap, vfsWrapShmLock, vfsWrapShmBarrier, + vfsWrapShmUnmap, vfsWrapFetch, vfsWrapUnfetch + }; + + Config *pConfig = (Config*)pVfs->pAppData; + VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; + int rc; + + pWrapper->pFd = (sqlite3_file*)&pWrapper[1]; + pWrapper->pConfig = pConfig; + rc = pConfig->pVfs->xOpen(pConfig->pVfs, zName, pWrapper->pFd, flags, fout); + if( rc==SQLITE_OK ){ + pWrapper->base.pMethods = &methods; + } + return rc; +} + +static int vfsWrapDelete(sqlite3_vfs *pVfs, const char *a, int b){ + Config *pConfig = (Config*)pVfs->pAppData; + return pConfig->pVfs->xDelete(pConfig->pVfs, a, b); +} +static int vfsWrapAccess(sqlite3_vfs *pVfs, const char *a, int b, int *c){ + Config *pConfig = (Config*)pVfs->pAppData; + return pConfig->pVfs->xAccess(pConfig->pVfs, a, b, c); +} +static int vfsWrapFullPathname(sqlite3_vfs *pVfs, const char *a, int b, char*c){ + Config *pConfig = (Config*)pVfs->pAppData; + return pConfig->pVfs->xFullPathname(pConfig->pVfs, a, b, c); +} +static void *vfsWrapDlOpen(sqlite3_vfs *pVfs, const char *a){ + Config *pConfig = (Config*)pVfs->pAppData; + return pConfig->pVfs->xDlOpen(pConfig->pVfs, a); +} +static void vfsWrapDlError(sqlite3_vfs *pVfs, int a, char *b){ + Config *pConfig = (Config*)pVfs->pAppData; + return pConfig->pVfs->xDlError(pConfig->pVfs, a, b); +} +static void (*vfsWrapDlSym(sqlite3_vfs *pVfs, void *a, const char *b))(void){ + Config *pConfig = (Config*)pVfs->pAppData; + return pConfig->pVfs->xDlSym(pConfig->pVfs, a, b); +} +static void vfsWrapDlClose(sqlite3_vfs *pVfs, void *a){ + Config *pConfig = (Config*)pVfs->pAppData; + return pConfig->pVfs->xDlClose(pConfig->pVfs, a); +} +static int vfsWrapRandomness(sqlite3_vfs *pVfs, int a, char *b){ + Config *pConfig = (Config*)pVfs->pAppData; + return pConfig->pVfs->xRandomness(pConfig->pVfs, a, b); +} +static int vfsWrapSleep(sqlite3_vfs *pVfs, int a){ + Config *pConfig = (Config*)pVfs->pAppData; + return pConfig->pVfs->xSleep(pConfig->pVfs, a); +} +static int vfsWrapCurrentTime(sqlite3_vfs *pVfs, double *a){ + Config *pConfig = (Config*)pVfs->pAppData; + return pConfig->pVfs->xCurrentTime(pConfig->pVfs, a); +} +static int vfsWrapGetLastError(sqlite3_vfs *pVfs, int a, char *b){ + Config *pConfig = (Config*)pVfs->pAppData; + return pConfig->pVfs->xGetLastError(pConfig->pVfs, a, b); +} +static int vfsWrapCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *a){ + Config *pConfig = (Config*)pVfs->pAppData; + return pConfig->pVfs->xCurrentTimeInt64(pConfig->pVfs, a); +} +static int vfsWrapSetSystemCall( + sqlite3_vfs *pVfs, + const char *a, + sqlite3_syscall_ptr b +){ + Config *pConfig = (Config*)pVfs->pAppData; + return pConfig->pVfs->xSetSystemCall(pConfig->pVfs, a, b); +} +static sqlite3_syscall_ptr vfsWrapGetSystemCall( + sqlite3_vfs *pVfs, + const char *a +){ + Config *pConfig = (Config*)pVfs->pAppData; + return pConfig->pVfs->xGetSystemCall(pConfig->pVfs, a); +} +static const char *vfsWrapNextSystemCall(sqlite3_vfs *pVfs, const char *a){ + Config *pConfig = (Config*)pVfs->pAppData; + return pConfig->pVfs->xNextSystemCall(pConfig->pVfs, a); +} + +static int vfsWrapClose(sqlite3_file *pFd){ + VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; + pWrapper->pFd->pMethods->xClose(pWrapper->pFd); + pWrapper->pFd = 0; + return SQLITE_OK; +} +static int vfsWrapRead(sqlite3_file *pFd, void *a, int b, sqlite3_int64 c){ + VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; + return pWrapper->pFd->pMethods->xRead(pWrapper->pFd, a, b, c); +} +static int vfsWrapWrite( + sqlite3_file *pFd, + const void *a, int b, + sqlite3_int64 c +){ + VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; + return pWrapper->pFd->pMethods->xWrite(pWrapper->pFd, a, b, c); +} +static int vfsWrapTruncate(sqlite3_file *pFd, sqlite3_int64 a){ + VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; + return pWrapper->pFd->pMethods->xTruncate(pWrapper->pFd, a); +} +static int vfsWrapSync(sqlite3_file *pFd, int a){ + VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; + return pWrapper->pFd->pMethods->xSync(pWrapper->pFd, a); +} +static int vfsWrapFileSize(sqlite3_file *pFd, sqlite3_int64 *a){ + VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; + return pWrapper->pFd->pMethods->xFileSize(pWrapper->pFd, a); +} +static int vfsWrapLock(sqlite3_file *pFd, int a){ + VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; + return pWrapper->pFd->pMethods->xLock(pWrapper->pFd, a); +} +static int vfsWrapUnlock(sqlite3_file *pFd, int a){ + VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; + return pWrapper->pFd->pMethods->xUnlock(pWrapper->pFd, a); +} +static int vfsWrapCheckReservedLock(sqlite3_file *pFd, int *a){ + VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; + return pWrapper->pFd->pMethods->xCheckReservedLock(pWrapper->pFd, a); +} +static int vfsWrapFileControl(sqlite3_file *pFd, int a, void *b){ + VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; + return pWrapper->pFd->pMethods->xFileControl(pWrapper->pFd, a, b); +} +static int vfsWrapSectorSize(sqlite3_file *pFd){ + VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; + return pWrapper->pFd->pMethods->xSectorSize(pWrapper->pFd); +} +static int vfsWrapDeviceCharacteristics(sqlite3_file *pFd){ + VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; + return pWrapper->pFd->pMethods->xDeviceCharacteristics(pWrapper->pFd); +} +static int vfsWrapShmMap( + sqlite3_file *pFd, + int a, int b, int c, + void volatile **d +){ + VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; + return pWrapper->pFd->pMethods->xShmMap(pWrapper->pFd, a, b, c, d); +} +static int vfsWrapShmLock(sqlite3_file *pFd, int offset, int n, int flags){ + VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; + Config *pConfig = pWrapper->pConfig; + int bMutex = 0; + int rc; + + if( (offset==0 && n==1) + && (flags & SQLITE_SHM_LOCK) && (flags & SQLITE_SHM_EXCLUSIVE) + ){ + pthread_mutex_lock(&pConfig->mutex); + pWrapper->bWriter = 1; + bMutex = 1; + } + + if( offset==0 && (flags & SQLITE_SHM_UNLOCK) && pWrapper->bWriter ){ + pthread_mutex_unlock(&pConfig->mutex); + pWrapper->bWriter = 0; + } + + rc = pWrapper->pFd->pMethods->xShmLock(pWrapper->pFd, offset, n, flags); + + if( rc!=SQLITE_OK && bMutex ){ + pthread_mutex_unlock(&pConfig->mutex); + pWrapper->bWriter = 0; + } + + return rc; +} +static void vfsWrapShmBarrier(sqlite3_file *pFd){ + VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; + return pWrapper->pFd->pMethods->xShmBarrier(pWrapper->pFd); +} +static int vfsWrapShmUnmap(sqlite3_file *pFd, int a){ + VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; + return pWrapper->pFd->pMethods->xShmUnmap(pWrapper->pFd, a); +} +static int vfsWrapFetch(sqlite3_file *pFd, sqlite3_int64 a, int b, void **c){ + VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; + return pWrapper->pFd->pMethods->xFetch(pWrapper->pFd, a, b, c); +} +static int vfsWrapUnfetch(sqlite3_file *pFd, sqlite3_int64 a, void *b){ + VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; + return pWrapper->pFd->pMethods->xUnfetch(pWrapper->pFd, a, b); +} + +static void create_vfs(Config *pConfig){ + static sqlite3_vfs vfs = { + 3, 0, 0, 0, "wrapper", 0, + vfsWrapOpen, vfsWrapDelete, vfsWrapAccess, + vfsWrapFullPathname, vfsWrapDlOpen, vfsWrapDlError, + vfsWrapDlSym, vfsWrapDlClose, vfsWrapRandomness, + vfsWrapSleep, vfsWrapCurrentTime, vfsWrapGetLastError, + vfsWrapCurrentTimeInt64, vfsWrapSetSystemCall, vfsWrapGetSystemCall, + vfsWrapNextSystemCall + }; + sqlite3_vfs *pVfs; + + pVfs = sqlite3_vfs_find(0); + vfs.mxPathname = pVfs->mxPathname; + vfs.szOsFile = pVfs->szOsFile + sizeof(VfsWrapperFd); + vfs.pAppData = (void*)pConfig; + pConfig->pVfs = pVfs; + + sqlite3_vfs_register(&vfs, 1); +} + + +/* +** Wal hook used by connections in thread_main(). +*/ +static int thread_wal_hook( + void *pArg, /* Pointer to Config object */ + sqlite3 *db, + const char *zDb, + int nFrame +){ + WalHookCtx *pCtx = (WalHookCtx*)pArg; + Config *pConfig = pCtx->pConfig; + + if( nFrame>=pConfig->nAutoCkpt ){ + pthread_mutex_lock(&pConfig->mutex); + if( pConfig->nCondWait>=0 ){ + pConfig->nCondWait++; + if( pConfig->nCondWait==pConfig->nThread ){ + execsql(pCtx->pErr, pCtx->pDb, "PRAGMA wal_checkpoint"); + pthread_cond_broadcast(&pConfig->cond); + }else{ + pthread_cond_wait(&pConfig->cond, &pConfig->mutex); + } + pConfig->nCondWait--; + } + pthread_mutex_unlock(&pConfig->mutex); + } + + return SQLITE_OK; +} + static char *thread_main(int iTid, void *pArg){ + WalHookCtx ctx; Config *pConfig = (Config*)pArg; Error err = {0}; /* Error code and message */ Sqlite db = {0}; /* SQLite database connection */ @@ -45,6 +360,11 @@ static char *thread_main(int iTid, void *pArg){ "PRAGMA synchronous = 0;", pConfig->nAutoCkpt ); + ctx.pConfig = pConfig; + ctx.pErr = &err; + ctx.pDb = &db; + sqlite3_wal_hook(db.db, thread_wal_hook, (void*)&ctx); + while( !timetostop(&err) ){ execsql(&err, &db, "BEGIN CONCURRENT"); for(j=0; jnIPT; j++){ @@ -53,9 +373,7 @@ static char *thread_main(int iTid, void *pArg){ "(randomblob(10), randomblob(20), randomblob(30), randomblob(200))" ); } - sqlite3_mutex_enter(pConfig->pMutex); execsql(&err, &db, "COMMIT"); - sqlite3_mutex_leave(pConfig->pMutex); nAttempt++; if( err.rc==SQLITE_OK ){ nCommit++; @@ -66,6 +384,12 @@ static char *thread_main(int iTid, void *pArg){ } closedb(&err, &db); + + pthread_mutex_lock(&pConfig->mutex); + pConfig->nCondWait = -1; + pthread_cond_broadcast(&pConfig->cond); + pthread_mutex_unlock(&pConfig->mutex); + return sqlite3_mprintf("%d/%d successful commits", nCommit, nAttempt); } @@ -93,12 +417,14 @@ int main(int argc, const char **argv){ sqlite3_free(z); } + /* Create the special VFS - "wrapper". And the mutex and condition + ** variable. */ + create_vfs(&conf); + pthread_mutex_init(&conf.mutex, 0); + pthread_cond_init(&conf.cond, 0); + /* Ensure the schema has been created */ - if( conf.bMutex ){ - conf.pMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_RECURSIVE); - } opendb(&err, &db, "xyz.db", conf.bRm); - sql_script(&err, &db, "PRAGMA journal_mode = wal;" "CREATE TABLE IF NOT EXISTS t1(a PRIMARY KEY, b, c, d) WITHOUT ROWID;" @@ -107,10 +433,16 @@ int main(int argc, const char **argv){ ); setstoptime(&err, conf.nSecond*1000); - for(i=0; i Date: Thu, 26 May 2016 20:52:15 +0000 Subject: [PATCH 034/113] Add further instrumentation to the bc_test1.c test app. FossilOrigin-Name: 5528de4a53c19557798b6169e1d738f1a301e131 --- manifest | 14 ++--- manifest.uuid | 2 +- test/bc_test1.c | 154 +++++++++++++++++++++++++++++++++++++++--------- test/tt3_core.c | 22 ++++++- 4 files changed, 154 insertions(+), 38 deletions(-) diff --git a/manifest b/manifest index 8db6dfd331..1c2a37b300 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\spthreads\smutexes\sand\sconditions\sto\ssynchronize\sthreads\sin\sbc_test1. -D 2016-05-21T18:50:56.299 +C Add\sfurther\sinstrumentation\sto\sthe\sbc_test1.c\stest\sapp. +D 2016-05-26T20:52:15.750 F Makefile.in 9e816d0323e418fbc0f8b2c05fc14e0b3763d9e8 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 71b8b16cf9393f68e2e2035486ca104872558836 @@ -521,7 +521,7 @@ F test/backup_malloc.test 7162d604ec2b4683c4b3799a48657fb8b5e2d450 F test/badutf.test d5360fc31f643d37a973ab0d8b4fb85799c3169f F test/badutf2.test f5bc7f2d280670ecd79b9cf4f0f1760c607fe51f F test/bc_common.tcl b5e42d80305be95697e6370e015af571e5333a1c -F test/bc_test1.c 874d03ffabbd565a6cf9a7eec23d3deafd3c8f1c +F test/bc_test1.c 05cd99276a5dc2de0e28f3b1095c343393e12f87 F test/bestindex1.test 0cf1bd2d7b97d3a3a8c10736125274f64765c4ee F test/bestindex2.test 4a06b8922ab2fd09434870da8d1cdf525aaf7060 F test/between.test 34d375fb5ce1ae283ffe82b6b233e9f38e84fc6c @@ -1295,7 +1295,7 @@ F test/triggerC.test 302d8995f5ffe63bbc15053abb3ef7a39cf5a092 F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650 F test/triggerE.test 15fa63f1097db1f83dd62d121616006978063d1f F test/tt3_checkpoint.c 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1 -F test/tt3_core.c 77d7acbe43f78802284da8ef04650f6f5f32f7a0 +F test/tt3_core.c 01a7cd1a4f10a666f404c46360da15468522d52e F test/tt3_index.c 39eec10a35f57672225be4d182862152896dee4a F test/tt3_lookaside1.c 0377e202c3c2a50d688cb65ba203afeda6fafeb9 F test/tt3_stress.c c57d804716165811d979d4a719e05baccd79277f @@ -1491,7 +1491,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ec6ef5f2c2dc18e1a19c205f365f4071f0870b68 -R 9d74e8a08d57f3a5262646881b7fcf49 +P f33aa76f074d8686a5a5c0edecabb71cb259c48d +R 3e6ef002903d2cc9312cf24b4caaa4ad U dan -Z 51f0c57ee889307d403d3ab523c9aec8 +Z 14c81df2e8a28af21f0d7f0b336be7a7 diff --git a/manifest.uuid b/manifest.uuid index 2e3f1b7111..b3462a0dfc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f33aa76f074d8686a5a5c0edecabb71cb259c48d \ No newline at end of file +5528de4a53c19557798b6169e1d738f1a301e131 \ No newline at end of file diff --git a/test/bc_test1.c b/test/bc_test1.c index 290e04067b..18b623bd1d 100644 --- a/test/bc_test1.c +++ b/test/bc_test1.c @@ -17,8 +17,28 @@ #include #include "tt3_core.c" +#ifdef USE_OSINST +# include "../src/test_osinst.c" +#else +# define vfslog_time() 0 +#endif typedef struct Config Config; +typedef struct ThreadCtx ThreadCtx; + +#define THREAD_TIME_INSERT 0 +#define THREAD_TIME_COMMIT 1 +#define THREAD_TIME_ROLLBACK 2 +#define THREAD_TIME_WRITER 3 +#define THREAD_TIME_CKPT 4 + +struct ThreadCtx { + Config *pConfig; + Sqlite *pDb; + Error *pErr; + sqlite3_int64 aTime[5]; +}; + struct Config { int nIPT; /* --inserts-per-transaction */ int nThread; /* --threads */ @@ -26,6 +46,12 @@ struct Config { int bMutex; /* --mutex */ int nAutoCkpt; /* --autockpt */ int bRm; /* --rm */ + int bClearCache; /* --clear-cache */ + int nMmap; /* mmap limit in MB */ + char *zFile; + int bOsinst; /* True to use osinst */ + + ThreadCtx *aCtx; /* Array of size nThread */ pthread_cond_t cond; pthread_mutex_t mutex; @@ -33,17 +59,12 @@ struct Config { sqlite3_vfs *pVfs; }; -typedef struct WalHookCtx WalHookCtx; -struct WalHookCtx { - Config *pConfig; - Sqlite *pDb; - Error *pErr; -}; typedef struct VfsWrapperFd VfsWrapperFd; struct VfsWrapperFd { sqlite3_file base; /* Base class */ int bWriter; /* True if holding shm WRITER lock */ + int iTid; Config *pConfig; sqlite3_file *pFd; /* Underlying file descriptor */ }; @@ -107,6 +128,11 @@ static int vfsWrapOpen( VfsWrapperFd *pWrapper = (VfsWrapperFd*)pFd; int rc; + memset(pWrapper, 0, sizeof(VfsWrapperFd)); + if( flags & SQLITE_OPEN_MAIN_DB ){ + pWrapper->iTid = (int)sqlite3_uri_int64(zName, "tid", 0); + } + pWrapper->pFd = (sqlite3_file*)&pWrapper[1]; pWrapper->pConfig = pConfig; rc = pConfig->pVfs->xOpen(pConfig->pVfs, zName, pWrapper->pFd, flags, fout); @@ -258,18 +284,24 @@ static int vfsWrapShmLock(sqlite3_file *pFd, int offset, int n, int flags){ pthread_mutex_lock(&pConfig->mutex); pWrapper->bWriter = 1; bMutex = 1; - } - - if( offset==0 && (flags & SQLITE_SHM_UNLOCK) && pWrapper->bWriter ){ - pthread_mutex_unlock(&pConfig->mutex); - pWrapper->bWriter = 0; + if( pWrapper->iTid ){ + sqlite3_int64 t = vfslog_time(); + pConfig->aCtx[pWrapper->iTid-1].aTime[THREAD_TIME_WRITER] -= t; + } } rc = pWrapper->pFd->pMethods->xShmLock(pWrapper->pFd, offset, n, flags); - if( rc!=SQLITE_OK && bMutex ){ + if( (rc!=SQLITE_OK && bMutex) + || (offset==0 && (flags & SQLITE_SHM_UNLOCK) && pWrapper->bWriter) + ){ + assert( pWrapper->bWriter ); pthread_mutex_unlock(&pConfig->mutex); pWrapper->bWriter = 0; + if( pWrapper->iTid ){ + sqlite3_int64 t = vfslog_time(); + pConfig->aCtx[pWrapper->iTid-1].aTime[THREAD_TIME_WRITER] += t; + } } return rc; @@ -317,15 +349,16 @@ static void create_vfs(Config *pConfig){ ** Wal hook used by connections in thread_main(). */ static int thread_wal_hook( - void *pArg, /* Pointer to Config object */ + void *pArg, /* Pointer to ThreadCtx object */ sqlite3 *db, const char *zDb, int nFrame ){ - WalHookCtx *pCtx = (WalHookCtx*)pArg; + ThreadCtx *pCtx = (ThreadCtx*)pArg; Config *pConfig = pCtx->pConfig; - if( nFrame>=pConfig->nAutoCkpt ){ + if( pConfig->nAutoCkpt && nFrame>=pConfig->nAutoCkpt ){ + pCtx->aTime[THREAD_TIME_CKPT] -= vfslog_time(); pthread_mutex_lock(&pConfig->mutex); if( pConfig->nCondWait>=0 ){ pConfig->nCondWait++; @@ -338,6 +371,7 @@ static int thread_wal_hook( pConfig->nCondWait--; } pthread_mutex_unlock(&pConfig->mutex); + pCtx->aTime[THREAD_TIME_CKPT] += vfslog_time(); } return SQLITE_OK; @@ -345,35 +379,63 @@ static int thread_wal_hook( static char *thread_main(int iTid, void *pArg){ - WalHookCtx ctx; Config *pConfig = (Config*)pArg; Error err = {0}; /* Error code and message */ Sqlite db = {0}; /* SQLite database connection */ int nAttempt = 0; /* Attempted transactions */ int nCommit = 0; /* Successful transactions */ int j; + ThreadCtx *pCtx = &pConfig->aCtx[iTid-1]; + char *zUri = 0; + +#ifdef USE_OSINST + char *zOsinstName = 0; + char *zLogName = 0; + if( pConfig->bOsinst ){ + zOsinstName = sqlite3_mprintf("osinst%d", iTid); + zLogName = sqlite3_mprintf("bc_test1.log.%d.%d", (int)getpid(), iTid); + zUri = sqlite3_mprintf( + "file:%s?vfs=%s&tid=%d", pConfig->zFile, zOsinstName, iTid + ); + sqlite3_vfslog_new(zOsinstName, 0, zLogName); + opendb(&err, &db, zUri, 0); + }else +#endif + { + zUri = sqlite3_mprintf("file:%s?tid=%d", pConfig->zFile, iTid); + opendb(&err, &db, zUri, 0); + } - opendb(&err, &db, "xyz.db", 0); sqlite3_busy_handler(db.db, 0, 0); sql_script_printf(&err, &db, - "PRAGMA wal_autocheckpoint = %d;" - "PRAGMA synchronous = 0;", pConfig->nAutoCkpt + "PRAGMA wal_autocheckpoint = 0;" + "PRAGMA synchronous = 0;" + "PRAGMA mmap_limit = %lld;", + (i64)(pConfig->nMmap) * 1024 * 1024 ); - ctx.pConfig = pConfig; - ctx.pErr = &err; - ctx.pDb = &db; - sqlite3_wal_hook(db.db, thread_wal_hook, (void*)&ctx); + pCtx->pConfig = pConfig; + pCtx->pErr = &err; + pCtx->pDb = &db; + sqlite3_wal_hook(db.db, thread_wal_hook, (void*)pCtx); while( !timetostop(&err) ){ execsql(&err, &db, "BEGIN CONCURRENT"); + + pCtx->aTime[THREAD_TIME_INSERT] -= vfslog_time(); for(j=0; jnIPT; j++){ execsql(&err, &db, "INSERT INTO t1 VALUES" "(randomblob(10), randomblob(20), randomblob(30), randomblob(200))" ); } + pCtx->aTime[THREAD_TIME_INSERT] += vfslog_time(); + + pCtx->aTime[THREAD_TIME_COMMIT] -= vfslog_time(); execsql(&err, &db, "COMMIT"); + pCtx->aTime[THREAD_TIME_COMMIT] += vfslog_time(); + + pCtx->aTime[THREAD_TIME_ROLLBACK] -= vfslog_time(); nAttempt++; if( err.rc==SQLITE_OK ){ nCommit++; @@ -381,16 +443,41 @@ static char *thread_main(int iTid, void *pArg){ clear_error(&err, SQLITE_BUSY); execsql(&err, &db, "ROLLBACK"); } + pCtx->aTime[THREAD_TIME_ROLLBACK] += vfslog_time(); + + if( pConfig->bClearCache ){ + sqlite3_db_release_memory(db.db); + } } closedb(&err, &db); +#ifdef USE_OSINST + if( pConfig->bOsinst ){ + sqlite3_vfslog_finalize(zOsinstName); + sqlite3_free(zOsinstName); + sqlite3_free(zLogName); + } +#endif + sqlite3_free(zUri); + pthread_mutex_lock(&pConfig->mutex); pConfig->nCondWait = -1; pthread_cond_broadcast(&pConfig->cond); pthread_mutex_unlock(&pConfig->mutex); - return sqlite3_mprintf("%d/%d successful commits", nCommit, nAttempt); + return sqlite3_mprintf("commits: %d/%d insert: %dms" + " commit: %dms" + " rollback: %dms" + " writer: %dms" + " checkpoint: %dms", + nCommit, nAttempt, + (int)(pCtx->aTime[THREAD_TIME_INSERT]/1000), + (int)(pCtx->aTime[THREAD_TIME_COMMIT]/1000), + (int)(pCtx->aTime[THREAD_TIME_ROLLBACK]/1000), + (int)(pCtx->aTime[THREAD_TIME_WRITER]/1000), + (int)(pCtx->aTime[THREAD_TIME_CKPT]/1000) + ); } int main(int argc, const char **argv){ @@ -407,6 +494,10 @@ int main(int argc, const char **argv){ { "--mutex", CMDLINE_BOOL, offsetof(Config, bMutex) }, { "--rm", CMDLINE_BOOL, offsetof(Config, bRm) }, { "--autockpt",CMDLINE_INT, offsetof(Config, nAutoCkpt) }, + { "--mmap", CMDLINE_INT, offsetof(Config, nMmap) }, + { "--clear-cache", CMDLINE_BOOL, offsetof(Config, bClearCache) }, + { "--file", CMDLINE_STRING, offsetof(Config, zFile) }, + { "--osinst", CMDLINE_BOOL, offsetof(Config, bOsinst) }, { 0, 0, 0 } }; @@ -416,6 +507,9 @@ int main(int argc, const char **argv){ printf("With: %s\n", z); sqlite3_free(z); } + if( conf.zFile==0 ){ + conf.zFile = "xyz.db"; + } /* Create the special VFS - "wrapper". And the mutex and condition ** variable. */ @@ -423,8 +517,11 @@ int main(int argc, const char **argv){ pthread_mutex_init(&conf.mutex, 0); pthread_cond_init(&conf.cond, 0); + conf.aCtx = sqlite3_malloc(sizeof(ThreadCtx) * conf.nThread); + memset(conf.aCtx, 0, sizeof(ThreadCtx) * conf.nThread); + /* Ensure the schema has been created */ - opendb(&err, &db, "xyz.db", conf.bRm); + opendb(&err, &db, conf.zFile, conf.bRm); sql_script(&err, &db, "PRAGMA journal_mode = wal;" "CREATE TABLE IF NOT EXISTS t1(a PRIMARY KEY, b, c, d) WITHOUT ROWID;" @@ -434,7 +531,7 @@ int main(int argc, const char **argv){ setstoptime(&err, conf.nSecond*1000); if( conf.nThread==1 ){ - char *z = thread_main(0, (void*)&conf); + char *z = thread_main(1, (void*)&conf); printf("Thread 0 says: %s\n", (z==0 ? "..." : z)); fflush(stdout); }else{ @@ -445,10 +542,11 @@ int main(int argc, const char **argv){ } if( err.rc==SQLITE_OK ){ - printf("Database is %dK\n", (int)(filesize(&err, "xyz.db") / 1024)); + printf("Database is %dK\n", (int)(filesize(&err, conf.zFile) / 1024)); } if( err.rc==SQLITE_OK ){ - printf("Wal file is %dK\n", (int)(filesize(&err, "xyz.db-wal") / 1024)); + char *zWal = sqlite3_mprintf("%s-wal", conf.zFile); + printf("Wal file is %dK\n", (int)(filesize(&err, zWal) / 1024)); } closedb(&err, &db); diff --git a/test/tt3_core.c b/test/tt3_core.c index 65c04f0204..dffadac9c8 100644 --- a/test/tt3_core.c +++ b/test/tt3_core.c @@ -69,8 +69,9 @@ /************************************************************************ ** Start of command line processing utilities. */ -#define CMDLINE_INT 1 -#define CMDLINE_BOOL 2 +#define CMDLINE_INT 1 +#define CMDLINE_BOOL 2 +#define CMDLINE_STRING 3 typedef struct CmdlineArg CmdlineArg; struct CmdlineArg { @@ -98,6 +99,7 @@ static void cmdline_usage(const char *zPrg, CmdlineArg *apArg){ for(i=0; apArg[i].zSwitch; i++){ const char *zExtra = ""; switch( apArg[i].eType ){ + case CMDLINE_STRING: zExtra = "STRING"; break; case CMDLINE_INT: zExtra = "N"; break; case CMDLINE_BOOL: zExtra = ""; break; default: @@ -120,6 +122,14 @@ static char *cmdline_construct(CmdlineArg *apArg, void *pObj){ CmdlineArg *pArg = &apArg[iArg]; switch( pArg->eType ){ + case CMDLINE_STRING: { + char *zVal = *(char**)(p + pArg->iOffset); + if( zVal ){ + zRet = sqlite3_mprintf("%z%s%s %s", zRet, zSpace, pArg->zSwitch,zVal); + } + break; + }; + case CMDLINE_INT: { zRet = sqlite3_mprintf("%z%s%s %d", zRet, zSpace, pArg->zSwitch, *(int*)(p + pArg->iOffset) @@ -171,6 +181,14 @@ static void cmdline_process( *(int*)(p + apArg[iArg].iOffset) = atoi(argv[i]); break; + case CMDLINE_STRING: + i++; + if( i==argc ){ + cmdline_error("option requires an argument: %s", z); + } + *(char**)(p + apArg[iArg].iOffset) = sqlite3_mprintf("%s", argv[i]); + break; + case CMDLINE_BOOL: *(int*)(p + apArg[iArg].iOffset) = 1; break; From 96b9dc9b36e7911dc3f282e39d3ea3dc96642013 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 30 May 2016 05:45:32 +0000 Subject: [PATCH 035/113] Minor tweaks to the bc_test1 test program. FossilOrigin-Name: d0d0bab4e92402b6af98366be6e8955588613a51 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/bc_test1.c | 21 +++++++++++---------- test/tt3_core.c | 5 +++++ 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index 1c2a37b300..9eeb419b53 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sfurther\sinstrumentation\sto\sthe\sbc_test1.c\stest\sapp. -D 2016-05-26T20:52:15.750 +C Minor\stweaks\sto\sthe\sbc_test1\stest\sprogram. +D 2016-05-30T05:45:32.809 F Makefile.in 9e816d0323e418fbc0f8b2c05fc14e0b3763d9e8 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 71b8b16cf9393f68e2e2035486ca104872558836 @@ -521,7 +521,7 @@ F test/backup_malloc.test 7162d604ec2b4683c4b3799a48657fb8b5e2d450 F test/badutf.test d5360fc31f643d37a973ab0d8b4fb85799c3169f F test/badutf2.test f5bc7f2d280670ecd79b9cf4f0f1760c607fe51f F test/bc_common.tcl b5e42d80305be95697e6370e015af571e5333a1c -F test/bc_test1.c 05cd99276a5dc2de0e28f3b1095c343393e12f87 +F test/bc_test1.c 64b3438cbb0a267de11c2c01e9ec7a96ebdbc3a3 F test/bestindex1.test 0cf1bd2d7b97d3a3a8c10736125274f64765c4ee F test/bestindex2.test 4a06b8922ab2fd09434870da8d1cdf525aaf7060 F test/between.test 34d375fb5ce1ae283ffe82b6b233e9f38e84fc6c @@ -1295,7 +1295,7 @@ F test/triggerC.test 302d8995f5ffe63bbc15053abb3ef7a39cf5a092 F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650 F test/triggerE.test 15fa63f1097db1f83dd62d121616006978063d1f F test/tt3_checkpoint.c 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1 -F test/tt3_core.c 01a7cd1a4f10a666f404c46360da15468522d52e +F test/tt3_core.c 8cd89ead95410f70e7fb02c79f1e040f9c5ad5cf F test/tt3_index.c 39eec10a35f57672225be4d182862152896dee4a F test/tt3_lookaside1.c 0377e202c3c2a50d688cb65ba203afeda6fafeb9 F test/tt3_stress.c c57d804716165811d979d4a719e05baccd79277f @@ -1491,7 +1491,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f33aa76f074d8686a5a5c0edecabb71cb259c48d -R 3e6ef002903d2cc9312cf24b4caaa4ad +P 5528de4a53c19557798b6169e1d738f1a301e131 +R 4e1a86c5f70b95ae38ae7d31e017c12f U dan -Z 14c81df2e8a28af21f0d7f0b336be7a7 +Z f49d8d592868742b4ebcfcd7d10075da diff --git a/manifest.uuid b/manifest.uuid index b3462a0dfc..250d42f7a8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5528de4a53c19557798b6169e1d738f1a301e131 \ No newline at end of file +d0d0bab4e92402b6af98366be6e8955588613a51 \ No newline at end of file diff --git a/test/bc_test1.c b/test/bc_test1.c index 18b623bd1d..6fbb7ca8e9 100644 --- a/test/bc_test1.c +++ b/test/bc_test1.c @@ -488,19 +488,20 @@ int main(int argc, const char **argv){ int i; CmdlineArg apArg[] = { - { "--seconds", CMDLINE_INT, offsetof(Config, nSecond) }, - { "--inserts", CMDLINE_INT, offsetof(Config, nIPT) }, - { "--threads", CMDLINE_INT, offsetof(Config, nThread) }, - { "--mutex", CMDLINE_BOOL, offsetof(Config, bMutex) }, - { "--rm", CMDLINE_BOOL, offsetof(Config, bRm) }, - { "--autockpt",CMDLINE_INT, offsetof(Config, nAutoCkpt) }, - { "--mmap", CMDLINE_INT, offsetof(Config, nMmap) }, - { "--clear-cache", CMDLINE_BOOL, offsetof(Config, bClearCache) }, - { "--file", CMDLINE_STRING, offsetof(Config, zFile) }, - { "--osinst", CMDLINE_BOOL, offsetof(Config, bOsinst) }, + { "-seconds", CMDLINE_INT, offsetof(Config, nSecond) }, + { "-inserts", CMDLINE_INT, offsetof(Config, nIPT) }, + { "-threads", CMDLINE_INT, offsetof(Config, nThread) }, + { "-mutex", CMDLINE_BOOL, offsetof(Config, bMutex) }, + { "-rm", CMDLINE_BOOL, offsetof(Config, bRm) }, + { "-autockpt",CMDLINE_INT, offsetof(Config, nAutoCkpt) }, + { "-mmap", CMDLINE_INT, offsetof(Config, nMmap) }, + { "-clear-cache", CMDLINE_BOOL, offsetof(Config, bClearCache) }, + { "-file", CMDLINE_STRING, offsetof(Config, zFile) }, + { "-osinst", CMDLINE_BOOL, offsetof(Config, bOsinst) }, { 0, 0, 0 } }; + conf.nAutoCkpt = 1000; cmdline_process(apArg, argc, argv, (void*)&conf); if( err.rc==SQLITE_OK ){ char *z = cmdline_construct(apArg, (void*)&conf); diff --git a/test/tt3_core.c b/test/tt3_core.c index dffadac9c8..31612e9cf6 100644 --- a/test/tt3_core.c +++ b/test/tt3_core.c @@ -166,6 +166,11 @@ static void cmdline_process( int n = strlen(z); int iOpt = -1; + if( z[0]=='-' && z[1]=='-' ){ + z++; + n--; + } + for(iArg=0; apArg[iArg].zSwitch; iArg++){ if( 0==sqlite3_strnicmp(apArg[iArg].zSwitch, z, n) ){ if( iOpt>=0 ){ From 21ac1de75b5da94c858d599240648d66fdcee5c6 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 6 Jul 2016 08:32:53 +0000 Subject: [PATCH 036/113] Fix a typo in test program bc_test1.c. FossilOrigin-Name: 2c61b7ab1808d5576a21fea84c3f414db51abfa5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/bc_test1.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 9eeb419b53..20610275e2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\stweaks\sto\sthe\sbc_test1\stest\sprogram. -D 2016-05-30T05:45:32.809 +C Fix\sa\stypo\sin\stest\sprogram\sbc_test1.c. +D 2016-07-06T08:32:53.109 F Makefile.in 9e816d0323e418fbc0f8b2c05fc14e0b3763d9e8 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 71b8b16cf9393f68e2e2035486ca104872558836 @@ -521,7 +521,7 @@ F test/backup_malloc.test 7162d604ec2b4683c4b3799a48657fb8b5e2d450 F test/badutf.test d5360fc31f643d37a973ab0d8b4fb85799c3169f F test/badutf2.test f5bc7f2d280670ecd79b9cf4f0f1760c607fe51f F test/bc_common.tcl b5e42d80305be95697e6370e015af571e5333a1c -F test/bc_test1.c 64b3438cbb0a267de11c2c01e9ec7a96ebdbc3a3 +F test/bc_test1.c e0a092579552e066ed4ce7bcdaecfa69c4aacc8d F test/bestindex1.test 0cf1bd2d7b97d3a3a8c10736125274f64765c4ee F test/bestindex2.test 4a06b8922ab2fd09434870da8d1cdf525aaf7060 F test/between.test 34d375fb5ce1ae283ffe82b6b233e9f38e84fc6c @@ -1491,7 +1491,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5528de4a53c19557798b6169e1d738f1a301e131 -R 4e1a86c5f70b95ae38ae7d31e017c12f +P d0d0bab4e92402b6af98366be6e8955588613a51 +R fd9335f42062b54523dedc8b82de076d U dan -Z f49d8d592868742b4ebcfcd7d10075da +Z 5f55bfec2b6a0fc682708f8a8d6277b4 diff --git a/manifest.uuid b/manifest.uuid index 250d42f7a8..aa42780861 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d0d0bab4e92402b6af98366be6e8955588613a51 \ No newline at end of file +2c61b7ab1808d5576a21fea84c3f414db51abfa5 \ No newline at end of file diff --git a/test/bc_test1.c b/test/bc_test1.c index 6fbb7ca8e9..89135d66d0 100644 --- a/test/bc_test1.c +++ b/test/bc_test1.c @@ -410,7 +410,7 @@ static char *thread_main(int iTid, void *pArg){ sql_script_printf(&err, &db, "PRAGMA wal_autocheckpoint = 0;" "PRAGMA synchronous = 0;" - "PRAGMA mmap_limit = %lld;", + "PRAGMA mmap_size = %lld;", (i64)(pConfig->nMmap) * 1024 * 1024 ); From c18d304066437f1ba3f9af9caa0fd544b0d229a4 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 22 Aug 2016 20:49:06 +0000 Subject: [PATCH 037/113] Add an experimental module to detect conflicts between sessions changesets. FossilOrigin-Name: 0c9fd6b723041955b5182caa430312e5124fdc83 --- ext/session/changebatch1.test | 55 ++++ ext/session/sqlite3changebatch.c | 442 +++++++++++++++++++++++++++++++ ext/session/sqlite3changebatch.h | 75 ++++++ ext/session/test_session.c | 127 ++++++++- main.mk | 1 + manifest | 23 +- manifest.uuid | 2 +- 7 files changed, 714 insertions(+), 11 deletions(-) create mode 100644 ext/session/changebatch1.test create mode 100644 ext/session/sqlite3changebatch.c create mode 100644 ext/session/sqlite3changebatch.h diff --git a/ext/session/changebatch1.test b/ext/session/changebatch1.test new file mode 100644 index 0000000000..6e9d1a9074 --- /dev/null +++ b/ext/session/changebatch1.test @@ -0,0 +1,55 @@ +# 2016 August 23 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. +# + +if {![info exists testdir]} { + set testdir [file join [file dirname [info script]] .. .. test] +} +source $testdir/tester.tcl +ifcapable !session {finish_test; return} + +set testprefix changebatch1 + +proc do_changebatch_test {tn args} { + set C [list] + foreach a $args { + sqlite3session S db main + S attach * + execsql $a + lappend C [S changeset] + S delete + } + + sqlite3changebatch cb db + set i 1 + foreach ::cs [lrange $C 0 end-1] { + do_test $tn.$i { cb add [set ::cs] } SQLITE_OK + incr i + } + + set ::cs [lindex $C end] + do_test $tn.$i { cb add [set ::cs] } SQLITE_CONSTRAINT + + cb delete +} + +do_execsql_test 1.0 { + CREATE TABLE t1(a PRIMARY KEY, b); +} + +do_changebatch_test 1.1 { + INSERT INTO t1 VALUES(1, 1); +} { + DELETE FROM t1 WHERE a=1; +} + +finish_test diff --git a/ext/session/sqlite3changebatch.c b/ext/session/sqlite3changebatch.c new file mode 100644 index 0000000000..c0f9b28340 --- /dev/null +++ b/ext/session/sqlite3changebatch.c @@ -0,0 +1,442 @@ + +#if !defined(SQLITE_TEST) || (defined(SQLITE_ENABLE_SESSION) && defined(SQLITE_ENABLE_PREUPDATE_HOOK)) + +#include "sqlite3session.h" +#include "sqlite3changebatch.h" + +#include +#include + +typedef struct BatchTable BatchTable; +typedef struct BatchIndex BatchIndex; +typedef struct BatchIndexEntry BatchIndexEntry; +typedef struct BatchHash BatchHash; + +struct sqlite3_changebatch { + sqlite3 *db; /* Database handle used to read schema */ + BatchTable *pTab; /* First in linked list of tables */ + int iChangesetId; /* Current changeset id */ + int iNextIdxId; /* Next available index id */ + int nEntry; /* Number of entries in hash table */ + int nHash; /* Number of hash buckets */ + BatchIndexEntry **apHash; /* Array of hash buckets */ +}; + +struct BatchTable { + BatchIndex *pIdx; /* First in linked list of UNIQUE indexes */ + BatchTable *pNext; /* Next table */ + char zTab[1]; /* Table name */ +}; + +struct BatchIndex { + BatchIndex *pNext; /* Next index on same table */ + int iId; /* Index id (assigned internally) */ + int bPk; /* True for PK index */ + int nCol; /* Size of aiCol[] array */ + int *aiCol; /* Array of columns that make up index */ +}; + +struct BatchIndexEntry { + BatchIndexEntry *pNext; /* Next colliding hash table entry */ + int iChangesetId; /* Id of associated changeset */ + int iIdxId; /* Id of index this key is from */ + int szRecord; + char aRecord[1]; +}; + +/* +** Allocate and zero a block of nByte bytes. Must be freed using cbFree(). +*/ +static void *cbMalloc(int *pRc, int nByte){ + void *pRet; + + if( *pRc ){ + pRet = 0; + }else{ + pRet = sqlite3_malloc(nByte); + if( pRet ){ + memset(pRet, 0, nByte); + }else{ + *pRc = SQLITE_NOMEM; + } + } + + return pRet; +} + +/* +** Free an allocation made by cbMalloc(). +*/ +static void cbFree(void *p){ + sqlite3_free(p); +} + +/* +** Return the hash bucket that pEntry belongs in. +*/ +static int cbHash(sqlite3_changebatch *p, BatchIndexEntry *pEntry){ + unsigned int iHash = (unsigned int)pEntry->iIdxId; + unsigned char *pEnd = (unsigned char*)&pEntry->aRecord[pEntry->szRecord]; + unsigned char *pIter; + + for(pIter=pEntry->aRecord; pIternHash); +} + +/* +** Resize the hash table. +*/ +static int cbHashResize(sqlite3_changebatch *p){ + int rc = SQLITE_OK; + BatchIndexEntry **apNew; + int nNew = (p->nHash ? p->nHash*2 : 512); + int i; + + apNew = cbMalloc(&rc, sizeof(BatchIndexEntry*) * nNew); + if( rc==SQLITE_OK ){ + int nHash = p->nHash; + p->nHash = nNew; + for(i=0; iapHash[i] ){ + int iHash = cbHash(p, pEntry); + p->apHash[i] = pEntry->pNext; + pEntry->pNext = apNew[iHash]; + apNew[iHash] = pEntry; + } + } + + cbFree(p->apHash); + p->apHash = apNew; + } + + return rc; +} + + +/* +** Allocate a new sqlite3_changebatch object. +*/ +int sqlite3changebatch_new(sqlite3 *db, sqlite3_changebatch **pp){ + sqlite3_changebatch *pRet; + int rc = SQLITE_OK; + *pp = pRet = (sqlite3_changebatch*)cbMalloc(&rc, sizeof(sqlite3_changebatch)); + if( pRet ){ + pRet->db = db; + } + return rc; +} + +/* +** Add a BatchIndex entry for index zIdx to table pTab. +*/ +static int cbAddIndex( + sqlite3_changebatch *p, + BatchTable *pTab, + const char *zIdx, + int bPk +){ + int nCol = 0; + sqlite3_stmt *pIndexInfo = 0; + BatchIndex *pNew = 0; + int rc; + char *zIndexInfo; + + zIndexInfo = (char*)sqlite3_mprintf("PRAGMA main.index_info = %Q", zIdx); + if( zIndexInfo ){ + rc = sqlite3_prepare_v2(p->db, zIndexInfo, -1, &pIndexInfo, 0); + sqlite3_free(zIndexInfo); + }else{ + rc = SQLITE_NOMEM; + } + + if( rc==SQLITE_OK ){ + int rc2; + while( SQLITE_ROW==sqlite3_step(pIndexInfo) ){ nCol++; } + rc2 = sqlite3_reset(pIndexInfo); + if( rc==SQLITE_OK ) rc = rc2; + } + + pNew = (BatchIndex*)cbMalloc(&rc, sizeof(BatchIndex) + sizeof(int) * nCol); + if( rc==SQLITE_OK ){ + int rc2; + pNew->nCol = nCol; + pNew->bPk = bPk; + pNew->aiCol = (int*)&pNew[1]; + pNew->iId = p->iNextIdxId++; + while( SQLITE_ROW==sqlite3_step(pIndexInfo) ){ + int i = sqlite3_column_int(pIndexInfo, 0); + int j = sqlite3_column_int(pIndexInfo, 1); + pNew->aiCol[i] = j; + } + rc2 = sqlite3_reset(pIndexInfo); + if( rc==SQLITE_OK ) rc = rc2; + } + + if( rc==SQLITE_OK ){ + pNew->pNext = pTab->pIdx; + pTab->pIdx = pNew; + }else{ + cbFree(pNew); + } + sqlite3_finalize(pIndexInfo); + + return rc; +} + +/* +** Find or create the BatchTable object named zTab. +*/ +static int cbFindTable( + sqlite3_changebatch *p, + const char *zTab, + BatchTable **ppTab +){ + BatchTable *pRet = 0; + int rc = SQLITE_OK; + + for(pRet=p->pTab; pRet; pRet=pRet->pNext){ + if( 0==sqlite3_stricmp(zTab, pRet->zTab) ) break; + } + + if( pRet==0 ){ + int nTab = strlen(zTab); + pRet = (BatchTable*)cbMalloc(&rc, nTab + sizeof(BatchTable)); + if( pRet ){ + sqlite3_stmt *pIndexList = 0; + char *zIndexList = 0; + int rc2; + memcpy(pRet->zTab, zTab, nTab); + + zIndexList = sqlite3_mprintf("PRAGMA main.index_list = %Q", zTab); + if( zIndexList==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v2(p->db, zIndexList, -1, &pIndexList, 0); + sqlite3_free(zIndexList); + } + + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pIndexList) ){ + if( sqlite3_column_int(pIndexList, 2) ){ + const char *zIdx = (const char*)sqlite3_column_text(pIndexList, 1); + const char *zTyp = (const char*)sqlite3_column_text(pIndexList, 3); + rc = cbAddIndex(p, pRet, zIdx, (zTyp[0]=='p')); + } + } + rc2 = sqlite3_finalize(pIndexList); + if( rc==SQLITE_OK ) rc = rc2; + + if( rc==SQLITE_OK ){ + pRet->pNext = p->pTab; + p->pTab = pRet; + } + } + } + + *ppTab = pRet; + return rc; +} + +static int cbAddToHash( + sqlite3_changebatch *p, + sqlite3_changeset_iter *pIter, + BatchIndex *pIdx, + int (*xVal)(sqlite3_changeset_iter*,int,sqlite3_value**), + int *pbConf +){ + BatchIndexEntry *pNew; + int sz = pIdx->nCol; + int i; + int iOut = 0; + int rc = SQLITE_OK; + + for(i=0; rc==SQLITE_OK && inCol; i++){ + sqlite3_value *pVal; + rc = xVal(pIter, pIdx->aiCol[i], &pVal); + if( rc==SQLITE_OK ){ + int eType = 0; + if( pVal ){ + eType = sqlite3_value_type(pVal); + } + switch( eType ){ + case 0: + case SQLITE_NULL: + return SQLITE_OK; + + case SQLITE_INTEGER: + sz += 8; + break; + case SQLITE_FLOAT: + sz += 8; + break; + + default: + assert( eType==SQLITE_TEXT || eType==SQLITE_BLOB ); + sz += sqlite3_value_bytes(pVal); + break; + } + } + } + + pNew = cbMalloc(&rc, sizeof(BatchIndexEntry) + sz); + if( pNew ){ + pNew->iChangesetId = p->iChangesetId; + pNew->iIdxId = pIdx->iId; + pNew->szRecord = sz; + + for(i=0; rc==SQLITE_OK && inCol; i++){ + sqlite3_value *pVal; + rc = xVal(pIter, pIdx->aiCol[i], &pVal); + if( rc==SQLITE_OK ){ + int eType = sqlite3_value_type(pVal); + pNew->aRecord[iOut++] = eType; + switch( eType ){ + case SQLITE_INTEGER: { + sqlite3_int64 i64 = sqlite3_value_int64(pVal); + memcpy(&pNew->aRecord[iOut], &i64, 8); + iOut += 8; + break; + } + case SQLITE_FLOAT: { + double d64 = sqlite3_value_double(pVal); + memcpy(&pNew->aRecord[iOut], &d64, sizeof(double)); + iOut += sizeof(double); + break; + } + + default: { + int nByte = sqlite3_value_bytes(pVal); + const char *z = (const char*)sqlite3_value_blob(pVal); + memcpy(&pNew->aRecord[iOut], z, nByte); + iOut += nByte; + break; + } + } + } + } + } + + if( rc==SQLITE_OK && p->nEntry>=(p->nHash/2) ){ + rc = cbHashResize(p); + } + + if( rc==SQLITE_OK ){ + BatchIndexEntry *pIter; + int iHash = cbHash(p, pNew); + + assert( iHash>=0 && iHashnHash ); + for(pIter=p->apHash[iHash]; pIter; pIter=pIter->pNext){ + if( pNew->szRecord==pIter->szRecord + && 0==memcmp(pNew->aRecord, pIter->aRecord, pNew->szRecord) + ){ + if( pNew->iChangesetId!=pIter->iChangesetId ){ + *pbConf = 1; + } + cbFree(pNew); + pNew = 0; + break; + } + } + + if( pNew ){ + pNew->pNext = p->apHash[iHash]; + p->apHash[iHash] = pNew; + p->nEntry++; + } + } + + p->iChangesetId++; + return rc; +} + + +/* +** Add a changeset to the current batch. +*/ +int sqlite3changebatch_add(sqlite3_changebatch *p, void *pBuf, int nBuf){ + sqlite3_changeset_iter *pIter; /* Iterator opened on pBuf/nBuf */ + int rc; /* Return code */ + int bConf = 0; /* Conflict was detected */ + + rc = sqlite3changeset_start(&pIter, nBuf, pBuf); + if( rc==SQLITE_OK ){ + int rc2; + for(rc2 = sqlite3changeset_next(pIter); + rc2==SQLITE_ROW; + rc2 = sqlite3changeset_next(pIter) + ){ + BatchTable *pTab; + BatchIndex *pIdx; + const char *zTab; /* Table this change applies to */ + int nCol; /* Number of columns in table */ + int op; /* UPDATE, INSERT or DELETE */ + + sqlite3changeset_op(pIter, &zTab, &nCol, &op, 0); + assert( op==SQLITE_INSERT || op==SQLITE_UPDATE || op==SQLITE_DELETE ); + + rc = cbFindTable(p, zTab, &pTab); + for(pIdx=pTab->pIdx; pIdx && rc==SQLITE_OK; pIdx=pIdx->pNext){ + if( op==SQLITE_UPDATE && pIdx->bPk ) continue; + if( op==SQLITE_UPDATE || op==SQLITE_DELETE ){ + rc = cbAddToHash(p, pIter, pIdx, sqlite3changeset_old, &bConf); + } + if( op==SQLITE_UPDATE || op==SQLITE_INSERT ){ + rc = cbAddToHash(p, pIter, pIdx, sqlite3changeset_new, &bConf); + } + } + if( rc!=SQLITE_OK ) break; + } + + rc2 = sqlite3changeset_finalize(pIter); + if( rc==SQLITE_OK ) rc = rc2; + } + + if( rc==SQLITE_OK && bConf ){ + rc = SQLITE_CONSTRAINT; + } + return rc; +} + +/* +** Zero an existing changebatch object. +*/ +void sqlite3changebatch_zero(sqlite3_changebatch *p){ + int i; + for(i=0; inHash; i++){ + BatchIndexEntry *pEntry; + BatchIndexEntry *pNext; + for(pEntry=p->apHash[i]; pEntry; pEntry=pNext){ + pNext = pEntry->pNext; + cbFree(pEntry); + } + } + cbFree(p->apHash); + p->nHash = 0; + p->apHash = 0; +} + +/* +** Delete a changebatch object. +*/ +void sqlite3changebatch_delete(sqlite3_changebatch *p){ + BatchTable *pTab; + BatchTable *pTabNext; + + sqlite3changebatch_zero(p); + for(pTab=p->pTab; pTab; pTab=pTabNext){ + BatchIndex *pIdx; + BatchIndex *pIdxNext; + for(pIdx=pTab->pIdx; pIdx; pIdx=pIdxNext){ + pIdxNext = pIdx->pNext; + cbFree(pIdx); + } + pTabNext = pTab->pNext; + cbFree(pTab); + } + cbFree(p); +} + +#endif /* SQLITE_ENABLE_SESSION && SQLITE_ENABLE_PREUPDATE_HOOK */ diff --git a/ext/session/sqlite3changebatch.h b/ext/session/sqlite3changebatch.h new file mode 100644 index 0000000000..9afa6c174e --- /dev/null +++ b/ext/session/sqlite3changebatch.h @@ -0,0 +1,75 @@ + +#if !defined(SQLITECHANGEBATCH_H_) +#define SQLITECHANGEBATCH_H_ 1 + +typedef struct sqlite3_changebatch sqlite3_changebatch; + +/* +** Create a new changebatch object for detecting conflicts between +** changesets associated with a schema equivalent to that of the "main" +** database of the open database handle db passed as the first +** parameter. It is the responsibility of the caller to ensure that +** the database handle is not closed until after the changebatch +** object has been deleted. +** +** A changebatch object is used to detect batches of non-conflicting +** changesets. Changesets that do not conflict may be applied to the +** target database in any order without affecting the final state of +** the database. +** +** The changebatch object only works reliably if PRIMARY KEY and UNIQUE +** constraints on tables affected by the changesets use collation +** sequences that are equivalent to built-in collation sequence +** BINARY for the == operation. +** +** If successful, SQLITE_OK is returned and (*pp) set to point to +** the new changebatch object. If an error occurs, an SQLite error +** code is returned and the final value of (*pp) is undefined. +*/ +int sqlite3changebatch_new(sqlite3 *db, sqlite3_changebatch **pp); + +/* +** Argument p points to a buffer containing a changeset n bytes in +** size. Assuming no error occurs, this function returns SQLITE_OK +** if the changeset does not conflict with any changeset passed +** to an sqlite3changebatch_add() call made on the same +** sqlite3_changebatch* handle since the most recent call to +** sqlite3changebatch_zero(). If the changeset does conflict with +** an earlier such changeset, SQLITE_CONSTRAINT is returned. Or, +** if an error occurs, some other SQLite error code may be returned. +** +** One changeset is said to conflict with another if +** either: +** +** * the two changesets contain operations (INSERT, UPDATE or +** DELETE) on the same row, identified by primary key, or +** +** * the two changesets contain operations (INSERT, UPDATE or +** DELETE) on rows with identical values in any combination +** of fields constrained by a UNIQUE constraint. +** +** Even if this function returns SQLITE_CONFLICT, the current +** changeset is added to the internal data structures - so future +** calls to this function may conflict with it. If this function +** returns any result code other than SQLITE_OK or SQLITE_CONFLICT, +** the result of any future call to sqlite3changebatch_add() is +** undefined. +** +** Only changesets may be passed to this function. Passing a +** patchset to this function results in an SQLITE_MISUSE error. +*/ +int sqlite3changebatch_add(sqlite3_changebatch*, void *p, int n); + +/* +** Zero a changebatch object. This causes the records of all earlier +** calls to sqlite3changebatch_add() to be discarded. +*/ +void sqlite3changebatch_zero(sqlite3_changebatch*); + +/* +** Delete a changebatch object. +*/ +void sqlite3changebatch_delete(sqlite3_changebatch*); + +#endif /* !defined(SQLITECHANGEBATCH_H_) */ + diff --git a/ext/session/test_session.c b/ext/session/test_session.c index 103a1c2d7a..3f4cdd3c34 100644 --- a/ext/session/test_session.c +++ b/ext/session/test_session.c @@ -373,7 +373,7 @@ static int test_filter_handler( Tcl_DecrRefCount(pEval); return res; -} +} static int test_conflict_handler( void *pCtx, /* Pointer to TestConflictHandler structure */ @@ -918,6 +918,127 @@ static int SQLITE_TCLAPI test_sqlite3session_foreach( return TCL_OK; } +#include "sqlite3changebatch.h" + +typedef struct TestChangebatch TestChangebatch; +struct TestChangebatch { + sqlite3_changebatch *pChangebatch; +}; + +/* +** Tclcmd: $changebatch add BLOB +** $changebatch zero +** $changebatch delete +*/ +static int SQLITE_TCLAPI test_changebatch_cmd( + void *clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + TestChangebatch *p = (TestChangebatch*)clientData; + sqlite3_changebatch *pChangebatch = p->pChangebatch; + struct SessionSubcmd { + const char *zSub; + int nArg; + const char *zMsg; + int iSub; + } aSub[] = { + { "add", 1, "CHANGESET", }, /* 0 */ + { "zero", 0, "", }, /* 1 */ + { "delete", 0, "", }, /* 2 */ + { 0 } + }; + int iSub; + int rc; + + if( objc<2 ){ + Tcl_WrongNumArgs(interp, 1, objv, "SUBCOMMAND ..."); + return TCL_ERROR; + } + rc = Tcl_GetIndexFromObjStruct(interp, + objv[1], aSub, sizeof(aSub[0]), "sub-command", 0, &iSub + ); + if( rc!=TCL_OK ) return rc; + if( objc!=2+aSub[iSub].nArg ){ + Tcl_WrongNumArgs(interp, 2, objv, aSub[iSub].zMsg); + return TCL_ERROR; + } + + switch( iSub ){ + case 0: { /* add */ + int nArg; + unsigned char *pArg = Tcl_GetByteArrayFromObj(objv[2], &nArg); + rc = sqlite3changebatch_add(pChangebatch, pArg, nArg); + if( rc!=SQLITE_OK && rc!=SQLITE_CONSTRAINT ){ + return test_session_error(interp, rc, 0); + }else{ + extern const char *sqlite3ErrName(int); + Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1)); + } + break; + } + + case 1: { /* zero */ + sqlite3changebatch_zero(pChangebatch); + break; + } + + case 2: /* delete */ + Tcl_DeleteCommand(interp, Tcl_GetString(objv[0])); + break; + } + + return TCL_OK; +} + +static void SQLITE_TCLAPI test_changebatch_del(void *clientData){ + TestChangebatch *p = (TestChangebatch*)clientData; + sqlite3changebatch_delete(p->pChangebatch); + ckfree((char*)p); +} + +/* +** Tclcmd: sqlite3changebatch CMD DB-HANDLE +*/ +static int SQLITE_TCLAPI test_sqlite3changebatch( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + sqlite3 *db; + Tcl_CmdInfo info; + int rc; /* sqlite3session_create() return code */ + TestChangebatch *p; /* New wrapper object */ + + if( objc!=3 ){ + Tcl_WrongNumArgs(interp, 1, objv, "CMD DB-HANDLE"); + return TCL_ERROR; + } + + if( 0==Tcl_GetCommandInfo(interp, Tcl_GetString(objv[2]), &info) ){ + Tcl_AppendResult(interp, "no such handle: ", Tcl_GetString(objv[2]), 0); + return TCL_ERROR; + } + db = *(sqlite3 **)info.objClientData; + + p = (TestChangebatch*)ckalloc(sizeof(TestChangebatch)); + memset(p, 0, sizeof(TestChangebatch)); + rc = sqlite3changebatch_new(db, &p->pChangebatch); + if( rc!=SQLITE_OK ){ + ckfree((char*)p); + return test_session_error(interp, rc, 0); + } + + Tcl_CreateObjCommand( + interp, Tcl_GetString(objv[1]), test_changebatch_cmd, (ClientData)p, + test_changebatch_del + ); + Tcl_SetObjResult(interp, objv[1]); + return TCL_OK; +} + int TestSession_Init(Tcl_Interp *interp){ Tcl_CreateObjCommand(interp, "sqlite3session", test_sqlite3session, 0, 0); Tcl_CreateObjCommand( @@ -936,6 +1057,10 @@ int TestSession_Init(Tcl_Interp *interp){ interp, "sqlite3changeset_apply_replace_all", test_sqlite3changeset_apply_replace_all, 0, 0 ); + + Tcl_CreateObjCommand( + interp, "sqlite3changebatch", test_sqlite3changebatch, 0, 0 + ); return TCL_OK; } diff --git a/main.mk b/main.mk index 451837ffff..034b65332a 100644 --- a/main.mk +++ b/main.mk @@ -390,6 +390,7 @@ TESTSRC2 = \ $(TOP)/ext/fts3/fts3_write.c \ $(TOP)/ext/async/sqlite3async.c \ $(TOP)/ext/session/sqlite3session.c \ + $(TOP)/ext/session/sqlite3changebatch.c \ $(TOP)/ext/session/test_session.c # Header files used by all library source files. diff --git a/manifest b/manifest index 2c686caa9b..698acd2427 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\sVACUUM\scommand\sso\sthat\sit\scan\soperate\son\san\sattached\sdatabase. -D 2016-08-19T15:15:55.612 +C Add\san\sexperimental\smodule\sto\sdetect\sconflicts\sbetween\ssessions\schangesets. +D 2016-08-22T20:49:06.286 F Makefile.in cfd8fb987cd7a6af046daa87daa146d5aad0e088 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc d66d0395c38571aab3804f8db0fa20707ae4609a @@ -281,6 +281,7 @@ F ext/rtree/rtree_util.tcl 06aab2ed5b826545bf215fff90ecb9255a8647ea F ext/rtree/sqlite3rtree.h 9c5777af3d2921c7b4ae4954e8e5697502289d28 F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 +F ext/session/changebatch1.test 5a69388b91ad02544ef2d9ae27771dbf0f9cea58 F ext/session/changeset.c 4ccbaa4531944c24584bf6a61ba3a39c62b6267a F ext/session/session1.test 98f384736e2bc21ccf5ed81bdadcff4ad863393b F ext/session/session2.test 284de45abae4cc1082bc52012ee81521d5ac58e0 @@ -300,16 +301,18 @@ F ext/session/sessionG.test 01ef705096a9d3984eebdcca79807a211dee1b60 F ext/session/session_common.tcl a1293167d14774b5e728836720497f40fe4ea596 F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7 F ext/session/sessionfault2.test 04aa0bc9aa70ea43d8de82c4f648db4de1e990b0 +F ext/session/sqlite3changebatch.c 37fb1c87d7b3ccaff194411ff8344d9cc056bd98 +F ext/session/sqlite3changebatch.h 50a302e4fc535324309607b13a1993bca074758b F ext/session/sqlite3session.c 37485891b4add26cf61495df193c419f36556a32 F ext/session/sqlite3session.h 69bf73cfd71e58f2ae5d2aa935b2c1a541aee555 -F ext/session/test_session.c 2caed9a659586428c63ca46e4900347b374487d4 +F ext/session/test_session.c 24968972a5709d2ccf5d570f1a13ce009fbc0d86 F ext/userauth/sqlite3userauth.h 19cb6f0e31316d0ee4afdfb7a85ef9da3333a220 F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04 F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 1883ecab643b136e8ab3fdc33785e6ea8b5ceb46 +F main.mk de9447348ea580282aa47dbffd20b042bfbec4e1 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -1511,8 +1514,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P cb9865e14db1c0076618f13400151112f84960cb ad35ef116296e5d6aaeb9ef260bf35bee3bd6d20 -R abd29f9f3d87c2af53d085425233b2a6 -T +closed ad35ef116296e5d6aaeb9ef260bf35bee3bd6d20 -U drh -Z a6de375e7bb722769082d6e640b9c49b +P 083f9e6270fa4faa402b91231271da4f3915c79f +R c89955dc116a299d44f6360524b79a8a +T *branch * changebatch +T *sym-changebatch * +T -sym-trunk * +U dan +Z f9a59b56ef4c3ca7ba5584bf19e5e811 diff --git a/manifest.uuid b/manifest.uuid index 4e9d48c81e..7935283ab4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -083f9e6270fa4faa402b91231271da4f3915c79f \ No newline at end of file +0c9fd6b723041955b5182caa430312e5124fdc83 \ No newline at end of file From a7d16a5cd1fa45e1a57d83d7fd46efa7a0f00621 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 22 Aug 2016 21:01:39 +0000 Subject: [PATCH 038/113] Add a couple of extra tests to changebatch1.test. FossilOrigin-Name: 207d970b7956c38af42c389b91a741a68b2c4eec --- ext/session/changebatch1.test | 35 +++++++++++++++++++++++++++++++++++ manifest | 15 ++++++--------- manifest.uuid | 2 +- 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/ext/session/changebatch1.test b/ext/session/changebatch1.test index 6e9d1a9074..056512aca3 100644 --- a/ext/session/changebatch1.test +++ b/ext/session/changebatch1.test @@ -52,4 +52,39 @@ do_changebatch_test 1.1 { DELETE FROM t1 WHERE a=1; } +do_execsql_test 1.2.0 { + INSERT INTO t1 VALUES(1, 1); + INSERT INTO t1 VALUES(2, 2); + INSERT INTO t1 VALUES(3, 3); +} +do_changebatch_test 1.2.1 { + DELETE FROM t1 WHERE a=2; +} { + INSERT INTO t1 VALUES(2, 2); +} + +#------------------------------------------------------------------------- +do_execsql_test 2.0 { + CREATE TABLE x1(a, b PRIMARY KEY, c UNIQUE); + CREATE TABLE x2(a PRIMARY KEY, b UNIQUE, c UNIQUE); + + INSERT INTO x1 VALUES(1, 1, 'a'); + INSERT INTO x1 VALUES(1, 2, 'b'); + INSERT INTO x1 VALUES(1, 3, 'c'); +} + +do_changebatch_test 2.1 { + DELETE FROM x1 WHERE b=2; +} { + UPDATE x1 SET c='b' WHERE b=3; +} + +do_changebatch_test 2.2 { + DELETE FROM x1 WHERE b=1; +} { + INSERT INTO x1 VALUES(1, 5, 'a'); +} + finish_test + + diff --git a/manifest b/manifest index 698acd2427..d16bdf85a5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\san\sexperimental\smodule\sto\sdetect\sconflicts\sbetween\ssessions\schangesets. -D 2016-08-22T20:49:06.286 +C Add\sa\scouple\sof\sextra\stests\sto\schangebatch1.test. +D 2016-08-22T21:01:39.413 F Makefile.in cfd8fb987cd7a6af046daa87daa146d5aad0e088 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc d66d0395c38571aab3804f8db0fa20707ae4609a @@ -281,7 +281,7 @@ F ext/rtree/rtree_util.tcl 06aab2ed5b826545bf215fff90ecb9255a8647ea F ext/rtree/sqlite3rtree.h 9c5777af3d2921c7b4ae4954e8e5697502289d28 F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 -F ext/session/changebatch1.test 5a69388b91ad02544ef2d9ae27771dbf0f9cea58 +F ext/session/changebatch1.test b2d1a8c8b8f86881f50b481eae233f8abfb61436 F ext/session/changeset.c 4ccbaa4531944c24584bf6a61ba3a39c62b6267a F ext/session/session1.test 98f384736e2bc21ccf5ed81bdadcff4ad863393b F ext/session/session2.test 284de45abae4cc1082bc52012ee81521d5ac58e0 @@ -1514,10 +1514,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 083f9e6270fa4faa402b91231271da4f3915c79f -R c89955dc116a299d44f6360524b79a8a -T *branch * changebatch -T *sym-changebatch * -T -sym-trunk * +P 0c9fd6b723041955b5182caa430312e5124fdc83 +R 0bf0e85497e377afe1f85fb7abd8225d U dan -Z f9a59b56ef4c3ca7ba5584bf19e5e811 +Z cf85cb19b321088cfc5e96ee875ee34c diff --git a/manifest.uuid b/manifest.uuid index 7935283ab4..f8bc749f9d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0c9fd6b723041955b5182caa430312e5124fdc83 \ No newline at end of file +207d970b7956c38af42c389b91a741a68b2c4eec \ No newline at end of file From 8bbf544747d4b458f301b8aa08d20c29fb5a61d1 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 23 Aug 2016 17:02:28 +0000 Subject: [PATCH 039/113] Add a new method to sessions - sqlite3sessions_fullchangeset() - to return a changeset that always contains values for all old.* fields. Update changebatch to use these values to more reliably detect multi-column UNIQUE constraint violations. FossilOrigin-Name: efa761b2f509844b9212dd20bf0d082c6338e83f --- ext/session/changebatch1.test | 145 ++++++++++++++++++++++--------- ext/session/sqlite3changebatch.c | 29 +++++-- ext/session/sqlite3session.c | 56 ++++++++---- ext/session/sqlite3session.h | 13 +++ ext/session/test_session.c | 25 +++--- manifest | 20 ++--- manifest.uuid | 2 +- 7 files changed, 206 insertions(+), 84 deletions(-) diff --git a/ext/session/changebatch1.test b/ext/session/changebatch1.test index 056512aca3..fc3f50ab4c 100644 --- a/ext/session/changebatch1.test +++ b/ext/session/changebatch1.test @@ -19,14 +19,19 @@ ifcapable !session {finish_test; return} set testprefix changebatch1 -proc do_changebatch_test {tn args} { +proc sql_to_changeset {method sql} { + sqlite3session S db main + S attach * + execsql $sql + set ret [S $method] + S delete + return $ret +} + +proc do_changebatch_test {tn method args} { set C [list] foreach a $args { - sqlite3session S db main - S attach * - execsql $a - lappend C [S changeset] - S delete + lappend C [sql_to_changeset $method $a] } sqlite3changebatch cb db @@ -42,49 +47,111 @@ proc do_changebatch_test {tn args} { cb delete } -do_execsql_test 1.0 { - CREATE TABLE t1(a PRIMARY KEY, b); +proc do_changebatch_test1 {tn args} { + uplevel do_changebatch_test $tn changeset $args } - -do_changebatch_test 1.1 { - INSERT INTO t1 VALUES(1, 1); -} { - DELETE FROM t1 WHERE a=1; +proc do_changebatch_test2 {tn args} { + uplevel do_changebatch_test $tn fullchangeset $args } -do_execsql_test 1.2.0 { - INSERT INTO t1 VALUES(1, 1); - INSERT INTO t1 VALUES(2, 2); - INSERT INTO t1 VALUES(3, 3); -} -do_changebatch_test 1.2.1 { - DELETE FROM t1 WHERE a=2; +#------------------------------------------------------------------------- +# The body of the following loop contains tests for database schemas +# that do not feature multi-column UNIQUE constraints. In this case +# it doesn't matter if the changesets are generated using +# sqlite3session_changeset() or sqlite3session_fullchangeset(). +# +foreach {tn testfunction} { + 1 do_changebatch_test1 + 2 do_changebatch_test2 } { - INSERT INTO t1 VALUES(2, 2); + reset_db + + #------------------------------------------------------------------------- + # + do_execsql_test $tn.1.0 { + CREATE TABLE t1(a PRIMARY KEY, b); + } + + $testfunction $tn.1.1 { + INSERT INTO t1 VALUES(1, 1); + } { + DELETE FROM t1 WHERE a=1; + } + + do_execsql_test $tn.1.2.0 { + INSERT INTO t1 VALUES(1, 1); + INSERT INTO t1 VALUES(2, 2); + INSERT INTO t1 VALUES(3, 3); + } + $testfunction $tn.1.2.1 { + DELETE FROM t1 WHERE a=2; + } { + INSERT INTO t1 VALUES(2, 2); + } + + #------------------------------------------------------------------------- + # + do_execsql_test $tn.2.0 { + CREATE TABLE x1(a, b PRIMARY KEY, c UNIQUE); + CREATE TABLE x2(a PRIMARY KEY, b UNIQUE, c UNIQUE); + + INSERT INTO x1 VALUES(1, 1, 'a'); + INSERT INTO x1 VALUES(1, 2, 'b'); + INSERT INTO x1 VALUES(1, 3, 'c'); + } + + $testfunction $tn.2.1 { + DELETE FROM x1 WHERE b=2; + } { + UPDATE x1 SET c='b' WHERE b=3; + } + + $testfunction $tn.2.2 { + DELETE FROM x1 WHERE b=1; + } { + INSERT INTO x1 VALUES(1, 5, 'a'); + } } #------------------------------------------------------------------------- -do_execsql_test 2.0 { - CREATE TABLE x1(a, b PRIMARY KEY, c UNIQUE); - CREATE TABLE x2(a PRIMARY KEY, b UNIQUE, c UNIQUE); - - INSERT INTO x1 VALUES(1, 1, 'a'); - INSERT INTO x1 VALUES(1, 2, 'b'); - INSERT INTO x1 VALUES(1, 3, 'c'); +# Test some multi-column UNIQUE constraints. First Using _changeset() to +# demonstrate the problem, then using _fullchangeset() to show that it has +# been fixed. +# +reset_db +do_execsql_test 3.0 { + CREATE TABLE y1(a PRIMARY KEY, b, c, UNIQUE(b, c)); + INSERT INTO y1 VALUES(1, 1, 1); + INSERT INTO y1 VALUES(2, 2, 2); + INSERT INTO y1 VALUES(3, 3, 3); + INSERT INTO y1 VALUES(4, 3, 4); + BEGIN; } -do_changebatch_test 2.1 { - DELETE FROM x1 WHERE b=2; -} { - UPDATE x1 SET c='b' WHERE b=3; -} +do_test 3.1.1 { + set c1 [sql_to_changeset changeset { DELETE FROM y1 WHERE a=4 }] + set c2 [sql_to_changeset changeset { UPDATE y1 SET c=4 WHERE a=3 }] + sqlite3changebatch cb db + cb add $c1 + cb add $c2 +} {SQLITE_OK} +do_test 3.1.2 { + cb delete + execsql ROLLBACK +} {} + +do_test 3.1.1 { + set c1 [sql_to_changeset fullchangeset { DELETE FROM y1 WHERE a=4 }] + set c2 [sql_to_changeset fullchangeset { UPDATE y1 SET c=4 WHERE a=3 }] + sqlite3changebatch cb db + cb add $c1 + cb add $c2 +} {SQLITE_CONSTRAINT} +do_test 3.1.2 { + cb delete +} {} -do_changebatch_test 2.2 { - DELETE FROM x1 WHERE b=1; -} { - INSERT INTO x1 VALUES(1, 5, 'a'); -} -finish_test +finish_test diff --git a/ext/session/sqlite3changebatch.c b/ext/session/sqlite3changebatch.c index c0f9b28340..5672a574c5 100644 --- a/ext/session/sqlite3changebatch.c +++ b/ext/session/sqlite3changebatch.c @@ -240,11 +240,26 @@ static int cbFindTable( return rc; } +static int cbGetChangesetValue( + sqlite3_changeset_iter *pIter, + int (*xVal)(sqlite3_changeset_iter*,int,sqlite3_value**), + int (*xFallback)(sqlite3_changeset_iter*,int,sqlite3_value**), + int iVal, + sqlite3_value **ppVal +){ + int rc = xVal(pIter, iVal, ppVal); + if( rc==SQLITE_OK && *ppVal==0 && xFallback ){ + rc = xFallback(pIter, iVal, ppVal); + } + return rc; +} + static int cbAddToHash( sqlite3_changebatch *p, sqlite3_changeset_iter *pIter, BatchIndex *pIdx, int (*xVal)(sqlite3_changeset_iter*,int,sqlite3_value**), + int (*xFallback)(sqlite3_changeset_iter*,int,sqlite3_value**), int *pbConf ){ BatchIndexEntry *pNew; @@ -255,12 +270,10 @@ static int cbAddToHash( for(i=0; rc==SQLITE_OK && inCol; i++){ sqlite3_value *pVal; - rc = xVal(pIter, pIdx->aiCol[i], &pVal); + rc = cbGetChangesetValue(pIter, xVal, xFallback, pIdx->aiCol[i], &pVal); if( rc==SQLITE_OK ){ int eType = 0; - if( pVal ){ - eType = sqlite3_value_type(pVal); - } + if( pVal ) eType = sqlite3_value_type(pVal); switch( eType ){ case 0: case SQLITE_NULL: @@ -289,7 +302,7 @@ static int cbAddToHash( for(i=0; rc==SQLITE_OK && inCol; i++){ sqlite3_value *pVal; - rc = xVal(pIter, pIdx->aiCol[i], &pVal); + rc = cbGetChangesetValue(pIter, xVal, xFallback, pIdx->aiCol[i], &pVal); if( rc==SQLITE_OK ){ int eType = sqlite3_value_type(pVal); pNew->aRecord[iOut++] = eType; @@ -381,10 +394,12 @@ int sqlite3changebatch_add(sqlite3_changebatch *p, void *pBuf, int nBuf){ for(pIdx=pTab->pIdx; pIdx && rc==SQLITE_OK; pIdx=pIdx->pNext){ if( op==SQLITE_UPDATE && pIdx->bPk ) continue; if( op==SQLITE_UPDATE || op==SQLITE_DELETE ){ - rc = cbAddToHash(p, pIter, pIdx, sqlite3changeset_old, &bConf); + rc = cbAddToHash(p, pIter, pIdx, sqlite3changeset_old, 0, &bConf); } if( op==SQLITE_UPDATE || op==SQLITE_INSERT ){ - rc = cbAddToHash(p, pIter, pIdx, sqlite3changeset_new, &bConf); + rc = cbAddToHash(p, pIter, pIdx, + sqlite3changeset_new, sqlite3changeset_old, &bConf + ); } } if( rc!=SQLITE_OK ) break; diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index 70ca840dae..22728d0b97 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -25,6 +25,13 @@ typedef struct SessionInput SessionInput; # endif #endif +/* +** The three different types of changesets generated. +*/ +#define SESSIONS_PATCHSET 0 +#define SESSIONS_CHANGESET 1 +#define SESSIONS_FULLCHANGESET 2 + typedef struct SessionHook SessionHook; struct SessionHook { void *pCtx; @@ -1934,7 +1941,7 @@ static void sessionAppendCol( */ static int sessionAppendUpdate( SessionBuffer *pBuf, /* Buffer to append to */ - int bPatchset, /* True for "patchset", 0 for "changeset" */ + int ePatchset, /* True for "patchset", 0 for "changeset" */ sqlite3_stmt *pStmt, /* Statement handle pointing at new row */ SessionChange *p, /* Object containing old values */ u8 *abPK /* Boolean array - true for PK columns */ @@ -1997,8 +2004,8 @@ static int sessionAppendUpdate( /* Add a field to the old.* record. This is omitted if this modules is ** currently generating a patchset. */ - if( bPatchset==0 ){ - if( bChanged || abPK[i] ){ + if( ePatchset!=SESSIONS_PATCHSET ){ + if( ePatchset==SESSIONS_FULLCHANGESET || bChanged || abPK[i] ){ sessionAppendBlob(pBuf, pCsr, nAdvance, &rc); }else{ sessionAppendByte(pBuf, 0, &rc); @@ -2007,7 +2014,7 @@ static int sessionAppendUpdate( /* Add a field to the new.* record. Or the only record if currently ** generating a patchset. */ - if( bChanged || (bPatchset && abPK[i]) ){ + if( bChanged || (ePatchset==SESSIONS_PATCHSET && abPK[i]) ){ sessionAppendCol(&buf2, pStmt, i, &rc); }else{ sessionAppendByte(&buf2, 0, &rc); @@ -2033,7 +2040,7 @@ static int sessionAppendUpdate( */ static int sessionAppendDelete( SessionBuffer *pBuf, /* Buffer to append to */ - int bPatchset, /* True for "patchset", 0 for "changeset" */ + int eChangeset, /* One of SESSIONS_CHANGESET etc. */ SessionChange *p, /* Object containing old values */ int nCol, /* Number of columns in table */ u8 *abPK /* Boolean array - true for PK columns */ @@ -2043,7 +2050,7 @@ static int sessionAppendDelete( sessionAppendByte(pBuf, SQLITE_DELETE, &rc); sessionAppendByte(pBuf, p->bIndirect, &rc); - if( bPatchset==0 ){ + if( eChangeset!=SESSIONS_PATCHSET ){ sessionAppendBlob(pBuf, p->aRecord, p->nRecord, &rc); }else{ int i; @@ -2202,12 +2209,12 @@ static int sessionSelectBind( */ static void sessionAppendTableHdr( SessionBuffer *pBuf, /* Append header to this buffer */ - int bPatchset, /* Use the patchset format if true */ + int ePatchset, /* Use the patchset format if true */ SessionTable *pTab, /* Table object to append header for */ int *pRc /* IN/OUT: Error code */ ){ /* Write a table header */ - sessionAppendByte(pBuf, (bPatchset ? 'P' : 'T'), pRc); + sessionAppendByte(pBuf, (ePatchset==SESSIONS_PATCHSET) ? 'P' : 'T', pRc); sessionAppendVarint(pBuf, pTab->nCol, pRc); sessionAppendBlob(pBuf, pTab->abPK, pTab->nCol, pRc); sessionAppendBlob(pBuf, (u8 *)pTab->zName, (int)strlen(pTab->zName)+1, pRc); @@ -2225,7 +2232,7 @@ static void sessionAppendTableHdr( */ static int sessionGenerateChangeset( sqlite3_session *pSession, /* Session object */ - int bPatchset, /* True for patchset, false for changeset */ + int ePatchset, /* One of SESSIONS_CHANGESET etc. */ int (*xOutput)(void *pOut, const void *pData, int nData), void *pOut, /* First argument for xOutput */ int *pnChangeset, /* OUT: Size of buffer at *ppChangeset */ @@ -2270,7 +2277,7 @@ static int sessionGenerateChangeset( } /* Write a table header */ - sessionAppendTableHdr(&buf, bPatchset, pTab, &rc); + sessionAppendTableHdr(&buf, ePatchset, pTab, &rc); /* Build and compile a statement to execute: */ if( rc==SQLITE_OK ){ @@ -2294,10 +2301,10 @@ static int sessionGenerateChangeset( sessionAppendCol(&buf, pSel, iCol, &rc); } }else{ - rc = sessionAppendUpdate(&buf, bPatchset, pSel, p, abPK); + rc = sessionAppendUpdate(&buf, ePatchset, pSel, p, abPK); } }else if( p->op!=SQLITE_INSERT ){ - rc = sessionAppendDelete(&buf, bPatchset, p, nCol, abPK); + rc = sessionAppendDelete(&buf, ePatchset, p, nCol, abPK); } if( rc==SQLITE_OK ){ rc = sqlite3_reset(pSel); @@ -2354,7 +2361,8 @@ int sqlite3session_changeset( int *pnChangeset, /* OUT: Size of buffer at *ppChangeset */ void **ppChangeset /* OUT: Buffer containing changeset */ ){ - return sessionGenerateChangeset(pSession, 0, 0, 0, pnChangeset, ppChangeset); + return sessionGenerateChangeset( + pSession, SESSIONS_CHANGESET, 0, 0, pnChangeset, ppChangeset); } /* @@ -2365,7 +2373,8 @@ int sqlite3session_changeset_strm( int (*xOutput)(void *pOut, const void *pData, int nData), void *pOut ){ - return sessionGenerateChangeset(pSession, 0, xOutput, pOut, 0, 0); + return sessionGenerateChangeset( + pSession, SESSIONS_CHANGESET, xOutput, pOut, 0, 0); } /* @@ -2376,7 +2385,8 @@ int sqlite3session_patchset_strm( int (*xOutput)(void *pOut, const void *pData, int nData), void *pOut ){ - return sessionGenerateChangeset(pSession, 1, xOutput, pOut, 0, 0); + return sessionGenerateChangeset( + pSession, SESSIONS_PATCHSET, xOutput, pOut, 0, 0); } /* @@ -2391,9 +2401,20 @@ int sqlite3session_patchset( int *pnPatchset, /* OUT: Size of buffer at *ppChangeset */ void **ppPatchset /* OUT: Buffer containing changeset */ ){ - return sessionGenerateChangeset(pSession, 1, 0, 0, pnPatchset, ppPatchset); + return sessionGenerateChangeset( + pSession, SESSIONS_PATCHSET, 0, 0, pnPatchset, ppPatchset); } +int sqlite3session_fullchangeset( + sqlite3_session *pSession, /* Session object */ + int *pnChangeset, /* OUT: Size of buffer at *ppChangeset */ + void **ppChangeset /* OUT: Buffer containing changeset */ +){ + return sessionGenerateChangeset( + pSession, SESSIONS_FULLCHANGESET, 0, 0, pnChangeset, ppChangeset); +} + + /* ** Enable or disable the session object passed as the first argument. */ @@ -4463,10 +4484,11 @@ static int sessionChangegroupOutput( ** hash tables attached to the SessionTable objects in list p->pList. */ for(pTab=pGrp->pList; rc==SQLITE_OK && pTab; pTab=pTab->pNext){ + int eChangeset = pGrp->bPatch ? SESSIONS_PATCHSET : SESSIONS_CHANGESET; int i; if( pTab->nEntry==0 ) continue; - sessionAppendTableHdr(&buf, pGrp->bPatch, pTab, &rc); + sessionAppendTableHdr(&buf, eChangeset, pTab, &rc); for(i=0; inChange; i++){ SessionChange *p; for(p=pTab->apChange[i]; p; p=p->pNext){ diff --git a/ext/session/sqlite3session.h b/ext/session/sqlite3session.h index 23d9a33aef..91ba511936 100644 --- a/ext/session/sqlite3session.h +++ b/ext/session/sqlite3session.h @@ -281,6 +281,19 @@ int sqlite3session_changeset( void **ppChangeset /* OUT: Buffer containing changeset */ ); +/* +** CAPI3REF: Generate A Full Changeset From A Session Object +** +** This function is similar to sqlite3session_changeset(), except that for +** each row affected by an UPDATE statement, all old.* values are recorded +** as part of the changeset, not just those modified. +*/ +int sqlite3session_fullchangeset( + sqlite3_session *pSession, /* Session object */ + int *pnChangeset, /* OUT: Size of buffer at *ppChangeset */ + void **ppChangeset /* OUT: Buffer containing changeset */ +); + /* ** CAPI3REF: Load The Difference Between Tables Into A Session ** diff --git a/ext/session/test_session.c b/ext/session/test_session.c index 3f4cdd3c34..02274c7f84 100644 --- a/ext/session/test_session.c +++ b/ext/session/test_session.c @@ -113,6 +113,7 @@ static int testStreamOutput( ** $session indirect INTEGER ** $session patchset ** $session table_filter SCRIPT +** $session fullchangeset */ static int SQLITE_TCLAPI test_session_cmd( void *clientData, @@ -126,17 +127,17 @@ static int SQLITE_TCLAPI test_session_cmd( const char *zSub; int nArg; const char *zMsg; - int iSub; } aSub[] = { - { "attach", 1, "TABLE", }, /* 0 */ - { "changeset", 0, "", }, /* 1 */ - { "delete", 0, "", }, /* 2 */ - { "enable", 1, "BOOL", }, /* 3 */ - { "indirect", 1, "BOOL", }, /* 4 */ - { "isempty", 0, "", }, /* 5 */ - { "table_filter", 1, "SCRIPT", }, /* 6 */ + { "attach", 1, "TABLE" }, /* 0 */ + { "changeset", 0, "" }, /* 1 */ + { "delete", 0, "" }, /* 2 */ + { "enable", 1, "BOOL" }, /* 3 */ + { "indirect", 1, "BOOL" }, /* 4 */ + { "isempty", 0, "" }, /* 5 */ + { "table_filter", 1, "SCRIPT" }, /* 6 */ { "patchset", 0, "", }, /* 7 */ - { "diff", 2, "FROMDB TBL", }, /* 8 */ + { "diff", 2, "FROMDB TBL" }, /* 8 */ + { "fullchangeset",0, "" }, /* 9 */ { 0 } }; int iSub; @@ -166,10 +167,11 @@ static int SQLITE_TCLAPI test_session_cmd( break; } + case 9: /* fullchangeset */ case 7: /* patchset */ case 1: { /* changeset */ TestSessionsBlob o = {0, 0}; - if( test_tcl_integer(interp, SESSION_STREAM_TCL_VAR) ){ + if( iSub!=9 && test_tcl_integer(interp, SESSION_STREAM_TCL_VAR) ){ void *pCtx = (void*)&o; if( iSub==7 ){ rc = sqlite3session_patchset_strm(pSession, testStreamOutput, pCtx); @@ -179,6 +181,8 @@ static int SQLITE_TCLAPI test_session_cmd( }else{ if( iSub==7 ){ rc = sqlite3session_patchset(pSession, &o.n, &o.p); + }else if( iSub==9 ){ + rc = sqlite3session_fullchangeset(pSession, &o.n, &o.p); }else{ rc = sqlite3session_changeset(pSession, &o.n, &o.p); } @@ -193,6 +197,7 @@ static int SQLITE_TCLAPI test_session_cmd( break; } + case 2: /* delete */ Tcl_DeleteCommand(interp, Tcl_GetString(objv[0])); break; diff --git a/manifest b/manifest index d16bdf85a5..8e6e0945fc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\scouple\sof\sextra\stests\sto\schangebatch1.test. -D 2016-08-22T21:01:39.413 +C Add\sa\snew\smethod\sto\ssessions\s-\ssqlite3sessions_fullchangeset()\s-\sto\sreturn\sa\schangeset\sthat\salways\scontains\svalues\sfor\sall\sold.*\sfields.\sUpdate\schangebatch\sto\suse\sthese\svalues\sto\smore\sreliably\sdetect\smulti-column\sUNIQUE\sconstraint\sviolations. +D 2016-08-23T17:02:28.920 F Makefile.in cfd8fb987cd7a6af046daa87daa146d5aad0e088 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc d66d0395c38571aab3804f8db0fa20707ae4609a @@ -281,7 +281,7 @@ F ext/rtree/rtree_util.tcl 06aab2ed5b826545bf215fff90ecb9255a8647ea F ext/rtree/sqlite3rtree.h 9c5777af3d2921c7b4ae4954e8e5697502289d28 F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 -F ext/session/changebatch1.test b2d1a8c8b8f86881f50b481eae233f8abfb61436 +F ext/session/changebatch1.test f3e5462189ebe238b57ddf31f17e5f6cb410f895 F ext/session/changeset.c 4ccbaa4531944c24584bf6a61ba3a39c62b6267a F ext/session/session1.test 98f384736e2bc21ccf5ed81bdadcff4ad863393b F ext/session/session2.test 284de45abae4cc1082bc52012ee81521d5ac58e0 @@ -301,11 +301,11 @@ F ext/session/sessionG.test 01ef705096a9d3984eebdcca79807a211dee1b60 F ext/session/session_common.tcl a1293167d14774b5e728836720497f40fe4ea596 F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7 F ext/session/sessionfault2.test 04aa0bc9aa70ea43d8de82c4f648db4de1e990b0 -F ext/session/sqlite3changebatch.c 37fb1c87d7b3ccaff194411ff8344d9cc056bd98 +F ext/session/sqlite3changebatch.c 7ddd1b44422508306c50c37056bb13d5e0492bd0 F ext/session/sqlite3changebatch.h 50a302e4fc535324309607b13a1993bca074758b -F ext/session/sqlite3session.c 37485891b4add26cf61495df193c419f36556a32 -F ext/session/sqlite3session.h 69bf73cfd71e58f2ae5d2aa935b2c1a541aee555 -F ext/session/test_session.c 24968972a5709d2ccf5d570f1a13ce009fbc0d86 +F ext/session/sqlite3session.c e5591f76aea6058720e04f78ae9e88487eb56c6b +F ext/session/sqlite3session.h c772b5440f41af44631891aa7f352e9a44b740ad +F ext/session/test_session.c 9e6a4313dc94b053edd33f54c3ffc053aeddff45 F ext/userauth/sqlite3userauth.h 19cb6f0e31316d0ee4afdfb7a85ef9da3333a220 F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04 F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e @@ -1514,7 +1514,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0c9fd6b723041955b5182caa430312e5124fdc83 -R 0bf0e85497e377afe1f85fb7abd8225d +P 207d970b7956c38af42c389b91a741a68b2c4eec +R fcf84064b854d920af796eb5c195b948 U dan -Z cf85cb19b321088cfc5e96ee875ee34c +Z e2f66a65ddf5985dbdfd723a07f7b7cc diff --git a/manifest.uuid b/manifest.uuid index f8bc749f9d..cecdca57cb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -207d970b7956c38af42c389b91a741a68b2c4eec \ No newline at end of file +efa761b2f509844b9212dd20bf0d082c6338e83f \ No newline at end of file From 7d931b985a5d04c42a4b92002bef752c5da787ff Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 23 Aug 2016 18:09:37 +0000 Subject: [PATCH 040/113] Fix harmless compiler warnings in changebatch. FossilOrigin-Name: a721a738184d914fcde3f5684099984a9373dff3 --- ext/session/sqlite3changebatch.c | 4 ++-- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ext/session/sqlite3changebatch.c b/ext/session/sqlite3changebatch.c index 5672a574c5..186bcab99c 100644 --- a/ext/session/sqlite3changebatch.c +++ b/ext/session/sqlite3changebatch.c @@ -79,7 +79,7 @@ static int cbHash(sqlite3_changebatch *p, BatchIndexEntry *pEntry){ unsigned char *pEnd = (unsigned char*)&pEntry->aRecord[pEntry->szRecord]; unsigned char *pIter; - for(pIter=pEntry->aRecord; pIteraRecord; pIternHash = nNew; for(i=0; iapHash[i] ){ + while( (pEntry=p->apHash[i])!=0 ){ int iHash = cbHash(p, pEntry); p->apHash[i] = pEntry->pNext; pEntry->pNext = apNew[iHash]; diff --git a/manifest b/manifest index 8e6e0945fc..4b3e6de352 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\snew\smethod\sto\ssessions\s-\ssqlite3sessions_fullchangeset()\s-\sto\sreturn\sa\schangeset\sthat\salways\scontains\svalues\sfor\sall\sold.*\sfields.\sUpdate\schangebatch\sto\suse\sthese\svalues\sto\smore\sreliably\sdetect\smulti-column\sUNIQUE\sconstraint\sviolations. -D 2016-08-23T17:02:28.920 +C Fix\sharmless\scompiler\swarnings\sin\schangebatch. +D 2016-08-23T18:09:37.916 F Makefile.in cfd8fb987cd7a6af046daa87daa146d5aad0e088 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc d66d0395c38571aab3804f8db0fa20707ae4609a @@ -301,7 +301,7 @@ F ext/session/sessionG.test 01ef705096a9d3984eebdcca79807a211dee1b60 F ext/session/session_common.tcl a1293167d14774b5e728836720497f40fe4ea596 F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7 F ext/session/sessionfault2.test 04aa0bc9aa70ea43d8de82c4f648db4de1e990b0 -F ext/session/sqlite3changebatch.c 7ddd1b44422508306c50c37056bb13d5e0492bd0 +F ext/session/sqlite3changebatch.c 72ec2f5c70af4e9e938222a98962bc05b82e9bf4 F ext/session/sqlite3changebatch.h 50a302e4fc535324309607b13a1993bca074758b F ext/session/sqlite3session.c e5591f76aea6058720e04f78ae9e88487eb56c6b F ext/session/sqlite3session.h c772b5440f41af44631891aa7f352e9a44b740ad @@ -1514,7 +1514,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 207d970b7956c38af42c389b91a741a68b2c4eec -R fcf84064b854d920af796eb5c195b948 -U dan -Z e2f66a65ddf5985dbdfd723a07f7b7cc +P efa761b2f509844b9212dd20bf0d082c6338e83f +R 7f5bf9af3be1c169a39e0edb328bafbb +U drh +Z e5dc9f2e44b6adaa79d5e6bc2fc1ab5e diff --git a/manifest.uuid b/manifest.uuid index cecdca57cb..ad7a6d4e5d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -efa761b2f509844b9212dd20bf0d082c6338e83f \ No newline at end of file +a721a738184d914fcde3f5684099984a9373dff3 \ No newline at end of file From a8dee8df646b19de71ed288f088f3439209dfe1d Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 23 Aug 2016 19:02:21 +0000 Subject: [PATCH 041/113] Add further tests for changebatch. And a fix to prevent a changeset from conflicting with itself. FossilOrigin-Name: 506d6ff4b64c72d4ca65f0d15e1fdf8a132556bc --- ext/session/changebatch1.test | 73 +++++++++++++++++-- ext/session/changebatchfault.test | 42 +++++++++++ ext/session/sqlite3changebatch.c | 114 ++++++++++++++++++------------ manifest | 17 ++--- manifest.uuid | 2 +- 5 files changed, 189 insertions(+), 59 deletions(-) create mode 100644 ext/session/changebatchfault.test diff --git a/ext/session/changebatch1.test b/ext/session/changebatch1.test index fc3f50ab4c..2fbe368947 100644 --- a/ext/session/changebatch1.test +++ b/ext/session/changebatch1.test @@ -19,6 +19,7 @@ ifcapable !session {finish_test; return} set testprefix changebatch1 + proc sql_to_changeset {method sql} { sqlite3session S db main S attach * @@ -37,13 +38,13 @@ proc do_changebatch_test {tn method args} { sqlite3changebatch cb db set i 1 foreach ::cs [lrange $C 0 end-1] { - do_test $tn.$i { cb add [set ::cs] } SQLITE_OK + set rc [cb add $::cs] + if {$rc!="SQLITE_OK"} { error "expected SQLITE_OK, got $rc (i=$i)" } incr i } set ::cs [lindex $C end] - do_test $tn.$i { cb add [set ::cs] } SQLITE_CONSTRAINT - + do_test $tn { cb add [set ::cs] } SQLITE_CONSTRAINT cb delete } @@ -94,6 +95,7 @@ foreach {tn testfunction} { do_execsql_test $tn.2.0 { CREATE TABLE x1(a, b PRIMARY KEY, c UNIQUE); CREATE TABLE x2(a PRIMARY KEY, b UNIQUE, c UNIQUE); + CREATE INDEX x1a ON x1(a); INSERT INTO x1 VALUES(1, 1, 'a'); INSERT INTO x1 VALUES(1, 2, 'b'); @@ -111,6 +113,53 @@ foreach {tn testfunction} { } { INSERT INTO x1 VALUES(1, 5, 'a'); } + + set L [list] + for {set i 1000} {$i < 10000} {incr i} { + lappend L "INSERT INTO x2 VALUES($i, $i, 'x' || $i)" + } + lappend L "DELETE FROM x2 WHERE b=1005" + $testfunction $tn.2.3 {*}$L + + execsql { INSERT INTO x1 VALUES('f', 'f', 'f') } + $testfunction $tn.2.4 { + INSERT INTO x2 VALUES('f', 'f', 'f'); + } { + INSERT INTO x1 VALUES('g', 'g', 'g'); + } { + DELETE FROM x1 WHERE b='f'; + } { + INSERT INTO x2 VALUES('g', 'g', 'g'); + } { + INSERT INTO x1 VALUES('f', 'f', 'f'); + } + + execsql { + DELETE FROM x1; + INSERT INTO x1 VALUES(1.5, 1.5, 1.5); + } + $testfunction $tn.2.5 { + DELETE FROM x1 WHERE b BETWEEN 1 AND 2; + } { + INSERT INTO x1 VALUES(2.5, 2.5, 2.5); + } { + INSERT INTO x1 VALUES(1.5, 1.5, 1.5); + } + + execsql { + DELETE FROM x2; + INSERT INTO x2 VALUES(X'abcd', X'1234', X'7890'); + INSERT INTO x2 VALUES(X'0000', X'0000', X'0000'); + } + breakpoint + $testfunction $tn.2.6 { + UPDATE x2 SET c = X'1234' WHERE a=X'abcd'; + INSERT INTO x2 VALUES(X'1234', X'abcd', X'7890'); + } { + DELETE FROM x2 WHERE b=X'0000'; + } { + INSERT INTO x2 VALUES(1, X'0000', NULL); + } } #------------------------------------------------------------------------- @@ -151,7 +200,23 @@ do_test 3.1.2 { cb delete } {} +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 4.0 { + CREATE TABLE t1(x, y, z, PRIMARY KEY(x, y), UNIQUE(z)); +} + +do_test 4.1 { + set c1 [sql_to_changeset fullchangeset { INSERT INTO t1 VALUES(1, 2, 3) }] + execsql { + DROP TABLE t1; + CREATE TABLE t1(w, x, y, z, PRIMARY KEY(x, y), UNIQUE(z)); + } + sqlite3changebatch cb db + list [catch { cb add $c1 } msg] $msg +} {1 SQLITE_RANGE} -finish_test +finish_test diff --git a/ext/session/changebatchfault.test b/ext/session/changebatchfault.test new file mode 100644 index 0000000000..209b60e0c8 --- /dev/null +++ b/ext/session/changebatchfault.test @@ -0,0 +1,42 @@ +# 2011 Mar 21 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# The focus of this file is testing the session module. +# + +if {![info exists testdir]} { + set testdir [file join [file dirname [info script]] .. .. test] +} +source [file join [file dirname [info script]] session_common.tcl] +source $testdir/tester.tcl +ifcapable !session {finish_test; return} +set testprefix changebatchfault + +do_execsql_test 1.0 { + CREATE TABLE t1(a, b, c PRIMARY KEY, UNIQUE(a, b)); + INSERT INTO t1 VALUES('a', 'a', 'a'); + INSERT INTO t1 VALUES('b', 'b', 'b'); +} + +set ::c1 [changeset_from_sql { delete from t1 where c='a' }] +set ::c2 [changeset_from_sql { insert into t1 values('c', 'c', 'c') }] + +do_faultsim_test 1 -faults oom-* -body { + sqlite3changebatch cb db + cb add $::c1 + cb add $::c2 +} -test { + faultsim_test_result {0 SQLITE_OK} {1 SQLITE_NOMEM} + catch { cb delete } +} + + +finish_test diff --git a/ext/session/sqlite3changebatch.c b/ext/session/sqlite3changebatch.c index 186bcab99c..a31d04ff4e 100644 --- a/ext/session/sqlite3changebatch.c +++ b/ext/session/sqlite3changebatch.c @@ -154,10 +154,8 @@ static int cbAddIndex( } if( rc==SQLITE_OK ){ - int rc2; while( SQLITE_ROW==sqlite3_step(pIndexInfo) ){ nCol++; } - rc2 = sqlite3_reset(pIndexInfo); - if( rc==SQLITE_OK ) rc = rc2; + rc = sqlite3_reset(pIndexInfo); } pNew = (BatchIndex*)cbMalloc(&rc, sizeof(BatchIndex) + sizeof(int) * nCol); @@ -172,8 +170,7 @@ static int cbAddIndex( int j = sqlite3_column_int(pIndexInfo, 1); pNew->aiCol[i] = j; } - rc2 = sqlite3_reset(pIndexInfo); - if( rc==SQLITE_OK ) rc = rc2; + rc = sqlite3_reset(pIndexInfo); } if( rc==SQLITE_OK ){ @@ -187,6 +184,19 @@ static int cbAddIndex( return rc; } +/* +** Free the object passed as the first argument. +*/ +static void cbFreeTable(BatchTable *pTab){ + BatchIndex *pIdx; + BatchIndex *pIdxNext; + for(pIdx=pTab->pIdx; pIdx; pIdx=pIdxNext){ + pIdxNext = pIdx->pNext; + cbFree(pIdx); + } + cbFree(pTab); +} + /* ** Find or create the BatchTable object named zTab. */ @@ -232,6 +242,9 @@ static int cbFindTable( if( rc==SQLITE_OK ){ pRet->pNext = p->pTab; p->pTab = pRet; + }else{ + cbFreeTable(pRet); + pRet = 0; } } } @@ -240,6 +253,16 @@ static int cbFindTable( return rc; } +/* +** Extract value iVal from the changeset iterator passed as the first +** argument. Set *ppVal to point to the value before returning. +** +** This function attempts to extract the value using function xVal +** (which is always either sqlite3changeset_new or sqlite3changeset_old). +** If the call returns SQLITE_OK but does not supply an sqlite3_value* +** pointer, an attempt to extract the value is made using the xFallback +** function. +*/ static int cbGetChangesetValue( sqlite3_changeset_iter *pIter, int (*xVal)(sqlite3_changeset_iter*,int,sqlite3_value**), @@ -300,33 +323,33 @@ static int cbAddToHash( pNew->iIdxId = pIdx->iId; pNew->szRecord = sz; - for(i=0; rc==SQLITE_OK && inCol; i++){ + for(i=0; inCol; i++){ + int eType; sqlite3_value *pVal; rc = cbGetChangesetValue(pIter, xVal, xFallback, pIdx->aiCol[i], &pVal); - if( rc==SQLITE_OK ){ - int eType = sqlite3_value_type(pVal); - pNew->aRecord[iOut++] = eType; - switch( eType ){ - case SQLITE_INTEGER: { - sqlite3_int64 i64 = sqlite3_value_int64(pVal); - memcpy(&pNew->aRecord[iOut], &i64, 8); - iOut += 8; - break; - } - case SQLITE_FLOAT: { - double d64 = sqlite3_value_double(pVal); - memcpy(&pNew->aRecord[iOut], &d64, sizeof(double)); - iOut += sizeof(double); - break; - } + if( rc!=SQLITE_OK ) break; /* coverage: condition is never true */ + eType = sqlite3_value_type(pVal); + pNew->aRecord[iOut++] = eType; + switch( eType ){ + case SQLITE_INTEGER: { + sqlite3_int64 i64 = sqlite3_value_int64(pVal); + memcpy(&pNew->aRecord[iOut], &i64, 8); + iOut += 8; + break; + } + case SQLITE_FLOAT: { + double d64 = sqlite3_value_double(pVal); + memcpy(&pNew->aRecord[iOut], &d64, sizeof(double)); + iOut += sizeof(double); + break; + } - default: { - int nByte = sqlite3_value_bytes(pVal); - const char *z = (const char*)sqlite3_value_blob(pVal); - memcpy(&pNew->aRecord[iOut], z, nByte); - iOut += nByte; - break; - } + default: { + int nByte = sqlite3_value_bytes(pVal); + const char *z = (const char*)sqlite3_value_blob(pVal); + memcpy(&pNew->aRecord[iOut], z, nByte); + iOut += nByte; + break; } } } @@ -359,9 +382,10 @@ static int cbAddToHash( p->apHash[iHash] = pNew; p->nEntry++; } + }else{ + cbFree(pNew); } - p->iChangesetId++; return rc; } @@ -391,15 +415,18 @@ int sqlite3changebatch_add(sqlite3_changebatch *p, void *pBuf, int nBuf){ assert( op==SQLITE_INSERT || op==SQLITE_UPDATE || op==SQLITE_DELETE ); rc = cbFindTable(p, zTab, &pTab); - for(pIdx=pTab->pIdx; pIdx && rc==SQLITE_OK; pIdx=pIdx->pNext){ - if( op==SQLITE_UPDATE && pIdx->bPk ) continue; - if( op==SQLITE_UPDATE || op==SQLITE_DELETE ){ - rc = cbAddToHash(p, pIter, pIdx, sqlite3changeset_old, 0, &bConf); - } - if( op==SQLITE_UPDATE || op==SQLITE_INSERT ){ - rc = cbAddToHash(p, pIter, pIdx, - sqlite3changeset_new, sqlite3changeset_old, &bConf - ); + assert( pTab || rc!=SQLITE_OK ); + if( pTab ){ + for(pIdx=pTab->pIdx; pIdx && rc==SQLITE_OK; pIdx=pIdx->pNext){ + if( op==SQLITE_UPDATE && pIdx->bPk ) continue; + if( op==SQLITE_UPDATE || op==SQLITE_DELETE ){ + rc = cbAddToHash(p, pIter, pIdx, sqlite3changeset_old, 0, &bConf); + } + if( op==SQLITE_UPDATE || op==SQLITE_INSERT ){ + rc = cbAddToHash(p, pIter, pIdx, + sqlite3changeset_new, sqlite3changeset_old, &bConf + ); + } } } if( rc!=SQLITE_OK ) break; @@ -412,6 +439,7 @@ int sqlite3changebatch_add(sqlite3_changebatch *p, void *pBuf, int nBuf){ if( rc==SQLITE_OK && bConf ){ rc = SQLITE_CONSTRAINT; } + p->iChangesetId++; return rc; } @@ -442,14 +470,8 @@ void sqlite3changebatch_delete(sqlite3_changebatch *p){ sqlite3changebatch_zero(p); for(pTab=p->pTab; pTab; pTab=pTabNext){ - BatchIndex *pIdx; - BatchIndex *pIdxNext; - for(pIdx=pTab->pIdx; pIdx; pIdx=pIdxNext){ - pIdxNext = pIdx->pNext; - cbFree(pIdx); - } pTabNext = pTab->pNext; - cbFree(pTab); + cbFreeTable(pTab); } cbFree(p); } diff --git a/manifest b/manifest index 4b3e6de352..3cea0f9b42 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings\sin\schangebatch. -D 2016-08-23T18:09:37.916 +C Add\sfurther\stests\sfor\schangebatch.\sAnd\sa\sfix\sto\sprevent\sa\schangeset\sfrom\sconflicting\swith\sitself. +D 2016-08-23T19:02:21.914 F Makefile.in cfd8fb987cd7a6af046daa87daa146d5aad0e088 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc d66d0395c38571aab3804f8db0fa20707ae4609a @@ -281,7 +281,8 @@ F ext/rtree/rtree_util.tcl 06aab2ed5b826545bf215fff90ecb9255a8647ea F ext/rtree/sqlite3rtree.h 9c5777af3d2921c7b4ae4954e8e5697502289d28 F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 -F ext/session/changebatch1.test f3e5462189ebe238b57ddf31f17e5f6cb410f895 +F ext/session/changebatch1.test 9ceaa8f7b2a505933e250fbe6cbc550e4ce1e59d +F ext/session/changebatchfault.test be49c793219bf387ad692a60856b921f0854ad6d F ext/session/changeset.c 4ccbaa4531944c24584bf6a61ba3a39c62b6267a F ext/session/session1.test 98f384736e2bc21ccf5ed81bdadcff4ad863393b F ext/session/session2.test 284de45abae4cc1082bc52012ee81521d5ac58e0 @@ -301,7 +302,7 @@ F ext/session/sessionG.test 01ef705096a9d3984eebdcca79807a211dee1b60 F ext/session/session_common.tcl a1293167d14774b5e728836720497f40fe4ea596 F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7 F ext/session/sessionfault2.test 04aa0bc9aa70ea43d8de82c4f648db4de1e990b0 -F ext/session/sqlite3changebatch.c 72ec2f5c70af4e9e938222a98962bc05b82e9bf4 +F ext/session/sqlite3changebatch.c 4b4fe1d52587e5fdb28930466409712f0e4b619d F ext/session/sqlite3changebatch.h 50a302e4fc535324309607b13a1993bca074758b F ext/session/sqlite3session.c e5591f76aea6058720e04f78ae9e88487eb56c6b F ext/session/sqlite3session.h c772b5440f41af44631891aa7f352e9a44b740ad @@ -1514,7 +1515,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P efa761b2f509844b9212dd20bf0d082c6338e83f -R 7f5bf9af3be1c169a39e0edb328bafbb -U drh -Z e5dc9f2e44b6adaa79d5e6bc2fc1ab5e +P a721a738184d914fcde3f5684099984a9373dff3 +R b3c5ba41110022813f99ffae5c67351c +U dan +Z 78075b3679b308d5ec26925a2eace0fc diff --git a/manifest.uuid b/manifest.uuid index ad7a6d4e5d..96566a509e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a721a738184d914fcde3f5684099984a9373dff3 \ No newline at end of file +506d6ff4b64c72d4ca65f0d15e1fdf8a132556bc \ No newline at end of file From ff8e42e2ca85961bb8e45ee6fe52bba4c66e5b81 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 24 Aug 2016 19:14:59 +0000 Subject: [PATCH 042/113] Add the sqlite3changebatch_db() API. FossilOrigin-Name: bee44ebc532f37e3fe61c18878e0d3db06805190 --- ext/session/sqlite3changebatch.c | 7 +++++++ ext/session/sqlite3changebatch.h | 7 +++++++ manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/ext/session/sqlite3changebatch.c b/ext/session/sqlite3changebatch.c index a31d04ff4e..0490d5f977 100644 --- a/ext/session/sqlite3changebatch.c +++ b/ext/session/sqlite3changebatch.c @@ -476,4 +476,11 @@ void sqlite3changebatch_delete(sqlite3_changebatch *p){ cbFree(p); } +/* +** Return the db handle. +*/ +sqlite3 *sqlite3changebatch_db(sqlite3_changebatch *p){ + return p->db; +} + #endif /* SQLITE_ENABLE_SESSION && SQLITE_ENABLE_PREUPDATE_HOOK */ diff --git a/ext/session/sqlite3changebatch.h b/ext/session/sqlite3changebatch.h index 9afa6c174e..3476629e58 100644 --- a/ext/session/sqlite3changebatch.h +++ b/ext/session/sqlite3changebatch.h @@ -66,6 +66,13 @@ int sqlite3changebatch_add(sqlite3_changebatch*, void *p, int n); */ void sqlite3changebatch_zero(sqlite3_changebatch*); +/* +** Return a copy of the first argument passed to the sqlite3changebatch_new() +** call used to create the changebatch object passed as the only argument +** to this function. +*/ +sqlite3 *sqlite3changebatch_db(sqlite3_changebatch*); + /* ** Delete a changebatch object. */ diff --git a/manifest b/manifest index 3cea0f9b42..1a738945f8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sfurther\stests\sfor\schangebatch.\sAnd\sa\sfix\sto\sprevent\sa\schangeset\sfrom\sconflicting\swith\sitself. -D 2016-08-23T19:02:21.914 +C Add\sthe\ssqlite3changebatch_db()\sAPI. +D 2016-08-24T19:14:59.159 F Makefile.in cfd8fb987cd7a6af046daa87daa146d5aad0e088 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc d66d0395c38571aab3804f8db0fa20707ae4609a @@ -302,8 +302,8 @@ F ext/session/sessionG.test 01ef705096a9d3984eebdcca79807a211dee1b60 F ext/session/session_common.tcl a1293167d14774b5e728836720497f40fe4ea596 F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7 F ext/session/sessionfault2.test 04aa0bc9aa70ea43d8de82c4f648db4de1e990b0 -F ext/session/sqlite3changebatch.c 4b4fe1d52587e5fdb28930466409712f0e4b619d -F ext/session/sqlite3changebatch.h 50a302e4fc535324309607b13a1993bca074758b +F ext/session/sqlite3changebatch.c 96011bdf72ac12ebf707f4d0f0e719e333631605 +F ext/session/sqlite3changebatch.h e72016998c9a22d439ddfd547b69e1ebac810c24 F ext/session/sqlite3session.c e5591f76aea6058720e04f78ae9e88487eb56c6b F ext/session/sqlite3session.h c772b5440f41af44631891aa7f352e9a44b740ad F ext/session/test_session.c 9e6a4313dc94b053edd33f54c3ffc053aeddff45 @@ -1515,7 +1515,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a721a738184d914fcde3f5684099984a9373dff3 -R b3c5ba41110022813f99ffae5c67351c +P 506d6ff4b64c72d4ca65f0d15e1fdf8a132556bc +R 437a725ec959b210c45a517f0a4720a0 U dan -Z 78075b3679b308d5ec26925a2eace0fc +Z 7a3026050d391945a1ada937b36aa9ce diff --git a/manifest.uuid b/manifest.uuid index 96566a509e..08b140baf5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -506d6ff4b64c72d4ca65f0d15e1fdf8a132556bc \ No newline at end of file +bee44ebc532f37e3fe61c18878e0d3db06805190 \ No newline at end of file From 0195d8ef5d7e3dd32819178a567c3a32f2d22698 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 9 Jan 2017 06:53:00 +0000 Subject: [PATCH 043/113] Disable the optimization from [8cb8516d] (omit TableLock instructions for non-sharable databases) on this branch. This branch uses the TableLock instructions to ensure that the db schema is not written from within a BEGIN CONCURRENT transaction. FossilOrigin-Name: c8ca3e0a8d82dbb077551c2d952cb2043f78333b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index d78d211a93..38fa1464ab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Upgrade\sthis\sbranch\sto\s3.16\splus\sthe\svarious\sfixes\sthat\sappeared\safter\sits\nrelease. -D 2017-01-09T06:33:50.719 +C Disable\sthe\soptimization\sfrom\s[8cb8516d]\s(omit\sTableLock\sinstructions\sfor\nnon-sharable\sdatabases)\son\sthis\sbranch.\sThis\sbranch\suses\sthe\sTableLock\ninstructions\sto\sensure\sthat\sthe\sdb\sschema\sis\snot\swritten\sfrom\swithin\sa\sBEGIN\nCONCURRENT\stransaction. +D 2017-01-09T06:53:00.359 F Makefile.in 41bd4cad981487345c4a84081074bcdb876e4b2e F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc b8ca53350ae545e3562403d5da2a69cec79308da @@ -334,7 +334,7 @@ F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca F src/btree.c 5e5bf5079aae45b91e71eb087f3eddd28deafafe F src/btree.h 9306cfe42eed20cf2d0e407172704f5193af26cc F src/btreeInt.h bade42398d4dcadd2263c6d17886e812e2471e87 -F src/build.c efef69bbc7d0729a9b1e6d71f1047d0c5e1cdb5b +F src/build.c 58bd67d6648d6120592605768a7008fd52fb2656 F src/callback.c 2e76147783386374bf01b227f752c81ec872d730 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 9f2296a4e5d26ebf0e0d95a0af4628f1ea694e7a @@ -1548,7 +1548,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d9f8918c5b7b6c8540b3f433142e1b4aa4433885 6696cd1878be4bd44a24841b04163e52d847711e -R 47f5758f699f0ce7270fcc21bb40e26e +P d0e212d08f82dfb5e42a156b3e2bb03dd8e21258 +R e3f8f4a25fa664daafdf2b1037a6c994 U dan -Z 398299ab95e9ac138577a5fdad763428 +Z 5b5ce2ca54ddaa75cd9b42bf54bd493e diff --git a/manifest.uuid b/manifest.uuid index a10503843d..01c64fc58f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d0e212d08f82dfb5e42a156b3e2bb03dd8e21258 \ No newline at end of file +c8ca3e0a8d82dbb077551c2d952cb2043f78333b \ No newline at end of file diff --git a/src/build.c b/src/build.c index e412a44bc1..ea282ee8ea 100644 --- a/src/build.c +++ b/src/build.c @@ -59,8 +59,10 @@ void sqlite3TableLock( TableLock *p; assert( iDb>=0 ); +#ifdef SQLITE_OMIT_CONCURRENT if( iDb==1 ) return; if( !sqlite3BtreeSharable(pParse->db->aDb[iDb].pBt) ) return; +#endif for(i=0; inTableLock; i++){ p = &pToplevel->aTableLock[i]; if( p->iDb==iDb && p->iTab==iTab ){ From fe329a737060c6e9aea2e41f6e3661425b75aa35 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 28 Mar 2017 18:48:43 +0000 Subject: [PATCH 044/113] Version 3.18.0 Release Candidate FossilOrigin-Name: 424a0d380332858ee55bdebc4af3789f74e70a2b3ba1cf29d84b9b4bcf3e2e37 --- manifest | 11 +++++++---- manifest.uuid | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/manifest b/manifest index 65dae1b276..ca56437574 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\snew\ssqlite3_set_last_insert_rowid()\sinterface\sto\sthe\sextension\nloader\sthunk. -D 2017-03-25T19:16:41.259 +C Version\s3.18.0\sRelease\sCandidate +D 2017-03-28T18:48:43.315 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 1faf9f06aadc9284c212dea7bbc7c0dea7e8337f0287c81001eff500912c790a @@ -1569,7 +1569,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 55df410b2cd27dc4c7670bcc1196fa3a0e9e601fc24c42e53d6b0a26ee3e4b45 +P 8469fc0d48d6af0accef9b8a84e08ad2ca32351907510d177b4ca4815c1ea7cb R e1b145e92e118b2bc2de7100fb7561b5 +T *branch * version-3.18 +T *sym-version-3.18 * +T -sym-trunk * U drh -Z e401f4d2ca1590406e5405bb5cd2850e +Z 2998f3cf8a15fbd1f3dc49f1b039f0d5 diff --git a/manifest.uuid b/manifest.uuid index 6ed302dbe3..5619e48c7b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8469fc0d48d6af0accef9b8a84e08ad2ca32351907510d177b4ca4815c1ea7cb \ No newline at end of file +424a0d380332858ee55bdebc4af3789f74e70a2b3ba1cf29d84b9b4bcf3e2e37 \ No newline at end of file From 6dbb452b381e7292f0b20739456e7652277a6fb9 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 18 May 2017 20:47:31 +0000 Subject: [PATCH 045/113] Fix a problem on this branch causing some page-level read-locks to be omitted. FossilOrigin-Name: 0eed152162b4721f7aaba8b480426476978a869e9578f100fca7b1d32942fe1a --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/pager.c | 1 + test/concurrent.test | 30 ++++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 9f8c231968..cf8e9ad002 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sthe\slatest\schanges\sfrom\strunk. -D 2017-05-15T17:34:23.124 +C Fix\sa\sproblem\son\sthis\sbranch\scausing\ssome\spage-level\sread-locks\sto\sbe\somitted. +D 2017-05-18T20:47:31.273 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc @@ -394,7 +394,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 30e2c43e4955db990e5b5a81e901f8aa74cc8820 F src/os_win.c 2a6c73eef01c51a048cc4ddccd57f981afbec18a F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c d82c877615ead80deccac6c7c59f7a875d7e3d7f1ff5652bbc74503d0e05f6d0 +F src/pager.c a26fa53c831f1f679352a0f1038933443f5ea36428bebb5e37e651fd98ad46a1 F src/pager.h 5e7b4e5afdcbdf558c211f27786672b3d2536003d0fb6c4888addb500c826e15 F src/parse.y 21660e5224d1e1635a4ad45ad4365c8f67153b8081b7a11e35629844ecb48ab0 F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870 @@ -609,7 +609,7 @@ F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151eca F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 08948a4809d22817e0e5de89c7c0a8bd90cb551b F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 -F test/concurrent.test 634b6a88f1942f5d68cc89d4d5efa2b11ba7913c +F test/concurrent.test 3eb5e6a911dc6ff72e3a679f563e683b436f6c701e6e1d6050173df2b8448d6b F test/concurrent2.test 77d655c6af93e77803b5c926555a838bb21f922f F test/concurrent3.test 0a5f7e3036d1eccf0782d7153ac21f5f222e9468 F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db @@ -1589,7 +1589,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 785c37d9dbdba9f3deedecbdd72f6761428ebfb58e9b9393b9ca4feab3f66f02 bb0d9281588b8cc24bf2f1f10d0c56277004226adaa2ce5037782503b283b45d -R 2209c7d58b85878752589360dcc54b3d -U drh -Z c0810d00013569d18eac37214e4c8809 +P 14ea84003600ada6f4605e47028cb72fe621a14bcce3637ad48b1512dcce41cd +R e81b507f65d4df5c681c42ea29f80e7d +U dan +Z 6bc66160d6824ab3a8c6e57fa6120412 diff --git a/manifest.uuid b/manifest.uuid index 6e8c4b9c4b..72434a6de3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -14ea84003600ada6f4605e47028cb72fe621a14bcce3637ad48b1512dcce41cd \ No newline at end of file +0eed152162b4721f7aaba8b480426476978a869e9578f100fca7b1d32942fe1a \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 253ca6ad4d..0d26c8d652 100644 --- a/src/pager.c +++ b/src/pager.c @@ -1795,6 +1795,7 @@ int sqlite3PagerBeginConcurrent(Pager *pPager){ int rc = SQLITE_OK; if( pPager->pAllRead==0 ){ pPager->pAllRead = sqlite3BitvecCreate(pPager->dbSize); + pPager->dbOrigSize = pPager->dbSize; if( pPager->pAllRead==0 ){ rc = SQLITE_NOMEM; } diff --git a/test/concurrent.test b/test/concurrent.test index 4e62d9e33f..92a9879ba8 100644 --- a/test/concurrent.test +++ b/test/concurrent.test @@ -526,5 +526,35 @@ do_multiclient_test tn { } {} } +do_multiclient_test tn { + do_test 6.$tn.1 { + sql1 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(a INTEGER PRIMARY KEY, b); + CREATE TABLE t2(a INTEGER PRIMARY KEY, b); + INSERT INTO t1 VALUES(1, 'one'); + INSERT INTO t2 VALUES(2, 'two'); + } + } {wal} + + do_test 6.$tn.2 { + sql2 { + BEGIN CONCURRENT; + SELECT * FROM t2; + INSERT INTO t1 VALUES(3, 'three'); + } + } {2 two} + + do_test 6.$tn.3 { + sql1 { + INSERT INTO t2 VALUES(3, 'three'); + } + } {} + + do_test 6.$tn.2 { + list [catch { sql2 { COMMIT } } msg] $msg + } {1 {database is locked}} +} + finish_test From 55b36d5c070d46171a7cdd38156c8050ec99ebca Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 19 May 2017 19:57:15 +0000 Subject: [PATCH 046/113] Invoke sqlite3_log() in response to irregularities surrounding the Pager.pAllRead bit-vector. FossilOrigin-Name: 9527089b7aa3695cd577f31b263b4777e9bd62dbbc1bd3af892c570e52e8c3a1 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/bitvec.c | 7 ++++++- src/pager.c | 17 +++++++++++++++++ 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index cf8e9ad002..779e15b1f4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\son\sthis\sbranch\scausing\ssome\spage-level\sread-locks\sto\sbe\somitted. -D 2017-05-18T20:47:31.273 +C Invoke\ssqlite3_log()\sin\sresponse\sto\sirregularities\ssurrounding\sthe\nPager.pAllRead\sbit-vector. +D 2017-05-19T19:57:15.749 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc @@ -348,7 +348,7 @@ F src/analyze.c 0d0ccf7520a201d8747ea2f02c92c26e26f801bc161f714f27b9f7630dde0421 F src/attach.c 8c476f8bd5d2afe11d925f890d30e527e5b0ce43 F src/auth.c 79f96c6f33bf0e5da8d1c282cee5ebb1852bb8a6ccca3e485d7c459b035d9c3c F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b -F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 +F src/bitvec.c fc0edcc2000f7d6faea86adcf9c2b8516882eb5aa2fc821fd2fd264e2cefde95 F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca F src/btree.c b8ffd067e78704a8bf81b83c60a23987a46dac9aca0c08c3959482dfae02d197 F src/btree.h 14e99cc2b666beb60322173c761d16b668ec2e07c18bbb74e8a49fe85946f8a0 @@ -394,7 +394,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 30e2c43e4955db990e5b5a81e901f8aa74cc8820 F src/os_win.c 2a6c73eef01c51a048cc4ddccd57f981afbec18a F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c a26fa53c831f1f679352a0f1038933443f5ea36428bebb5e37e651fd98ad46a1 +F src/pager.c ba57b91a11790725f53238c6e3f38734a296219f2cab26e0df764b7fb43c952e F src/pager.h 5e7b4e5afdcbdf558c211f27786672b3d2536003d0fb6c4888addb500c826e15 F src/parse.y 21660e5224d1e1635a4ad45ad4365c8f67153b8081b7a11e35629844ecb48ab0 F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870 @@ -1589,7 +1589,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 14ea84003600ada6f4605e47028cb72fe621a14bcce3637ad48b1512dcce41cd -R e81b507f65d4df5c681c42ea29f80e7d +P 0eed152162b4721f7aaba8b480426476978a869e9578f100fca7b1d32942fe1a +R dfb5691b0d7dbb9b1f618a1ddfa439f1 U dan -Z 6bc66160d6824ab3a8c6e57fa6120412 +Z 2e92764e6404f57fc047755474f473c5 diff --git a/manifest.uuid b/manifest.uuid index 72434a6de3..e02de0443e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0eed152162b4721f7aaba8b480426476978a869e9578f100fca7b1d32942fe1a \ No newline at end of file +9527089b7aa3695cd577f31b263b4777e9bd62dbbc1bd3af892c570e52e8c3a1 \ No newline at end of file diff --git a/src/bitvec.c b/src/bitvec.c index bd4a09429b..ae9c7f978d 100644 --- a/src/bitvec.c +++ b/src/bitvec.c @@ -170,7 +170,12 @@ int sqlite3BitvecSet(Bitvec *p, u32 i){ u32 h; if( p==0 ) return SQLITE_OK; assert( i>0 ); - assert( i<=p->iSize ); + /* assert( i<=p->iSize ); */ + if( i>p->iSize ){ + sqlite3_log(SQLITE_ERROR, + "Bitvec: setting bit %d of bitvec size %d\n", (int)i, (int)p->iSize + ); + } i--; while((p->iSize > BITVEC_NBIT) && p->iDivisor) { u32 bin = i/p->iDivisor; diff --git a/src/pager.c b/src/pager.c index 0d26c8d652..8c17a001bd 100644 --- a/src/pager.c +++ b/src/pager.c @@ -5386,6 +5386,13 @@ int sqlite3PagerSharedLock(Pager *pPager){ }else{ pPager->eState = PAGER_READER; pPager->hasHeldSharedLock = 1; +#ifndef SQLITE_OMIT_CONCURRENT + if( pPager->pAllRead ){ + sqlite3_log(SQLITE_ERROR, + "Bitvec: pAllRead already allocated in PagerSharedLock()" + ); + } +#endif } return rc; } @@ -5884,6 +5891,16 @@ int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){ ** file as well as into the page cache. Which would be incorrect in ** WAL mode. */ +#ifndef SQLITE_OMIT_CONCURRENT + if( pPager->pAllRead + && pPager->dbSize!=sqlite3BitvecSize(pPager->pAllRead) + ){ + sqlite3_log(SQLITE_ERROR, + "Bitvec: pAllRead size is %d, dbOrigSize set to %d", + (int)sqlite3BitvecSize(pPager->pAllRead), pPager->dbSize + ); + } +#endif pPager->eState = PAGER_WRITER_LOCKED; pPager->dbHintSize = pPager->dbSize; pPager->dbFileSize = pPager->dbSize; From aa59505ae85ee929b2d80d13e54ea17300f64e57 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 23 May 2017 19:23:45 +0000 Subject: [PATCH 047/113] Add experimental new API sqlite3_wal_info(). FossilOrigin-Name: 5b9d498f6e9de6ee2ab86370c02c28a2a8b83d717b96d23b1fc52107677e45a2 --- manifest | 26 +++++++++++++------------- manifest.uuid | 2 +- src/main.c | 31 +++++++++++++++++++++++++++++++ src/pager.c | 5 +++++ src/pager.h | 2 ++ src/sqlite.h.in | 25 +++++++++++++++++++++++++ src/test1.c | 36 ++++++++++++++++++++++++++++++++++++ src/wal.c | 16 ++++++++++++++++ src/wal.h | 3 +++ test/concurrent2.test | 29 +++++++++++++++++++++++++++++ 10 files changed, 161 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 779e15b1f4..8d9ba32435 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Invoke\ssqlite3_log()\sin\sresponse\sto\sirregularities\ssurrounding\sthe\nPager.pAllRead\sbit-vector. -D 2017-05-19T19:57:15.749 +C Add\sexperimental\snew\sAPI\ssqlite3_wal_info(). +D 2017-05-23T19:23:45.315 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc @@ -372,7 +372,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c d4bb3a135948553d18cf992f76f7ed7b18aa0327f250607b5a6671e55d9947d5 F src/legacy.c e88ed13c2d531decde75d42c2e35623fb9ce3cb0 F src/loadext.c a72909474dadce771d3669bf84bf689424f6f87d471fee898589c3ef9b2acfd9 -F src/main.c 1e448d204045c1dcd604853639d9d8fe253aa9ec302a2f1ffd2e22752fd6b708 +F src/main.c 5559b8e5aa6a7222d3dff52ae377b48e4365a7a4e3ea21491fc6c508a1fb838a F src/malloc.c e20bb2b48abec52d3faf01cce12e8b4f95973755fafec98d45162dfdab111978 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -394,8 +394,8 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 30e2c43e4955db990e5b5a81e901f8aa74cc8820 F src/os_win.c 2a6c73eef01c51a048cc4ddccd57f981afbec18a F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c ba57b91a11790725f53238c6e3f38734a296219f2cab26e0df764b7fb43c952e -F src/pager.h 5e7b4e5afdcbdf558c211f27786672b3d2536003d0fb6c4888addb500c826e15 +F src/pager.c babddba9a8aa02feae4544175d4eeaee65321c263d78cf3ff3e0670df41bc837 +F src/pager.h 1afb4b777b3a297d56dc6cafc4f17d47d92522e9d2cb106839ea0fa0d6d489c7 F src/parse.y 21660e5224d1e1635a4ad45ad4365c8f67153b8081b7a11e35629844ecb48ab0 F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870 F src/pcache.h 2cedcd8407eb23017d92790b112186886e179490 @@ -409,7 +409,7 @@ F src/resolve.c 3e518b962d932a997fae373366880fc028c75706 F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac F src/select.c d74b1cde1d9ca6d08bec50b60a5be19440273646bc8ae16648d748c38161d5b7 F src/shell.c a37d96b20b3644d0eb905df5aa7a0fcf9f6e73c15898337230c760a24a8df794 -F src/sqlite.h.in 8dd468837a4f6d76713e3a4cc65bea48095009038593d41040ab46c1b351197f +F src/sqlite.h.in 6eae6c87571d142f5aee27d49b13b5aec06bae40c706494e8565a64ab68b03f5 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 58fd0676d3111d02e62e5a35992a7d3da5d3f88753acc174f2d37b774fbbdd28 F src/sqliteInt.h b7e590bc90ebee66cf79fb41312a7cdbce881b7db316d934c159294ff6087fd5 @@ -417,7 +417,7 @@ F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6 F src/status.c a9e66593dfb28a9e746cba7153f84d49c1ddc4b1 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c c8cf60d0c5411d5e70e7c136470d29dbe760d250f55198b71682c67086524e4a -F src/test1.c c99f0442918a7a5d5b68a95d6024c211989e6c782c15ced5a558994baaf76a5e +F src/test1.c 108f95744b7c949ac806ad67a4be5d9e283bbe2011639a1b7ca512a1c52e908a F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c d03f5b5da9a2410b7a91c64b0d3306ed28ab6fee F src/test4.c 18ec393bb4d0ad1de729f0b94da7267270f3d8e6 @@ -485,8 +485,8 @@ F src/vdbesort.c e72fe02a2121386ba767ede8942e9450878b8fc873abf3d1b6824485f092570 F src/vdbetrace.c 41963d5376f0349842b5fc4aaaaacd7d9cdc0834 F src/vtab.c 35b9bdc2b41de32a417141d12097bcc4e29a77ed7cdb8f836d1d2305d946b61b F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 2858e71b30d521c80949fa10ed6b116367865594 -F src/wal.h 8659519a248ef0f33e575b20ab04211cebe1f430 +F src/wal.c 0c4faf368f51abb3f077fa5c175920b73b6a07584688a287c8d77296b6af582e +F src/wal.h 79378c5cd2127f32060d4952d827a7abdd490f8f9e5cbb14a4c39657ed99ad15 F src/walker.c b71a992b413b3a022572eccf29ef4b4890223791 F src/where.c c6352f15be5031907c68bcbde96cad1a6da20e9f4051d10168a59235de9a8566 F src/whereInt.h 2a4b634d63ce488b46d4b0da8f2eaa8f9aeab202bc25ef76f007de5e3fba1f20 @@ -610,7 +610,7 @@ F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 08948a4809d22817e0e5de89c7c0a8bd90cb551b F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 F test/concurrent.test 3eb5e6a911dc6ff72e3a679f563e683b436f6c701e6e1d6050173df2b8448d6b -F test/concurrent2.test 77d655c6af93e77803b5c926555a838bb21f922f +F test/concurrent2.test ba7e166187289ee23089fff4f9527bc36f7cc324196cc8e84d31eae2769e678f F test/concurrent3.test 0a5f7e3036d1eccf0782d7153ac21f5f222e9468 F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c @@ -1589,7 +1589,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0eed152162b4721f7aaba8b480426476978a869e9578f100fca7b1d32942fe1a -R dfb5691b0d7dbb9b1f618a1ddfa439f1 +P 9527089b7aa3695cd577f31b263b4777e9bd62dbbc1bd3af892c570e52e8c3a1 +R 37ee232af322d70fdc5a9c9d4ab6870b U dan -Z 2e92764e6404f57fc047755474f473c5 +Z 786d45f8ca40d966271275a2c1f1d5ca diff --git a/manifest.uuid b/manifest.uuid index e02de0443e..eb3f0245f3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9527089b7aa3695cd577f31b263b4777e9bd62dbbc1bd3af892c570e52e8c3a1 \ No newline at end of file +5b9d498f6e9de6ee2ab86370c02c28a2a8b83d717b96d23b1fc52107677e45a2 \ No newline at end of file diff --git a/src/main.c b/src/main.c index 32d00087f5..57172a4a2e 100644 --- a/src/main.c +++ b/src/main.c @@ -4095,3 +4095,34 @@ void sqlite3_snapshot_free(sqlite3_snapshot *pSnapshot){ sqlite3_free(pSnapshot); } #endif /* SQLITE_ENABLE_SNAPSHOT */ + +SQLITE_EXPERIMENTAL int sqlite3_wal_info( + sqlite3 *db, const char *zDb, + unsigned int *pnPrior, unsigned int *pnFrame +){ + int rc = SQLITE_OK; + +#ifndef SQLITE_OMIT_WAL + Btree *pBt; + int iDb; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + + sqlite3_mutex_enter(db->mutex); + iDb = sqlite3FindDbName(db, zDb); + if( iDb<0 ){ + return SQLITE_ERROR; + } + pBt = db->aDb[iDb].pBt; + rc = sqlite3PagerWalInfo(sqlite3BtreePager(pBt), pnPrior, pnFrame); + sqlite3_mutex_leave(db->mutex); +#endif /* SQLITE_OMIT_WAL */ + + return rc; +} + + diff --git a/src/pager.c b/src/pager.c index 8c17a001bd..4b0d5bcba6 100644 --- a/src/pager.c +++ b/src/pager.c @@ -7707,6 +7707,11 @@ int sqlite3PagerSnapshotRecover(Pager *pPager){ return rc; } #endif /* SQLITE_ENABLE_SNAPSHOT */ + +int sqlite3PagerWalInfo(Pager *pPager, u32 *pnPrior, u32 *pnFrame){ + return sqlite3WalInfo(pPager->pWal, pnPrior, pnFrame); +} + #endif /* !SQLITE_OMIT_WAL */ #ifdef SQLITE_ENABLE_ZIPVFS diff --git a/src/pager.h b/src/pager.h index 8bf2caa6f5..aa98bce95d 100644 --- a/src/pager.h +++ b/src/pager.h @@ -231,6 +231,8 @@ int sqlite3PagerIsWal(Pager*); int sqlite3PagerIswriteable(DbPage*); +int sqlite3PagerWalInfo(Pager*, u32 *pnPrior, u32 *pnFrame); + #if defined(SQLITE_HAS_CODEC) && !defined(SQLITE_OMIT_WAL) void *sqlite3PagerCodec(DbPage *); #endif diff --git a/src/sqlite.h.in b/src/sqlite.h.in index d836e97058..df228b2c9a 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -8495,6 +8495,31 @@ SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp( */ SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb); +/* +** CAPI3REF: Wal related information regarding the most recent COMMIT +** EXPERIMENTAL +** +** This function reports on the state of the wal file (if any) for database +** zDb, which should be "main", "temp", or the name of the attached database. +** Its results - the values written to the output parameters - are only +** defined if the most recent SQL command on the connection was a successful +** COMMIT that wrote data to wal-mode database zDb. +** +** Assuming the above conditions are met, output parameter (*pnFrame) is set +** to the total number of frames in the wal file. Parameter (*pnPrior) is +** set to the number of frames that were present in the wal file before the +** most recent transaction was committed. So that the number of frames written +** by the most recent transaction is (*pnFrame)-(*pnPrior). +** +** If successful, SQLITE_OK is returned. Otherwise, an SQLite error code. It +** is not an error if this function is called at a time when the results +** are undefined. +*/ +SQLITE_EXPERIMENTAL int sqlite3_wal_info( + sqlite3 *db, const char *zDb, + unsigned int *pnPrior, unsigned int *pnFrame +); + /* ** Undo the hack that converts floating point types to integer for ** builds on processors without floating point support. diff --git a/src/test1.c b/src/test1.c index 87b255c9e9..f648f0559a 100644 --- a/src/test1.c +++ b/src/test1.c @@ -7369,6 +7369,41 @@ static int SQLITE_TCLAPI test_dbconfig_maindbname_icecube( } } +/* +** Usage: sqlite3_wal_info DB DBNAME +*/ +static int SQLITE_TCLAPI test_wal_info( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + int rc; + sqlite3 *db; + char *zName; + unsigned int nPrior; + unsigned int nFrame; + + if( objc!=3 ){ + Tcl_WrongNumArgs(interp, 1, objv, "DB DBNAME"); + return TCL_ERROR; + } + if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; + zName = Tcl_GetString(objv[2]); + + rc = sqlite3_wal_info(db, zName, &nPrior, &nFrame); + if( rc!=SQLITE_OK ){ + Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1)); + return TCL_ERROR; + }else{ + Tcl_Obj *pNew = Tcl_NewObj(); + Tcl_ListObjAppendElement(interp, pNew, Tcl_NewWideIntObj((i64)nPrior)); + Tcl_ListObjAppendElement(interp, pNew, Tcl_NewWideIntObj((i64)nFrame)); + Tcl_SetObjResult(interp, pNew); + } + return TCL_OK; +} + /* ** Register commands with the TCL interpreter. */ @@ -7639,6 +7674,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ { "sqlite3_snapshot_cmp_blob", test_snapshot_cmp_blob, 0 }, #endif { "sqlite3_delete_database", test_delete_database, 0 }, + { "sqlite3_wal_info", test_wal_info, 0 }, }; static int bitmask_size = sizeof(Bitmask)*8; static int longdouble_size = sizeof(LONGDOUBLE_TYPE); diff --git a/src/wal.c b/src/wal.c index c56b1365cb..73b5f7ad82 100644 --- a/src/wal.c +++ b/src/wal.c @@ -446,6 +446,7 @@ struct Wal { WalIndexHdr hdr; /* Wal-index header for current transaction */ u32 minFrame; /* Ignore wal frames before this one */ u32 iReCksum; /* On commit, recalculate checksums from here */ + u32 nPriorFrame; /* For sqlite3WalInfo() */ const char *zWalName; /* Name of WAL file */ u32 nCkpt; /* Checkpoint sequence counter in the wal-header */ #ifdef SQLITE_DEBUG @@ -2507,6 +2508,7 @@ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ testcase( rc==SQLITE_PROTOCOL ); testcase( rc==SQLITE_OK ); + pWal->nPriorFrame = pWal->hdr.mxFrame; #ifdef SQLITE_ENABLE_SNAPSHOT if( rc==SQLITE_OK ){ if( pSnapshot && memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){ @@ -2948,6 +2950,7 @@ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPage1, Bitvec *pAllRead){ } } + pWal->nPriorFrame = pWal->hdr.mxFrame; return rc; } @@ -3118,6 +3121,7 @@ static int walRestartLog(Wal *pWal){ ** to handle if this transaction is rolled back. */ walRestartHdr(pWal, salt1); walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); + pWal->nPriorFrame = 0; }else if( rc!=SQLITE_BUSY ){ return rc; } @@ -3759,4 +3763,16 @@ sqlite3_file *sqlite3WalFile(Wal *pWal){ return pWal->pWalFd; } +/* +** Return the values required by sqlite3_wal_info(). +*/ +int sqlite3WalInfo(Wal *pWal, u32 *pnPrior, u32 *pnFrame){ + int rc = SQLITE_OK; + if( pWal ){ + *pnFrame = pWal->hdr.mxFrame; + *pnPrior = pWal->nPriorFrame; + } + return rc; +} + #endif /* #ifndef SQLITE_OMIT_WAL */ diff --git a/src/wal.h b/src/wal.h index 5243bca162..b636d57a0a 100644 --- a/src/wal.h +++ b/src/wal.h @@ -153,5 +153,8 @@ int sqlite3WalFramesize(Wal *pWal); /* Return the sqlite3_file object for the WAL file */ sqlite3_file *sqlite3WalFile(Wal *pWal); +/* sqlite3_wal_info() data */ +int sqlite3WalInfo(Wal *pWal, u32 *pnPrior, u32 *pnFrame); + #endif /* ifndef SQLITE_OMIT_WAL */ #endif /* SQLITE_WAL_H */ diff --git a/test/concurrent2.test b/test/concurrent2.test index e0600ff9c3..6a9a40d16a 100644 --- a/test/concurrent2.test +++ b/test/concurrent2.test @@ -548,5 +548,34 @@ do_multiclient_test tn { } {} } +do_multiclient_test tn { + do_test 11.$tn.1 { + sql1 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(a); + } + } {wal} + + do_test 11.$tn.2 { + code1 { sqlite3_wal_info db main } + } {0 2} + + do_test 11.$tn.3 { + sql1 { INSERT INTO t1 VALUES(1) } + code1 { sqlite3_wal_info db main } + } {2 3} + + do_test 11.$tn.4 { + sql2 { INSERT INTO t1 VALUES(2) } + code2 { sqlite3_wal_info db2 main } + } {3 4} + + do_test 11.$tn.5 { + sql1 { PRAGMA wal_checkpoint } + sql2 { INSERT INTO t1 VALUES(3) } + code2 { sqlite3_wal_info db2 main } + } {0 1} +} + finish_test From e3c3be85111b5a9e1b3891e3b3baf18576629195 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 25 May 2017 21:02:00 +0000 Subject: [PATCH 048/113] Fix a problem with the deferred page allocation on this branch that could occur when the database file is just slightly smaller than the PENDING_BYTE page offset. FossilOrigin-Name: 47a7dd92355ffd74645cf8da8186d5799c05a95907877a09c28de41135deeede --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/bitvec.c | 2 +- src/btree.c | 3 ++- test/concurrent2.test | 42 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 54 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 8d9ba32435..ad41d84290 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sexperimental\snew\sAPI\ssqlite3_wal_info(). -D 2017-05-23T19:23:45.315 +C Fix\sa\sproblem\swith\sthe\sdeferred\spage\sallocation\son\sthis\sbranch\sthat\scould\noccur\swhen\sthe\sdatabase\sfile\sis\sjust\sslightly\ssmaller\sthan\sthe\sPENDING_BYTE\npage\soffset. +D 2017-05-25T21:02:00.680 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc @@ -348,9 +348,9 @@ F src/analyze.c 0d0ccf7520a201d8747ea2f02c92c26e26f801bc161f714f27b9f7630dde0421 F src/attach.c 8c476f8bd5d2afe11d925f890d30e527e5b0ce43 F src/auth.c 79f96c6f33bf0e5da8d1c282cee5ebb1852bb8a6ccca3e485d7c459b035d9c3c F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b -F src/bitvec.c fc0edcc2000f7d6faea86adcf9c2b8516882eb5aa2fc821fd2fd264e2cefde95 +F src/bitvec.c e65c3d8ce932b4a38795574b549db6607b6140a22b82e783fa1ab57d0e42a49c F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca -F src/btree.c b8ffd067e78704a8bf81b83c60a23987a46dac9aca0c08c3959482dfae02d197 +F src/btree.c ffb001f02b4c65984068e50cbb308bb833c3d4d6280bf606e43d3eebf8d740df F src/btree.h 14e99cc2b666beb60322173c761d16b668ec2e07c18bbb74e8a49fe85946f8a0 F src/btreeInt.h 42c3e3d9534aed0b99ee68678b0311c33134c7c015037a319900eddd148584d6 F src/build.c ba3f389668754c407805bbc5f8ab140f063ba6b04a6a86f63006b63b3c7319a8 @@ -610,7 +610,7 @@ F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 08948a4809d22817e0e5de89c7c0a8bd90cb551b F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 F test/concurrent.test 3eb5e6a911dc6ff72e3a679f563e683b436f6c701e6e1d6050173df2b8448d6b -F test/concurrent2.test ba7e166187289ee23089fff4f9527bc36f7cc324196cc8e84d31eae2769e678f +F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8 F test/concurrent3.test 0a5f7e3036d1eccf0782d7153ac21f5f222e9468 F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c @@ -1589,7 +1589,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9527089b7aa3695cd577f31b263b4777e9bd62dbbc1bd3af892c570e52e8c3a1 -R 37ee232af322d70fdc5a9c9d4ab6870b +P 5b9d498f6e9de6ee2ab86370c02c28a2a8b83d717b96d23b1fc52107677e45a2 +R 707b1529cc7d8b55115b4608864612c4 U dan -Z 786d45f8ca40d966271275a2c1f1d5ca +Z fe29adbc1160b9b71ae2cc3a046207ff diff --git a/manifest.uuid b/manifest.uuid index eb3f0245f3..119515c7c8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5b9d498f6e9de6ee2ab86370c02c28a2a8b83d717b96d23b1fc52107677e45a2 \ No newline at end of file +47a7dd92355ffd74645cf8da8186d5799c05a95907877a09c28de41135deeede \ No newline at end of file diff --git a/src/bitvec.c b/src/bitvec.c index ae9c7f978d..a3e67b8f4c 100644 --- a/src/bitvec.c +++ b/src/bitvec.c @@ -170,7 +170,7 @@ int sqlite3BitvecSet(Bitvec *p, u32 i){ u32 h; if( p==0 ) return SQLITE_OK; assert( i>0 ); - /* assert( i<=p->iSize ); */ + assert( i<=p->iSize ); if( i>p->iSize ){ sqlite3_log(SQLITE_ERROR, "Bitvec: setting bit %d of bitvec size %d\n", (int)i, (int)p->iSize diff --git a/src/btree.c b/src/btree.c index b289b3f6c6..fa779386ae 100644 --- a/src/btree.c +++ b/src/btree.c @@ -4129,10 +4129,11 @@ static int btreeFixUnlocked(Btree *p){ assert( nCurrent!=PENDING_BYTE_PAGE(pBt) ); sqlite3PagerSetDbsize(pBt->pPager, nCurrent); nFree = get4byte(&p1[36]); - nFin = MAX(nCurrent-nFree, nHPage); + nFin = nCurrent-nFree; if( nCurrent>PENDING_BYTE_PAGE(pBt) && nFin<=PENDING_BYTE_PAGE(pBt) ){ nFin--; } + nFin = MAX(nFin, nHPage); rc = btreeRelocateRange(pBt, nFin+1, nCurrent, 0); } diff --git a/test/concurrent2.test b/test/concurrent2.test index 6a9a40d16a..65f0022ab2 100644 --- a/test/concurrent2.test +++ b/test/concurrent2.test @@ -577,5 +577,47 @@ do_multiclient_test tn { } {0 1} } +reset_db +do_execsql_test 12.0 { + PRAGMA journal_mode = wal; + CREATE TABLE tx(a INTEGER PRIMARY KEY, b); +} {wal} +do_test 12.1 { + for {set i 0} {$i < 50} {incr i} { + execsql { + BEGIN CONCURRENT; + INSERT INTO tx(b) VALUES( randomblob( 1200 ) ); + COMMIT; + } + } + execsql { PRAGMA page_size } +} {1024} +do_execsql_test 12.2 { + DELETE FROM tx; +} +do_test 12.3 { + for {set i 0} {$i < 50} {incr i} { + execsql { + BEGIN CONCURRENT; + INSERT INTO tx(b) VALUES( randomblob( 1200 ) ); + COMMIT; + } + } + execsql { PRAGMA page_size } +} {1024} +do_execsql_test 12.4 { + DELETE FROM tx; +} +do_test 12.5 { + execsql { BEGIN CONCURRENT } + for {set i 0} {$i < 5000} {incr i} { + execsql { + INSERT INTO tx(b) VALUES( randomblob( 1200 ) ); + } + } + execsql { COMMIT } + execsql { PRAGMA page_size } +} {1024} + finish_test From 606f7184801e7e913d712e9a4645b326f3264b5e Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 26 May 2017 16:15:05 +0000 Subject: [PATCH 049/113] Fix a problem with deferred page allocation in transactions that revert page allocations by savepoint rollbacks. FossilOrigin-Name: a4a3bbe64690856403642352f36e664a5a7fba686463a63446c6ada99df4e89f --- manifest | 13 ++++++------ manifest.uuid | 2 +- src/btree.c | 3 ++- test/concurrent4.test | 48 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 test/concurrent4.test diff --git a/manifest b/manifest index ad41d84290..bb07f60ea8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sthe\sdeferred\spage\sallocation\son\sthis\sbranch\sthat\scould\noccur\swhen\sthe\sdatabase\sfile\sis\sjust\sslightly\ssmaller\sthan\sthe\sPENDING_BYTE\npage\soffset. -D 2017-05-25T21:02:00.680 +C Fix\sa\sproblem\swith\sdeferred\spage\sallocation\sin\stransactions\sthat\srevert\spage\nallocations\sby\ssavepoint\srollbacks. +D 2017-05-26T16:15:05.191 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc @@ -350,7 +350,7 @@ F src/auth.c 79f96c6f33bf0e5da8d1c282cee5ebb1852bb8a6ccca3e485d7c459b035d9c3c F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b F src/bitvec.c e65c3d8ce932b4a38795574b549db6607b6140a22b82e783fa1ab57d0e42a49c F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca -F src/btree.c ffb001f02b4c65984068e50cbb308bb833c3d4d6280bf606e43d3eebf8d740df +F src/btree.c ca942fd75c1b791bd3fdf647e283473acf63e97d2252077216cdc1d56cb3a25e F src/btree.h 14e99cc2b666beb60322173c761d16b668ec2e07c18bbb74e8a49fe85946f8a0 F src/btreeInt.h 42c3e3d9534aed0b99ee68678b0311c33134c7c015037a319900eddd148584d6 F src/build.c ba3f389668754c407805bbc5f8ab140f063ba6b04a6a86f63006b63b3c7319a8 @@ -612,6 +612,7 @@ F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 F test/concurrent.test 3eb5e6a911dc6ff72e3a679f563e683b436f6c701e6e1d6050173df2b8448d6b F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8 F test/concurrent3.test 0a5f7e3036d1eccf0782d7153ac21f5f222e9468 +F test/concurrent4.test d1b808b0c65f8a6368da1ca30bab9e25b0851f9dc529ffab761ba8c9a42d2943 F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9 @@ -1589,7 +1590,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5b9d498f6e9de6ee2ab86370c02c28a2a8b83d717b96d23b1fc52107677e45a2 -R 707b1529cc7d8b55115b4608864612c4 +P 47a7dd92355ffd74645cf8da8186d5799c05a95907877a09c28de41135deeede +R 09d4e4c80f127f9ecf740a4309c9fec3 U dan -Z fe29adbc1160b9b71ae2cc3a046207ff +Z bd7d66ea928950ff2ef1b7b7ec07e968 diff --git a/manifest.uuid b/manifest.uuid index 119515c7c8..cea7e0cc0d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -47a7dd92355ffd74645cf8da8186d5799c05a95907877a09c28de41135deeede \ No newline at end of file +a4a3bbe64690856403642352f36e664a5a7fba686463a63446c6ada99df4e89f \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index fa779386ae..af57d4148e 100644 --- a/src/btree.c +++ b/src/btree.c @@ -522,6 +522,7 @@ static int btreePtrmapStore( pMap->aRollback[pMap->nRollback].pgno = pgno; pMap->aRollback[pMap->nRollback].parent = pMap->aPtr[iEntry].parent; pMap->aRollback[pMap->nRollback].eType = pMap->aPtr[iEntry].eType; + pMap->nRollback++; } /* Update the aPtr[] array */ @@ -538,7 +539,7 @@ static int btreePtrmapStore( */ static int btreePtrmapBegin(BtShared *pBt, int nSvpt){ BtreePtrmap *pMap = pBt->pMap; - if( pMap && nSvptnSvpt ){ + if( pMap && nSvpt>pMap->nSvpt ){ int i; if( nSvpt>=pMap->nSvptAlloc ){ int nNew = pMap->nSvptAlloc ? pMap->nSvptAlloc*2 : 16; diff --git a/test/concurrent4.test b/test/concurrent4.test new file mode 100644 index 0000000000..d129eaf7ac --- /dev/null +++ b/test/concurrent4.test @@ -0,0 +1,48 @@ +# 2017 May 26 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# Miscellaneous tests for transactions started with BEGIN CONCURRENT. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/lock_common.tcl +source $testdir/wal_common.tcl +set ::testprefix concurrent4 + +ifcapable !concurrent { + finish_test + return +} + +do_execsql_test 1.0 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(x PRIMARY KEY, y UNIQUE); + WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100) + INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s; + DELETE FROM t1 WHERE rowid<2; +} {wal} + +do_execsql_test 1.1 { + BEGIN CONCURRENT; + INSERT INTO t1(rowid, x, y) VALUES(1000, randomblob(3000), randomblob(3000)); + SAVEPOINT abc; + DELETE FROM t1 WHERE rowid = 1000; +} + +do_execsql_test 1.2 { ROLLBACK TO abc } +do_execsql_test 1.3 { COMMIT } +do_execsql_test 1.4 { PRAGMA integrity_check } {ok} + + + +finish_test + From 7037787d303d6c26b74e6f62e317dc86d7381618 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 26 May 2017 16:51:15 +0000 Subject: [PATCH 050/113] Add extra test cases for deferred page allocation. FossilOrigin-Name: 9df0195780306a26709e87daabf9d426856aebf2082060b98818f2d48c7472ec --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/concurrent4.test | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index bb07f60ea8..cb5622a88f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sdeferred\spage\sallocation\sin\stransactions\sthat\srevert\spage\nallocations\sby\ssavepoint\srollbacks. -D 2017-05-26T16:15:05.191 +C Add\sextra\stest\scases\sfor\sdeferred\spage\sallocation. +D 2017-05-26T16:51:15.019 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc @@ -612,7 +612,7 @@ F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 F test/concurrent.test 3eb5e6a911dc6ff72e3a679f563e683b436f6c701e6e1d6050173df2b8448d6b F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8 F test/concurrent3.test 0a5f7e3036d1eccf0782d7153ac21f5f222e9468 -F test/concurrent4.test d1b808b0c65f8a6368da1ca30bab9e25b0851f9dc529ffab761ba8c9a42d2943 +F test/concurrent4.test 989c6575225f9c4ef5d2392a9b9d0405665567c7501a3e44129598794d9b1b5f F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9 @@ -1590,7 +1590,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 47a7dd92355ffd74645cf8da8186d5799c05a95907877a09c28de41135deeede -R 09d4e4c80f127f9ecf740a4309c9fec3 +P a4a3bbe64690856403642352f36e664a5a7fba686463a63446c6ada99df4e89f +R 69e13a62db6a845ec0ea0e91eabb688e U dan -Z bd7d66ea928950ff2ef1b7b7ec07e968 +Z 97d78c704135d26c80fab0abc59ae894 diff --git a/manifest.uuid b/manifest.uuid index cea7e0cc0d..c0fc82007e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a4a3bbe64690856403642352f36e664a5a7fba686463a63446c6ada99df4e89f \ No newline at end of file +9df0195780306a26709e87daabf9d426856aebf2082060b98818f2d48c7472ec \ No newline at end of file diff --git a/test/concurrent4.test b/test/concurrent4.test index d129eaf7ac..ce55cdd848 100644 --- a/test/concurrent4.test +++ b/test/concurrent4.test @@ -42,6 +42,47 @@ do_execsql_test 1.2 { ROLLBACK TO abc } do_execsql_test 1.3 { COMMIT } do_execsql_test 1.4 { PRAGMA integrity_check } {ok} +do_multiclient_test tn { + do_test 2.$tn.1 { + sql1 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(a, b); + WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100) + INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s; + + CREATE TABLE t2(a, b); + WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100) + INSERT INTO t2 SELECT randomblob(400), randomblob(400) FROM s; + } + + sql1 { + BEGIN CONCURRENT; + INSERT INTO t1 VALUES(randomblob(3000), randomblob(3000)); + } + } {} + + do_test 2.$tn.2 { + sql2 { + WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<10) + INSERT INTO t2 SELECT randomblob(400), randomblob(400) FROM s; + } + sql2 { + DELETE FROM t2 WHERE rowid<10; + } + } {} + + do_test 2.$tn.3 { + sql1 { + COMMIT; + PRAGMA integrity_check; + } + } {ok} + do_test 2.$tn.4 { + sql2 { + PRAGMA integrity_check; + } + } {ok} +} finish_test From e3b047b3d7a666023cd29874e2676529cde0562e Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 26 May 2017 18:18:51 +0000 Subject: [PATCH 051/113] Adjust the bitvec related sqlite3_log messages added by [9527089b]. FossilOrigin-Name: a7e0e7a4835314a04e065839a7f88b074eda795da2b2da5741b2afc096421a32 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/bitvec.c | 2 +- src/pager.c | 17 ----------------- 4 files changed, 9 insertions(+), 26 deletions(-) diff --git a/manifest b/manifest index cb5622a88f..61e52657d5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sextra\stest\scases\sfor\sdeferred\spage\sallocation. -D 2017-05-26T16:51:15.019 +C Adjust\sthe\sbitvec\srelated\ssqlite3_log\smessages\sadded\sby\s[9527089b]. +D 2017-05-26T18:18:51.758 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc @@ -348,7 +348,7 @@ F src/analyze.c 0d0ccf7520a201d8747ea2f02c92c26e26f801bc161f714f27b9f7630dde0421 F src/attach.c 8c476f8bd5d2afe11d925f890d30e527e5b0ce43 F src/auth.c 79f96c6f33bf0e5da8d1c282cee5ebb1852bb8a6ccca3e485d7c459b035d9c3c F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b -F src/bitvec.c e65c3d8ce932b4a38795574b549db6607b6140a22b82e783fa1ab57d0e42a49c +F src/bitvec.c c77b7f5759e413c1c8b53267d633c952e66db79c1171964c7e24c0f92f5019cf F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca F src/btree.c ca942fd75c1b791bd3fdf647e283473acf63e97d2252077216cdc1d56cb3a25e F src/btree.h 14e99cc2b666beb60322173c761d16b668ec2e07c18bbb74e8a49fe85946f8a0 @@ -394,7 +394,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 30e2c43e4955db990e5b5a81e901f8aa74cc8820 F src/os_win.c 2a6c73eef01c51a048cc4ddccd57f981afbec18a F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c babddba9a8aa02feae4544175d4eeaee65321c263d78cf3ff3e0670df41bc837 +F src/pager.c 079884c8486596240e200f1e37e867b1ed56eff399e4bbbcabcc145dc5679cd5 F src/pager.h 1afb4b777b3a297d56dc6cafc4f17d47d92522e9d2cb106839ea0fa0d6d489c7 F src/parse.y 21660e5224d1e1635a4ad45ad4365c8f67153b8081b7a11e35629844ecb48ab0 F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870 @@ -1590,7 +1590,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a4a3bbe64690856403642352f36e664a5a7fba686463a63446c6ada99df4e89f -R 69e13a62db6a845ec0ea0e91eabb688e +P 9df0195780306a26709e87daabf9d426856aebf2082060b98818f2d48c7472ec +R ef448b68266e15a0b11a8140036a504f U dan -Z 97d78c704135d26c80fab0abc59ae894 +Z e753798d60e27266ad4ce7eb0092b295 diff --git a/manifest.uuid b/manifest.uuid index c0fc82007e..4b2ca7af23 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9df0195780306a26709e87daabf9d426856aebf2082060b98818f2d48c7472ec \ No newline at end of file +a7e0e7a4835314a04e065839a7f88b074eda795da2b2da5741b2afc096421a32 \ No newline at end of file diff --git a/src/bitvec.c b/src/bitvec.c index a3e67b8f4c..31994f550b 100644 --- a/src/bitvec.c +++ b/src/bitvec.c @@ -171,7 +171,7 @@ int sqlite3BitvecSet(Bitvec *p, u32 i){ if( p==0 ) return SQLITE_OK; assert( i>0 ); assert( i<=p->iSize ); - if( i>p->iSize ){ + if( i>p->iSize || i==0 ){ sqlite3_log(SQLITE_ERROR, "Bitvec: setting bit %d of bitvec size %d\n", (int)i, (int)p->iSize ); diff --git a/src/pager.c b/src/pager.c index 4b0d5bcba6..cbc078ffe6 100644 --- a/src/pager.c +++ b/src/pager.c @@ -5386,13 +5386,6 @@ int sqlite3PagerSharedLock(Pager *pPager){ }else{ pPager->eState = PAGER_READER; pPager->hasHeldSharedLock = 1; -#ifndef SQLITE_OMIT_CONCURRENT - if( pPager->pAllRead ){ - sqlite3_log(SQLITE_ERROR, - "Bitvec: pAllRead already allocated in PagerSharedLock()" - ); - } -#endif } return rc; } @@ -5891,16 +5884,6 @@ int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){ ** file as well as into the page cache. Which would be incorrect in ** WAL mode. */ -#ifndef SQLITE_OMIT_CONCURRENT - if( pPager->pAllRead - && pPager->dbSize!=sqlite3BitvecSize(pPager->pAllRead) - ){ - sqlite3_log(SQLITE_ERROR, - "Bitvec: pAllRead size is %d, dbOrigSize set to %d", - (int)sqlite3BitvecSize(pPager->pAllRead), pPager->dbSize - ); - } -#endif pPager->eState = PAGER_WRITER_LOCKED; pPager->dbHintSize = pPager->dbSize; pPager->dbFileSize = pPager->dbSize; From 7fff2e1cb9c838edc392ee1edd9070fac53d96bb Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 29 May 2017 14:27:37 +0000 Subject: [PATCH 052/113] Enhance the log messages emitted when a page conflict is detected. FossilOrigin-Name: 92618492b048867af38922825f3d094eaaa2dd919b1ed2f7372483cc53f892bf --- manifest | 17 +++---- manifest.uuid | 2 +- src/btree.c | 38 ++++++++++++--- src/btreeInt.h | 3 ++ src/wal.c | 26 ++++++++-- test/concurrent5.test | 109 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 174 insertions(+), 21 deletions(-) create mode 100644 test/concurrent5.test diff --git a/manifest b/manifest index 61e52657d5..9c926fb54c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Adjust\sthe\sbitvec\srelated\ssqlite3_log\smessages\sadded\sby\s[9527089b]. -D 2017-05-26T18:18:51.758 +C Enhance\sthe\slog\smessages\semitted\swhen\sa\spage\sconflict\sis\sdetected. +D 2017-05-29T14:27:37.696 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc @@ -350,9 +350,9 @@ F src/auth.c 79f96c6f33bf0e5da8d1c282cee5ebb1852bb8a6ccca3e485d7c459b035d9c3c F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b F src/bitvec.c c77b7f5759e413c1c8b53267d633c952e66db79c1171964c7e24c0f92f5019cf F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca -F src/btree.c ca942fd75c1b791bd3fdf647e283473acf63e97d2252077216cdc1d56cb3a25e +F src/btree.c 3c5409453a17294ed8fe7b44dc87c0434b2418f447ad768f4624ead69d5dfa18 F src/btree.h 14e99cc2b666beb60322173c761d16b668ec2e07c18bbb74e8a49fe85946f8a0 -F src/btreeInt.h 42c3e3d9534aed0b99ee68678b0311c33134c7c015037a319900eddd148584d6 +F src/btreeInt.h 7429915fc8f51bbd78b7ac023aa4afbe5b9660fc1e6970f144b07540a34a4623 F src/build.c ba3f389668754c407805bbc5f8ab140f063ba6b04a6a86f63006b63b3c7319a8 F src/callback.c 2e76147783386374bf01b227f752c81ec872d730 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e @@ -485,7 +485,7 @@ F src/vdbesort.c e72fe02a2121386ba767ede8942e9450878b8fc873abf3d1b6824485f092570 F src/vdbetrace.c 41963d5376f0349842b5fc4aaaaacd7d9cdc0834 F src/vtab.c 35b9bdc2b41de32a417141d12097bcc4e29a77ed7cdb8f836d1d2305d946b61b F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 0c4faf368f51abb3f077fa5c175920b73b6a07584688a287c8d77296b6af582e +F src/wal.c 4b857e74548bb0f9bc0c7f56517327421f925b1263ac65a6e58e9c176194857e F src/wal.h 79378c5cd2127f32060d4952d827a7abdd490f8f9e5cbb14a4c39657ed99ad15 F src/walker.c b71a992b413b3a022572eccf29ef4b4890223791 F src/where.c c6352f15be5031907c68bcbde96cad1a6da20e9f4051d10168a59235de9a8566 @@ -613,6 +613,7 @@ F test/concurrent.test 3eb5e6a911dc6ff72e3a679f563e683b436f6c701e6e1d6050173df2b F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8 F test/concurrent3.test 0a5f7e3036d1eccf0782d7153ac21f5f222e9468 F test/concurrent4.test 989c6575225f9c4ef5d2392a9b9d0405665567c7501a3e44129598794d9b1b5f +F test/concurrent5.test 06fd0b5294586d170a3b12d68153394fbfe642c8346e249a6240bc6ababc5f4b F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9 @@ -1590,7 +1591,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9df0195780306a26709e87daabf9d426856aebf2082060b98818f2d48c7472ec -R ef448b68266e15a0b11a8140036a504f +P a7e0e7a4835314a04e065839a7f88b074eda795da2b2da5741b2afc096421a32 +R beb58ff81a99fbcff0806ad7e4f3b8ee U dan -Z e753798d60e27266ad4ce7eb0092b295 +Z a8b4d17828fb801d4b09ca76008d7042 diff --git a/manifest.uuid b/manifest.uuid index 4b2ca7af23..d27dbec941 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a7e0e7a4835314a04e065839a7f88b074eda795da2b2da5741b2afc096421a32 \ No newline at end of file +92618492b048867af38922825f3d094eaaa2dd919b1ed2f7372483cc53f892bf \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index af57d4148e..e9a09b69bd 100644 --- a/src/btree.c +++ b/src/btree.c @@ -2289,6 +2289,17 @@ static int getAndInitPage( return rc; } +#ifndef SQLITE_OMIT_CONCURRENT +/* +** Set the value of the MemPage.pgnoRoot variable, if it exists. +*/ +static void setMempageRoot(MemPage *pPg, u32 pgnoRoot){ + pPg->pgnoRoot = pgnoRoot; +} +#else +# define setMempageRoot(x,y) +#endif + /* ** Release a MemPage. This should be called once for each prior ** call to btreeGetPage. @@ -5222,6 +5233,7 @@ const void *sqlite3BtreePayloadFetch(BtCursor *pCur, u32 *pAmt){ */ static int moveToChild(BtCursor *pCur, u32 newPgno){ BtShared *pBt = pCur->pBt; + int rc; assert( cursorOwnsBtShared(pCur) ); assert( pCur->eState==CURSOR_VALID ); @@ -5234,8 +5246,12 @@ static int moveToChild(BtCursor *pCur, u32 newPgno){ pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); pCur->aiIdx[pCur->iPage++] = pCur->ix; pCur->ix = 0; - return getAndInitPage(pBt, newPgno, &pCur->apPage[pCur->iPage], + rc = getAndInitPage(pBt, newPgno, &pCur->apPage[pCur->iPage], pCur, pCur->curPagerFlags); + if( rc==SQLITE_OK ){ + setMempageRoot(pCur->apPage[pCur->iPage], pCur->pgnoRoot); + } + return rc; } #ifdef SQLITE_DEBUG @@ -5341,6 +5357,7 @@ static int moveToRoot(BtCursor *pCur){ pCur->eState = CURSOR_INVALID; return rc; } + setMempageRoot(pCur->apPage[0], pCur->pgnoRoot); pCur->iPage = 0; pCur->curIntKey = pCur->apPage[0]->intKey; } @@ -7500,7 +7517,8 @@ static int balance_nonroot( int iParentIdx, /* Index of "the page" in pParent */ u8 *aOvflSpace, /* page-size bytes of space for parent ovfl */ int isRoot, /* True if pParent is a root-page */ - int bBulk /* True if this call is part of a bulk load */ + int bBulk, /* True if this call is part of a bulk load */ + Pgno pgnoRoot /* Root page of b-tree being balanced */ ){ BtShared *pBt; /* The whole database */ int nMaxCells = 0; /* Allocated size of apCell, szCell, aFrom. */ @@ -7592,6 +7610,8 @@ static int balance_nonroot( memset(apOld, 0, (i+1)*sizeof(MemPage*)); goto balance_cleanup; } + setMempageRoot(apOld[i], pgnoRoot); + nMaxCells += 1+apOld[i]->nCell+apOld[i]->nOverflow; if( (i--)==0 ) break; @@ -8400,7 +8420,7 @@ static int balance(BtCursor *pCur){ */ u8 *pSpace = sqlite3PageMalloc(pCur->pBt->pageSize); rc = balance_nonroot(pParent, iIdx, pSpace, iPage==1, - pCur->hints&BTREE_BULKLOAD); + pCur->hints&BTREE_BULKLOAD, pCur->pgnoRoot); if( pFree ){ /* If pFree is not NULL, it points to the pSpace buffer used ** by a previous call to balance_nonroot(). Its contents are @@ -8998,7 +9018,8 @@ static int clearDatabasePage( BtShared *pBt, /* The BTree that contains the table */ Pgno pgno, /* Page number to clear */ int freePageFlag, /* Deallocate page if true */ - int *pnChange /* Add number of Cells freed to this counter */ + int *pnChange, /* Add number of Cells freed to this counter */ + Pgno pgnoRoot ){ MemPage *pPage; int rc; @@ -9013,6 +9034,7 @@ static int clearDatabasePage( } rc = getAndInitPage(pBt, pgno, &pPage, 0, 0); if( rc ) return rc; + setMempageRoot(pPage, pgnoRoot); if( pPage->bBusy ){ rc = SQLITE_CORRUPT_BKPT; goto cleardatabasepage_out; @@ -9022,14 +9044,16 @@ static int clearDatabasePage( for(i=0; inCell; i++){ pCell = findCell(pPage, i); if( !pPage->leaf ){ - rc = clearDatabasePage(pBt, get4byte(pCell), 1, pnChange); + rc = clearDatabasePage(pBt, get4byte(pCell), 1, pnChange, pgnoRoot); if( rc ) goto cleardatabasepage_out; } rc = clearCell(pPage, pCell, &info); if( rc ) goto cleardatabasepage_out; } if( !pPage->leaf ){ - rc = clearDatabasePage(pBt, get4byte(&pPage->aData[hdr+8]), 1, pnChange); + rc = clearDatabasePage( + pBt, get4byte(&pPage->aData[hdr+8]), 1, pnChange, pgnoRoot + ); if( rc ) goto cleardatabasepage_out; }else if( pnChange ){ assert( pPage->intKey || CORRUPT_DB ); @@ -9074,7 +9098,7 @@ int sqlite3BtreeClearTable(Btree *p, int iTable, int *pnChange){ ** is the root of a table b-tree - if it is not, the following call is ** a no-op). */ invalidateIncrblobCursors(p, (Pgno)iTable, 0, 1); - rc = clearDatabasePage(pBt, (Pgno)iTable, 0, pnChange); + rc = clearDatabasePage(pBt, (Pgno)iTable, 0, pnChange, (Pgno)iTable); } sqlite3BtreeLeave(p); return rc; diff --git a/src/btreeInt.h b/src/btreeInt.h index d924f08ff2..5820db64c3 100644 --- a/src/btreeInt.h +++ b/src/btreeInt.h @@ -301,6 +301,9 @@ struct MemPage { DbPage *pDbPage; /* Pager page handle */ u16 (*xCellSize)(MemPage*,u8*); /* cellSizePtr method */ void (*xParseCell)(MemPage*,u8*,CellInfo*); /* btreeParseCell method */ +#ifndef SQLITE_OMIT_CONCURRENT + u32 pgnoRoot; /* Root page of b-tree that this page belongs to */ +#endif }; /* diff --git a/src/wal.c b/src/wal.c index 73b5f7ad82..4139b7c563 100644 --- a/src/wal.c +++ b/src/wal.c @@ -243,6 +243,7 @@ #ifndef SQLITE_OMIT_WAL #include "wal.h" +#include "btreeInt.h" /* ** Trace output macros @@ -2916,11 +2917,26 @@ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPage1, Bitvec *pAllRead){ rc = SQLITE_BUSY_SNAPSHOT; } }else if( sqlite3BitvecTestNotNull(pAllRead, aPgno[i]) ){ - sqlite3_log(SQLITE_OK, - "cannot commit CONCURRENT transaction (conflict at page %d)", - (int)aPgno[i] - ); - rc = SQLITE_BUSY_SNAPSHOT; + PgHdr *pPg = 0; + rc = sqlite3PagerGet(pPage1->pPager, aPgno[i], &pPg, 0); + if( rc==SQLITE_OK ){ + Pgno pgnoRoot = 0; + int bWrite = -1; + if( pPg ){ + pgnoRoot = ((MemPage*)sqlite3PagerGetExtra(pPg))->pgnoRoot; + bWrite = sqlite3PagerIswriteable(pPg); + sqlite3PagerUnref(pPg); + } + sqlite3_log(SQLITE_OK, + "cannot commit CONCURRENT transaction " + "- conflict at page %d " + "(%s page; part of b-tree with root page %d)", + (int)aPgno[i], + (bWrite==0?"read-only":(bWrite>0?"read/write":"unknown")), + (int)pgnoRoot + ); + rc = SQLITE_BUSY_SNAPSHOT; + } }else if( (pPg = sqlite3PagerLookup(pPager, aPgno[i])) ){ /* Page aPgno[i], which is present in the pager cache, has been ** modified since the current CONCURRENT transaction was started. diff --git a/test/concurrent5.test b/test/concurrent5.test new file mode 100644 index 0000000000..e77c794048 --- /dev/null +++ b/test/concurrent5.test @@ -0,0 +1,109 @@ +# 2017 May 26 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/lock_common.tcl +source $testdir/wal_common.tcl +set ::testprefix concurrent5 + +ifcapable !concurrent { + finish_test + return +} + +db close +sqlite3_shutdown +test_sqlite3_log [list lappend ::log] +set ::log [list] + +sqlite3 db test.db + +proc do_test_conflict_msg {tn msg} { + set msg "cannot commit CONCURRENT transaction - [string trim $msg]" + uplevel [list do_test $tn {lindex $::log end} $msg] +} + +do_execsql_test 1.0 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(x, y); + CREATE TABLE t2(c); + WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100) + INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s; +} {wal} + +sqlite3 db2 test.db + +do_test 1.1.1 { + set ::log [list] + db2 eval { + BEGIN CONCURRENT; + SELECT count(*) FROM t1; + INSERT INTO t2 VALUES(10); + } + + db eval { + INSERT INTO t1 VALUES(randomblob(200), randomblob(200)); + } + + catchsql COMMIT db2 +} {1 {database is locked}} +do_test_conflict_msg 1.1.2 { + conflict at page 2 (read-only page; part of b-tree with root page 2) +} + +do_test 1.2.1 { + set ::log [list] + db2 eval { + ROLLBACK; + BEGIN CONCURRENT; + INSERT INTO t1 VALUES(11, 12); + } + + db eval { + INSERT INTO t1 VALUES(12, 11); + } + + catchsql COMMIT db2 +} {1 {database is locked}} + +do_test_conflict_msg 1.2.2 { + conflict at page 105 (read/write page; part of b-tree with root page 2) +} + +do_test 1.3.1 { + set ::log [list] + db2 eval { + ROLLBACK; + BEGIN CONCURRENT; + INSERT INTO t2 VALUES('x'); + } + + db eval { + INSERT INTO t2 VALUES('y'); + } + + catchsql COMMIT db2 +} {1 {database is locked}} + +do_test_conflict_msg 1.3.2 { + conflict at page 3 (read/write page; part of b-tree with root page 3) +} + +db close +db2 close +sqlite3_shutdown +test_sqlite3_log +sqlite3_initialize +finish_test + From 995b2457e2666e18d89ccb523bf8cd47482b9622 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 29 May 2017 19:23:56 +0000 Subject: [PATCH 053/113] Instead of a root page number, log the object (table or index) name if a page level locking conflict is detected. FossilOrigin-Name: 9ad846e57bd427adc7c29768cabca18905f7f978168e0642a5917d894fda8bfd --- manifest | 22 +++++++++--------- manifest.uuid | 2 +- src/btree.c | 52 ++++++++++++++++++++++++++++++++++++++++++- src/pager.c | 8 ++++--- src/pager.h | 2 +- src/wal.c | 30 +++++++------------------ src/wal.h | 2 +- test/concurrent5.test | 30 ++++++++++++++++++++++--- 8 files changed, 105 insertions(+), 43 deletions(-) diff --git a/manifest b/manifest index 9c926fb54c..7d09c7ae3f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\slog\smessages\semitted\swhen\sa\spage\sconflict\sis\sdetected. -D 2017-05-29T14:27:37.696 +C Instead\sof\sa\sroot\spage\snumber,\slog\sthe\sobject\s(table\sor\sindex)\sname\sif\sa\spage\nlevel\slocking\sconflict\sis\sdetected. +D 2017-05-29T19:23:56.135 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc @@ -350,7 +350,7 @@ F src/auth.c 79f96c6f33bf0e5da8d1c282cee5ebb1852bb8a6ccca3e485d7c459b035d9c3c F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b F src/bitvec.c c77b7f5759e413c1c8b53267d633c952e66db79c1171964c7e24c0f92f5019cf F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca -F src/btree.c 3c5409453a17294ed8fe7b44dc87c0434b2418f447ad768f4624ead69d5dfa18 +F src/btree.c 8be55b3e9ed1346b5cfd3f749e6c338ced1cade9242a3c5404696bc4aed26652 F src/btree.h 14e99cc2b666beb60322173c761d16b668ec2e07c18bbb74e8a49fe85946f8a0 F src/btreeInt.h 7429915fc8f51bbd78b7ac023aa4afbe5b9660fc1e6970f144b07540a34a4623 F src/build.c ba3f389668754c407805bbc5f8ab140f063ba6b04a6a86f63006b63b3c7319a8 @@ -394,8 +394,8 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 30e2c43e4955db990e5b5a81e901f8aa74cc8820 F src/os_win.c 2a6c73eef01c51a048cc4ddccd57f981afbec18a F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 079884c8486596240e200f1e37e867b1ed56eff399e4bbbcabcc145dc5679cd5 -F src/pager.h 1afb4b777b3a297d56dc6cafc4f17d47d92522e9d2cb106839ea0fa0d6d489c7 +F src/pager.c 817afaac17f7c4b1282d9aa283f10fc4b58d5d1e4afb12f84c46038904311650 +F src/pager.h ba7b3fbb18f78835a7368d66530bf21d6782e3e640d79c9550d218742c0b07ce F src/parse.y 21660e5224d1e1635a4ad45ad4365c8f67153b8081b7a11e35629844ecb48ab0 F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870 F src/pcache.h 2cedcd8407eb23017d92790b112186886e179490 @@ -485,8 +485,8 @@ F src/vdbesort.c e72fe02a2121386ba767ede8942e9450878b8fc873abf3d1b6824485f092570 F src/vdbetrace.c 41963d5376f0349842b5fc4aaaaacd7d9cdc0834 F src/vtab.c 35b9bdc2b41de32a417141d12097bcc4e29a77ed7cdb8f836d1d2305d946b61b F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 4b857e74548bb0f9bc0c7f56517327421f925b1263ac65a6e58e9c176194857e -F src/wal.h 79378c5cd2127f32060d4952d827a7abdd490f8f9e5cbb14a4c39657ed99ad15 +F src/wal.c e006353c3578071a457888aedd5eec9c8f1ba31ba11ddac4084c91c80478ca16 +F src/wal.h 1ea51dc499d6451529b822a8aaac053eafeef10b7fd9e5a4c9cc413182be429f F src/walker.c b71a992b413b3a022572eccf29ef4b4890223791 F src/where.c c6352f15be5031907c68bcbde96cad1a6da20e9f4051d10168a59235de9a8566 F src/whereInt.h 2a4b634d63ce488b46d4b0da8f2eaa8f9aeab202bc25ef76f007de5e3fba1f20 @@ -613,7 +613,7 @@ F test/concurrent.test 3eb5e6a911dc6ff72e3a679f563e683b436f6c701e6e1d6050173df2b F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8 F test/concurrent3.test 0a5f7e3036d1eccf0782d7153ac21f5f222e9468 F test/concurrent4.test 989c6575225f9c4ef5d2392a9b9d0405665567c7501a3e44129598794d9b1b5f -F test/concurrent5.test 06fd0b5294586d170a3b12d68153394fbfe642c8346e249a6240bc6ababc5f4b +F test/concurrent5.test d5d7d9d404a9b4502464fc097c1fc5c3012bb4f1b063fae7ad707ca983fc86c5 F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9 @@ -1591,7 +1591,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a7e0e7a4835314a04e065839a7f88b074eda795da2b2da5741b2afc096421a32 -R beb58ff81a99fbcff0806ad7e4f3b8ee +P 92618492b048867af38922825f3d094eaaa2dd919b1ed2f7372483cc53f892bf +R 9903c08299ff258c04c9dfdcdc90aac6 U dan -Z a8b4d17828fb801d4b09ca76008d7042 +Z 4393c020077681d651727b37beafcbae diff --git a/manifest.uuid b/manifest.uuid index d27dbec941..cee4fdfd92 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -92618492b048867af38922825f3d094eaaa2dd919b1ed2f7372483cc53f892bf \ No newline at end of file +9ad846e57bd427adc7c29768cabca18905f7f978168e0642a5917d894fda8bfd \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index e9a09b69bd..38dfbccf41 100644 --- a/src/btree.c +++ b/src/btree.c @@ -10286,10 +10286,60 @@ int sqlite3HeaderSizeBtree(void){ return ROUND8(sizeof(MemPage)); } */ int sqlite3BtreeExclusiveLock(Btree *p){ int rc; + Pgno pgno = 0; BtShared *pBt = p->pBt; assert( p->inTrans==TRANS_WRITE && pBt->pPage1 ); sqlite3BtreeEnter(p); - rc = sqlite3PagerExclusiveLock(pBt->pPager, pBt->pPage1->pDbPage); + rc = sqlite3PagerExclusiveLock(pBt->pPager, pBt->pPage1->pDbPage, &pgno); + if( rc==SQLITE_BUSY_SNAPSHOT && pgno ){ + PgHdr *pPg = 0; + int rc2 = sqlite3PagerGet(pBt->pPager, pgno, &pPg, 0); + if( rc2==SQLITE_OK ){ + int bWrite = -1; + const char *zObj = 0; + const char *zTab = 0; + + if( pPg ){ + Pgno pgnoRoot = 0; + HashElem *pE; + Schema *pSchema; + + pgnoRoot = ((MemPage*)sqlite3PagerGetExtra(pPg))->pgnoRoot; + bWrite = sqlite3PagerIswriteable(pPg); + sqlite3PagerUnref(pPg); + + pSchema = sqlite3SchemaGet(p->db, p); + if( pSchema ){ + for(pE=sqliteHashFirst(&pSchema->tblHash); pE; pE=sqliteHashNext(pE)){ + Table *pTab = (Table *)sqliteHashData(pE); + if( pTab->tnum==(int)pgnoRoot ){ + zObj = pTab->zName; + zTab = 0; + }else{ + Index *pIdx; + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + if( pIdx->tnum==(int)pgnoRoot ){ + zObj = pIdx->zName; + zTab = pTab->zName; + } + } + } + } + } + } + + sqlite3_log(SQLITE_OK, + "cannot commit CONCURRENT transaction " + "- conflict at page %d " + "(%s page; part of db %s %s%s%s)", + (int)pgno, + (bWrite==0?"read-only":(bWrite>0?"read/write":"unknown")), + (zTab ? "index" : "table"), + (zTab ? zTab : ""), (zTab ? "." : ""), (zObj ? zObj : "UNKNOWN") + ); + } + } + sqlite3BtreeLeave(p); return rc; } diff --git a/src/pager.c b/src/pager.c index cbc078ffe6..0ea9fc5d57 100644 --- a/src/pager.c +++ b/src/pager.c @@ -4266,7 +4266,7 @@ static int syncJournal(Pager *pPager, int newHdr){ assert( assert_pager_state(pPager) ); assert( !pagerUseWal(pPager) ); - rc = sqlite3PagerExclusiveLock(pPager, 0); + rc = sqlite3PagerExclusiveLock(pPager, 0, 0); if( rc!=SQLITE_OK ) return rc; if( !pPager->noSync ){ @@ -6347,7 +6347,7 @@ int sqlite3PagerSync(Pager *pPager, const char *zMaster){ ** is returned. Otherwise, if some other error occurs (IO error, OOM etc.), ** and SQLite error code is returned. */ -int sqlite3PagerExclusiveLock(Pager *pPager, PgHdr *pPage1){ +int sqlite3PagerExclusiveLock(Pager *pPager, PgHdr *pPage1, Pgno *piConflict){ int rc = pPager->errCode; assert( assert_pager_state(pPager) ); if( rc==SQLITE_OK ){ @@ -6367,7 +6367,9 @@ int sqlite3PagerExclusiveLock(Pager *pPager, PgHdr *pPage1){ ** invoke the busy-handler and try again for as long as it returns ** non-zero. */ do { - rc = sqlite3WalLockForCommit(pPager->pWal, pPage1, pPager->pAllRead); + rc = sqlite3WalLockForCommit( + pPager->pWal, pPage1, pPager->pAllRead, piConflict + ); }while( rc==SQLITE_BUSY && pPager->xBusyHandler(pPager->pBusyHandlerArg) ); diff --git a/src/pager.h b/src/pager.h index aa98bce95d..8aa17c4553 100644 --- a/src/pager.h +++ b/src/pager.h @@ -164,7 +164,7 @@ void *sqlite3PagerGetExtra(DbPage *); void sqlite3PagerPagecount(Pager*, int*); int sqlite3PagerBegin(Pager*, int exFlag, int); int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, int); -int sqlite3PagerExclusiveLock(Pager*, DbPage *pPage1); +int sqlite3PagerExclusiveLock(Pager*, DbPage *pPage1, Pgno*); int sqlite3PagerSync(Pager *pPager, const char *zMaster); int sqlite3PagerCommitPhaseTwo(Pager*); int sqlite3PagerRollback(Pager*); diff --git a/src/wal.c b/src/wal.c index 4139b7c563..13e1c57a99 100644 --- a/src/wal.c +++ b/src/wal.c @@ -243,7 +243,6 @@ #ifndef SQLITE_OMIT_WAL #include "wal.h" -#include "btreeInt.h" /* ** Trace output macros @@ -2857,7 +2856,12 @@ static int walUpgradeReadlock(Wal *pWal){ ** if an error (i.e. an OOM condition or IO error), an SQLite error code ** is returned. */ -int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPage1, Bitvec *pAllRead){ +int sqlite3WalLockForCommit( + Wal *pWal, + PgHdr *pPage1, + Bitvec *pAllRead, + Pgno *piConflict +){ Pager *pPager = pPage1->pPager; int rc = walWriteLock(pWal); @@ -2917,26 +2921,8 @@ int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPage1, Bitvec *pAllRead){ rc = SQLITE_BUSY_SNAPSHOT; } }else if( sqlite3BitvecTestNotNull(pAllRead, aPgno[i]) ){ - PgHdr *pPg = 0; - rc = sqlite3PagerGet(pPage1->pPager, aPgno[i], &pPg, 0); - if( rc==SQLITE_OK ){ - Pgno pgnoRoot = 0; - int bWrite = -1; - if( pPg ){ - pgnoRoot = ((MemPage*)sqlite3PagerGetExtra(pPg))->pgnoRoot; - bWrite = sqlite3PagerIswriteable(pPg); - sqlite3PagerUnref(pPg); - } - sqlite3_log(SQLITE_OK, - "cannot commit CONCURRENT transaction " - "- conflict at page %d " - "(%s page; part of b-tree with root page %d)", - (int)aPgno[i], - (bWrite==0?"read-only":(bWrite>0?"read/write":"unknown")), - (int)pgnoRoot - ); - rc = SQLITE_BUSY_SNAPSHOT; - } + *piConflict = aPgno[i]; + rc = SQLITE_BUSY_SNAPSHOT; }else if( (pPg = sqlite3PagerLookup(pPager, aPgno[i])) ){ /* Page aPgno[i], which is present in the pager cache, has been ** modified since the current CONCURRENT transaction was started. diff --git a/src/wal.h b/src/wal.h index b636d57a0a..d1909c4621 100644 --- a/src/wal.h +++ b/src/wal.h @@ -136,7 +136,7 @@ int sqlite3WalSnapshotRecover(Wal *pWal); #ifndef SQLITE_OMIT_CONCURRENT /* Tell the wal layer that we want to commit a concurrent transaction */ -int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPg, Bitvec *pRead); +int sqlite3WalLockForCommit(Wal *pWal, PgHdr *pPg, Bitvec *pRead, Pgno*); /* Upgrade the state of the client to take into account changes written ** by other connections */ diff --git a/test/concurrent5.test b/test/concurrent5.test index e77c794048..dde661ea8b 100644 --- a/test/concurrent5.test +++ b/test/concurrent5.test @@ -59,7 +59,7 @@ do_test 1.1.1 { catchsql COMMIT db2 } {1 {database is locked}} do_test_conflict_msg 1.1.2 { - conflict at page 2 (read-only page; part of b-tree with root page 2) + conflict at page 2 (read-only page; part of db table t1) } do_test 1.2.1 { @@ -78,7 +78,7 @@ do_test 1.2.1 { } {1 {database is locked}} do_test_conflict_msg 1.2.2 { - conflict at page 105 (read/write page; part of b-tree with root page 2) + conflict at page 105 (read/write page; part of db table t1) } do_test 1.3.1 { @@ -97,7 +97,31 @@ do_test 1.3.1 { } {1 {database is locked}} do_test_conflict_msg 1.3.2 { - conflict at page 3 (read/write page; part of b-tree with root page 3) + conflict at page 3 (read/write page; part of db table t2) +} + +do_test 1.4.1 { + set ::log [list] + + execsql { + ROLLBACK; + CREATE TABLE t3(a INTEGER PRIMARY KEY, b INTEGER); + CREATE INDEX i3 ON t3(b); + + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<5000 + ) INSERT INTO t3 SELECT i, i FROM s; + + BEGIN CONCURRENT; + INSERT INTO t3 VALUES(0, 5001); + } db2 + + execsql { INSERT INTO t3 VALUES(NULL, 5002) } db + catchsql COMMIT db2 +} {1 {database is locked}} + +do_test_conflict_msg 1.3.2 { + conflict at page 211 (read/write page; part of db index t3.i3) } db close From 7f002db7e3386448e0dc96e9c586f0c3f8501504 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 31 May 2017 17:06:13 +0000 Subject: [PATCH 054/113] Generate extra log messages in response to irregularites in the pointer-map used by "BEGIN CONCURRENT" transactions. FossilOrigin-Name: f7e3e2bc88f110d9282ce5d2fa58580c585faeb57cb707253f05001e5f4bd91b --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 38 ++++++++++++++++++++++++++++++++++++++ test/concurrent3.test | 4 ++-- 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 7d09c7ae3f..7df12fad09 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Instead\sof\sa\sroot\spage\snumber,\slog\sthe\sobject\s(table\sor\sindex)\sname\sif\sa\spage\nlevel\slocking\sconflict\sis\sdetected. -D 2017-05-29T19:23:56.135 +C Generate\sextra\slog\smessages\sin\sresponse\sto\sirregularites\sin\sthe\spointer-map\nused\sby\s"BEGIN\sCONCURRENT"\stransactions. +D 2017-05-31T17:06:13.603 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc @@ -350,7 +350,7 @@ F src/auth.c 79f96c6f33bf0e5da8d1c282cee5ebb1852bb8a6ccca3e485d7c459b035d9c3c F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b F src/bitvec.c c77b7f5759e413c1c8b53267d633c952e66db79c1171964c7e24c0f92f5019cf F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca -F src/btree.c 8be55b3e9ed1346b5cfd3f749e6c338ced1cade9242a3c5404696bc4aed26652 +F src/btree.c 322cd2e8aa98c5e44fb9fc756e15fe86c093bdba2e8c4465541098a56b1dd0a7 F src/btree.h 14e99cc2b666beb60322173c761d16b668ec2e07c18bbb74e8a49fe85946f8a0 F src/btreeInt.h 7429915fc8f51bbd78b7ac023aa4afbe5b9660fc1e6970f144b07540a34a4623 F src/build.c ba3f389668754c407805bbc5f8ab140f063ba6b04a6a86f63006b63b3c7319a8 @@ -611,7 +611,7 @@ F test/colname.test 08948a4809d22817e0e5de89c7c0a8bd90cb551b F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 F test/concurrent.test 3eb5e6a911dc6ff72e3a679f563e683b436f6c701e6e1d6050173df2b8448d6b F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8 -F test/concurrent3.test 0a5f7e3036d1eccf0782d7153ac21f5f222e9468 +F test/concurrent3.test f4af1cf1220908c6dd5694923621c19e999b78cd997e2646285f08a52bcb4170 F test/concurrent4.test 989c6575225f9c4ef5d2392a9b9d0405665567c7501a3e44129598794d9b1b5f F test/concurrent5.test d5d7d9d404a9b4502464fc097c1fc5c3012bb4f1b063fae7ad707ca983fc86c5 F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db @@ -1591,7 +1591,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 92618492b048867af38922825f3d094eaaa2dd919b1ed2f7372483cc53f892bf -R 9903c08299ff258c04c9dfdcdc90aac6 +P 9ad846e57bd427adc7c29768cabca18905f7f978168e0642a5917d894fda8bfd +R 524ad4cfe044e13975f9c2307068a2ae U dan -Z 4393c020077681d651727b37beafcbae +Z b8c7e688cb5faa52956d652176272c93 diff --git a/manifest.uuid b/manifest.uuid index cee4fdfd92..063e7cf439 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9ad846e57bd427adc7c29768cabca18905f7f978168e0642a5917d894fda8bfd \ No newline at end of file +f7e3e2bc88f110d9282ce5d2fa58580c585faeb57cb707253f05001e5f4bd91b \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 38dfbccf41..183e3db17c 100644 --- a/src/btree.c +++ b/src/btree.c @@ -629,11 +629,45 @@ static void btreePtrmapDelete(BtShared *pBt){ pBt->pMap = 0; } } + +static void btreeCheckPtrmap(BtShared *p, int nPage, const char *zLog){ + BtreePtrmap *pMap = p->pMap; + if( pMap ){ + int n = MIN(1 + nPage - (int)pMap->iFirst, 5); + int i; + for(i=0; iaPtr[i].eType; + if( (eType==PTRMAP_OVERFLOW1 || + eType==PTRMAP_OVERFLOW2 || + eType==PTRMAP_BTREE) && pMap->aPtr[i].parent==0 + ){ + sqlite3_log(SQLITE_ERROR, + "Bitvec: error at (%s) - (%d/%d %d/%d %d/%d %d/%d %d/%d)", + zLog, + (int)pMap->aPtr[0].eType, (int)pMap->aPtr[0].parent, + (n>1 ? (int)pMap->aPtr[1].eType : -1), + (n>1 ? (int)pMap->aPtr[1].parent : -1), + + (n>2 ? (int)pMap->aPtr[2].eType : -1), + (n>2 ? (int)pMap->aPtr[2].parent : -1), + + (n>3 ? (int)pMap->aPtr[3].eType : -1), + (n>3 ? (int)pMap->aPtr[3].parent : -1), + + (n>4 ? (int)pMap->aPtr[4].eType : -1), + (n>4 ? (int)pMap->aPtr[4].parent : -1) + ); + break; + } + } + } +} #else /* SQLITE_OMIT_CONCURRENT */ # define btreePtrmapAllocate(x) SQLITE_OK # define btreePtrmapDelete(x) # define btreePtrmapBegin(x,y) SQLITE_OK # define btreePtrmapEnd(x,y,z) +# define btreeCheckPtrmap(a,b,c) #endif /* SQLITE_OMIT_CONCURRENT */ static void releasePage(MemPage *pPage); /* Forward reference */ @@ -4088,6 +4122,8 @@ static int btreeFixUnlocked(Btree *p){ Pgno nPage = btreePagecount(pBt); u32 nFree = get4byte(&p1[36]); + btreeCheckPtrmap(pBt, nPage, "btreeFixUnlocked(1)"); + assert( pBt->pMap ); rc = sqlite3PagerUpgradeSnapshot(pPager, pPage1->pDbPage); assert( p1==pPage1->aData ); @@ -8674,6 +8710,7 @@ int sqlite3BtreeInsert( assert( pCur->apPage[pCur->iPage]->nOverflow==0 ); end_insert: + btreeCheckPtrmap(pBt, pBt->nPage, "sqlite3BtreeInsert()"); return rc; } @@ -8845,6 +8882,7 @@ int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ } } } + btreeCheckPtrmap(pBt, pBt->nPage, "sqlite3BtreeInsert()"); return rc; } diff --git a/test/concurrent3.test b/test/concurrent3.test index 3ad6a1cce4..4364f84012 100644 --- a/test/concurrent3.test +++ b/test/concurrent3.test @@ -26,8 +26,8 @@ ifcapable !concurrent { db close sqlite3_shutdown -#test_sqlite3_log xLog -#proc xLog {error_code msg} { puts "$error_code: $msg" } +test_sqlite3_log xLog +proc xLog {error_code msg} { puts "$error_code: $msg" } reset_db proc create_schema {} { From 35dcd0e89231faa9af59bc24edafbd09dd28d240 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 2 Jun 2017 09:31:27 +0000 Subject: [PATCH 055/113] Extend even further the logging designed to find problems in the pointer-map structure. Call abort() to dump a core as soon as such a problem is seen. FossilOrigin-Name: f131677dcb4937e0dd62626afa91756aa28079e92acd6e9e127f6f676aa334f9 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 10 +++++++++- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 7df12fad09..7622016606 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Generate\sextra\slog\smessages\sin\sresponse\sto\sirregularites\sin\sthe\spointer-map\nused\sby\s"BEGIN\sCONCURRENT"\stransactions. -D 2017-05-31T17:06:13.603 +C Extend\seven\sfurther\sthe\slogging\sdesigned\sto\sfind\sproblems\sin\sthe\spointer-map\nstructure.\sCall\sabort()\sto\sdump\sa\score\sas\ssoon\sas\ssuch\sa\sproblem\sis\sseen. +D 2017-06-02T09:31:27.185 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc @@ -350,7 +350,7 @@ F src/auth.c 79f96c6f33bf0e5da8d1c282cee5ebb1852bb8a6ccca3e485d7c459b035d9c3c F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b F src/bitvec.c c77b7f5759e413c1c8b53267d633c952e66db79c1171964c7e24c0f92f5019cf F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca -F src/btree.c 322cd2e8aa98c5e44fb9fc756e15fe86c093bdba2e8c4465541098a56b1dd0a7 +F src/btree.c 63ae7953340839b84a1462f01414debebf8a178867085189280698f0cf724219 F src/btree.h 14e99cc2b666beb60322173c761d16b668ec2e07c18bbb74e8a49fe85946f8a0 F src/btreeInt.h 7429915fc8f51bbd78b7ac023aa4afbe5b9660fc1e6970f144b07540a34a4623 F src/build.c ba3f389668754c407805bbc5f8ab140f063ba6b04a6a86f63006b63b3c7319a8 @@ -1591,7 +1591,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9ad846e57bd427adc7c29768cabca18905f7f978168e0642a5917d894fda8bfd -R 524ad4cfe044e13975f9c2307068a2ae +P f7e3e2bc88f110d9282ce5d2fa58580c585faeb57cb707253f05001e5f4bd91b +R 0cc4cace2096d9ccd320cd1d9a64685a U dan -Z b8c7e688cb5faa52956d652176272c93 +Z 40b70ad4ffb9dd03aeca52705a79b953 diff --git a/manifest.uuid b/manifest.uuid index 063e7cf439..c8b24c331b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f7e3e2bc88f110d9282ce5d2fa58580c585faeb57cb707253f05001e5f4bd91b \ No newline at end of file +f131677dcb4937e0dd62626afa91756aa28079e92acd6e9e127f6f676aa334f9 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 183e3db17c..e495aa3297 100644 --- a/src/btree.c +++ b/src/btree.c @@ -657,6 +657,7 @@ static void btreeCheckPtrmap(BtShared *p, int nPage, const char *zLog){ (n>4 ? (int)pMap->aPtr[4].eType : -1), (n>4 ? (int)pMap->aPtr[4].parent : -1) ); + abort(); break; } } @@ -8806,6 +8807,8 @@ int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ invalidateIncrblobCursors(p, pCur->pgnoRoot, pCur->info.nKey, 0); } + btreeCheckPtrmap(pBt, pBt->nPage, "sqlite3BtreeDelete(0)"); + /* Make the page containing the entry to be deleted writable. Then free any ** overflow pages associated with the entry and finally remove the cell ** itself from within the page. */ @@ -8815,6 +8818,8 @@ int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ dropCell(pPage, iCellIdx, info.nSize, &rc); if( rc ) return rc; + btreeCheckPtrmap(pBt, pBt->nPage, "sqlite3BtreeDelete(1)"); + /* If the cell deleted was not located on a leaf page, then the cursor ** is currently pointing to the largest entry in the sub-tree headed ** by the child-page of the cell that was just deleted from an internal @@ -8840,6 +8845,8 @@ int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ if( rc ) return rc; } + btreeCheckPtrmap(pBt, pBt->nPage, "sqlite3BtreeDelete(2)"); + /* Balance the tree. If the entry deleted was located on a leaf page, ** then the cursor still points to that page. In this case the first ** call to balance() repairs the tree, and the if(...) condition is @@ -8863,6 +8870,8 @@ int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ rc = balance(pCur); } + btreeCheckPtrmap(pBt, pBt->nPage, "sqlite3BtreeDelete(3)"); + if( rc==SQLITE_OK ){ if( bSkipnext ){ assert( bPreserve && (pCur->iPage==iCellDepth || CORRUPT_DB) ); @@ -8882,7 +8891,6 @@ int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ } } } - btreeCheckPtrmap(pBt, pBt->nPage, "sqlite3BtreeInsert()"); return rc; } From 50179f91f391d4b65b192f9495ea221ca8a9ff90 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 8 Jun 2017 11:26:13 +0000 Subject: [PATCH 056/113] Ensure pointer map entries are always added when a row that does use overflow pages replaces one that does not in an auto-vacuum database. Fix for [fda22108]. FossilOrigin-Name: 9478106ca963e3ae5cfe59da40301c5a0a07494d03e656b5eb10ab45e441b870 --- manifest | 18 ++++++++---------- manifest.uuid | 2 +- src/btree.c | 10 ++++++++-- test/autovacuum.test | 7 +++++++ 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index d8ee2f52b1..7448590647 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.19.2 -D 2017-05-25T16:50:27.649 +C Ensure\spointer\smap\sentries\sare\salways\sadded\swhen\sa\srow\sthat\sdoes\suse\soverflow\npages\sreplaces\sone\sthat\sdoes\snot\sin\san\sauto-vacuum\sdatabase.\sFix\sfor\n[fda22108]. +D 2017-06-08T11:26:13.795 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc @@ -346,7 +346,7 @@ F src/auth.c 79f96c6f33bf0e5da8d1c282cee5ebb1852bb8a6ccca3e485d7c459b035d9c3c F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca -F src/btree.c 8c1fd4cfa2b0bf021386e0a1f4e30b64eea7a2c1bc2e0c3e5901a626b1ab6aa9 +F src/btree.c de57bf3f205082eb4ad8c923af7ecd1d10c4f15656f6a38038a3bd9b8ac3fc2a F src/btree.h 80f518c0788be6cec8d9f8e13bd8e380df299d2b5e4ac340dc887b0642647cfc F src/btreeInt.h a392d353104b4add58b4a59cb185f5d5693dde832c565b77d8d4c343ed98f610 F src/build.c 4026a9c554b233e50c5e9ad46963e676cf54dd2306d952aa1eaa07a1bc9ce14f @@ -537,7 +537,7 @@ F test/autoindex2.test 12ef578928102baaa0dc23ad397601a2f4ecb0df F test/autoindex3.test a3be0d1a53a7d2edff208a5e442312957047e972 F test/autoindex4.test 49d3cd791a9baa16fb461d7ea3de80d019a819cf F test/autoindex5.test 96f084a5e6024ea07cace5888df3223f3ea86990 -F test/autovacuum.test 92c24eedbdb68e49f3fb71f26f9ce6d8988cac15 +F test/autovacuum.test 0831cd34e14695d297187f7f6519265e3121c5b0a1720e548e86829e796129e9 F test/autovacuum_ioerr2.test 8a367b224183ad801e0e24dcb7d1501f45f244b4 F test/avtrans.test 0252654f4295ddda3b2cce0e894812259e655a85 F test/backcompat.test 3e64cedda754c778ef6bbe417b6e7a295e662a4d @@ -1580,10 +1580,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 1a074c8a2bc0b28918ef905339d11a21d30101b4ea8c06c8b3faca7d17237538 -R f4b3c258ec4a8c30fd1362752bfd9b5c -T +bgcolor * #d0c0ff -T +sym-release * -T +sym-version-3.19.2 * +P edb4e819b0c058c7d74d27ebd14cc5ceb2bad6a6144a486a970182b7afe3f8b9 +Q +b30dfba811cb531b09ff2e71a1a18ed53c816cb39155dd52ca3e2701425fe17b +R f3c8c8383c25bcc4e304081dde6d0ab0 U drh -Z 1c4850e8eeff11c8d32e6493160f83cd +Z f97aca8e1bd3663fbf75118ceaa954dd diff --git a/manifest.uuid b/manifest.uuid index b316b7a155..981f2490fd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -edb4e819b0c058c7d74d27ebd14cc5ceb2bad6a6144a486a970182b7afe3f8b9 \ No newline at end of file +9478106ca963e3ae5cfe59da40301c5a0a07494d03e656b5eb10ab45e441b870 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index e5edf44c4d..1f9a6e4872 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8174,12 +8174,18 @@ int sqlite3BtreeInsert( memcpy(newCell, oldCell, 4); } rc = clearCell(pPage, oldCell, &info); - if( info.nSize==szNew && info.nLocal==info.nPayload ){ + if( info.nSize==szNew && info.nLocal==info.nPayload + && (!ISAUTOVACUUM || szNewminLocal) + ){ /* Overwrite the old cell with the new if they are the same size. ** We could also try to do this if the old cell is smaller, then add ** the leftover space to the free list. But experiments show that ** doing that is no faster then skipping this optimization and just - ** calling dropCell() and insertCell(). */ + ** calling dropCell() and insertCell(). + ** + ** This optimization cannot be used on an autovacuum database if the + ** new entry uses overflow pages, as the insertCell() call below is + ** necessary to add the PTRMAP_OVERFLOW1 pointer-map entry. */ assert( rc==SQLITE_OK ); /* clearCell never fails when nLocal==nPayload */ if( oldCell+szNew > pPage->aDataEnd ) return SQLITE_CORRUPT_BKPT; memcpy(oldCell, newCell, szNew); diff --git a/test/autovacuum.test b/test/autovacuum.test index 5c14ed85d3..431c4b8a2a 100644 --- a/test/autovacuum.test +++ b/test/autovacuum.test @@ -705,5 +705,12 @@ do_test autovacuum-9.5 { file size test.db } $::sqlite_pending_byte +do_execsql_test autovacuum-10.1 { + DROP TABLE t1; + CREATE TABLE t1(a INTEGER PRIMARY KEY, b); + INSERT INTO t1 VALUES(25, randomblob(104)); + REPLACE INTO t1 VALUES(25, randomblob(1117)); + PRAGMA integrity_check; +} {ok} finish_test From a096fcc73c82f17e4194089f9b3f4c8a224781c7 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 8 Jun 2017 11:27:05 +0000 Subject: [PATCH 057/113] Increase the version number to 3.19.3. FossilOrigin-Name: 903fff53b3f02cbc011c4cd47d841f45a447746fdf3bcb01202e27c3f2b57589 --- VERSION | 2 +- configure | 18 +++++++++--------- manifest | 15 +++++++-------- manifest.uuid | 2 +- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/VERSION b/VERSION index a8346d5d11..0b3135213f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.19.2 +3.19.3 diff --git a/configure b/configure index 653accad11..8c672fadce 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for sqlite 3.19.2. +# Generated by GNU Autoconf 2.69 for sqlite 3.19.3. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -726,8 +726,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='sqlite' PACKAGE_TARNAME='sqlite' -PACKAGE_VERSION='3.19.2' -PACKAGE_STRING='sqlite 3.19.2' +PACKAGE_VERSION='3.19.3' +PACKAGE_STRING='sqlite 3.19.3' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1463,7 +1463,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures sqlite 3.19.2 to adapt to many kinds of systems. +\`configure' configures sqlite 3.19.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1528,7 +1528,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of sqlite 3.19.2:";; + short | recursive ) echo "Configuration of sqlite 3.19.3:";; esac cat <<\_ACEOF @@ -1652,7 +1652,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -sqlite configure 3.19.2 +sqlite configure 3.19.3 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2071,7 +2071,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by sqlite $as_me 3.19.2, which was +It was created by sqlite $as_me 3.19.3, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -12151,7 +12151,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by sqlite $as_me 3.19.2, which was +This file was extended by sqlite $as_me 3.19.3, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -12217,7 +12217,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -sqlite config.status 3.19.2 +sqlite config.status 3.19.3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/manifest b/manifest index 7448590647..81321a8b5d 100644 --- a/manifest +++ b/manifest @@ -1,10 +1,10 @@ -C Ensure\spointer\smap\sentries\sare\salways\sadded\swhen\sa\srow\sthat\sdoes\suse\soverflow\npages\sreplaces\sone\sthat\sdoes\snot\sin\san\sauto-vacuum\sdatabase.\sFix\sfor\n[fda22108]. -D 2017-06-08T11:26:13.795 +C Increase\sthe\sversion\snumber\sto\s3.19.3. +D 2017-06-08T11:27:05.632 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc F README.md 2b15fae33852f2f53996774c21fb41e1d94181c4401a0e43ac93e11f2cc901b9 -F VERSION 10a1d396b8a19db3c3cc6c7b909be2cf7ad97c517b4f00af363506fd85aab713 +F VERSION 6035ef7e627075d9a9194304c3a07acb2736a0abd0dd980a7ea75a3a45719e86 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 @@ -30,7 +30,7 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 226d9a188c6196f3033ffc651cbc9dcee1a42977 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc F config.sub 9ebe4c3b3dab6431ece34f16828b594fb420da55 -F configure 1b0309062481dbde6278cb870f1680c81c65202d0bfde469f81c7e22397d6f23 x +F configure 51470e605be2083c8ac6e7973a1860ead8be59562f2121197216b70caa0d8b9d x F configure.ac 901e8db2c211e8b655e51ee24f2b8faa33407acde87effc47f70380f3b04e452 F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/lemon.html b5a3c07d33ecb8e019ce8f7660fe2dbbad9d7977 @@ -1580,8 +1580,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P edb4e819b0c058c7d74d27ebd14cc5ceb2bad6a6144a486a970182b7afe3f8b9 -Q +b30dfba811cb531b09ff2e71a1a18ed53c816cb39155dd52ca3e2701425fe17b -R f3c8c8383c25bcc4e304081dde6d0ab0 +P 9478106ca963e3ae5cfe59da40301c5a0a07494d03e656b5eb10ab45e441b870 +R 28460bdf0816a2fdb51bf300e77b3848 U drh -Z f97aca8e1bd3663fbf75118ceaa954dd +Z 52bfa7329c4a7a037c3124284cb2a054 diff --git a/manifest.uuid b/manifest.uuid index 981f2490fd..057626a2f4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9478106ca963e3ae5cfe59da40301c5a0a07494d03e656b5eb10ab45e441b870 \ No newline at end of file +903fff53b3f02cbc011c4cd47d841f45a447746fdf3bcb01202e27c3f2b57589 \ No newline at end of file From d4d01a689d6f41c324386dc7735d60e3f1480b35 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 8 Jun 2017 11:32:19 +0000 Subject: [PATCH 058/113] Fix an issue with OPT_FEATURE_FLAGS in configure.ac. FossilOrigin-Name: 97b5c4a53d0af3792c5ae5ceafdb02245f841c2bd4d79bcfd0ffdf6c5ff27c9e --- configure | 20 ++++++++++---------- configure.ac | 20 ++++++++++---------- manifest | 15 ++++++++------- manifest.uuid | 2 +- 4 files changed, 29 insertions(+), 28 deletions(-) diff --git a/configure b/configure index 8c672fadce..ee7ae2a121 100755 --- a/configure +++ b/configure @@ -11356,7 +11356,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support MEMSYS5" >&5 $as_echo_n "checking whether to support MEMSYS5... " >&6; } if test "${enable_memsys5}" = "yes"; then - OPT_FEATURE_FLAGS="$(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_MEMSYS5" + OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_MEMSYS5" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else @@ -11373,7 +11373,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support MEMSYS3" >&5 $as_echo_n "checking whether to support MEMSYS3... " >&6; } if test "${enable_memsys3}" = "yes" -a "${enable_memsys5}" = "no"; then - OPT_FEATURE_FLAGS="$(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_MEMSYS3" + OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_MEMSYS3" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else @@ -11391,7 +11391,7 @@ else fi if test "${enable_fts3}" = "yes" ; then - OPT_FEATURE_FLAGS="$(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_FTS3" + OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_FTS3" fi # Check whether --enable-fts4 was given. if test "${enable_fts4+set}" = set; then : @@ -11401,7 +11401,7 @@ else fi if test "${enable_fts4}" = "yes" ; then - OPT_FEATURE_FLAGS="$(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_FTS4" + OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_FTS4" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing log" >&5 $as_echo_n "checking for library containing log... " >&6; } if ${ac_cv_search_log+:} false; then : @@ -11467,7 +11467,7 @@ else fi if test "${enable_fts5}" = "yes" ; then - OPT_FEATURE_FLAGS="$(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_FTS5" + OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_FTS5" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing log" >&5 $as_echo_n "checking for library containing log... " >&6; } if ${ac_cv_search_log+:} false; then : @@ -11536,7 +11536,7 @@ else fi if test "${enable_json1}" = "yes" ; then - OPT_FEATURE_FLAGS="$(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_JSON1" + OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_JSON1" fi ######### @@ -11549,7 +11549,7 @@ else fi if test "${enable_rtree}" = "yes" ; then - OPT_FEATURE_FLAGS="$(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_RTREE" + OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_RTREE" fi ######### @@ -11562,12 +11562,12 @@ else fi if test "${enable_session}" = "yes" ; then - OPT_FEATURE_FLAGS="$(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_SESSION" - OPT_FEATURE_FLAGS="$(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_PREUPDATE_HOOK" + OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_SESSION" + OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_PREUPDATE_HOOK" fi ######### -# attempt to duplicate any OMITS and ENABLES into the $(OPT_FEATURE_FLAGS) parameter +# attempt to duplicate any OMITS and ENABLES into the ${OPT_FEATURE_FLAGS} parameter for option in $CFLAGS $CPPFLAGS do case $option in diff --git a/configure.ac b/configure.ac index a0aeb94f72..4deee8ddcb 100644 --- a/configure.ac +++ b/configure.ac @@ -596,7 +596,7 @@ AC_ARG_ENABLE(memsys5, [enable_memsys5=yes],[enable_memsys5=no]) AC_MSG_CHECKING([whether to support MEMSYS5]) if test "${enable_memsys5}" = "yes"; then - OPT_FEATURE_FLAGS="$(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_MEMSYS5" + OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_MEMSYS5" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) @@ -606,7 +606,7 @@ AC_ARG_ENABLE(memsys3, [enable_memsys3=yes],[enable_memsys3=no]) AC_MSG_CHECKING([whether to support MEMSYS3]) if test "${enable_memsys3}" = "yes" -a "${enable_memsys5}" = "no"; then - OPT_FEATURE_FLAGS="$(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_MEMSYS3" + OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_MEMSYS3" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) @@ -618,20 +618,20 @@ AC_ARG_ENABLE(fts3, AC_HELP_STRING([--enable-fts3], [Enable the FTS3 extension]), [enable_fts3=yes],[enable_fts3=no]) if test "${enable_fts3}" = "yes" ; then - OPT_FEATURE_FLAGS="$(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_FTS3" + OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_FTS3" fi AC_ARG_ENABLE(fts4, AC_HELP_STRING([--enable-fts4], [Enable the FTS4 extension]), [enable_fts4=yes],[enable_fts4=no]) if test "${enable_fts4}" = "yes" ; then - OPT_FEATURE_FLAGS="$(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_FTS4" + OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_FTS4" AC_SEARCH_LIBS([log],[m]) fi AC_ARG_ENABLE(fts5, AC_HELP_STRING([--enable-fts5], [Enable the FTS5 extension]), [enable_fts5=yes],[enable_fts5=no]) if test "${enable_fts5}" = "yes" ; then - OPT_FEATURE_FLAGS="$(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_FTS5" + OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_FTS5" AC_SEARCH_LIBS([log],[m]) fi @@ -641,7 +641,7 @@ AC_ARG_ENABLE(json1, AC_HELP_STRING([--enable-json1], [Enable the JSON1 extension]), [enable_json1=yes],[enable_json1=no]) if test "${enable_json1}" = "yes" ; then - OPT_FEATURE_FLAGS="$(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_JSON1" + OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_JSON1" fi ######### @@ -650,7 +650,7 @@ AC_ARG_ENABLE(rtree, AC_HELP_STRING([--enable-rtree], [Enable the RTREE extension]), [enable_rtree=yes],[enable_rtree=no]) if test "${enable_rtree}" = "yes" ; then - OPT_FEATURE_FLAGS="$(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_RTREE" + OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_RTREE" fi ######### @@ -659,12 +659,12 @@ AC_ARG_ENABLE(session, AC_HELP_STRING([--enable-session], [Enable the SESSION extension]), [enable_session=yes],[enable_session=no]) if test "${enable_session}" = "yes" ; then - OPT_FEATURE_FLAGS="$(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_SESSION" - OPT_FEATURE_FLAGS="$(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_PREUPDATE_HOOK" + OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_SESSION" + OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_PREUPDATE_HOOK" fi ######### -# attempt to duplicate any OMITS and ENABLES into the $(OPT_FEATURE_FLAGS) parameter +# attempt to duplicate any OMITS and ENABLES into the ${OPT_FEATURE_FLAGS} parameter for option in $CFLAGS $CPPFLAGS do case $option in diff --git a/manifest b/manifest index 81321a8b5d..f58be9d0ea 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Increase\sthe\sversion\snumber\sto\s3.19.3. -D 2017-06-08T11:27:05.632 +C Fix\san\sissue\swith\sOPT_FEATURE_FLAGS\sin\sconfigure.ac. +D 2017-06-08T11:32:19.653 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc @@ -30,8 +30,8 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 226d9a188c6196f3033ffc651cbc9dcee1a42977 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc F config.sub 9ebe4c3b3dab6431ece34f16828b594fb420da55 -F configure 51470e605be2083c8ac6e7973a1860ead8be59562f2121197216b70caa0d8b9d x -F configure.ac 901e8db2c211e8b655e51ee24f2b8faa33407acde87effc47f70380f3b04e452 +F configure 1a94740b2ac20f3b865689d32746ade6eee7974282170b0ba2b019d310917ec7 x +F configure.ac 13f45f02e6c51dd0e347315b5401c3f047712b7f79b7f35619115c23755afcff F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/lemon.html b5a3c07d33ecb8e019ce8f7660fe2dbbad9d7977 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 @@ -1580,7 +1580,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 9478106ca963e3ae5cfe59da40301c5a0a07494d03e656b5eb10ab45e441b870 -R 28460bdf0816a2fdb51bf300e77b3848 +P 903fff53b3f02cbc011c4cd47d841f45a447746fdf3bcb01202e27c3f2b57589 +Q +43ce3bd3a4b41ea757e308e563d6c1bf7f9c09f10e4766c536d0bf1042c45613 +R b94272eb5bee6b36b4ac20fd561bc415 U drh -Z 52bfa7329c4a7a037c3124284cb2a054 +Z 9d46edb93ef6aa9b74fdbf7152b194d5 diff --git a/manifest.uuid b/manifest.uuid index 057626a2f4..f110d18634 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -903fff53b3f02cbc011c4cd47d841f45a447746fdf3bcb01202e27c3f2b57589 \ No newline at end of file +97b5c4a53d0af3792c5ae5ceafdb02245f841c2bd4d79bcfd0ffdf6c5ff27c9e \ No newline at end of file From d6396e9b169ccedcd9e8ba07f6ecba68d558e61b Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 8 Jun 2017 14:26:16 +0000 Subject: [PATCH 059/113] Version 3.19.3 FossilOrigin-Name: 0ee482a1e0eae22e08edc8978c9733a96603d4509645f348ebf55b579e89636b --- manifest | 12 +++++++----- manifest.uuid | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/manifest b/manifest index f58be9d0ea..5b7be2b7f8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sissue\swith\sOPT_FEATURE_FLAGS\sin\sconfigure.ac. -D 2017-06-08T11:32:19.653 +C Version\s3.19.3 +D 2017-06-08T14:26:16.283 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc @@ -1580,8 +1580,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 903fff53b3f02cbc011c4cd47d841f45a447746fdf3bcb01202e27c3f2b57589 -Q +43ce3bd3a4b41ea757e308e563d6c1bf7f9c09f10e4766c536d0bf1042c45613 +P 97b5c4a53d0af3792c5ae5ceafdb02245f841c2bd4d79bcfd0ffdf6c5ff27c9e R b94272eb5bee6b36b4ac20fd561bc415 +T +bgcolor * #d0c0ff +T +sym-release * +T +sym-version-3.19.3 * U drh -Z 9d46edb93ef6aa9b74fdbf7152b194d5 +Z 0ee14e0381c757607413d6046358676f diff --git a/manifest.uuid b/manifest.uuid index f110d18634..fd64fbcbc1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -97b5c4a53d0af3792c5ae5ceafdb02245f841c2bd4d79bcfd0ffdf6c5ff27c9e \ No newline at end of file +0ee482a1e0eae22e08edc8978c9733a96603d4509645f348ebf55b579e89636b \ No newline at end of file From 4956bd5f9aa5b14807d175b109819a5be9972c92 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 8 Jun 2017 16:23:55 +0000 Subject: [PATCH 060/113] Update the recent auto-vacuum fix so that it works for the in-memory pointer-map structure used by this branch. FossilOrigin-Name: 8e311a6dba202e8733830d8f31b8f0ce11eaefb3a0ab5e5e95ac0d2e5136043b --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- test/concurrent4.test | 16 ++++++++++++++++ 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index f9144add04..6d09c0d308 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\s3.19.3\schanges\swith\sthis\sbranch. -D 2017-06-08T16:10:41.913 +C Update\sthe\srecent\sauto-vacuum\sfix\sso\sthat\sit\sworks\sfor\sthe\sin-memory\npointer-map\sstructure\sused\sby\sthis\sbranch. +D 2017-06-08T16:23:55.894 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc @@ -350,7 +350,7 @@ F src/auth.c 79f96c6f33bf0e5da8d1c282cee5ebb1852bb8a6ccca3e485d7c459b035d9c3c F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b F src/bitvec.c c77b7f5759e413c1c8b53267d633c952e66db79c1171964c7e24c0f92f5019cf F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca -F src/btree.c 95dd5106cb3ee133610b8fab3d1ab1d76ae7f9ef3fae11d023836dc3c672d2b7 +F src/btree.c 1394abd656dab0f62cfe7060be026451bb7fb75a2c5f5a2ea95484264d105614 F src/btree.h 14e99cc2b666beb60322173c761d16b668ec2e07c18bbb74e8a49fe85946f8a0 F src/btreeInt.h 7429915fc8f51bbd78b7ac023aa4afbe5b9660fc1e6970f144b07540a34a4623 F src/build.c ba3f389668754c407805bbc5f8ab140f063ba6b04a6a86f63006b63b3c7319a8 @@ -612,7 +612,7 @@ F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 F test/concurrent.test 3eb5e6a911dc6ff72e3a679f563e683b436f6c701e6e1d6050173df2b8448d6b F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8 F test/concurrent3.test f4af1cf1220908c6dd5694923621c19e999b78cd997e2646285f08a52bcb4170 -F test/concurrent4.test 989c6575225f9c4ef5d2392a9b9d0405665567c7501a3e44129598794d9b1b5f +F test/concurrent4.test 653de3066911acfb9dcf3802bf4f1981b392b86c11f75e2c38ed1abfdd162293 F test/concurrent5.test d5d7d9d404a9b4502464fc097c1fc5c3012bb4f1b063fae7ad707ca983fc86c5 F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c @@ -1591,7 +1591,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0f59bb94d5e8e16a47c53ef0d6138a35c87230ad384b58008e8e7127780446d8 0ee482a1e0eae22e08edc8978c9733a96603d4509645f348ebf55b579e89636b -R f7ed8b840e4f80adc0a45856c6802bc0 +P e2d38d51a9cf1c3dfef742507ec76e3d35853bd09b0d09bf2d404c4b036a184d +R b03e2900f702f1d9793bda1b10355a73 U dan -Z 8407296cfc564f67ed28c7f44ba3d184 +Z f6db321d9b4a7908768625f45dff8451 diff --git a/manifest.uuid b/manifest.uuid index b3d31c2fb1..1378a871d3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e2d38d51a9cf1c3dfef742507ec76e3d35853bd09b0d09bf2d404c4b036a184d \ No newline at end of file +8e311a6dba202e8733830d8f31b8f0ce11eaefb3a0ab5e5e95ac0d2e5136043b \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 359e699368..75bf0fbdfa 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8638,7 +8638,7 @@ int sqlite3BtreeInsert( } rc = clearCell(pPage, oldCell, &info); if( info.nSize==szNew && info.nLocal==info.nPayload - && (!ISAUTOVACUUM || szNewminLocal) + && (!REQUIRE_PTRMAP || szNewminLocal) ){ /* Overwrite the old cell with the new if they are the same size. ** We could also try to do this if the old cell is smaller, then add diff --git a/test/concurrent4.test b/test/concurrent4.test index ce55cdd848..dd29434381 100644 --- a/test/concurrent4.test +++ b/test/concurrent4.test @@ -84,6 +84,22 @@ do_multiclient_test tn { } {ok} } +reset_db +do_execsql_test 3.1 { + PRAGMA page_size = 1024; + PRAGMA journal_mode = wal; + CREATE TABLE t2(x); + INSERT INTO t2 VALUES(randomblob(5000)); + CREATE TABLE t1(a INTEGER PRIMARY KEY, b); + INSERT INTO t1 VALUES(25, randomblob(104)); + DELETE FROM t2; +} {wal} + +do_execsql_test 3.2 { + BEGIN CONCURRENT; + REPLACE INTO t1 VALUES(25, randomblob(1117)); + COMMIT; +} {} finish_test From 827c9b785e7a8ba2a1b80ad69c150747c4d893af Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 10 Jun 2017 17:23:20 +0000 Subject: [PATCH 061/113] Remove sqlite3_log() and abort() calls added to this branch to debug the pointer-map problem ([fda22108]). FossilOrigin-Name: 79544fc2856f30cac8b0962d00698974e8918562f09769a68264d17e1e1176fe --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 46 ---------------------------------------------- 3 files changed, 7 insertions(+), 53 deletions(-) diff --git a/manifest b/manifest index 6d09c0d308..6d77845a0c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthe\srecent\sauto-vacuum\sfix\sso\sthat\sit\sworks\sfor\sthe\sin-memory\npointer-map\sstructure\sused\sby\sthis\sbranch. -D 2017-06-08T16:23:55.894 +C Remove\ssqlite3_log()\sand\sabort()\scalls\sadded\sto\sthis\sbranch\sto\sdebug\sthe\npointer-map\sproblem\s([fda22108]). +D 2017-06-10T17:23:20.663 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc @@ -350,7 +350,7 @@ F src/auth.c 79f96c6f33bf0e5da8d1c282cee5ebb1852bb8a6ccca3e485d7c459b035d9c3c F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b F src/bitvec.c c77b7f5759e413c1c8b53267d633c952e66db79c1171964c7e24c0f92f5019cf F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca -F src/btree.c 1394abd656dab0f62cfe7060be026451bb7fb75a2c5f5a2ea95484264d105614 +F src/btree.c 5a93ba67ecdcde5e0112c355dffbcb067891c9f2211dbc1e232796e279855de6 F src/btree.h 14e99cc2b666beb60322173c761d16b668ec2e07c18bbb74e8a49fe85946f8a0 F src/btreeInt.h 7429915fc8f51bbd78b7ac023aa4afbe5b9660fc1e6970f144b07540a34a4623 F src/build.c ba3f389668754c407805bbc5f8ab140f063ba6b04a6a86f63006b63b3c7319a8 @@ -1591,7 +1591,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e2d38d51a9cf1c3dfef742507ec76e3d35853bd09b0d09bf2d404c4b036a184d -R b03e2900f702f1d9793bda1b10355a73 +P 8e311a6dba202e8733830d8f31b8f0ce11eaefb3a0ab5e5e95ac0d2e5136043b +R 6be74687e7f9ac02928f68f0a8d639cb U dan -Z f6db321d9b4a7908768625f45dff8451 +Z a53782ebd88a9fbbd1f17403d5393b28 diff --git a/manifest.uuid b/manifest.uuid index 1378a871d3..14de91ea10 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8e311a6dba202e8733830d8f31b8f0ce11eaefb3a0ab5e5e95ac0d2e5136043b \ No newline at end of file +79544fc2856f30cac8b0962d00698974e8918562f09769a68264d17e1e1176fe \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 75bf0fbdfa..fadb7eac94 100644 --- a/src/btree.c +++ b/src/btree.c @@ -629,46 +629,11 @@ static void btreePtrmapDelete(BtShared *pBt){ pBt->pMap = 0; } } - -static void btreeCheckPtrmap(BtShared *p, int nPage, const char *zLog){ - BtreePtrmap *pMap = p->pMap; - if( pMap ){ - int n = MIN(1 + nPage - (int)pMap->iFirst, 5); - int i; - for(i=0; iaPtr[i].eType; - if( (eType==PTRMAP_OVERFLOW1 || - eType==PTRMAP_OVERFLOW2 || - eType==PTRMAP_BTREE) && pMap->aPtr[i].parent==0 - ){ - sqlite3_log(SQLITE_ERROR, - "Bitvec: error at (%s) - (%d/%d %d/%d %d/%d %d/%d %d/%d)", - zLog, - (int)pMap->aPtr[0].eType, (int)pMap->aPtr[0].parent, - (n>1 ? (int)pMap->aPtr[1].eType : -1), - (n>1 ? (int)pMap->aPtr[1].parent : -1), - - (n>2 ? (int)pMap->aPtr[2].eType : -1), - (n>2 ? (int)pMap->aPtr[2].parent : -1), - - (n>3 ? (int)pMap->aPtr[3].eType : -1), - (n>3 ? (int)pMap->aPtr[3].parent : -1), - - (n>4 ? (int)pMap->aPtr[4].eType : -1), - (n>4 ? (int)pMap->aPtr[4].parent : -1) - ); - abort(); - break; - } - } - } -} #else /* SQLITE_OMIT_CONCURRENT */ # define btreePtrmapAllocate(x) SQLITE_OK # define btreePtrmapDelete(x) # define btreePtrmapBegin(x,y) SQLITE_OK # define btreePtrmapEnd(x,y,z) -# define btreeCheckPtrmap(a,b,c) #endif /* SQLITE_OMIT_CONCURRENT */ static void releasePage(MemPage *pPage); /* Forward reference */ @@ -4123,8 +4088,6 @@ static int btreeFixUnlocked(Btree *p){ Pgno nPage = btreePagecount(pBt); u32 nFree = get4byte(&p1[36]); - btreeCheckPtrmap(pBt, nPage, "btreeFixUnlocked(1)"); - assert( pBt->pMap ); rc = sqlite3PagerUpgradeSnapshot(pPager, pPage1->pDbPage); assert( p1==pPage1->aData ); @@ -8717,7 +8680,6 @@ int sqlite3BtreeInsert( assert( pCur->apPage[pCur->iPage]->nOverflow==0 ); end_insert: - btreeCheckPtrmap(pBt, pBt->nPage, "sqlite3BtreeInsert()"); return rc; } @@ -8813,8 +8775,6 @@ int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ invalidateIncrblobCursors(p, pCur->pgnoRoot, pCur->info.nKey, 0); } - btreeCheckPtrmap(pBt, pBt->nPage, "sqlite3BtreeDelete(0)"); - /* Make the page containing the entry to be deleted writable. Then free any ** overflow pages associated with the entry and finally remove the cell ** itself from within the page. */ @@ -8824,8 +8784,6 @@ int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ dropCell(pPage, iCellIdx, info.nSize, &rc); if( rc ) return rc; - btreeCheckPtrmap(pBt, pBt->nPage, "sqlite3BtreeDelete(1)"); - /* If the cell deleted was not located on a leaf page, then the cursor ** is currently pointing to the largest entry in the sub-tree headed ** by the child-page of the cell that was just deleted from an internal @@ -8851,8 +8809,6 @@ int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ if( rc ) return rc; } - btreeCheckPtrmap(pBt, pBt->nPage, "sqlite3BtreeDelete(2)"); - /* Balance the tree. If the entry deleted was located on a leaf page, ** then the cursor still points to that page. In this case the first ** call to balance() repairs the tree, and the if(...) condition is @@ -8876,8 +8832,6 @@ int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ rc = balance(pCur); } - btreeCheckPtrmap(pBt, pBt->nPage, "sqlite3BtreeDelete(3)"); - if( rc==SQLITE_OK ){ if( bSkipnext ){ assert( bPreserve && (pCur->iPage==iCellDepth || CORRUPT_DB) ); From 7365bcd72c17412b9a9a59eccd58e01ad01dc6b0 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 20 Jul 2017 18:28:33 +0000 Subject: [PATCH 062/113] Get the build working with SQLITE_OMIT_CONCURRENT. FossilOrigin-Name: a29401e924e6f82ca1c3eec98c6c0b2f1d5b9d7fba9af41a78516f21a7bab3a2 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/btree.c | 5 ++++- src/btreeInt.h | 6 +++--- src/pager.h | 2 ++ 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 96896f8708..6ae55d542a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sall\sthe\slatest\strunk\senhancements. -D 2017-07-20T17:47:12.460 +C Get\sthe\sbuild\sworking\swith\sSQLITE_OMIT_CONCURRENT. +D 2017-07-20T18:28:33.979 F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016 @@ -399,9 +399,9 @@ F src/auth.c 79f96c6f33bf0e5da8d1c282cee5ebb1852bb8a6ccca3e485d7c459b035d9c3c F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b F src/bitvec.c c77b7f5759e413c1c8b53267d633c952e66db79c1171964c7e24c0f92f5019cf F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca -F src/btree.c b3d5ea919c2eef869306ec09e1b6e64a8b9fdd7421f93e6913f5c48b51b4ea6c +F src/btree.c 7e9673478702a5b26ebbbfc1e55a1f0b60bc147a52742db86f781e9fe96c6ecc F src/btree.h e8045998d865a21de226a417467cc64cf9d66e41b91b7436539f99ee464b5402 -F src/btreeInt.h 70236a051364c7d4b8c0513b118925a61cd24c2511ef3991e62732cfc8624c15 +F src/btreeInt.h 4a4cc19595e98c471c05cd9d7fc824da3397c303c7293019f4df7706caacf2fe F src/build.c 62faff0876fdce2b18f14312e3e891f3f366ee493c8fb48d844f9cbae15e6a02 F src/callback.c 8e14b60d1ed1c87c02cb5f121ecda99224f2aea6524a77ee6f72c9b5c7110f84 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e @@ -444,7 +444,7 @@ F src/os_unix.c 30e2c43e4955db990e5b5a81e901f8aa74cc8820 F src/os_win.c 2a6c73eef01c51a048cc4ddccd57f981afbec18a F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 7666599a49ff5098cfaea232cae118ad9afda37a96c9afa8f6db656a977c9cb6 -F src/pager.h ba7b3fbb18f78835a7368d66530bf21d6782e3e640d79c9550d218742c0b07ce +F src/pager.h 13713b181c041691a2bb7afbfbc4aa66c5addd34c46b1e68429eab75a5cfa632 F src/parse.y e4dbcc6136fc4f3084cedd41036401eafd336c5f7cb33bc516fed913a46cac2a F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870 F src/pcache.h 521bb9610d38ef17a3cc9b5ddafd4546c2ea67fa3d0e464823d73c2a28d50e11 @@ -1648,7 +1648,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 79544fc2856f30cac8b0962d00698974e8918562f09769a68264d17e1e1176fe a90c062d46c63a1e6f83064b1c5afb26a16e93b6ee8620ca46d169fdb325c488 -R 5ca93a16d61103201899491d16be4992 +P 213c61cb82d4ee51cc638fc5bb2b54cd51b963c40d088b2f01caf77032ea32fb +R d95fefd02901737ecfdecd42852575c7 U drh -Z 646329efaa2d2b6e9e011be806365053 +Z fe3c771992759cd0f7884a1e6c1e626c diff --git a/manifest.uuid b/manifest.uuid index 4fc907c6af..7b0dec5b1a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -213c61cb82d4ee51cc638fc5bb2b54cd51b963c40d088b2f01caf77032ea32fb \ No newline at end of file +a29401e924e6f82ca1c3eec98c6c0b2f1d5b9d7fba9af41a78516f21a7bab3a2 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index ca9e42af7b..711e20fdda 100644 --- a/src/btree.c +++ b/src/btree.c @@ -10314,6 +10314,9 @@ int sqlite3BtreeExclusiveLock(Btree *p){ assert( p->inTrans==TRANS_WRITE && pBt->pPage1 ); sqlite3BtreeEnter(p); rc = sqlite3PagerExclusiveLock(pBt->pPager, pBt->pPage1->pDbPage, &pgno); +#ifdef SQLITE_OMIT_CONCURRENT + assert( pgno==0 ); +#else if( rc==SQLITE_BUSY_SNAPSHOT && pgno ){ PgHdr *pPg = 0; int rc2 = sqlite3PagerGet(pBt->pPager, pgno, &pPg, 0); @@ -10362,7 +10365,7 @@ int sqlite3BtreeExclusiveLock(Btree *p){ ); } } - +#endif sqlite3BtreeLeave(p); return rc; } diff --git a/src/btreeInt.h b/src/btreeInt.h index fff805b962..44f1e015fb 100644 --- a/src/btreeInt.h +++ b/src/btreeInt.h @@ -277,6 +277,9 @@ struct MemPage { u8 intKey; /* True if table b-trees. False for index b-trees */ u8 intKeyLeaf; /* True if the leaf of an intKey table */ Pgno pgno; /* Page number for this page */ +#ifndef SQLITE_OMIT_CONCURRENT + Pgno pgnoRoot; /* Root page of b-tree that this page belongs to */ +#endif /* Only the first 8 bytes (above) are zeroed by pager.c when a new page ** is allocated. All fields that follow must be initialized before use */ u8 leaf; /* True if a leaf page */ @@ -301,9 +304,6 @@ struct MemPage { DbPage *pDbPage; /* Pager page handle */ u16 (*xCellSize)(MemPage*,u8*); /* cellSizePtr method */ void (*xParseCell)(MemPage*,u8*,CellInfo*); /* btreeParseCell method */ -#ifndef SQLITE_OMIT_CONCURRENT - u32 pgnoRoot; /* Root page of b-tree that this page belongs to */ -#endif }; /* diff --git a/src/pager.h b/src/pager.h index 8aa17c4553..7b02818b2f 100644 --- a/src/pager.h +++ b/src/pager.h @@ -229,7 +229,9 @@ int sqlite3PagerIsWal(Pager*); # define sqlite3PagerEndConcurrent(x) #endif +#if !defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_CONCURRENT) int sqlite3PagerIswriteable(DbPage*); +#endif int sqlite3PagerWalInfo(Pager*, u32 *pnPrior, u32 *pnFrame); From 1af0a4e1dfc2edfb560d18f410756d78ca6d1235 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 20 Jul 2017 18:56:21 +0000 Subject: [PATCH 063/113] Fix a faulty #ifdef on the previous check-in FossilOrigin-Name: 7355e74239fc20f3d948867902675069e6a4efd103bf734f1b24a132f6d2edd1 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pager.h | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 6ae55d542a..844cae323a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Get\sthe\sbuild\sworking\swith\sSQLITE_OMIT_CONCURRENT. -D 2017-07-20T18:28:33.979 +C Fix\sa\sfaulty\s#ifdef\son\sthe\sprevious\scheck-in +D 2017-07-20T18:56:21.537 F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016 @@ -444,7 +444,7 @@ F src/os_unix.c 30e2c43e4955db990e5b5a81e901f8aa74cc8820 F src/os_win.c 2a6c73eef01c51a048cc4ddccd57f981afbec18a F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 7666599a49ff5098cfaea232cae118ad9afda37a96c9afa8f6db656a977c9cb6 -F src/pager.h 13713b181c041691a2bb7afbfbc4aa66c5addd34c46b1e68429eab75a5cfa632 +F src/pager.h 403b7d242616f8742ec149ede4a06b3e66896c554ce09c2abeddb926fdd1b707 F src/parse.y e4dbcc6136fc4f3084cedd41036401eafd336c5f7cb33bc516fed913a46cac2a F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870 F src/pcache.h 521bb9610d38ef17a3cc9b5ddafd4546c2ea67fa3d0e464823d73c2a28d50e11 @@ -1648,7 +1648,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 213c61cb82d4ee51cc638fc5bb2b54cd51b963c40d088b2f01caf77032ea32fb -R d95fefd02901737ecfdecd42852575c7 +P a29401e924e6f82ca1c3eec98c6c0b2f1d5b9d7fba9af41a78516f21a7bab3a2 +R 266b56d38ac33675de86b579a395b93a U drh -Z fe3c771992759cd0f7884a1e6c1e626c +Z 6866fd6a6d6e7ac87e940c57657cce02 diff --git a/manifest.uuid b/manifest.uuid index 7b0dec5b1a..d569dac3aa 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a29401e924e6f82ca1c3eec98c6c0b2f1d5b9d7fba9af41a78516f21a7bab3a2 \ No newline at end of file +7355e74239fc20f3d948867902675069e6a4efd103bf734f1b24a132f6d2edd1 \ No newline at end of file diff --git a/src/pager.h b/src/pager.h index 7b02818b2f..70194e89aa 100644 --- a/src/pager.h +++ b/src/pager.h @@ -229,7 +229,7 @@ int sqlite3PagerIsWal(Pager*); # define sqlite3PagerEndConcurrent(x) #endif -#if !defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_CONCURRENT) +#if defined(SQLITE_DEBUG) || !defined(SQLITE_OMIT_CONCURRENT) int sqlite3PagerIswriteable(DbPage*); #endif From 0a2afca904f9ae11b44e17ea112cc07b2a78ef72 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 20 Jul 2017 19:08:35 +0000 Subject: [PATCH 064/113] Fix compiler warnings. FossilOrigin-Name: 44c760d150b494ddd88382360cfcc4734fec936ed620f88b9df33ea7215c2fc2 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/btree.c | 1 - src/pager.c | 1 + src/wal.c | 7 ++++--- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 844cae323a..4757f0c129 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sfaulty\s#ifdef\son\sthe\sprevious\scheck-in -D 2017-07-20T18:56:21.537 +C Fix\scompiler\swarnings. +D 2017-07-20T19:08:35.935 F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016 @@ -399,7 +399,7 @@ F src/auth.c 79f96c6f33bf0e5da8d1c282cee5ebb1852bb8a6ccca3e485d7c459b035d9c3c F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b F src/bitvec.c c77b7f5759e413c1c8b53267d633c952e66db79c1171964c7e24c0f92f5019cf F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca -F src/btree.c 7e9673478702a5b26ebbbfc1e55a1f0b60bc147a52742db86f781e9fe96c6ecc +F src/btree.c a21ffc82236d6108633559c9459d67b0e173e82934d417ad2ae998511ede6b55 F src/btree.h e8045998d865a21de226a417467cc64cf9d66e41b91b7436539f99ee464b5402 F src/btreeInt.h 4a4cc19595e98c471c05cd9d7fc824da3397c303c7293019f4df7706caacf2fe F src/build.c 62faff0876fdce2b18f14312e3e891f3f366ee493c8fb48d844f9cbae15e6a02 @@ -443,7 +443,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 30e2c43e4955db990e5b5a81e901f8aa74cc8820 F src/os_win.c 2a6c73eef01c51a048cc4ddccd57f981afbec18a F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 7666599a49ff5098cfaea232cae118ad9afda37a96c9afa8f6db656a977c9cb6 +F src/pager.c f29bab45ff5a2c51083196f4bb72d6ad1ab9d1811368f97e52b50579b6e19677 F src/pager.h 403b7d242616f8742ec149ede4a06b3e66896c554ce09c2abeddb926fdd1b707 F src/parse.y e4dbcc6136fc4f3084cedd41036401eafd336c5f7cb33bc516fed913a46cac2a F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870 @@ -535,7 +535,7 @@ F src/vdbesort.c f512c68d0bf7e0105316a5594c4329358c8ee9cae3b25138df041d97516c037 F src/vdbetrace.c 41963d5376f0349842b5fc4aaaaacd7d9cdc0834 F src/vtab.c 35b9bdc2b41de32a417141d12097bcc4e29a77ed7cdb8f836d1d2305d946b61b F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c e006353c3578071a457888aedd5eec9c8f1ba31ba11ddac4084c91c80478ca16 +F src/wal.c 57c8c0720420b5b4a4301b263f3cb09f68cf4cd2240f4473de0910b91de03923 F src/wal.h 1ea51dc499d6451529b822a8aaac053eafeef10b7fd9e5a4c9cc413182be429f F src/walker.c a7ca64ce08a83a20d32186fbe06bca9234e348cfcf07959ee322fdc3e8a6173a F src/where.c cbe8ddffbcec7ce86f7a800fe8fd10aee412c76c87e0dd3732a1682e68d74cd9 @@ -1648,7 +1648,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a29401e924e6f82ca1c3eec98c6c0b2f1d5b9d7fba9af41a78516f21a7bab3a2 -R 266b56d38ac33675de86b579a395b93a +P 7355e74239fc20f3d948867902675069e6a4efd103bf734f1b24a132f6d2edd1 +R 9b106d6151f13525ebfd4ea2a990e095 U drh -Z 6866fd6a6d6e7ac87e940c57657cce02 +Z 89e2d0fc2610ca8ab68df1aaa870de84 diff --git a/manifest.uuid b/manifest.uuid index d569dac3aa..a547a92a81 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7355e74239fc20f3d948867902675069e6a4efd103bf734f1b24a132f6d2edd1 \ No newline at end of file +44c760d150b494ddd88382360cfcc4734fec936ed620f88b9df33ea7215c2fc2 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 711e20fdda..4faaf31413 100644 --- a/src/btree.c +++ b/src/btree.c @@ -4076,7 +4076,6 @@ static int btreeRelocateRange( rc = allocateBtreePage(pBt, &pFree, &iNew, iFirst-1, BTALLOC_LE); assert( rc!=SQLITE_OK || iNeweType, pEntry->parent,iNew,1); diff --git a/src/pager.c b/src/pager.c index 6b8e2ccddc..416ca997cb 100644 --- a/src/pager.c +++ b/src/pager.c @@ -5474,6 +5474,7 @@ static int getPageNormal( /* If this is an CONCURRENT transaction and the page being read was ** present in the database file when the transaction was opened, ** mark it as read in the pAllRead vector. */ + pPg = 0; if( pPager->pAllRead && pgno<=pPager->dbOrigSize ){ rc = sqlite3BitvecSet(pPager->pAllRead, pgno); if( rc!=SQLITE_OK ) goto pager_acquire_err; diff --git a/src/wal.c b/src/wal.c index 13e1c57a99..25df6f3acf 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2899,9 +2899,10 @@ int sqlite3WalLockForCommit( rc = walHashGet(pWal, iHash, &aHash, &aPgno, &iZero); if( rc==SQLITE_OK ){ - int i; - int iMin = (iFirst - iZero); - int iMax = (iHash==0) ? HASHTABLE_NPAGE_ONE : HASHTABLE_NPAGE; + u32 i, iMin, iMax; + assert( iFirst >= iZero ); + iMin = (iFirst - iZero); + iMax = (iHash==0) ? HASHTABLE_NPAGE_ONE : HASHTABLE_NPAGE; if( iMin<1 ) iMin = 1; if( iMax>head.mxFrame ) iMax = head.mxFrame; for(i=iMin; rc==SQLITE_OK && i<=iMax; i++){ From c5856def1e192c086502f703dc197907497912f8 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 20 Jul 2017 19:28:49 +0000 Subject: [PATCH 065/113] Minor fix to the concurrent.test module so that it works on windows. FossilOrigin-Name: 58553d61d199477f88ea9b45055ddaf821eca2aff1bf67c7d81fa80b23c2575a --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/concurrent.test | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 4757f0c129..a85bd5c4b6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\scompiler\swarnings. -D 2017-07-20T19:08:35.935 +C Minor\sfix\sto\sthe\sconcurrent.test\smodule\sso\sthat\sit\sworks\son\swindows. +D 2017-07-20T19:28:49.858 F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016 @@ -659,7 +659,7 @@ F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151eca F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 08948a4809d22817e0e5de89c7c0a8bd90cb551b F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 -F test/concurrent.test 3eb5e6a911dc6ff72e3a679f563e683b436f6c701e6e1d6050173df2b8448d6b +F test/concurrent.test 75977c464f9613045dfa45eb9871aca0c51c2d67a6c89ccd19d47a88c5168cfe F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8 F test/concurrent3.test f4af1cf1220908c6dd5694923621c19e999b78cd997e2646285f08a52bcb4170 F test/concurrent4.test 653de3066911acfb9dcf3802bf4f1981b392b86c11f75e2c38ed1abfdd162293 @@ -1648,7 +1648,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7355e74239fc20f3d948867902675069e6a4efd103bf734f1b24a132f6d2edd1 -R 9b106d6151f13525ebfd4ea2a990e095 +P 44c760d150b494ddd88382360cfcc4734fec936ed620f88b9df33ea7215c2fc2 +R e43e51f268de0c519f41dfe98cdb868f U drh -Z 89e2d0fc2610ca8ab68df1aaa870de84 +Z 893b46e0693cb4cb333312e0b8e9a7df diff --git a/manifest.uuid b/manifest.uuid index a547a92a81..c116e6c3aa 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -44c760d150b494ddd88382360cfcc4734fec936ed620f88b9df33ea7215c2fc2 \ No newline at end of file +58553d61d199477f88ea9b45055ddaf821eca2aff1bf67c7d81fa80b23c2575a \ No newline at end of file diff --git a/test/concurrent.test b/test/concurrent.test index 92a9879ba8..8b05668382 100644 --- a/test/concurrent.test +++ b/test/concurrent.test @@ -162,6 +162,8 @@ do_test 1.8.5 { db eval COMMIT db2 eval COMMIT } {} +db close +db2 close do_multiclient_test tn { @@ -557,4 +559,3 @@ do_multiclient_test tn { } finish_test - From 741802e825d69699e41e8635fb53dbda593d417f Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 11 Aug 2017 19:31:53 +0000 Subject: [PATCH 066/113] Add a PAGERTRACE() macro to log when frames are written into the WAL file. This is for analysis only and is a no-op for production builds. FossilOrigin-Name: 39f39e3d9a083eebe2f8dd5812d20c5b07cc17607b04b573a52fde6d00666f36 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pager.c | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 03713dce17..083bfe611d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sthe\slatest\senhancements\sfrom\strunk. -D 2017-08-11T19:16:55.071 +C Add\sa\sPAGERTRACE()\smacro\sto\slog\swhen\sframes\sare\swritten\sinto\sthe\sWAL\sfile.\nThis\sis\sfor\sanalysis\sonly\sand\sis\sa\sno-op\sfor\sproduction\sbuilds. +D 2017-08-11T19:31:53.502 F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016 @@ -444,7 +444,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c a361273749229755f92c8f0e3e4855054ad39bbc5c65773e8db5d0b79afa632c F src/os_win.c 964165b66cde03abc72fe948198b01be608436894732eadb94c8720d2467f223 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 399d8d5f9436f2e14c5b116875248f03afacb05e77f8465b3f23ce7cad34c86d +F src/pager.c 7fbee7d787ada94b523cb50f92cd89b0eb9a297a1b4328260748b3df0619140e F src/pager.h 403b7d242616f8742ec149ede4a06b3e66896c554ce09c2abeddb926fdd1b707 F src/parse.y bcd8c5d9442518887df1fc9c35d454126927f705ae262cd3981c16bf297e910e F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870 @@ -1657,7 +1657,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P aafe1fec803ddf207bbcb3c669da0a9639411375fc04a52066dde4eb99c3c11b 831156a4bd7c4408085f7c5584cdeebd1953c539972f80c5ef29bc147008630e -R cf26a5dc81c3e301583424514c738282 +P 47e716952d4a5d893b75726a2c52202cb0bc8ce1f75131e920a3ac2e202a507e +R dd67bd244e76571fe616a1fa57b01237 U drh -Z d7b2abd4937b3c1a53ce3f10f75e5d51 +Z d2720ec37e28e2f9ee94d83f86f8a988 diff --git a/manifest.uuid b/manifest.uuid index 6b3bea9342..99b0390e14 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -47e716952d4a5d893b75726a2c52202cb0bc8ce1f75131e920a3ac2e202a507e \ No newline at end of file +39f39e3d9a083eebe2f8dd5812d20c5b07cc17607b04b573a52fde6d00666f36 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 16838c7dc9..3b172d5e78 100644 --- a/src/pager.c +++ b/src/pager.c @@ -3243,6 +3243,8 @@ static int pagerWalFrames( if( p->pgno<=nTruncate ){ ppNext = &p->pDirty; nList++; + PAGERTRACE(("TO-WAL %d page %d hash(%08x)\n", + PAGERID(pPager), p->pgno, pager_pagehash(p))); } } assert( pList ); From 9f16a96d4bc71ea54d61a3bbe706eb8350530b18 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 11 Aug 2017 20:22:30 +0000 Subject: [PATCH 067/113] Add another PAGERTRACE() macro to show when pages are added to Pager.pAllRead. No impact on production builds. FossilOrigin-Name: 11054cf5e8c24ef9ca869d558a0ca6750b56103c3b3793dc4afcef75192ea943 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pager.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 083bfe611d..10e8ee54df 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\sPAGERTRACE()\smacro\sto\slog\swhen\sframes\sare\swritten\sinto\sthe\sWAL\sfile.\nThis\sis\sfor\sanalysis\sonly\sand\sis\sa\sno-op\sfor\sproduction\sbuilds. -D 2017-08-11T19:31:53.502 +C Add\sanother\sPAGERTRACE()\smacro\sto\sshow\swhen\spages\sare\sadded\sto\sPager.pAllRead.\nNo\simpact\son\sproduction\sbuilds. +D 2017-08-11T20:22:30.659 F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016 @@ -444,7 +444,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c a361273749229755f92c8f0e3e4855054ad39bbc5c65773e8db5d0b79afa632c F src/os_win.c 964165b66cde03abc72fe948198b01be608436894732eadb94c8720d2467f223 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 7fbee7d787ada94b523cb50f92cd89b0eb9a297a1b4328260748b3df0619140e +F src/pager.c fac516ae6a04a45b2e84804245d0d0c38be07e8dd62be1f7613c83913f681570 F src/pager.h 403b7d242616f8742ec149ede4a06b3e66896c554ce09c2abeddb926fdd1b707 F src/parse.y bcd8c5d9442518887df1fc9c35d454126927f705ae262cd3981c16bf297e910e F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870 @@ -1657,7 +1657,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 47e716952d4a5d893b75726a2c52202cb0bc8ce1f75131e920a3ac2e202a507e -R dd67bd244e76571fe616a1fa57b01237 +P 39f39e3d9a083eebe2f8dd5812d20c5b07cc17607b04b573a52fde6d00666f36 +R 44b0453e47b7d15fed17613bc4cf70e5 U drh -Z d2720ec37e28e2f9ee94d83f86f8a988 +Z f6a60fb915e7da3c7036aeb9a03bed52 diff --git a/manifest.uuid b/manifest.uuid index 99b0390e14..e9bedf7cbe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -39f39e3d9a083eebe2f8dd5812d20c5b07cc17607b04b573a52fde6d00666f36 \ No newline at end of file +11054cf5e8c24ef9ca869d558a0ca6750b56103c3b3793dc4afcef75192ea943 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 3b172d5e78..733d65d436 100644 --- a/src/pager.c +++ b/src/pager.c @@ -5500,6 +5500,7 @@ static int getPageNormal( ** mark it as read in the pAllRead vector. */ pPg = 0; if( pPager->pAllRead && pgno<=pPager->dbOrigSize ){ + PAGERTRACE(("USING page %d\n", pgno)); rc = sqlite3BitvecSet(pPager->pAllRead, pgno); if( rc!=SQLITE_OK ) goto pager_acquire_err; } From 6aab028db0695dbaa085d7334ac5cc59595a172f Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 11 Aug 2017 21:16:23 +0000 Subject: [PATCH 068/113] Fix a problem allowing a conflicting transaction to be committed in the case where more than one 32KB shared-memory page has been written to since the transaction was started. FossilOrigin-Name: 38dd9b50fe260d853cbc2551bc1bb60ddf5752f0456e0da3afe4cbf728c891d8 --- manifest | 16 ++++++------ manifest.uuid | 2 +- src/wal.c | 7 +++--- test/concurrent.test | 59 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 10e8ee54df..8893e26ec0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sanother\sPAGERTRACE()\smacro\sto\sshow\swhen\spages\sare\sadded\sto\sPager.pAllRead.\nNo\simpact\son\sproduction\sbuilds. -D 2017-08-11T20:22:30.659 +C Fix\sa\sproblem\sallowing\sa\sconflicting\stransaction\sto\sbe\scommitted\sin\sthe\scase\nwhere\smore\sthan\sone\s32KB\sshared-memory\spage\shas\sbeen\swritten\sto\ssince\sthe\ntransaction\swas\sstarted. +D 2017-08-11T21:16:23.047 F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016 @@ -536,7 +536,7 @@ F src/vdbesort.c fea2bea25f5e9ccd91e0760d7359f0365f9fba1aaeac7216c71cad78765f58e F src/vdbetrace.c 41963d5376f0349842b5fc4aaaaacd7d9cdc0834 F src/vtab.c f1d5c23132fb0247af3e86146404112283ddedb6c518de0d4edc91cfb36970ef F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 57c8c0720420b5b4a4301b263f3cb09f68cf4cd2240f4473de0910b91de03923 +F src/wal.c ab94c3cc7bfe006c424b5f5945ad8285ffcda36222f0d40048d46bafb43dab69 F src/wal.h 1ea51dc499d6451529b822a8aaac053eafeef10b7fd9e5a4c9cc413182be429f F src/walker.c a7ca64ce08a83a20d32186fbe06bca9234e348cfcf07959ee322fdc3e8a6173a F src/where.c cbe8ddffbcec7ce86f7a800fe8fd10aee412c76c87e0dd3732a1682e68d74cd9 @@ -662,7 +662,7 @@ F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151eca F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test b111edd2a84f558567320904bb94c779d7eec47254265b5f0a3d1f3e52cc28e0 F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 -F test/concurrent.test 75977c464f9613045dfa45eb9871aca0c51c2d67a6c89ccd19d47a88c5168cfe +F test/concurrent.test f91ab1933beee68b5dbe7a784ed147d2ad190c1b84425e3ea84aefe14f7d1151 F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8 F test/concurrent3.test f4af1cf1220908c6dd5694923621c19e999b78cd997e2646285f08a52bcb4170 F test/concurrent4.test 653de3066911acfb9dcf3802bf4f1981b392b86c11f75e2c38ed1abfdd162293 @@ -1657,7 +1657,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 39f39e3d9a083eebe2f8dd5812d20c5b07cc17607b04b573a52fde6d00666f36 -R 44b0453e47b7d15fed17613bc4cf70e5 -U drh -Z f6a60fb915e7da3c7036aeb9a03bed52 +P 11054cf5e8c24ef9ca869d558a0ca6750b56103c3b3793dc4afcef75192ea943 +R 4e06f85f8b10dfd7cc0854935df8167f +U dan +Z d88ae17a00fc8079da60ecbd46144cbb diff --git a/manifest.uuid b/manifest.uuid index e9bedf7cbe..f2738523b9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -11054cf5e8c24ef9ca869d558a0ca6750b56103c3b3793dc4afcef75192ea943 \ No newline at end of file +38dd9b50fe260d853cbc2551bc1bb60ddf5752f0456e0da3afe4cbf728c891d8 \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index 25df6f3acf..1e0b6f98bc 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2900,11 +2900,10 @@ int sqlite3WalLockForCommit( rc = walHashGet(pWal, iHash, &aHash, &aPgno, &iZero); if( rc==SQLITE_OK ){ u32 i, iMin, iMax; - assert( iFirst >= iZero ); - iMin = (iFirst - iZero); + assert( head.mxFrame>=iZero ); + iMin = (iZero >= iFirst) ? 1 : (iFirst - iZero); iMax = (iHash==0) ? HASHTABLE_NPAGE_ONE : HASHTABLE_NPAGE; - if( iMin<1 ) iMin = 1; - if( iMax>head.mxFrame ) iMax = head.mxFrame; + if( iMax>(head.mxFrame-iZero) ) iMax = (head.mxFrame-iZero); for(i=iMin; rc==SQLITE_OK && i<=iMax; i++){ PgHdr *pPg; if( aPgno[i]==1 ){ diff --git a/test/concurrent.test b/test/concurrent.test index 8b05668382..f18d9d8922 100644 --- a/test/concurrent.test +++ b/test/concurrent.test @@ -558,4 +558,63 @@ do_multiclient_test tn { } {1 {database is locked}} } +do_multiclient_test tn { + do_test 7.$tn.1 { + sql1 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(a INTEGER PRIMARY KEY, b); + WITH s(i) AS ( VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<100) + INSERT INTO t1 SELECT NULL, randomblob(400) FROM s; + + CREATE TABLE t2(a INTEGER PRIMARY KEY, b); + WITH s(i) AS ( VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<50000) + INSERT INTO t2 SELECT NULL, randomblob(400) FROM s; + + CREATE TABLE t3(a INTEGER PRIMARY KEY, b); + WITH s(i) AS ( VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<100) + INSERT INTO t3 SELECT NULL, randomblob(400) FROM s; + + CREATE TABLE t4(a INTEGER PRIMARY KEY, b); + + PRAGMA wal_checkpoint; + } + set {} {} + } {} + + do_test 7.$tn.2 { + sql2 { + BEGIN CONCURRENT; + SELECT * FROM t1; + INSERT INTO t4 VALUES(1, 2); + } + set {} {} + } {} + + do_test 7.$tn.3 { + sql3 { + BEGIN CONCURRENT; + SELECT * FROM t3; + INSERT INTO t4 VALUES(1, 2); + } + set {} {} + } {} + + do_test 7.$tn.4 { + sql1 { + UPDATE t1 SET b=randomblob(400); + UPDATE t2 SET b=randomblob(400); + UPDATE t3 SET b=randomblob(400); + } + } {} + + do_test 7.$tn.5 { + csql2 { COMMIT } + } {1 {database is locked}} + + do_test 7.$tn.6 { + csql3 { COMMIT } + } {1 {database is locked}} + +} + finish_test From d828d0debc064b64afa563c499d2d7b7e3b6f006 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 12 Aug 2017 14:06:15 +0000 Subject: [PATCH 069/113] Add a more rigorous test case for the bug fixed by the previous commit on this branch. FossilOrigin-Name: 4256072399f44f48ed0856aa8112226af6feaf8676923612bde6cea239ebf920 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/concurrent.test | 32 +++++++++++++++++++++++++++++++- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 8893e26ec0..91cd200ac0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sallowing\sa\sconflicting\stransaction\sto\sbe\scommitted\sin\sthe\scase\nwhere\smore\sthan\sone\s32KB\sshared-memory\spage\shas\sbeen\swritten\sto\ssince\sthe\ntransaction\swas\sstarted. -D 2017-08-11T21:16:23.047 +C Add\sa\smore\srigorous\stest\scase\sfor\sthe\sbug\sfixed\sby\sthe\sprevious\scommit\son\sthis\nbranch. +D 2017-08-12T14:06:15.050 F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016 @@ -662,7 +662,7 @@ F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151eca F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test b111edd2a84f558567320904bb94c779d7eec47254265b5f0a3d1f3e52cc28e0 F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 -F test/concurrent.test f91ab1933beee68b5dbe7a784ed147d2ad190c1b84425e3ea84aefe14f7d1151 +F test/concurrent.test a801cd60c370f0ed851657c9576b102f9ab1dd846c6a88e6ae45939a8deeda7c F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8 F test/concurrent3.test f4af1cf1220908c6dd5694923621c19e999b78cd997e2646285f08a52bcb4170 F test/concurrent4.test 653de3066911acfb9dcf3802bf4f1981b392b86c11f75e2c38ed1abfdd162293 @@ -1657,7 +1657,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 11054cf5e8c24ef9ca869d558a0ca6750b56103c3b3793dc4afcef75192ea943 -R 4e06f85f8b10dfd7cc0854935df8167f +P 38dd9b50fe260d853cbc2551bc1bb60ddf5752f0456e0da3afe4cbf728c891d8 +R 5ae6eec944d8695060377eb5fcb02f25 U dan -Z d88ae17a00fc8079da60ecbd46144cbb +Z be5258dc78cb84266e8cf9b3ea9ebd92 diff --git a/manifest.uuid b/manifest.uuid index f2738523b9..d2eec08d49 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -38dd9b50fe260d853cbc2551bc1bb60ddf5752f0456e0da3afe4cbf728c891d8 \ No newline at end of file +4256072399f44f48ed0856aa8112226af6feaf8676923612bde6cea239ebf920 \ No newline at end of file diff --git a/test/concurrent.test b/test/concurrent.test index f18d9d8922..b8f8d7e0d6 100644 --- a/test/concurrent.test +++ b/test/concurrent.test @@ -576,7 +576,6 @@ do_multiclient_test tn { CREATE TABLE t4(a INTEGER PRIMARY KEY, b); - PRAGMA wal_checkpoint; } set {} {} } {} @@ -615,6 +614,37 @@ do_multiclient_test tn { csql3 { COMMIT } } {1 {database is locked}} + + csql2 ROLLBACK + csql3 ROLLBACK + + # The following test works with $tn==1 (sql2 and sql3 use separate + # processes), but is quite slow. So only run it with $tn==2 (all + # connections in the same process). + # + if {$tn==2} { + do_test 7.$tn.7 { + for {set i 1} {$i < 10000} {incr i} { + sql3 { + PRAGMA wal_checkpoint; + BEGIN CONCURRENT; + SELECT * FROM t3; + INSERT INTO t4 VALUES(1, 2); + } + + sql1 { + UPDATE t2 SET b = randomblob(400) WHERE rowid <= $i; + UPDATE t3 SET b = randomblob(400) WHERE rowid = 1; + } + + if {[csql3 COMMIT]!={1 {database is locked}}} { + error "Failed at i=$i" + } + csql3 ROLLBACK + } + } {} + } + } finish_test From 9c54156a9cc203a106f9938eab1a572c7f3598f3 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 24 Aug 2017 10:10:28 +0000 Subject: [PATCH 070/113] Test BEGIN CONCURRENT transactions that consist entirely of read-only statements. FossilOrigin-Name: c3fe1f4b7e8dcadcb516622719d000b808effe3ad497244ba44f57d52dc2cc08 --- manifest | 12 +++--- manifest.uuid | 2 +- test/concurrent4.test | 89 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 91cd200ac0..c5496f5966 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\smore\srigorous\stest\scase\sfor\sthe\sbug\sfixed\sby\sthe\sprevious\scommit\son\sthis\nbranch. -D 2017-08-12T14:06:15.050 +C Test\sBEGIN\sCONCURRENT\stransactions\sthat\sconsist\sentirely\sof\sread-only\nstatements. +D 2017-08-24T10:10:28.736 F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016 @@ -665,7 +665,7 @@ F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 F test/concurrent.test a801cd60c370f0ed851657c9576b102f9ab1dd846c6a88e6ae45939a8deeda7c F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8 F test/concurrent3.test f4af1cf1220908c6dd5694923621c19e999b78cd997e2646285f08a52bcb4170 -F test/concurrent4.test 653de3066911acfb9dcf3802bf4f1981b392b86c11f75e2c38ed1abfdd162293 +F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44 F test/concurrent5.test d5d7d9d404a9b4502464fc097c1fc5c3012bb4f1b063fae7ad707ca983fc86c5 F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c @@ -1657,7 +1657,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 38dd9b50fe260d853cbc2551bc1bb60ddf5752f0456e0da3afe4cbf728c891d8 -R 5ae6eec944d8695060377eb5fcb02f25 +P 4256072399f44f48ed0856aa8112226af6feaf8676923612bde6cea239ebf920 +R 03a159c270fd82b6d54f5498b523d32e U dan -Z be5258dc78cb84266e8cf9b3ea9ebd92 +Z fcb6179847dc0180b01d1fb922b3b8b6 diff --git a/manifest.uuid b/manifest.uuid index d2eec08d49..7d481eeeee 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4256072399f44f48ed0856aa8112226af6feaf8676923612bde6cea239ebf920 \ No newline at end of file +c3fe1f4b7e8dcadcb516622719d000b808effe3ad497244ba44f57d52dc2cc08 \ No newline at end of file diff --git a/test/concurrent4.test b/test/concurrent4.test index dd29434381..d43e701d99 100644 --- a/test/concurrent4.test +++ b/test/concurrent4.test @@ -101,5 +101,94 @@ do_execsql_test 3.2 { COMMIT; } {} +#------------------------------------------------------------------------- +# Test the effect of BEGIN CONCURRENT transactions that consist entirely +# of read-only statements. +# +reset_db +do_execsql_test 4.0 { + PRAGMA page_size = 1024; + PRAGMA journal_mode = wal; + + CREATE TABLE t4(a, b); + INSERT INTO t4 VALUES(1, 2); + INSERT INTO t4 VALUES(3, 4); +} {wal} + +sqlite3 db2 test.db +do_test 4.1.1 { + db eval { + BEGIN CONCURRENT; + INSERT INTO t4 VALUES(5, 6); + } + + db2 eval { + BEGIN CONCURRENT; + SELECT * FROM t4; + ROLLBACK; + } +} {1 2 3 4} + +do_test 4.1.2 { + db eval { COMMIT } + db2 eval { SELECT * FROM t4 } +} {1 2 3 4 5 6} + +do_test 4.2.1 { + db eval { + BEGIN CONCURRENT; + INSERT INTO t4 VALUES(7, 8); + } + + db2 eval { + BEGIN CONCURRENT; + SELECT * FROM t4; + COMMIT; + } +} {1 2 3 4 5 6} + +do_test 4.2.2 { + db eval { COMMIT } + db2 eval { SELECT * FROM t4 } +} {1 2 3 4 5 6 7 8} + +do_test 4.3 { + db2 eval { + BEGIN CONCURRENT; + SELECT * FROM t4; + } + + db eval { + BEGIN CONCURRENT; + INSERT INTO t4 VALUES(9, 10); + COMMIT; + } + db2 eval { + SELECT * FROM t4; + COMMIT; + } +} {1 2 3 4 5 6 7 8} + +set sz [file size test.db-wal] +do_test 4.4.1 { + db eval { + BEGIN CONCURRENT; + SELECT * FROM t4; + SELECT * FROM sqlite_master; + } + + db eval COMMIT + file size test.db-wal +} $sz +do_test 4.4.2 { + db eval { + BEGIN CONCURRENT; + SELECT * FROM t4; + SELECT * FROM sqlite_master; + ROLLBACK; + } + file size test.db-wal +} $sz + finish_test From d351e7643f04d2df346ba4729eed331b8874ceb5 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 9 Sep 2017 08:03:28 +0000 Subject: [PATCH 071/113] Use a mutex-free PRNG for the random() and randomblob() SQL functions and for the randomness used during checkpoint operations. FossilOrigin-Name: e63d1a7cd317811f74d206ae47bd11a8fc6b6311218fbc6d0cbf49e8281b362f --- manifest | 27 +++++++++++++++------------ manifest.uuid | 2 +- src/func.c | 6 ++++-- src/main.c | 1 + src/random.c | 22 ++++++++++++++++++++++ src/select.c | 2 +- src/sqliteInt.h | 12 ++++++++++++ src/wal.c | 8 +++++--- 8 files changed, 61 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index 4b71f03671..494f65db2e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings\sseen\swith\sMSVC. -D 2017-09-09T00:51:36.496 +C Use\sa\smutex-free\sPRNG\sfor\sthe\srandom()\sand\srandomblob()\sSQL\sfunctions\sand\sfor\nthe\srandomness\sused\sduring\scheckpoint\soperations. +D 2017-09-09T08:03:28.579 F Makefile.in c644bbe8ebe4aae82ad6783eae6b6beea4c727b99ff97568b847ced5e2ac7afb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 6a7a74bf60ad395098c0bd175ab054cd65ef85d7f034198d52bcc4d9e5fb4c6b @@ -413,7 +413,7 @@ F src/delete.c 21a5f1812fdb599e9f7afb9f650bdabab60a3afd51d7e94e539c982f647b0023 F src/expr.c 0f611840217016cf2c5e72f2eb8e412e48511bf740ae1fd5b58dc5e409c6e738 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 5ff2c895fe087756d8085dc1a9bc229b5670e2a65c3929dd87c71e43649af333 -F src/func.c b4d259af627e3cd9510cf08db37f0bcc88b1887c735169c74490c3739d5cf5c6 +F src/func.c 8c46246dcb5779e77bf2ef192fa1355460aeec1d3d0b2537608d319bcd7d8778 F src/global.c ac3094f1dc59fbeb919aef7cc0cc827a8459d1fb1adb7972ef75bd9e0c10b75b F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 @@ -422,7 +422,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c d2d1bf12d2b5382450620d7cede84c7ffe57e6a89fa9a908f1aba68df2731cd9 F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e F src/loadext.c 20865b183bb8a3723d59cf1efffc3c50217eb452c1021d077b908c94da26b0b2 -F src/main.c 34a58563358fe40979186124d1a3614b9a00c833124d7ebfa8e5d604ed1d2521 +F src/main.c cd03aeca7a9d5f221010d0212b3abdd558e37a317947f8e78dd9162a5d904223 F src/malloc.c a02c9e69bc76bee0f639416b947a946412890b606301454727feadcb313536d6 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -454,16 +454,16 @@ F src/pragma.c faf5f9ec553b71035c63e08d31651bbd28bec826d546b32c8e9c295855ca3605 F src/pragma.h bb83728944b42f6d409c77f5838a8edbdb0fe83046c5496ffc9602b40340a324 F src/prepare.c 9a141a1b02dca53beaa9771699d390aafcac01f5d1f1c0ae6e23ded8dcdb709a F src/printf.c 40aee47ae9be4bd3dbdc8968bd07fddc027be8edec8daddf24d3391d36698a1c -F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 +F src/random.c f27af4099afaea7284ade5c206224dcfdb2334cfd119d018b470d46356b3f27d F src/resolve.c 4324a94573b1e29286f8121e4881db59eaedc014afeb274c8d3e07ed282e0e20 F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac -F src/select.c c9b3d8444bbf6f167d84f41ca6f3672e2521cb163a8c706b19058dc82fffe9b8 +F src/select.c 5bda89e7cda69ef9cdd25c98ee6403ed2a3753d5ab135e24fc7a20344fd68d0a F src/shell.c c1206a23d9239f8f51751d3be9b8c3b02fa4103546bea1add7f864d84a8276ab F src/shell.c.in bb9720a8c5c98d3984b16ab7540e7142bcae959666ecf248bfc523a1d44220ee F src/sqlite.h.in 21f62793a3611b43f6fb31f0a4c8b38489a4df025416e9b7db7cc01bf5ef5aaa F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a1fd3aa82f967da436164e0728a7d6841651fd0c6e27b9044e0eb9f6c8462e47 -F src/sqliteInt.h f9ae3609a583aa51712083e1d5817f62c7d97c0a203036a9a62c439059e8258b +F src/sqliteInt.h 63e64c24f19910f52d2910f000b070a027fad42d134055970c98c18a76584fce F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 9737ed017279a9e0c5da748701c3c7bf1e8ae0dae459aad20dd64fcff97a7e35 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -536,7 +536,7 @@ F src/vdbesort.c 731a09e5cb9e96b70c394c1b7cf3860fbe84acca7682e178615eb941a3a0ef2 F src/vdbetrace.c 48e11ebe040c6b41d146abed2602e3d00d621d7ebe4eb29b0a0f1617fd3c2f6c F src/vtab.c f1d5c23132fb0247af3e86146404112283ddedb6c518de0d4edc91cfb36970ef F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 839db09792fead5052bb35e533fa485e134913d547d05b5f42e537b73e63f07a +F src/wal.c 2a205ec9c9be4e4b2933d32481c4654b4c6b644d8a6c755a5f8c7a10ade64616 F src/wal.h 8de5d2d3de0956d6f6cb48c83a4012d5f227b8fe940f3a349a4b7e85ebcb492a F src/walker.c 3ccfa8637f95355bff61144e01a615b8ef26f79c312880848da73f03367da1e6 F src/where.c 101f0a645c45c12141b38a61b593232555fc001bf7786dcb03eb8f313783b404 @@ -1652,7 +1652,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e1e3ca7ea43a68b9b57dc38d8855f63b63a53feb8128b666a1becf87a2c70341 -R 14621bd82abfa0f650a4c6242c2108d7 -U mistachkin -Z 11f83c8a0999c8fee516d7917728daf2 +P faa22e29a5a05a16d46a428d838acedfa7d6fad6239495d59a6a1f4764e1b1b6 +R a52f584275f92dc78c3958a57a4f1fc7 +T *branch * mutex-free-randomness +T *sym-mutex-free-randomness * +T -sym-trunk * +U drh +Z fc9d4eaa55f9d67c6518af204f0991ab diff --git a/manifest.uuid b/manifest.uuid index ce2953ddb7..99d7c5ea83 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -faa22e29a5a05a16d46a428d838acedfa7d6fad6239495d59a6a1f4764e1b1b6 \ No newline at end of file +e63d1a7cd317811f74d206ae47bd11a8fc6b6311218fbc6d0cbf49e8281b362f \ No newline at end of file diff --git a/src/func.c b/src/func.c index b46578a407..f2ed1faae6 100644 --- a/src/func.c +++ b/src/func.c @@ -481,8 +481,9 @@ static void randomFunc( sqlite3_value **NotUsed2 ){ sqlite_int64 r; + sqlite3 *db = sqlite3_context_db_handle(context); UNUSED_PARAMETER2(NotUsed, NotUsed2); - sqlite3_randomness(sizeof(r), &r); + sqlite3FastRandomness(&db->sPrng, sizeof(r), &r); if( r<0 ){ /* We need to prevent a random number of 0x8000000000000000 ** (or -9223372036854775808) since when you do abs() of that @@ -508,6 +509,7 @@ static void randomBlob( ){ int n; unsigned char *p; + sqlite3 *db = sqlite3_context_db_handle(context); assert( argc==1 ); UNUSED_PARAMETER(argc); n = sqlite3_value_int(argv[0]); @@ -516,7 +518,7 @@ static void randomBlob( } p = contextMalloc(context, n); if( p ){ - sqlite3_randomness(n, p); + sqlite3FastRandomness(&db->sPrng, n, p); sqlite3_result_blob(context, (char*)p, n, sqlite3_free); } } diff --git a/src/main.c b/src/main.c index 3942ed9465..2a83e05539 100644 --- a/src/main.c +++ b/src/main.c @@ -2865,6 +2865,7 @@ static int openDatabase( db->nDb = 2; db->magic = SQLITE_MAGIC_BUSY; db->aDb = db->aDbStatic; + sqlite3FastPrngInit(&db->sPrng); assert( sizeof(db->aLimit)==sizeof(aHardLimit) ); memcpy(db->aLimit, aHardLimit, sizeof(db->aLimit)); diff --git a/src/random.c b/src/random.c index d4ae77c435..dd971ab655 100644 --- a/src/random.c +++ b/src/random.c @@ -106,6 +106,28 @@ void sqlite3_randomness(int N, void *pBuf){ sqlite3_mutex_leave(mutex); } +/* +** Initialize a fast PRNG. A Fast PRNG is called "fast" because it does +** not need a mutex to operate, though it does use a mutex to initialize. +** The quality of the randomness is not as good as the global PRNG. +*/ +void sqlite3FastPrngInit(FastPrng *pPrng){ + sqlite3_randomness(sizeof(*pPrng), pPrng); + pPrng->x |= 1; +} + +/* +** Generate N bytes of pseudo-randomness using a FastPrng +*/ +void sqlite3FastRandomness(FastPrng *pPrng, int N, void *P){ + unsigned char *pOut = (unsigned char*)P; + while( N-->0 ){ + pPrng->x = ((pPrng->x)>>1) ^ ((1+~((pPrng->x)&1)) & 0xd0000001); + pPrng->y = (pPrng->y)*1103515245 + 12345; + *(pOut++) = (pPrng->x ^ pPrng->y) & 0xff; + } +} + #ifndef SQLITE_UNTESTABLE /* ** For testing purposes, we sometimes want to preserve the state of diff --git a/src/select.c b/src/select.c index aedbcc4b3a..2b2f687a5b 100644 --- a/src/select.c +++ b/src/select.c @@ -1745,7 +1745,7 @@ int sqlite3ColumnsFromExprList( if( zName[j]==':' ) nName = j; } zName = sqlite3MPrintf(db, "%.*z:%u", nName, zName, ++cnt); - if( cnt>3 ) sqlite3_randomness(sizeof(cnt), &cnt); + if( cnt>3 ) sqlite3FastRandomness(&db->sPrng, sizeof(cnt), &cnt); } pCol->zName = zName; sqlite3ColumnPropertiesFromName(0, pCol); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 4ce54cf73d..1b254e2512 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1073,6 +1073,7 @@ typedef struct NameContext NameContext; typedef struct Parse Parse; typedef struct PreUpdate PreUpdate; typedef struct PrintfArguments PrintfArguments; +typedef struct FastPrng FastPrng; typedef struct RowSet RowSet; typedef struct Savepoint Savepoint; typedef struct Select Select; @@ -1145,6 +1146,14 @@ typedef int VList; # define SQLITE_DEFAULT_WAL_SYNCHRONOUS SQLITE_DEFAULT_SYNCHRONOUS #endif +/* +** State of a simple PRNG used for the per-connection and per-pager +** pseudo-random number generators. +*/ +struct FastPrng { + unsigned int x, y; +}; + /* ** Each database file to be accessed by the system is an instance ** of the following structure. There are normally two of these structures @@ -1351,6 +1360,7 @@ struct sqlite3 { u8 nSqlExec; /* Number of pending OP_SqlExec opcodes */ int nextPagesize; /* Pagesize after VACUUM if >0 */ u32 magic; /* Magic number for detect library misuse */ + FastPrng sPrng; /* State of the per-connection PRNG */ int nChange; /* Value returned by sqlite3_changes() */ int nTotalChange; /* Value returned by sqlite3_total_changes() */ int aLimit[SQLITE_N_LIMIT]; /* Limits */ @@ -3821,6 +3831,8 @@ Vdbe *sqlite3GetVdbe(Parse*); void sqlite3PrngSaveState(void); void sqlite3PrngRestoreState(void); #endif +void sqlite3FastPrngInit(FastPrng*); +void sqlite3FastRandomness(FastPrng*, int N, void *P); void sqlite3RollbackAll(sqlite3*,int); void sqlite3CodeVerifySchema(Parse*, int); void sqlite3CodeVerifyNamedSchema(Parse*, const char *zDb); diff --git a/src/wal.c b/src/wal.c index 9930b84421..1353766f7f 100644 --- a/src/wal.c +++ b/src/wal.c @@ -448,6 +448,7 @@ struct Wal { u32 iReCksum; /* On commit, recalculate checksums from here */ const char *zWalName; /* Name of WAL file */ u32 nCkpt; /* Checkpoint sequence counter in the wal-header */ + FastPrng sPrng; /* Random number generator */ #ifdef SQLITE_DEBUG u8 lockError; /* True if a locking error has occurred */ #endif @@ -1323,6 +1324,7 @@ int sqlite3WalOpen( pRet->syncHeader = 1; pRet->padToSectorBoundary = 1; pRet->exclusiveMode = (bNoShm ? WAL_HEAPMEMORY_MODE: WAL_NORMAL_MODE); + sqlite3FastPrngInit(&pRet->sPrng); /* Open file handle on the write-ahead log file. */ flags = (SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_WAL); @@ -1870,7 +1872,7 @@ static int walCheckpoint( rc = SQLITE_BUSY; }else if( eMode>=SQLITE_CHECKPOINT_RESTART ){ u32 salt1; - sqlite3_randomness(4, &salt1); + sqlite3FastRandomness(&pWal->sPrng, 4, &salt1); assert( pInfo->nBackfill==pWal->hdr.mxFrame ); rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(1), WAL_NREADER-1); if( rc==SQLITE_OK ){ @@ -2878,7 +2880,7 @@ static int walRestartLog(Wal *pWal){ assert( pInfo->nBackfill==pWal->hdr.mxFrame ); if( pInfo->nBackfill>0 ){ u32 salt1; - sqlite3_randomness(4, &salt1); + sqlite3FastRandomness(&pWal->sPrng, 4, &salt1); rc = walLockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); if( rc==SQLITE_OK ){ /* If all readers are using WAL_READ_LOCK(0) (in other words if no @@ -3094,7 +3096,7 @@ int sqlite3WalFrames( sqlite3Put4byte(&aWalHdr[4], WAL_MAX_VERSION); sqlite3Put4byte(&aWalHdr[8], szPage); sqlite3Put4byte(&aWalHdr[12], pWal->nCkpt); - if( pWal->nCkpt==0 ) sqlite3_randomness(8, pWal->hdr.aSalt); + if( pWal->nCkpt==0 ) sqlite3FastRandomness(&pWal->sPrng, 8, pWal->hdr.aSalt); memcpy(&aWalHdr[16], pWal->hdr.aSalt, 8); walChecksumBytes(1, aWalHdr, WAL_HDRSIZE-2*4, 0, aCksum); sqlite3Put4byte(&aWalHdr[24], aCksum[0]); From 03d405f0464f25de0ef1aa76a650faa1baabf931 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 12 Sep 2017 20:09:31 +0000 Subject: [PATCH 072/113] Add the highly-experimental "PRAGMA noop_update=TRUE" command. FossilOrigin-Name: afe45271b9c0cd379cf0beb94657e2396068c4a18f84003c4c48297760fd83ee --- manifest | 24 ++++++++++++++---------- manifest.uuid | 2 +- src/pragma.h | 11 ++++++++++- src/sqliteInt.h | 1 + src/update.c | 11 +++++++++++ tool/mkpragmatab.tcl | 6 ++++++ 6 files changed, 43 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 91cd200ac0..aba94857ed 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\smore\srigorous\stest\scase\sfor\sthe\sbug\sfixed\sby\sthe\sprevious\scommit\son\sthis\nbranch. -D 2017-08-12T14:06:15.050 +C Add\sthe\shighly-experimental\s"PRAGMA\snoop_update=TRUE"\scommand. +D 2017-09-12T20:09:31.560 F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016 @@ -451,7 +451,7 @@ F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870 F src/pcache.h 521bb9610d38ef17a3cc9b5ddafd4546c2ea67fa3d0e464823d73c2a28d50e11 F src/pcache1.c 0b793738b5dddaf0a645784835c6b5557b1ecfaee339af9c26810c6ecdb273aa F src/pragma.c cd6aeda3587be6c5c08f9b2d45eae6068666a03c9d077c8c43cdb85fb0aa70f2 -F src/pragma.h bb83728944b42f6d409c77f5838a8edbdb0fe83046c5496ffc9602b40340a324 +F src/pragma.h 70cb22e66adabf21bac20e2894184ece986a67a3252506220f3b62633c87dceb F src/prepare.c 3cbb99757d7295997674972f9dd2331c5c544368854ca08954c9beb1e9b6145a F src/printf.c 8757834f1b54dae512fb25eb1acc8e94a0d15dd2290b58f2563f65973265adb2 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 @@ -463,7 +463,7 @@ F src/shell.c.in b5725acacba95ccefa57b6d068f710e29ba8239c3aa704628a1902a1f729c17 F src/sqlite.h.in 803d2c969bccaf78ef087269c73f1f00f8870c122b3514414b8c47c4fde73e82 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a1fd3aa82f967da436164e0728a7d6841651fd0c6e27b9044e0eb9f6c8462e47 -F src/sqliteInt.h 0eccf839f75dab42f46559ea529c51921b8bf427b3d9a170a45e8e58cb4304bd +F src/sqliteInt.h dc8a03250ca4887630a048ed135e50c47f75ef30a0859256420d072e6b98caf4 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c a9e66593dfb28a9e746cba7153f84d49c1ddc4b1 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -521,7 +521,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 1003d6d90c6783206c711f0a9397656fa5b055209f4d092caa43bb3bf5215db5 F src/treeview.c 2ee4a5dada213d5ab08a742af5c876cee6f1aaae65f10a61923f3fb63846afef F src/trigger.c 48e0f7ed6749ce4d50a695e09e20ce9cf84ecabf2691852c965a51e0b620eccc -F src/update.c 5404be9e840717323a69209190cdbc9d0d34adaedaaf1d1a1069babf2c4171c0 +F src/update.c 2bb1d048a1a56e1f9238d68e8e476299a5873c4d4d9e0e9c4ab542d8b25f341d F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c fc081ec6f63448dcd80d3dfad35baecfa104823254a815b081a4d9fe76e1db23 F src/vacuum.c 07eec96f821c7dcbdca2fadffc6e38ea2c24bf409fcb15fe9fb3ac444d632dfe @@ -1594,7 +1594,7 @@ F tool/mkmsvcmin.tcl cbd93f1cfa3a0a9ae56fc958510aa3fc3ac65e29cb111716199e3d0e66e F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 4ee2a30ccbd900dc4d5cdb61bdab87cd2166cd2affcc78c9cc0b8d22a65b2eee F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e -F tool/mkpragmatab.tcl 2144bc8550a6471a029db262a132d2df4b9e0db61b90398bf64f5b7b3f8d92cd +F tool/mkpragmatab.tcl e9a725395dc4419047d242f4ebd4716dd8c682e234b6553a4bb891fc1f12174c F tool/mkshellc.tcl 69c38ecd7b74b2b0799a35ce20e1e3998e504d8c99c100ca4b98ae9d8f6279bc F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl fef88397668ae83166735c41af99d79f56afaabb @@ -1657,7 +1657,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 38dd9b50fe260d853cbc2551bc1bb60ddf5752f0456e0da3afe4cbf728c891d8 -R 5ae6eec944d8695060377eb5fcb02f25 -U dan -Z be5258dc78cb84266e8cf9b3ea9ebd92 +P 4256072399f44f48ed0856aa8112226af6feaf8676923612bde6cea239ebf920 +Q +de2e371757d2031cefc4bbae29d746a768c126a6c8443bb0f9ddebee7e69240b +R 2413782f3f576a461bb90e166b6f6e32 +T *branch * begin-concurrent-pnu +T *sym-begin-concurrent-pnu * +T -sym-begin-concurrent * +U drh +Z 105db701de986bc4ba15a35d9febe596 diff --git a/manifest.uuid b/manifest.uuid index d2eec08d49..c3c05f6cd6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4256072399f44f48ed0856aa8112226af6feaf8676923612bde6cea239ebf920 \ No newline at end of file +afe45271b9c0cd379cf0beb94657e2396068c4a18f84003c4c48297760fd83ee \ No newline at end of file diff --git a/src/pragma.h b/src/pragma.h index c9ece2dc87..80801945cf 100644 --- a/src/pragma.h +++ b/src/pragma.h @@ -440,6 +440,15 @@ static const PragmaName aPragmaName[] = { /* iArg: */ 0 }, #endif #endif +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if defined(SQLITE_DEBUG) + {/* zName: */ "noop_update", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_NoopUpdate }, +#endif #endif {/* zName: */ "optimize", /* ePragTyp: */ PragTyp_OPTIMIZE, @@ -646,4 +655,4 @@ static const PragmaName aPragmaName[] = { /* iArg: */ SQLITE_WriteSchema }, #endif }; -/* Number of pragmas: 60 on by default, 77 total. */ +/* Number of pragmas: 60 on by default, 78 total. */ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 7d41119578..c6295c3d33 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1490,6 +1490,7 @@ struct sqlite3 { #define SQLITE_EnableQPSG 0x00800000 /* Query Planner Stability Guarantee */ /* Flags used only if debugging */ #ifdef SQLITE_DEBUG +#define SQLITE_NoopUpdate 0x04000000 /* UPDATE operations are no-ops */ #define SQLITE_SqlTrace 0x08000000 /* Debug print SQL as it executes */ #define SQLITE_VdbeListing 0x10000000 /* Debug listings of VDBE programs */ #define SQLITE_VdbeTrace 0x20000000 /* True to trace VDBE execution */ diff --git a/src/update.c b/src/update.c index e69efdb6bf..912b7e646b 100644 --- a/src/update.c +++ b/src/update.c @@ -223,6 +223,17 @@ void sqlite3Update( */ chngRowid = chngPk = 0; for(i=0; inExpr; i++){ +#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_FLAG_PRAGMAS) + if( db->flags & SQLITE_NoopUpdate ){ + Token x; + sqlite3ExprDelete(db, pChanges->a[i].pExpr); + x.z = pChanges->a[i].zName; + x.n = sqlite3Strlen30(x.z); + pChanges->a[i].pExpr = + sqlite3PExpr(pParse, TK_UPLUS, sqlite3ExprAlloc(db, TK_ID, &x, 0), 0); + if( db->mallocFailed ) goto update_cleanup; + } +#endif if( sqlite3ResolveExprNames(&sNC, pChanges->a[i].pExpr) ){ goto update_cleanup; } diff --git a/tool/mkpragmatab.tcl b/tool/mkpragmatab.tcl index 1bfbeb7c58..b790398476 100644 --- a/tool/mkpragmatab.tcl +++ b/tool/mkpragmatab.tcl @@ -112,6 +112,12 @@ set pragma_def { IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) IF: defined(SQLITE_DEBUG) + NAME: noop_update + TYPE: FLAG + ARG: SQLITE_NoopUpdate + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) + IF: defined(SQLITE_DEBUG) + NAME: ignore_check_constraints TYPE: FLAG ARG: SQLITE_IgnoreChecks From 7393c7424e14ab4acdc188a93b84d5bfaefa954b Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 22 Sep 2017 11:09:09 +0000 Subject: [PATCH 073/113] Cherrypick [ec37ad6d08] into this branch. With this patch, if SQLITE_SHARED_MAPPING is defined at build-time SQLite will use a single memory mapping for multiple connections to the same database file within a single process. FossilOrigin-Name: c7a5880d6d898299b4c9414b7702cfa450aa5f7bf4ec8f417b94d2a7b6558264 --- manifest | 13 +++++++------ manifest.uuid | 2 +- src/os_unix.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index b3429762a7..861009c901 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\slatest\strunk\schanges\sinto\sthis\sbranch. -D 2017-09-22T10:49:03.297 +C Cherrypick\s[ec37ad6d08]\sinto\sthis\sbranch.\sWith\sthis\spatch,\sif\nSQLITE_SHARED_MAPPING\sis\sdefined\sat\sbuild-time\sSQLite\swill\suse\sa\ssingle\smemory\nmapping\sfor\smultiple\sconnections\sto\sthe\ssame\sdatabase\sfile\swithin\sa\ssingle\nprocess. +D 2017-09-22T11:09:09.656 F Makefile.in 4bc36d913c2e3e2d326d588d72f618ac9788b2fd4b7efda61102611a6495c3ff F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 6033b51b6aea702ea059f6ab2d47b1d3cef648695f787247dd4fb395fe60673f @@ -446,7 +446,7 @@ F src/os.c 93e0979b9b55df29c0c4923f73b48e9d3fe728f01dd8ed4f6a9d2f1d79779bc8 F src/os.h 8e976e59eb4ca1c0fca6d35ee803e38951cb0343 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c 3984fc069df59e26f000e30609611cecdb4e93293e6ee52313a473a7e874af1b +F src/os_unix.c 1b2203f30ec4ecef66b0f9b714432edaffe0f89f189af7c6b1db3e2cb3a52d24 F src/os_win.c 5c802f05e706c87c6e4cc6e9527f3364c7a7178458f93dffa5e19ac2e8eef9c1 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 84e90e0acee15766840f89b8be6f14322de16396d9229c494fec6c1cc03a69cf @@ -1666,7 +1666,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 d53108e76307fb24ef1d8f75fe82c180f5588ad8e65eeceace92f4cecadfa452 0a12915b373cd0491a58d8f7a645711c620c70efced623e6b40aa01f23284157 -R 5b090dbbf85dc5792098185268ac7c8f +P 307b802e8627c93a51e4c54851a4fab33db5061bb80e3d327ce53b127d6d511b +Q +ec37ad6d08362f4c9faad9b629c0fa23f5864ff6ad7f4cbed93a25d5f7b815d8 +R a7069c27bdffb405c8574ad991612563 U dan -Z 51723e9e7fe6c543a37219e2d01ad740 +Z 9a1235c2d010c6dd3774c97b07deb6f2 diff --git a/manifest.uuid b/manifest.uuid index f7b69a87af..da8f0bb88e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -307b802e8627c93a51e4c54851a4fab33db5061bb80e3d327ce53b127d6d511b \ No newline at end of file +c7a5880d6d898299b4c9414b7702cfa450aa5f7bf4ec8f417b94d2a7b6558264 \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index 4445104dd6..0e444e61f2 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -1115,6 +1115,10 @@ struct unixInodeInfo { sem_t *pSem; /* Named POSIX semaphore */ char aSemName[MAX_PATHNAME+2]; /* Name of that semaphore */ #endif +#ifdef SQLITE_SHARED_MAPPING + sqlite3_int64 nSharedMapping; /* Size of mapped region in bytes */ + void *pSharedMapping; /* Memory mapped region */ +#endif }; /* @@ -1249,6 +1253,13 @@ static void releaseInodeInfo(unixFile *pFile){ pInode->nRef--; if( pInode->nRef==0 ){ assert( pInode->pShmNode==0 ); +#ifdef SQLITE_SHARED_MAPPING + if( pInode->pSharedMapping ){ + osMunmap(pInode->pSharedMapping, pInode->nSharedMapping); + pInode->pSharedMapping = 0; + pInode->nSharedMapping = 0; + } +#endif closePendingFds(pFile); if( pInode->pPrev ){ assert( pInode->pPrev->pNext==pInode ); @@ -2055,6 +2066,14 @@ static int nolockUnlock(sqlite3_file *NotUsed, int NotUsed2){ ** Close the file. */ static int nolockClose(sqlite3_file *id) { +#ifdef SQLITE_SHARED_MAPPING + unixFile *pFd = (unixFile*)id; + if( pFd->pInode ){ + unixEnterMutex(); + releaseInodeInfo(pFd); + unixLeaveMutex(); + } +#endif return closeUnixFile(id); } @@ -3874,6 +3893,9 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){ *(i64*)pArg = pFile->mmapSizeMax; if( newLimit>=0 && newLimit!=pFile->mmapSizeMax && pFile->nFetchOut==0 ){ pFile->mmapSizeMax = newLimit; +#ifdef SQLITE_SHARED_MAPPING + if( pFile->pInode==0 ) +#endif if( pFile->mmapSize>0 ){ unixUnmapfile(pFile); rc = unixMapfile(pFile, -1); @@ -4774,6 +4796,9 @@ static int unixShmUnmap( */ static void unixUnmapfile(unixFile *pFd){ assert( pFd->nFetchOut==0 ); +#ifdef SQLITE_SHARED_MAPPING + if( pFd->pInode ) return; +#endif if( pFd->pMapRegion ){ osMunmap(pFd->pMapRegion, pFd->mmapSizeActual); pFd->pMapRegion = 0; @@ -4905,6 +4930,28 @@ static int unixMapfile(unixFile *pFd, i64 nMap){ nMap = pFd->mmapSizeMax; } +#ifdef SQLITE_SHARED_MAPPING + if( pFd->pInode ){ + unixInodeInfo *pInode = pFd->pInode; + if( pFd->pMapRegion ) return SQLITE_OK; + unixEnterMutex(); + if( pInode->pSharedMapping==0 ){ + u8 *pNew = osMmap(0, nMap, PROT_READ, MAP_SHARED, pFd->h, 0); + if( pNew==MAP_FAILED ){ + unixLogError(SQLITE_OK, "mmap", pFd->zPath); + pFd->mmapSizeMax = 0; + }else{ + pInode->pSharedMapping = pNew; + pInode->nSharedMapping = nMap; + } + } + pFd->pMapRegion = pInode->pSharedMapping; + pFd->mmapSizeActual = pFd->mmapSize = pInode->nSharedMapping; + unixLeaveMutex(); + return SQLITE_OK; + } +#endif + assert( nMap>0 || (pFd->mmapSize==0 && pFd->pMapRegion==0) ); if( nMap!=pFd->mmapSize ){ unixRemapfile(pFd, nMap); @@ -5342,6 +5389,9 @@ static int fillInUnixFile( if( pLockingStyle == &posixIoMethods #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE || pLockingStyle == &nfsIoMethods +#endif +#ifdef SQLITE_SHARED_MAPPING + || pLockingStyle == &nolockIoMethods #endif ){ unixEnterMutex(); From 56391f2769aa384088175b24d28f37a1526f2390 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 1 Nov 2017 18:48:54 +0000 Subject: [PATCH 074/113] The "PRAGMA noop_update" command now requires SQLITE_ENABLE_NOOP_UPDATE and no longer requires SQLITE_DEBUG. FossilOrigin-Name: 81baf67c4493468e4feb2f4990bf82d59804ce4f3149252c0e1e8c43f90d6bc1 --- manifest | 20 ++++++++------------ manifest.uuid | 2 +- src/pragma.h | 2 +- src/update.c | 2 +- tool/mkpragmatab.tcl | 2 +- 5 files changed, 12 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index aba94857ed..ff67f1b298 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\shighly-experimental\s"PRAGMA\snoop_update=TRUE"\scommand. -D 2017-09-12T20:09:31.560 +C The\s"PRAGMA\snoop_update"\scommand\snow\srequires\sSQLITE_ENABLE_NOOP_UPDATE\nand\sno\slonger\srequires\sSQLITE_DEBUG. +D 2017-11-01T18:48:54.596 F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016 @@ -451,7 +451,7 @@ F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870 F src/pcache.h 521bb9610d38ef17a3cc9b5ddafd4546c2ea67fa3d0e464823d73c2a28d50e11 F src/pcache1.c 0b793738b5dddaf0a645784835c6b5557b1ecfaee339af9c26810c6ecdb273aa F src/pragma.c cd6aeda3587be6c5c08f9b2d45eae6068666a03c9d077c8c43cdb85fb0aa70f2 -F src/pragma.h 70cb22e66adabf21bac20e2894184ece986a67a3252506220f3b62633c87dceb +F src/pragma.h ce41efb7d4cdafca499839f29014d9b1d9534c8f503eeceb88310920c62d6097 F src/prepare.c 3cbb99757d7295997674972f9dd2331c5c544368854ca08954c9beb1e9b6145a F src/printf.c 8757834f1b54dae512fb25eb1acc8e94a0d15dd2290b58f2563f65973265adb2 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 @@ -521,7 +521,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 1003d6d90c6783206c711f0a9397656fa5b055209f4d092caa43bb3bf5215db5 F src/treeview.c 2ee4a5dada213d5ab08a742af5c876cee6f1aaae65f10a61923f3fb63846afef F src/trigger.c 48e0f7ed6749ce4d50a695e09e20ce9cf84ecabf2691852c965a51e0b620eccc -F src/update.c 2bb1d048a1a56e1f9238d68e8e476299a5873c4d4d9e0e9c4ab542d8b25f341d +F src/update.c d36ee12b6cde68543fa35f6b88475a78e787c7237ed0a79c786364e8ef680480 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c fc081ec6f63448dcd80d3dfad35baecfa104823254a815b081a4d9fe76e1db23 F src/vacuum.c 07eec96f821c7dcbdca2fadffc6e38ea2c24bf409fcb15fe9fb3ac444d632dfe @@ -1594,7 +1594,7 @@ F tool/mkmsvcmin.tcl cbd93f1cfa3a0a9ae56fc958510aa3fc3ac65e29cb111716199e3d0e66e F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 4ee2a30ccbd900dc4d5cdb61bdab87cd2166cd2affcc78c9cc0b8d22a65b2eee F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e -F tool/mkpragmatab.tcl e9a725395dc4419047d242f4ebd4716dd8c682e234b6553a4bb891fc1f12174c +F tool/mkpragmatab.tcl 0d67312ad1a6db29e85215c87e3f5c0cd3a9bf9e32784bf3a02e5ebaf1faadb0 F tool/mkshellc.tcl 69c38ecd7b74b2b0799a35ce20e1e3998e504d8c99c100ca4b98ae9d8f6279bc F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl fef88397668ae83166735c41af99d79f56afaabb @@ -1657,11 +1657,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4256072399f44f48ed0856aa8112226af6feaf8676923612bde6cea239ebf920 -Q +de2e371757d2031cefc4bbae29d746a768c126a6c8443bb0f9ddebee7e69240b -R 2413782f3f576a461bb90e166b6f6e32 -T *branch * begin-concurrent-pnu -T *sym-begin-concurrent-pnu * -T -sym-begin-concurrent * +P afe45271b9c0cd379cf0beb94657e2396068c4a18f84003c4c48297760fd83ee +R 13a4e608c33e96d8f32961fb092111d1 U drh -Z 105db701de986bc4ba15a35d9febe596 +Z 22f49919fb59529cdea1770ba1acc6e3 diff --git a/manifest.uuid b/manifest.uuid index c3c05f6cd6..7e93f679a5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -afe45271b9c0cd379cf0beb94657e2396068c4a18f84003c4c48297760fd83ee \ No newline at end of file +81baf67c4493468e4feb2f4990bf82d59804ce4f3149252c0e1e8c43f90d6bc1 \ No newline at end of file diff --git a/src/pragma.h b/src/pragma.h index 80801945cf..c4f61734f8 100644 --- a/src/pragma.h +++ b/src/pragma.h @@ -442,7 +442,7 @@ static const PragmaName aPragmaName[] = { #endif #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) -#if defined(SQLITE_DEBUG) +#if defined(SQLITE_ENABLE_NOOP_UPDATE) {/* zName: */ "noop_update", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, diff --git a/src/update.c b/src/update.c index 912b7e646b..86872cd3c0 100644 --- a/src/update.c +++ b/src/update.c @@ -223,7 +223,7 @@ void sqlite3Update( */ chngRowid = chngPk = 0; for(i=0; inExpr; i++){ -#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if defined(SQLITE_ENABLE_NOOP_UPDATE) && !defined(SQLITE_OMIT_FLAG_PRAGMAS) if( db->flags & SQLITE_NoopUpdate ){ Token x; sqlite3ExprDelete(db, pChanges->a[i].pExpr); diff --git a/tool/mkpragmatab.tcl b/tool/mkpragmatab.tcl index b790398476..4d4b959aa1 100644 --- a/tool/mkpragmatab.tcl +++ b/tool/mkpragmatab.tcl @@ -116,7 +116,7 @@ set pragma_def { TYPE: FLAG ARG: SQLITE_NoopUpdate IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) - IF: defined(SQLITE_DEBUG) + IF: defined(SQLITE_ENABLE_NOOP_UPDATE) NAME: ignore_check_constraints TYPE: FLAG From 4d13729861259c527a56cd5e7e79ef51c41a4b0d Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 1 Nov 2017 19:30:41 +0000 Subject: [PATCH 075/113] Fix the SQLITE_NoopUpdate #define so that it occurs under the correct conditions. FossilOrigin-Name: bdf791f9f7f7ab4b1871e1d3a0d5edcad46fc67d7336ae7f3f7b20e69801be8e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqliteInt.h | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index ff67f1b298..28ecb53069 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\s"PRAGMA\snoop_update"\scommand\snow\srequires\sSQLITE_ENABLE_NOOP_UPDATE\nand\sno\slonger\srequires\sSQLITE_DEBUG. -D 2017-11-01T18:48:54.596 +C Fix\sthe\sSQLITE_NoopUpdate\s#define\sso\sthat\sit\soccurs\sunder\sthe\scorrect\nconditions. +D 2017-11-01T19:30:41.289 F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016 @@ -463,7 +463,7 @@ F src/shell.c.in b5725acacba95ccefa57b6d068f710e29ba8239c3aa704628a1902a1f729c17 F src/sqlite.h.in 803d2c969bccaf78ef087269c73f1f00f8870c122b3514414b8c47c4fde73e82 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a1fd3aa82f967da436164e0728a7d6841651fd0c6e27b9044e0eb9f6c8462e47 -F src/sqliteInt.h dc8a03250ca4887630a048ed135e50c47f75ef30a0859256420d072e6b98caf4 +F src/sqliteInt.h 5bea474f3e9e2446bb80d3f5e632fb33cad6332f822fd1f207c4fbfee63bc39c F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c a9e66593dfb28a9e746cba7153f84d49c1ddc4b1 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1657,7 +1657,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P afe45271b9c0cd379cf0beb94657e2396068c4a18f84003c4c48297760fd83ee -R 13a4e608c33e96d8f32961fb092111d1 +P 81baf67c4493468e4feb2f4990bf82d59804ce4f3149252c0e1e8c43f90d6bc1 +R 59abeaa6daabac9ab7e74c5755dea792 U drh -Z 22f49919fb59529cdea1770ba1acc6e3 +Z d4cba171c15be720c948ceaa78bd9661 diff --git a/manifest.uuid b/manifest.uuid index 7e93f679a5..97b4af9f46 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -81baf67c4493468e4feb2f4990bf82d59804ce4f3149252c0e1e8c43f90d6bc1 \ No newline at end of file +bdf791f9f7f7ab4b1871e1d3a0d5edcad46fc67d7336ae7f3f7b20e69801be8e \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index c6295c3d33..dfc3cb6564 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1488,9 +1488,9 @@ struct sqlite3 { #define SQLITE_CellSizeCk 0x00200000 /* Check btree cell sizes on load */ #define SQLITE_Fts3Tokenizer 0x00400000 /* Enable fts3_tokenizer(2) */ #define SQLITE_EnableQPSG 0x00800000 /* Query Planner Stability Guarantee */ +#define SQLITE_NoopUpdate 0x01000000 /* UPDATE operations are no-ops */ /* Flags used only if debugging */ #ifdef SQLITE_DEBUG -#define SQLITE_NoopUpdate 0x04000000 /* UPDATE operations are no-ops */ #define SQLITE_SqlTrace 0x08000000 /* Debug print SQL as it executes */ #define SQLITE_VdbeListing 0x10000000 /* Debug listings of VDBE programs */ #define SQLITE_VdbeTrace 0x20000000 /* True to trace VDBE execution */ From c0f69fcec77830092331cc4bbc0b6b36d17a5e7a Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 6 Nov 2017 10:04:45 +0000 Subject: [PATCH 076/113] Allow "BEGIN CONCURRENT" transactions to modify the temp schema. FossilOrigin-Name: 0fb6d91cea347384fc081ce4c79582b365801dd4f56f5bf2ed40922bbfca0344 --- manifest | 15 +++++++-------- manifest.uuid | 2 +- src/vdbe.c | 4 ++-- test/concurrent.test | 36 ++++++++++++++++++++++++++++++++---- 4 files changed, 42 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 861009c901..6930c352bb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Cherrypick\s[ec37ad6d08]\sinto\sthis\sbranch.\sWith\sthis\spatch,\sif\nSQLITE_SHARED_MAPPING\sis\sdefined\sat\sbuild-time\sSQLite\swill\suse\sa\ssingle\smemory\nmapping\sfor\smultiple\sconnections\sto\sthe\ssame\sdatabase\sfile\swithin\sa\ssingle\nprocess. -D 2017-09-22T11:09:09.656 +C Allow\s"BEGIN\sCONCURRENT"\stransactions\sto\smodify\sthe\stemp\sschema. +D 2017-11-06T10:04:45.041 F Makefile.in 4bc36d913c2e3e2d326d588d72f618ac9788b2fd4b7efda61102611a6495c3ff F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 6033b51b6aea702ea059f6ab2d47b1d3cef648695f787247dd4fb395fe60673f @@ -530,7 +530,7 @@ F src/update.c 5404be9e840717323a69209190cdbc9d0d34adaedaaf1d1a1069babf2c4171c0 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c 5168013cfd937a695d23cce8c67cb07a3dda242d4cb812530ba1148b88e0f159 F src/vacuum.c 07eec96f821c7dcbdca2fadffc6e38ea2c24bf409fcb15fe9fb3ac444d632dfe -F src/vdbe.c 96467c73f53c3cb2b3ad7a73c69d59fb43966d772a7fc70114dde14cf3876dd0 +F src/vdbe.c 8b7313c7012c627a0f6579b0c1d3a42f48ffd187e4beb6a0face21092d728ac0 F src/vdbe.h d50cadf12bcf9fb99117ef392ce1ea283aa429270481426b6e8b0280c101fd97 F src/vdbeInt.h 1fe00770144c12c4913128f35262d11527ef3284561baaab59b947a41c08d0d9 F src/vdbeapi.c 9c670ca0dcc1cd86373aa353b747b26fe531ca5cd4331690c611d1f03842e2a1 @@ -668,7 +668,7 @@ F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151eca F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test c47639d26cbeba6977457e5ef2c2c55c5b6c889478dd7eb0ed858ba894e7fa93 F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 -F test/concurrent.test a801cd60c370f0ed851657c9576b102f9ab1dd846c6a88e6ae45939a8deeda7c +F test/concurrent.test 86661967a680670127a62a819e60dc93c2d3d49043ac95b26dfa70d3e60dbde5 F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8 F test/concurrent3.test f4af1cf1220908c6dd5694923621c19e999b78cd997e2646285f08a52bcb4170 F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44 @@ -1666,8 +1666,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 307b802e8627c93a51e4c54851a4fab33db5061bb80e3d327ce53b127d6d511b -Q +ec37ad6d08362f4c9faad9b629c0fa23f5864ff6ad7f4cbed93a25d5f7b815d8 -R a7069c27bdffb405c8574ad991612563 +P c7a5880d6d898299b4c9414b7702cfa450aa5f7bf4ec8f417b94d2a7b6558264 +R 202ef8632fda2b1b9ef7af4f1e374f95 U dan -Z 9a1235c2d010c6dd3774c97b07deb6f2 +Z d758dc3efdc3027768a35f11fc7171bf diff --git a/manifest.uuid b/manifest.uuid index da8f0bb88e..e36be45a6d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c7a5880d6d898299b4c9414b7702cfa450aa5f7bf4ec8f417b94d2a7b6558264 \ No newline at end of file +0fb6d91cea347384fc081ce4c79582b365801dd4f56f5bf2ed40922bbfca0344 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 09c0cd32b4..4292fce260 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3306,7 +3306,7 @@ case OP_SetCookie: { rc = sqlite3BtreeUpdateMeta(pDb->pBt, pOp->p2, pOp->p3); if( pOp->p2==BTREE_SCHEMA_VERSION ){ /* When the schema cookie changes, record the new cookie internally */ - assert( db->bConcurrent==0 ); + assert( pOp->p1==1 || db->bConcurrent==0 ); pDb->pSchema->schema_cookie = pOp->p3; db->mDbFlags |= DBFLAG_SchemaChange; }else if( pOp->p2==BTREE_FILE_FORMAT ){ @@ -6509,7 +6509,7 @@ case OP_Expire: { case OP_TableLock: { u8 isWriteLock = (u8)pOp->p3; #ifndef SQLITE_OMIT_CONCURRENT - if( isWriteLock && db->bConcurrent && pOp->p2==1 ){ + if( isWriteLock && db->bConcurrent && pOp->p2==1 && pOp->p1!=1 ){ rc = SQLITE_ERROR; sqlite3VdbeError(p, "cannot modify database schema within CONCURRENT transaction"); diff --git a/test/concurrent.test b/test/concurrent.test index b8f8d7e0d6..b94071a8f1 100644 --- a/test/concurrent.test +++ b/test/concurrent.test @@ -112,19 +112,47 @@ foreach {tn sql} { 2 { DROP TABLE t1 } 3 { CREATE INDEX i1 ON t1(a) } 4 { CREATE VIEW v1 AS SELECT * FROM t1 } - 5 { CREATE TEMP TABLE xx(a, b) } } { - do_catchsql_test 1.7.$tn.1 " + do_catchsql_test 1.7.0.$tn.1 " BEGIN CONCURRENT; $sql " {1 {cannot modify database schema within CONCURRENT transaction}} - do_execsql_test 1.7.$tn.2 { + do_execsql_test 1.7.0.$tn.2 { SELECT sql FROM sqlite_master; SELECT sql FROM sqlite_temp_master; } {{CREATE TABLE t1(a, b)}} - do_execsql_test 1.7.$tn.3 COMMIT + do_execsql_test 1.7.0.$tn.3 COMMIT +} + +# Except the temp db schema. +foreach {tn sql} { + 1 { CREATE TEMP TABLE xx(a, b) } + 2 { DROP TABLE xx } + 3 { CREATE TEMP TABLE yy(a, b) } + 4 { CREATE VIEW temp.v1 AS SELECT * FROM t1 } + 5 { CREATE INDEX yyi1 ON yy(a); } + 6 { CREATE TABLE temp.zz(a, b) } +} { + do_catchsql_test 1.7.1.$tn.1 " + BEGIN CONCURRENT; + $sql + " {0 {}} + + do_execsql_test 1.7.1.$tn.2 COMMIT +} + + +do_execsql_test 1.7.1.x { + SELECT sql FROM sqlite_master; + SELECT sql FROM sqlite_temp_master; +} { + {CREATE TABLE t1(a, b)} + {CREATE TABLE yy(a, b)} + {CREATE VIEW v1 AS SELECT * FROM t1} + {CREATE INDEX yyi1 ON yy(a)} + {CREATE TABLE zz(a, b)} } #------------------------------------------------------------------------- From cb0267185c8178ad94b9dc169a2ee043ec60321e Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 11 Dec 2017 14:02:10 +0000 Subject: [PATCH 077/113] Abort on an invalid paramater to sqlite3BitvecSet(). FossilOrigin-Name: 163c870950f386f6b0bb1ff9b3886cf95ba0deed414cae75baf87621ed3528c2 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/bitvec.c | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 77220b7e11..dce0a2ddfa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\schanges\sfrom\strunk.\sThis\sfixes\sthe\sSQLITE_ENABLE_UPDATE_DELETE_LIMIT\sfunctionality\sso\sthat\sit\sworks\swith\sviews\sand\sWITHOUT\sROWID\stables. -D 2017-11-14T20:06:15.563 +C Abort\son\san\sinvalid\sparamater\sto\ssqlite3BitvecSet(). +D 2017-12-11T14:02:10.998 F Makefile.in b142eb20482922153ebc77b261cdfd0a560ed05a81e9f6d9a2b0e8192922a1d2 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc a55372a22454e742ba7c8f6edf05b83213ec01125166ad7dcee0567e2f7fc81b @@ -414,7 +414,7 @@ F src/analyze.c 0d0ccf7520a201d8747ea2f02c92c26e26f801bc161f714f27b9f7630dde0421 F src/attach.c 07b706e336fd3cedbd855e1f8266d10e82fecae07daf86717b5760cd7784c584 F src/auth.c 6277d63837357549fe14e723490d6dc1a38768d71c795c5eb5c0f8a99f918f73 F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b -F src/bitvec.c c77b7f5759e413c1c8b53267d633c952e66db79c1171964c7e24c0f92f5019cf +F src/bitvec.c 8433d9e98dd6f2ea3286e0d2fe5d65de1bfc18a706486eb2026b01be066b5806 F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca F src/btree.c a41d580524a4cd9b00443b7196d298e05463f6bfcb712853db3abcddc93cf3ab F src/btree.h feafd0647331366f4ef17f7e68597e9029f001e7ab16a125e2f176c598a7ef4a @@ -1686,7 +1686,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7f217edab4575554f657d38e2a1bc6b3f577998fdbecb04eb200aeb8b8406581 dae4a97a483bee1e6ac0271ddd28a0dffcebf7522edaf12eb5e0eba5fc62516a -R d370973eeca86ae526a0060a468b38d6 -U dan -Z 20f27c4758e319217032ba89b2abf6bd +P d90e5f346bcf7adab26ca8dad9dfbd0fbb86604a15f2fe827f11b3faab036750 +R e43dfcde6e63fd81287681f03e602a2f +U drh +Z 3fc04e05119313efe5c6f01b2d450caa diff --git a/manifest.uuid b/manifest.uuid index b87d30350a..af787c32f4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d90e5f346bcf7adab26ca8dad9dfbd0fbb86604a15f2fe827f11b3faab036750 \ No newline at end of file +163c870950f386f6b0bb1ff9b3886cf95ba0deed414cae75baf87621ed3528c2 \ No newline at end of file diff --git a/src/bitvec.c b/src/bitvec.c index 31994f550b..68ff12dc91 100644 --- a/src/bitvec.c +++ b/src/bitvec.c @@ -175,6 +175,7 @@ int sqlite3BitvecSet(Bitvec *p, u32 i){ sqlite3_log(SQLITE_ERROR, "Bitvec: setting bit %d of bitvec size %d\n", (int)i, (int)p->iSize ); + abort(); } i--; while((p->iSize > BITVEC_NBIT) && p->iDivisor) { From 55fba4f05cd32ca2e4a9077e62ce5987537f3823 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 2 Jan 2018 19:57:26 +0000 Subject: [PATCH 078/113] Fix a spurious SQLITE_CORRUPT error that could occur within a COMMIT of a concurrent transaction. FossilOrigin-Name: 50c8952c92b9f0c61935fb0df04ed1426d9e266a812071b7bf5b0215c5552757 --- manifest | 13 +++++----- manifest.uuid | 2 +- src/btree.c | 6 +++-- test/concurrent6.test | 60 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 9 deletions(-) create mode 100644 test/concurrent6.test diff --git a/manifest b/manifest index c25d494650..77dbf33fb4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\slatest\sbegin-concurrent\schanges\sinto\sthis\sbranch. -D 2017-12-12T18:17:09.710 +C Fix\sa\sspurious\sSQLITE_CORRUPT\serror\sthat\scould\soccur\swithin\sa\sCOMMIT\sof\sa\nconcurrent\stransaction. +D 2018-01-02T19:57:26.765 F Makefile.in b142eb20482922153ebc77b261cdfd0a560ed05a81e9f6d9a2b0e8192922a1d2 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc a55372a22454e742ba7c8f6edf05b83213ec01125166ad7dcee0567e2f7fc81b @@ -416,7 +416,7 @@ F src/auth.c 6277d63837357549fe14e723490d6dc1a38768d71c795c5eb5c0f8a99f918f73 F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b F src/bitvec.c 8433d9e98dd6f2ea3286e0d2fe5d65de1bfc18a706486eb2026b01be066b5806 F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca -F src/btree.c a41d580524a4cd9b00443b7196d298e05463f6bfcb712853db3abcddc93cf3ab +F src/btree.c c3e15a9e5726fa3f426322cccaf9fe972dc9b3d9e07921220286f9076413f71d F src/btree.h feafd0647331366f4ef17f7e68597e9029f001e7ab16a125e2f176c598a7ef4a F src/btreeInt.h 0e0abe97427b4139092ec8782d396a4ad18566964e992c60043e370d4c86fd99 F src/build.c f890a66f2b78cd820b21b580f37605f8dd77f19d0b35f5850a675c88a815adca @@ -686,6 +686,7 @@ F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903 F test/concurrent3.test f4af1cf1220908c6dd5694923621c19e999b78cd997e2646285f08a52bcb4170 F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44 F test/concurrent5.test d5d7d9d404a9b4502464fc097c1fc5c3012bb4f1b063fae7ad707ca983fc86c5 +F test/concurrent6.test a7860e9ca13bb5fb76bcf41c5524fbfa9c37e6e258ecf84ffb5748a272488c67 F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9 @@ -1686,7 +1687,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bdf791f9f7f7ab4b1871e1d3a0d5edcad46fc67d7336ae7f3f7b20e69801be8e 163c870950f386f6b0bb1ff9b3886cf95ba0deed414cae75baf87621ed3528c2 -R 99497e88454df0f5b4640ad740c855cd +P 3fde0b4d05c249b9d2a54dd721185202c353cee23c0351b634cac349dc0a7b14 +R 131f3c49cbacffd5469d66a498022e8f U dan -Z 55bd54709eec1e2f156a3a0d8460b930 +Z 25c8423f0f81f25c528eab1972eef804 diff --git a/manifest.uuid b/manifest.uuid index dfe596be48..bb2728f213 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3fde0b4d05c249b9d2a54dd721185202c353cee23c0351b634cac349dc0a7b14 \ No newline at end of file +50c8952c92b9f0c61935fb0df04ed1426d9e266a812071b7bf5b0215c5552757 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index e46a3f2c34..e3fd5a3928 100644 --- a/src/btree.c +++ b/src/btree.c @@ -4179,10 +4179,12 @@ static int btreeFixUnlocked(Btree *p){ /* The current transaction allocated pages pMap->iFirst through ** nPage (inclusive) at the end of the database file. Meanwhile, ** other transactions have allocated (iFirst..nHPage). So move - ** pages (iFirst..MIN(nPage,nHPage)) to (MAX(nPage,nHPage)+1). */ + ** pages (iFirst..MIN(nPage,nHPage)) to (MAX(nPage,nHPage)+1). */ Pgno iLast = MIN(nPage, nHPage); /* Last page to move */ Pgno nCurrent; /* Current size of db */ + nCurrent = MAX(nPage, nHPage); + pBt->nPage = nCurrent; rc = btreeRelocateRange(pBt, pMap->iFirst, iLast, &nCurrent); /* There are now no collisions with the snapshot at the head of the @@ -6127,7 +6129,7 @@ static int allocateBtreePage( ** stores stores the total number of pages on the freelist. */ n = get4byte(&pPage1->aData[36]); testcase( n==mxPage-1 ); - if( ISCONCURRENT==0 && n>=mxPage ){ + if( n>=mxPage ){ return SQLITE_CORRUPT_BKPT; } diff --git a/test/concurrent6.test b/test/concurrent6.test new file mode 100644 index 0000000000..44718b7dbc --- /dev/null +++ b/test/concurrent6.test @@ -0,0 +1,60 @@ +# 2017 May 26 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/lock_common.tcl +source $testdir/wal_common.tcl +set ::testprefix concurrent6 + +ifcapable !concurrent { + finish_test + return +} + +sqlite3 db2 test.db + +do_execsql_test 1.0 { + PRAGMA page_size = 1024; + PRAGMA journal_mode = wal; + CREATE TABLE t1(x); + CREATE TABLE t2(x); + CREATE TABLE t3(x); + CREATE TABLE t4(x); + + INSERT INTO t1 VALUES(zeroblob(1500)); +} {wal} + +do_execsql_test -db db2 1.1 { + BEGIN CONCURRENT; + INSERT INTO t3 VALUES(zeroblob(4000)); + DELETE FROM t1; +} + +do_execsql_test 1.2 { + WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100) + INSERT INTO t2 SELECT zeroblob(1000) FROM s; + + WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100) + INSERT INTO t4 SELECT zeroblob(1000) FROM s; + + DELETE FROM t4; +} + +do_execsql_test -db db2 1.3 { + COMMIT; +} + + +finish_test + From 5d9c916150203985051a35a3e9708c5b68d51a37 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 4 Jan 2018 18:36:39 +0000 Subject: [PATCH 079/113] Fix problem causing free-list corruption when merging free-lists for two concurrent transactions that have both used page X as an in-memory free-list trunk page, where X lies past the end of the initial database images. FossilOrigin-Name: dc0fc2aa7cbefeb5f0ba8c992fd3e9adcfb5a4d61e2321c1bd93f4d36ba9aafc --- manifest | 13 ++++++----- manifest.uuid | 2 +- src/btree.c | 5 ++++- test/concurrent7.test | 52 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 test/concurrent7.test diff --git a/manifest b/manifest index 77dbf33fb4..8f46fe4a5f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sspurious\sSQLITE_CORRUPT\serror\sthat\scould\soccur\swithin\sa\sCOMMIT\sof\sa\nconcurrent\stransaction. -D 2018-01-02T19:57:26.765 +C Fix\sproblem\scausing\sfree-list\scorruption\swhen\smerging\sfree-lists\sfor\stwo\nconcurrent\stransactions\sthat\shave\sboth\sused\spage\sX\sas\san\sin-memory\sfree-list\ntrunk\spage,\swhere\sX\slies\spast\sthe\send\sof\sthe\sinitial\sdatabase\simages. +D 2018-01-04T18:36:39.212 F Makefile.in b142eb20482922153ebc77b261cdfd0a560ed05a81e9f6d9a2b0e8192922a1d2 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc a55372a22454e742ba7c8f6edf05b83213ec01125166ad7dcee0567e2f7fc81b @@ -416,7 +416,7 @@ F src/auth.c 6277d63837357549fe14e723490d6dc1a38768d71c795c5eb5c0f8a99f918f73 F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b F src/bitvec.c 8433d9e98dd6f2ea3286e0d2fe5d65de1bfc18a706486eb2026b01be066b5806 F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca -F src/btree.c c3e15a9e5726fa3f426322cccaf9fe972dc9b3d9e07921220286f9076413f71d +F src/btree.c 8cbe0ce25607b0a64b44dbf9d018d0d667569b5966ad1bd40f27f95d65ce4284 F src/btree.h feafd0647331366f4ef17f7e68597e9029f001e7ab16a125e2f176c598a7ef4a F src/btreeInt.h 0e0abe97427b4139092ec8782d396a4ad18566964e992c60043e370d4c86fd99 F src/build.c f890a66f2b78cd820b21b580f37605f8dd77f19d0b35f5850a675c88a815adca @@ -687,6 +687,7 @@ F test/concurrent3.test f4af1cf1220908c6dd5694923621c19e999b78cd997e2646285f08a5 F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44 F test/concurrent5.test d5d7d9d404a9b4502464fc097c1fc5c3012bb4f1b063fae7ad707ca983fc86c5 F test/concurrent6.test a7860e9ca13bb5fb76bcf41c5524fbfa9c37e6e258ecf84ffb5748a272488c67 +F test/concurrent7.test b96fa5c4cfdf8d5c0bc66b6934214500bad0260884a736f054ccc76e81aae85d F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9 @@ -1687,7 +1688,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3fde0b4d05c249b9d2a54dd721185202c353cee23c0351b634cac349dc0a7b14 -R 131f3c49cbacffd5469d66a498022e8f +P 50c8952c92b9f0c61935fb0df04ed1426d9e266a812071b7bf5b0215c5552757 +R 27d77b980c6b081a9288d237e34b2379 U dan -Z 25c8423f0f81f25c528eab1972eef804 +Z 38a96e74ef2f420253bcb0ab74b036ef diff --git a/manifest.uuid b/manifest.uuid index bb2728f213..01f2fea017 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -50c8952c92b9f0c61935fb0df04ed1426d9e266a812071b7bf5b0215c5552757 \ No newline at end of file +dc0fc2aa7cbefeb5f0ba8c992fd3e9adcfb5a4d61e2321c1bd93f4d36ba9aafc \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index e3fd5a3928..9e02e32724 100644 --- a/src/btree.c +++ b/src/btree.c @@ -4095,7 +4095,10 @@ static int btreeRelocateRange( if( pEntry->eType==PTRMAP_FREEPAGE ){ Pgno dummy; rc = allocateBtreePage(pBt, &pFree, &dummy, iPg, BTALLOC_EXACT); - releasePage(pFree); + if( pFree ){ + assert( sqlite3PagerPageRefcount(pFree->pDbPage)==1 ); + sqlite3PcacheDrop(pFree->pDbPage); + } assert( rc!=SQLITE_OK || dummy==iPg ); }else if( pnCurrent ){ btreeGetPage(pBt, iPg, &pPg, 0); diff --git a/test/concurrent7.test b/test/concurrent7.test new file mode 100644 index 0000000000..871e428031 --- /dev/null +++ b/test/concurrent7.test @@ -0,0 +1,52 @@ +# 2018 Jan 5 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# + + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set ::testprefix concurrent7 + +sqlite3 db2 test.db + +do_execsql_test 1 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(x); + CREATE TABLE t2(x); +} {wal} + +do_execsql_test -db db2 2 { + SELECT * FROM t1; +} + +do_execsql_test 3 { + BEGIN CONCURRENT; + INSERT INTO t1 VALUES(randomblob(1500)); + INSERT INTO t1 VALUES(randomblob(1500)); + DELETE FROM t1 WHERE rowid = 1; +} + +do_execsql_test -db db2 4 { + INSERT INTO t2 VALUES(randomblob(1500)); + INSERT INTO t2 VALUES(randomblob(1500)); + INSERT INTO t2 VALUES(randomblob(1500)); + INSERT INTO t2 VALUES(randomblob(1500)); + DELETE FROM t2 WHERE rowid IN (1, 2); +} + +do_execsql_test 5 { + COMMIT; + PRAGMA integrity_check; +} {ok} + +finish_test + + From c7a82772dcd06cc10036e1a84ef6cd2ad9f15dd6 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 20 Feb 2018 21:00:45 +0000 Subject: [PATCH 080/113] Add extra code to log details when corruption is detected in the pointer-map structure maintained by the b-tree layer in begin-concurrent transactions. FossilOrigin-Name: 570233716032f258b878d52c4d5a47e07292d66fa84e3a85c0388ec15efee625 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 8f46fe4a5f..a356e9989c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sproblem\scausing\sfree-list\scorruption\swhen\smerging\sfree-lists\sfor\stwo\nconcurrent\stransactions\sthat\shave\sboth\sused\spage\sX\sas\san\sin-memory\sfree-list\ntrunk\spage,\swhere\sX\slies\spast\sthe\send\sof\sthe\sinitial\sdatabase\simages. -D 2018-01-04T18:36:39.212 +C Add\sextra\scode\sto\slog\sdetails\swhen\scorruption\sis\sdetected\sin\sthe\spointer-map\nstructure\smaintained\sby\sthe\sb-tree\slayer\sin\sbegin-concurrent\stransactions. +D 2018-02-20T21:00:45.475 F Makefile.in b142eb20482922153ebc77b261cdfd0a560ed05a81e9f6d9a2b0e8192922a1d2 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc a55372a22454e742ba7c8f6edf05b83213ec01125166ad7dcee0567e2f7fc81b @@ -416,7 +416,7 @@ F src/auth.c 6277d63837357549fe14e723490d6dc1a38768d71c795c5eb5c0f8a99f918f73 F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b F src/bitvec.c 8433d9e98dd6f2ea3286e0d2fe5d65de1bfc18a706486eb2026b01be066b5806 F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca -F src/btree.c 8cbe0ce25607b0a64b44dbf9d018d0d667569b5966ad1bd40f27f95d65ce4284 +F src/btree.c 8c6b975926e62c88dfc146c71eb8629e25318a326948b8694de8b87261d5a961 F src/btree.h feafd0647331366f4ef17f7e68597e9029f001e7ab16a125e2f176c598a7ef4a F src/btreeInt.h 0e0abe97427b4139092ec8782d396a4ad18566964e992c60043e370d4c86fd99 F src/build.c f890a66f2b78cd820b21b580f37605f8dd77f19d0b35f5850a675c88a815adca @@ -1688,7 +1688,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 50c8952c92b9f0c61935fb0df04ed1426d9e266a812071b7bf5b0215c5552757 -R 27d77b980c6b081a9288d237e34b2379 +P dc0fc2aa7cbefeb5f0ba8c992fd3e9adcfb5a4d61e2321c1bd93f4d36ba9aafc +R 374752e5ff248b7c36b763a5149c6f74 U dan -Z 38a96e74ef2f420253bcb0ab74b036ef +Z f6098e8b2b3786dd4ba01a06d1e8ac97 diff --git a/manifest.uuid b/manifest.uuid index 01f2fea017..8c7c80619e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dc0fc2aa7cbefeb5f0ba8c992fd3e9adcfb5a4d61e2321c1bd93f4d36ba9aafc \ No newline at end of file +570233716032f258b878d52c4d5a47e07292d66fa84e3a85c0388ec15efee625 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 9e02e32724..2b38656e1f 100644 --- a/src/btree.c +++ b/src/btree.c @@ -628,11 +628,48 @@ static void btreePtrmapDelete(BtShared *pBt){ pBt->pMap = 0; } } + +/* +** Check that the pointer-map does not contain any entries with a parent +** page of 0. Call sqlite3_log() multiple times to output the entire +** data structure if it does. +*/ +static void btreePtrmapCheck(BtShared *pBt, Pgno nPage){ + Pgno i; + int bProblem = 0; + BtreePtrmap *p = pBt->pMap; + + for(i=p->iFirst; i<=nPage; i++){ + PtrmapEntry *pEntry = &p->aPtr[i-p->iFirst]; + if( pEntry->eType==PTRMAP_OVERFLOW1 + || pEntry->eType==PTRMAP_OVERFLOW2 + || pEntry->eType==PTRMAP_BTREE + ){ + if( pEntry->parent==0 ){ + bProblem = 1; + break; + } + } + } + + if( bProblem ){ + for(i=p->iFirst; i<=nPage; i++){ + PtrmapEntry *pEntry = &p->aPtr[i-p->iFirst]; + sqlite3_log(SQLITE_CORRUPT, + "btreePtrmapCheck: pgno=%d eType=%d parent=%d", + (int)i, (int)pEntry->eType, (int)pEntry->parent + ); + } + abort(); + } +} + #else /* SQLITE_OMIT_CONCURRENT */ # define btreePtrmapAllocate(x) SQLITE_OK # define btreePtrmapDelete(x) # define btreePtrmapBegin(x,y) SQLITE_OK # define btreePtrmapEnd(x,y,z) +# define btreePtrmapCheck(y,z) #endif /* SQLITE_OMIT_CONCURRENT */ static void releasePage(MemPage *pPage); /* Forward reference */ @@ -4156,6 +4193,8 @@ static int btreeFixUnlocked(Btree *p){ Pgno iHTrunk = get4byte(&p1[32]); u32 nHFree = get4byte(&p1[36]); + btreePtrmapCheck(pBt, nPage); + /* Attach the head database free list to the end of the current ** transactions free-list (if any). */ if( iTrunk!=0 ){ From cdbf6d01a49b2658e028ebcbb27a631d37243a11 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 20 Mar 2018 13:54:22 +0000 Subject: [PATCH 081/113] Remove debugging puts from concurrrent3.test. FossilOrigin-Name: 13b4975681f249831a22562d1c26958f841ea77ca779858b0bee735dd30b710e --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/concurrent3.test | 12 +++++++----- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 25807c5b4c..fc7088ced9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sall\srecent\senhancements\sfrom\strunk. -D 2018-03-20T13:52:42.504 +C Remove\sdebugging\sputs\sfrom\sconcurrrent3.test. +D 2018-03-20T13:54:22.689 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 7016fc56c6b9bfe5daac4f34be8be38d8c0b5fab79ccbfb764d3b23bf1c6fff3 @@ -702,7 +702,7 @@ F test/colname.test fb28b3687e03625425bc216edf8b186ce974aa71008e2aa1f426a7dcb75a F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 F test/concurrent.test 86661967a680670127a62a819e60dc93c2d3d49043ac95b26dfa70d3e60dbde5 F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8 -F test/concurrent3.test f4af1cf1220908c6dd5694923621c19e999b78cd997e2646285f08a52bcb4170 +F test/concurrent3.test 530671ac706f6a1d0f4992dbdd33a86408330d03cd90fb9e82ecb1b27f5fd081 F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44 F test/concurrent5.test d5d7d9d404a9b4502464fc097c1fc5c3012bb4f1b063fae7ad707ca983fc86c5 F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db @@ -1723,7 +1723,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fb6b7938601505186c0b1f0df6c45630039027f85ff394d290bc2c86b16a3a07 ec7addc87f97bcff3c3694b14a680453b52de3f8c106436f0708a1cc04b90faa -R 43c5e6204e5e1e748f1b8270da37c665 +P b0c2f760a637ee973f4dcc27308eec44950e6d0a9c5ab5c828c1210c1f868efa +R ca9cb1d929805c71db9b6a05a48b9513 U drh -Z dfd53febd46dc841536127bb8e42a571 +Z ae9c4938206a0b6e0c232c0b2ca9588b diff --git a/manifest.uuid b/manifest.uuid index e069a3d23c..4412f52407 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b0c2f760a637ee973f4dcc27308eec44950e6d0a9c5ab5c828c1210c1f868efa \ No newline at end of file +13b4975681f249831a22562d1c26958f841ea77ca779858b0bee735dd30b710e \ No newline at end of file diff --git a/test/concurrent3.test b/test/concurrent3.test index 4364f84012..cc80388902 100644 --- a/test/concurrent3.test +++ b/test/concurrent3.test @@ -27,7 +27,10 @@ ifcapable !concurrent { db close sqlite3_shutdown test_sqlite3_log xLog -proc xLog {error_code msg} { puts "$error_code: $msg" } +proc xLog {error_code msg} { + # puts "$error_code: $msg" + # Enable the previous for debugging +} reset_db proc create_schema {} { @@ -218,12 +221,11 @@ foreach {tn nRepeat oplist} { foreach db $DBLIST { $db close } - foreach k [lsort [array names used]] { - puts "$k: $stats($k,0) committed, $stats($k,1) rolled back" - } + # foreach k [lsort [array names used]] { + # puts "$k: $stats($k,0) committed, $stats($k,1) rolled back" + # } } finish_test - From bfbe2b8c80ac95f12d824dd0bb5cc64d2f555c77 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 15 May 2018 08:51:05 +0000 Subject: [PATCH 082/113] Include the value of the "flags" byte of the relevant page in the log message emitted when a BEGIN CONCURRENT commit conflict is detected. FossilOrigin-Name: fbfa547177ac7d57dcb0775d761a7f92fc1f2263cd83e2843cd109139a8c5121 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 7 +++++-- test/concurrent5.test | 8 ++++---- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 78138b0dbf..b989d2b3f2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\slatest\schanges\sfrom\strunk.\sIncluding\sthe\s"ORDER\sBY\s...\sLIMIT"\noptimization. -D 2018-04-26T17:54:11.487 +C Include\sthe\svalue\sof\sthe\s"flags"\sbyte\sof\sthe\srelevant\spage\sin\sthe\slog\smessage\nemitted\swhen\sa\sBEGIN\sCONCURRENT\scommit\sconflict\sis\sdetected. +D 2018-05-15T08:51:05.745 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 5ce9343cba9c189046f1afe6d2bcc1f68079439febc05267b98aec6ecc752439 @@ -437,7 +437,7 @@ F src/auth.c 6277d63837357549fe14e723490d6dc1a38768d71c795c5eb5c0f8a99f918f73 F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b F src/bitvec.c 8433d9e98dd6f2ea3286e0d2fe5d65de1bfc18a706486eb2026b01be066b5806 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c a64d302f0fa956af74d2a74538d206c3c854bdb9c6d53b92825b774e8465bcb6 +F src/btree.c 593a90431223ca1dcdd3ff6797e96d36147434431dbfaf213e866e400dd408df F src/btree.h 0cd745755efd1f3df4c70544c54253920ea32fe6b179b97e9daeb786ba0de4ba F src/btreeInt.h 6c65e6c96f561596f6870c79a64d4706af81613881d7947e3f063e923f14115f F src/build.c 1ef8945748702f0069521bafe33df41647bea777fd2353c73530d522a9fedaf8 @@ -708,7 +708,7 @@ F test/concurrent.test 86661967a680670127a62a819e60dc93c2d3d49043ac95b26dfa70d3e F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8 F test/concurrent3.test 530671ac706f6a1d0f4992dbdd33a86408330d03cd90fb9e82ecb1b27f5fd081 F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44 -F test/concurrent5.test d5d7d9d404a9b4502464fc097c1fc5c3012bb4f1b063fae7ad707ca983fc86c5 +F test/concurrent5.test ff73e642342f02133151c23b0eecab2ec1ea5bc9645c646861a9baa4263d8f50 F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9 @@ -1736,7 +1736,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b27bd799ea66748b89223044c536813d56d0aa513f077499cbf8ed9c974d7b01 0fcfc36ceb820fc70136b799a0405fe92e50646e697be2872bbe9a53a05ed5a9 -R aacb8135e5d5d61c420d0eb994490898 +P d8ae7ba083551f05b963f13c5164ff60257c7b615cd48d675027cb6289b463da +R b31f3045e7e18d43f49b3d4aef3b5822 U dan -Z 0c0899207e7f0c3c73b0ec6107e8e193 +Z bf3fce17ea47da69e27674ff4f78c20a diff --git a/manifest.uuid b/manifest.uuid index 9dcfb8e644..285075f650 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d8ae7ba083551f05b963f13c5164ff60257c7b615cd48d675027cb6289b463da \ No newline at end of file +fbfa547177ac7d57dcb0775d761a7f92fc1f2263cd83e2843cd109139a8c5121 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 013f4cb6f0..2f4d82e5a6 100644 --- a/src/btree.c +++ b/src/btree.c @@ -10433,6 +10433,7 @@ int sqlite3BtreeExclusiveLock(Btree *p){ PgHdr *pPg = 0; int rc2 = sqlite3PagerGet(pBt->pPager, pgno, &pPg, 0); if( rc2==SQLITE_OK ){ + u8 pageFlags = 0; int bWrite = -1; const char *zObj = 0; const char *zTab = 0; @@ -10444,6 +10445,7 @@ int sqlite3BtreeExclusiveLock(Btree *p){ pgnoRoot = ((MemPage*)sqlite3PagerGetExtra(pPg))->pgnoRoot; bWrite = sqlite3PagerIswriteable(pPg); + pageFlags = ((u8*)sqlite3PagerGetData(pPg))[0]; sqlite3PagerUnref(pPg); pSchema = sqlite3SchemaGet(p->db, p); @@ -10469,11 +10471,12 @@ int sqlite3BtreeExclusiveLock(Btree *p){ sqlite3_log(SQLITE_OK, "cannot commit CONCURRENT transaction " "- conflict at page %d " - "(%s page; part of db %s %s%s%s)", + "(%s page; part of db %s %s%s%s; flags=0x%02x)", (int)pgno, (bWrite==0?"read-only":(bWrite>0?"read/write":"unknown")), (zTab ? "index" : "table"), - (zTab ? zTab : ""), (zTab ? "." : ""), (zObj ? zObj : "UNKNOWN") + (zTab ? zTab : ""), (zTab ? "." : ""), (zObj ? zObj : "UNKNOWN"), + pageFlags ); } } diff --git a/test/concurrent5.test b/test/concurrent5.test index dde661ea8b..1747e2ed44 100644 --- a/test/concurrent5.test +++ b/test/concurrent5.test @@ -59,7 +59,7 @@ do_test 1.1.1 { catchsql COMMIT db2 } {1 {database is locked}} do_test_conflict_msg 1.1.2 { - conflict at page 2 (read-only page; part of db table t1) + conflict at page 2 (read-only page; part of db table t1; flags=0x05) } do_test 1.2.1 { @@ -78,7 +78,7 @@ do_test 1.2.1 { } {1 {database is locked}} do_test_conflict_msg 1.2.2 { - conflict at page 105 (read/write page; part of db table t1) + conflict at page 105 (read/write page; part of db table t1; flags=0x0d) } do_test 1.3.1 { @@ -97,7 +97,7 @@ do_test 1.3.1 { } {1 {database is locked}} do_test_conflict_msg 1.3.2 { - conflict at page 3 (read/write page; part of db table t2) + conflict at page 3 (read/write page; part of db table t2; flags=0x0d) } do_test 1.4.1 { @@ -121,7 +121,7 @@ do_test 1.4.1 { } {1 {database is locked}} do_test_conflict_msg 1.3.2 { - conflict at page 211 (read/write page; part of db index t3.i3) + conflict at page 211 (read/write page; part of db index t3.i3; flags=0x0a) } db close From b7ee5667c29f08436370b2043a74e2608392f534 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 15 May 2018 11:28:36 +0000 Subject: [PATCH 083/113] Instead of just the flags byte, include the first 8 bytes of the relevant page in an on-commit conflict log message. FossilOrigin-Name: e7dc03e7439f224e4bec458f27fe364f2fb1ac637328657a578ada693ae22842 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 18 ++++++++++++++---- test/concurrent5.test | 8 ++++---- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index b989d2b3f2..3cd10ab329 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Include\sthe\svalue\sof\sthe\s"flags"\sbyte\sof\sthe\srelevant\spage\sin\sthe\slog\smessage\nemitted\swhen\sa\sBEGIN\sCONCURRENT\scommit\sconflict\sis\sdetected. -D 2018-05-15T08:51:05.745 +C Instead\sof\sjust\sthe\sflags\sbyte,\sinclude\sthe\sfirst\s8\sbytes\sof\sthe\srelevant\spage\nin\san\son-commit\sconflict\slog\smessage. +D 2018-05-15T11:28:36.683 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 5ce9343cba9c189046f1afe6d2bcc1f68079439febc05267b98aec6ecc752439 @@ -437,7 +437,7 @@ F src/auth.c 6277d63837357549fe14e723490d6dc1a38768d71c795c5eb5c0f8a99f918f73 F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b F src/bitvec.c 8433d9e98dd6f2ea3286e0d2fe5d65de1bfc18a706486eb2026b01be066b5806 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 593a90431223ca1dcdd3ff6797e96d36147434431dbfaf213e866e400dd408df +F src/btree.c 78be543c894d6fb6e1be538251246ae6da35d63ab29bd65dbf27a62d73444358 F src/btree.h 0cd745755efd1f3df4c70544c54253920ea32fe6b179b97e9daeb786ba0de4ba F src/btreeInt.h 6c65e6c96f561596f6870c79a64d4706af81613881d7947e3f063e923f14115f F src/build.c 1ef8945748702f0069521bafe33df41647bea777fd2353c73530d522a9fedaf8 @@ -708,7 +708,7 @@ F test/concurrent.test 86661967a680670127a62a819e60dc93c2d3d49043ac95b26dfa70d3e F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8 F test/concurrent3.test 530671ac706f6a1d0f4992dbdd33a86408330d03cd90fb9e82ecb1b27f5fd081 F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44 -F test/concurrent5.test ff73e642342f02133151c23b0eecab2ec1ea5bc9645c646861a9baa4263d8f50 +F test/concurrent5.test 0c16cbf7446af162a14e6def30445e94016064eb994e5aa4ebb2bebc59554176 F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9 @@ -1736,7 +1736,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d8ae7ba083551f05b963f13c5164ff60257c7b615cd48d675027cb6289b463da -R b31f3045e7e18d43f49b3d4aef3b5822 +P fbfa547177ac7d57dcb0775d761a7f92fc1f2263cd83e2843cd109139a8c5121 +R fdff9a25ded182bc4a0b3f2b7933cc53 U dan -Z bf3fce17ea47da69e27674ff4f78c20a +Z acdbc76c6ad1bafb932ec798f2a5510e diff --git a/manifest.uuid b/manifest.uuid index 285075f650..0fdab1824d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fbfa547177ac7d57dcb0775d761a7f92fc1f2263cd83e2843cd109139a8c5121 \ No newline at end of file +e7dc03e7439f224e4bec458f27fe364f2fb1ac637328657a578ada693ae22842 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 2f4d82e5a6..35602cec08 100644 --- a/src/btree.c +++ b/src/btree.c @@ -10433,19 +10433,29 @@ int sqlite3BtreeExclusiveLock(Btree *p){ PgHdr *pPg = 0; int rc2 = sqlite3PagerGet(pBt->pPager, pgno, &pPg, 0); if( rc2==SQLITE_OK ){ - u8 pageFlags = 0; int bWrite = -1; const char *zObj = 0; const char *zTab = 0; + char zContent[17]; if( pPg ){ Pgno pgnoRoot = 0; HashElem *pE; Schema *pSchema; + u8 *aData = (u8*)sqlite3PagerGetData(pPg); + int i; + for(i=0; i<8; i++){ + static const char hexdigits[] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' + }; + zContent[i*2] = hexdigits[(aData[i] >> 4)]; + zContent[i*2+1] = hexdigits[(aData[i] & 0xF)]; + } + zContent[16] = '\0'; pgnoRoot = ((MemPage*)sqlite3PagerGetExtra(pPg))->pgnoRoot; bWrite = sqlite3PagerIswriteable(pPg); - pageFlags = ((u8*)sqlite3PagerGetData(pPg))[0]; sqlite3PagerUnref(pPg); pSchema = sqlite3SchemaGet(p->db, p); @@ -10471,12 +10481,12 @@ int sqlite3BtreeExclusiveLock(Btree *p){ sqlite3_log(SQLITE_OK, "cannot commit CONCURRENT transaction " "- conflict at page %d " - "(%s page; part of db %s %s%s%s; flags=0x%02x)", + "(%s page; part of db %s %s%s%s; content=%s...)", (int)pgno, (bWrite==0?"read-only":(bWrite>0?"read/write":"unknown")), (zTab ? "index" : "table"), (zTab ? zTab : ""), (zTab ? "." : ""), (zObj ? zObj : "UNKNOWN"), - pageFlags + zContent ); } } diff --git a/test/concurrent5.test b/test/concurrent5.test index 1747e2ed44..bc00232442 100644 --- a/test/concurrent5.test +++ b/test/concurrent5.test @@ -59,7 +59,7 @@ do_test 1.1.1 { catchsql COMMIT db2 } {1 {database is locked}} do_test_conflict_msg 1.1.2 { - conflict at page 2 (read-only page; part of db table t1; flags=0x05) + conflict at page 2 (read-only page; part of db table t1; content=0500000063021100...) } do_test 1.2.1 { @@ -78,7 +78,7 @@ do_test 1.2.1 { } {1 {database is locked}} do_test_conflict_msg 1.2.2 { - conflict at page 105 (read/write page; part of db table t1; flags=0x0d) + conflict at page 105 (read/write page; part of db table t1; content=0D00000002026100...) } do_test 1.3.1 { @@ -97,7 +97,7 @@ do_test 1.3.1 { } {1 {database is locked}} do_test_conflict_msg 1.3.2 { - conflict at page 3 (read/write page; part of db table t2; flags=0x0d) + conflict at page 3 (read/write page; part of db table t2; content=0D0000000103FB00...) } do_test 1.4.1 { @@ -121,7 +121,7 @@ do_test 1.4.1 { } {1 {database is locked}} do_test_conflict_msg 1.3.2 { - conflict at page 211 (read/write page; part of db index t3.i3; flags=0x0a) + conflict at page 211 (read/write page; part of db index t3.i3; content=0A0310006300D800...) } db close From 9b5c67f78485dbef431d996577bdc5b9f4371ffb Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 30 Nov 2018 16:26:39 +0000 Subject: [PATCH 084/113] Merge the mutex-free PRNG change into this branch. FossilOrigin-Name: 81e626f4a44be75425cf916ec61b6b36df0907ebac4adbf6786f87ad4f3a0674 --- manifest | 23 ++++++++++++----------- manifest.uuid | 2 +- src/func.c | 6 ++++-- src/main.c | 2 +- src/random.c | 22 ++++++++++++++++++++++ src/select.c | 2 +- src/sqliteInt.h | 12 ++++++++++++ src/wal.c | 8 +++++--- 8 files changed, 58 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index e89604258e..4fafda0823 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\slatest\sbegin-concurrent\schanges\sinto\sthis\sbranch. -D 2018-11-26T07:34:33.644 +C Merge\sthe\smutex-free\sPRNG\schange\sinto\sthis\sbranch. +D 2018-11-30T16:26:39.800 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in b730006b54c990461d864c5387f2e6f13aadb0236804555fb010ed6865a5f058 @@ -465,7 +465,7 @@ F src/delete.c cec65c0e74be7492cafba1b77580732b0b1a41a4dbc4ac70909ac44b65b2a20b F src/expr.c 9aacc0b72348ba90010b672dcbbbe2fa56e1182043bc917a3a147b2bc57a5497 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 972a4ba14296bef2303a0abbad1e3d82bc3c61f9e6ce4e8e9528bdee68748812 -F src/func.c 7c288b4ce309b5a8b8473514b88e1f8e69a80134509a8c0db8e39c858e367e7f +F src/func.c 8efa2c813b3f6a831a070311b5bcbc97993b79cbcd274bdb49bde56ccd3d37bc F src/global.c 9bf034fd560bdd514715170ed8460bb7f823cec113f0569ef3f18a20c7ccd128 F src/hash.c 931ec82d7e070654a8facb42549bbb3a25720171d73ba94c3d3160580d01ef1f F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 @@ -474,7 +474,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 6b81aae27b196925d8ff78824f4bbd435d6a40cd38dc324685e21735bb402109 F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e F src/loadext.c 448eab53ecdb566a1259ee2d45ebff9c0bc4a2cf393774488775c33e4fbe89bf -F src/main.c 47b8f0411812b3dd7c41fddf09420638aabfb838c6134de0ec5c18df381ecd28 +F src/main.c b23c7b1eeca05ee3af56dacdc0efdf61484dc17194c82233fb98b42ee8e807b8 F src/malloc.c 07295435093ce354c6d9063ac05a2eeae28bd251d2e63c48b3d67c12c76f7e18 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -507,15 +507,15 @@ F src/pragma.c a2eab23fbf7c70c28f3a22629de2662d052c22853649430be302b910719574de F src/pragma.h 7003ea8e45e5da0a7cd6d35846214f9ae9ecf5be66b268415ceea5855324af11 F src/prepare.c f81f8d707e583192c28fea0b2e19385415b7d188123b23f49b038076408d7a69 F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 -F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 +F src/random.c f27af4099afaea7284ade5c206224dcfdb2334cfd119d018b470d46356b3f27d F src/resolve.c bc8c79e56439b111e7d9415e44940951f7087e9466c3a9d664558ef0faf31073 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 61e867a906f140b73baf4ce7a201ad6dcba30820969f5618ee40e9a0d32c6f5f +F src/select.c e1cad752987c476a9d1d053682558caec048ea799ef7ba1b6e38e2266451010d F src/shell.c.in 6a9d8a56700d136addc14d1cd25863b8112e5c12e1877f373750bda476ff6314 F src/sqlite.h.in 41dfd60cf62d4f8756991517c1a9d2ff4977ca04f7798c10b0c16dcf884cbc7e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h b9f89d79c047df09c1efe2dfe054512cf956780af468daef9d368b319dc68aa7 +F src/sqliteInt.h ca2d5f030547a1677a74bce26338ca70ebd6747b7d500a9edc00146c61ff2376 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -592,7 +592,7 @@ F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7 F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392 F src/vtab.c 70188a745dc4e57d26e942681ff4b2912b7c8249ad5de3f60f0677b4337bcfaa F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 41de67424237a3dd097a093057ba454ccfef26c452f6263fecd5591a15dd5a9a +F src/wal.c f53ac2b6ec6f23960471b4402632b8276d8b80c1ac31a28ea08500c56a9cc5c9 F src/wal.h f325a5856b669f5ba449157485915816103857c8574efc746ac55eba3335c5e0 F src/walker.c fb94aadc9099ff9c6506d0a8b88d51266005bcaa265403f3d7caf732a562eb66 F src/where.c 3818e8a736a05d2cb194e64399af707e367fbcc5c251d785804d02eaf121288e @@ -1791,7 +1791,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 6f3dd9809fdef7d6195f1f93428a662d5a8c01dba9815daa22d1b94059a2eb43 28a615a2e0f48b0fee3eaf7841ff902e069fa6c221df6ad9a57b8709c88561fb -R c73a7474a8ba36fb4e79620530d56018 +P 76608f750ab13c0a165def9672759fee43cf4e9895df3bfa21765e08358b07a0 +Q +8b1fc4b9f3e743bffcfbbb8e26991240441778e10512fb502b8eaec460184296 +R 05d3a3eaadb134c59c94e4d5941647d0 U dan -Z 4a9121244def783d11e1880a226f98cc +Z 45ce6d06a747e646527aeb46f6440480 diff --git a/manifest.uuid b/manifest.uuid index 04bacb7327..ade3e7b765 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -76608f750ab13c0a165def9672759fee43cf4e9895df3bfa21765e08358b07a0 \ No newline at end of file +81e626f4a44be75425cf916ec61b6b36df0907ebac4adbf6786f87ad4f3a0674 \ No newline at end of file diff --git a/src/func.c b/src/func.c index 0504a8f026..d8233835a2 100644 --- a/src/func.c +++ b/src/func.c @@ -485,8 +485,9 @@ static void randomFunc( sqlite3_value **NotUsed2 ){ sqlite_int64 r; + sqlite3 *db = sqlite3_context_db_handle(context); UNUSED_PARAMETER2(NotUsed, NotUsed2); - sqlite3_randomness(sizeof(r), &r); + sqlite3FastRandomness(&db->sPrng, sizeof(r), &r); if( r<0 ){ /* We need to prevent a random number of 0x8000000000000000 ** (or -9223372036854775808) since when you do abs() of that @@ -512,6 +513,7 @@ static void randomBlob( ){ int n; unsigned char *p; + sqlite3 *db = sqlite3_context_db_handle(context); assert( argc==1 ); UNUSED_PARAMETER(argc); n = sqlite3_value_int(argv[0]); @@ -520,7 +522,7 @@ static void randomBlob( } p = contextMalloc(context, n); if( p ){ - sqlite3_randomness(n, p); + sqlite3FastRandomness(&db->sPrng, n, p); sqlite3_result_blob(context, (char*)p, n, sqlite3_free); } } diff --git a/src/main.c b/src/main.c index 19831abfc7..38b056d93b 100644 --- a/src/main.c +++ b/src/main.c @@ -3023,7 +3023,7 @@ static int openDatabase( db->magic = SQLITE_MAGIC_BUSY; db->aDb = db->aDbStatic; db->lookaside.bDisable = 1; - + sqlite3FastPrngInit(&db->sPrng); assert( sizeof(db->aLimit)==sizeof(aHardLimit) ); memcpy(db->aLimit, aHardLimit, sizeof(db->aLimit)); db->aLimit[SQLITE_LIMIT_WORKER_THREADS] = SQLITE_DEFAULT_WORKER_THREADS; diff --git a/src/random.c b/src/random.c index d4ae77c435..dd971ab655 100644 --- a/src/random.c +++ b/src/random.c @@ -106,6 +106,28 @@ void sqlite3_randomness(int N, void *pBuf){ sqlite3_mutex_leave(mutex); } +/* +** Initialize a fast PRNG. A Fast PRNG is called "fast" because it does +** not need a mutex to operate, though it does use a mutex to initialize. +** The quality of the randomness is not as good as the global PRNG. +*/ +void sqlite3FastPrngInit(FastPrng *pPrng){ + sqlite3_randomness(sizeof(*pPrng), pPrng); + pPrng->x |= 1; +} + +/* +** Generate N bytes of pseudo-randomness using a FastPrng +*/ +void sqlite3FastRandomness(FastPrng *pPrng, int N, void *P){ + unsigned char *pOut = (unsigned char*)P; + while( N-->0 ){ + pPrng->x = ((pPrng->x)>>1) ^ ((1+~((pPrng->x)&1)) & 0xd0000001); + pPrng->y = (pPrng->y)*1103515245 + 12345; + *(pOut++) = (pPrng->x ^ pPrng->y) & 0xff; + } +} + #ifndef SQLITE_UNTESTABLE /* ** For testing purposes, we sometimes want to preserve the state of diff --git a/src/select.c b/src/select.c index c60ff27001..5cd1630785 100644 --- a/src/select.c +++ b/src/select.c @@ -1993,7 +1993,7 @@ int sqlite3ColumnsFromExprList( if( zName[j]==':' ) nName = j; } zName = sqlite3MPrintf(db, "%.*z:%u", nName, zName, ++cnt); - if( cnt>3 ) sqlite3_randomness(sizeof(cnt), &cnt); + if( cnt>3 ) sqlite3FastRandomness(&db->sPrng, sizeof(cnt), &cnt); } pCol->zName = zName; sqlite3ColumnPropertiesFromName(0, pCol); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 12a9f38867..410cc74c52 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1089,6 +1089,7 @@ typedef struct Parse Parse; typedef struct PreUpdate PreUpdate; typedef struct PrintfArguments PrintfArguments; typedef struct RenameToken RenameToken; +typedef struct FastPrng FastPrng; typedef struct RowSet RowSet; typedef struct Savepoint Savepoint; typedef struct Select Select; @@ -1189,6 +1190,14 @@ typedef int VList; # define SQLITE_DEFAULT_WAL_SYNCHRONOUS SQLITE_DEFAULT_SYNCHRONOUS #endif +/* +** State of a simple PRNG used for the per-connection and per-pager +** pseudo-random number generators. +*/ +struct FastPrng { + unsigned int x, y; +}; + /* ** Each database file to be accessed by the system is an instance ** of the following structure. There are normally two of these structures @@ -1398,6 +1407,7 @@ struct sqlite3 { u8 nSqlExec; /* Number of pending OP_SqlExec opcodes */ int nextPagesize; /* Pagesize after VACUUM if >0 */ u32 magic; /* Magic number for detect library misuse */ + FastPrng sPrng; /* State of the per-connection PRNG */ int nChange; /* Value returned by sqlite3_changes() */ int nTotalChange; /* Value returned by sqlite3_total_changes() */ int aLimit[SQLITE_N_LIMIT]; /* Limits */ @@ -3997,6 +4007,8 @@ Vdbe *sqlite3GetVdbe(Parse*); void sqlite3PrngSaveState(void); void sqlite3PrngRestoreState(void); #endif +void sqlite3FastPrngInit(FastPrng*); +void sqlite3FastRandomness(FastPrng*, int N, void *P); void sqlite3RollbackAll(sqlite3*,int); void sqlite3CodeVerifySchema(Parse*, int); void sqlite3CodeVerifyNamedSchema(Parse*, const char *zDb); diff --git a/src/wal.c b/src/wal.c index 031389ea6f..c67bd9dcac 100644 --- a/src/wal.c +++ b/src/wal.c @@ -474,6 +474,7 @@ struct Wal { u32 nPriorFrame; /* For sqlite3WalInfo() */ const char *zWalName; /* Name of WAL file */ u32 nCkpt; /* Checkpoint sequence counter in the wal-header */ + FastPrng sPrng; /* Random number generator */ #ifdef SQLITE_DEBUG u8 lockError; /* True if a locking error has occurred */ #endif @@ -1380,6 +1381,7 @@ int sqlite3WalOpen( pRet->syncHeader = 1; pRet->padToSectorBoundary = 1; pRet->exclusiveMode = (bNoShm ? WAL_HEAPMEMORY_MODE: WAL_NORMAL_MODE); + sqlite3FastPrngInit(&pRet->sPrng); /* Open file handle on the write-ahead log file. */ flags = (SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_WAL); @@ -1926,7 +1928,7 @@ static int walCheckpoint( rc = SQLITE_BUSY; }else if( eMode>=SQLITE_CHECKPOINT_RESTART ){ u32 salt1; - sqlite3_randomness(4, &salt1); + sqlite3FastRandomness(&pWal->sPrng, 4, &salt1); assert( pInfo->nBackfill==pWal->hdr.mxFrame ); rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(1), WAL_NREADER-1); if( rc==SQLITE_OK ){ @@ -3373,7 +3375,7 @@ static int walRestartLog(Wal *pWal){ assert( pInfo->nBackfill==pWal->hdr.mxFrame ); if( pInfo->nBackfill>0 ){ u32 salt1; - sqlite3_randomness(4, &salt1); + sqlite3FastRandomness(&pWal->sPrng, 4, &salt1); rc = walLockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); if( rc==SQLITE_OK ){ /* If all readers are using WAL_READ_LOCK(0) (in other words if no @@ -3589,7 +3591,7 @@ int sqlite3WalFrames( sqlite3Put4byte(&aWalHdr[4], WAL_MAX_VERSION); sqlite3Put4byte(&aWalHdr[8], szPage); sqlite3Put4byte(&aWalHdr[12], pWal->nCkpt); - if( pWal->nCkpt==0 ) sqlite3_randomness(8, pWal->hdr.aSalt); + if( pWal->nCkpt==0 ) sqlite3FastRandomness(&pWal->sPrng, 8, pWal->hdr.aSalt); memcpy(&aWalHdr[16], pWal->hdr.aSalt, 8); walChecksumBytes(1, aWalHdr, WAL_HDRSIZE-2*4, 0, aCksum); sqlite3Put4byte(&aWalHdr[24], aCksum[0]); From 51883dfc8bcbba9f409d2d1efe8cadbd501000c3 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 3 Dec 2018 19:29:37 +0000 Subject: [PATCH 085/113] Cherrypick a couple of fixes from begin-concurrent-pnu into this branch. The differences between the two branches are now that this one does not have "PRAGMA noop_update" or the mutex-free PRNG. FossilOrigin-Name: a56506b9387a067ef259504d127694ad20223f4b08781d1676ff7f5fdd9443d8 --- manifest | 19 +++++++++----- manifest.uuid | 2 +- src/btree.c | 50 +++++++++++++++++++++++++++++++++--- test/concurrent6.test | 60 +++++++++++++++++++++++++++++++++++++++++++ test/concurrent7.test | 52 +++++++++++++++++++++++++++++++++++++ 5 files changed, 172 insertions(+), 11 deletions(-) create mode 100644 test/concurrent6.test create mode 100644 test/concurrent7.test diff --git a/manifest b/manifest index eadf9a7db7..b00fa69f09 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Bring\sup\sto\sdate\swith\sversion\s3.26.0. -D 2018-12-03T18:15:52.710 +C Cherrypick\sa\scouple\sof\sfixes\sfrom\sbegin-concurrent-pnu\sinto\sthis\sbranch.\sThe\ndifferences\sbetween\sthe\stwo\sbranches\sare\snow\sthat\sthis\sone\sdoes\snot\shave\n"PRAGMA\snoop_update"\sor\sthe\smutex-free\sPRNG. +D 2018-12-03T19:29:37.766 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in a050c8670ea0d7b37b2192306cbb50d392acd9902b84e9b56f3444d006f97a6c @@ -451,7 +451,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 8433d9e98dd6f2ea3286e0d2fe5d65de1bfc18a706486eb2026b01be066b5806 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 4ad4c92bbd327b72cc7b3444de6b6d0f416e29ef0b21b2c3ec16165ba4070804 +F src/btree.c 4a2184be69d491d4b0228d4e397d67cb0802bbec06e7615b485ea1af69a131f6 F src/btree.h 1ed41c71481a1196a520064f2282bc13d768bbd8ae2850e319a3048f8ee7cb3d F src/btreeInt.h 6c65e6c96f561596f6870c79a64d4706af81613881d7947e3f063e923f14115f F src/build.c 5e04fb8528a4a915ed9af94b5cd068e53f2cfa9824d37464c4059279ea9bc8a0 @@ -735,6 +735,8 @@ F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903 F test/concurrent3.test 530671ac706f6a1d0f4992dbdd33a86408330d03cd90fb9e82ecb1b27f5fd081 F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44 F test/concurrent5.test 0c16cbf7446af162a14e6def30445e94016064eb994e5aa4ebb2bebc59554176 +F test/concurrent6.test a7860e9ca13bb5fb76bcf41c5524fbfa9c37e6e258ecf84ffb5748a272488c67 +F test/concurrent7.test b96fa5c4cfdf8d5c0bc66b6934214500bad0260884a736f054ccc76e81aae85d F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9 @@ -1790,7 +1792,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 28a615a2e0f48b0fee3eaf7841ff902e069fa6c221df6ad9a57b8709c88561fb bf8c1b2b7a5960c282e543b9c293686dccff272512d08865f4600fb58238b4f9 -R ad7ac98b07a5e19a9d448dcba578a20a -U drh -Z e005195a2c11998dc5b1c6dec19b9447 +P f0ddb358cc68e5ec6d9e758893ab3da058a3b2e705124a7449279c992e672a4a +Q +50c8952c92b9f0c61935fb0df04ed1426d9e266a812071b7bf5b0215c5552757 +Q +570233716032f258b878d52c4d5a47e07292d66fa84e3a85c0388ec15efee625 +Q +dc0fc2aa7cbefeb5f0ba8c992fd3e9adcfb5a4d61e2321c1bd93f4d36ba9aafc +R 0b6ca72792de50021b48db0500a10b60 +U dan +Z e7051457303763dcda2174967ac468b5 diff --git a/manifest.uuid b/manifest.uuid index d0b8f54408..13eb6ed24f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f0ddb358cc68e5ec6d9e758893ab3da058a3b2e705124a7449279c992e672a4a \ No newline at end of file +a56506b9387a067ef259504d127694ad20223f4b08781d1676ff7f5fdd9443d8 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 828d63c180..f4f7365b92 100644 --- a/src/btree.c +++ b/src/btree.c @@ -656,11 +656,48 @@ static void btreePtrmapDelete(BtShared *pBt){ pBt->pMap = 0; } } + +/* +** Check that the pointer-map does not contain any entries with a parent +** page of 0. Call sqlite3_log() multiple times to output the entire +** data structure if it does. +*/ +static void btreePtrmapCheck(BtShared *pBt, Pgno nPage){ + Pgno i; + int bProblem = 0; + BtreePtrmap *p = pBt->pMap; + + for(i=p->iFirst; i<=nPage; i++){ + PtrmapEntry *pEntry = &p->aPtr[i-p->iFirst]; + if( pEntry->eType==PTRMAP_OVERFLOW1 + || pEntry->eType==PTRMAP_OVERFLOW2 + || pEntry->eType==PTRMAP_BTREE + ){ + if( pEntry->parent==0 ){ + bProblem = 1; + break; + } + } + } + + if( bProblem ){ + for(i=p->iFirst; i<=nPage; i++){ + PtrmapEntry *pEntry = &p->aPtr[i-p->iFirst]; + sqlite3_log(SQLITE_CORRUPT, + "btreePtrmapCheck: pgno=%d eType=%d parent=%d", + (int)i, (int)pEntry->eType, (int)pEntry->parent + ); + } + abort(); + } +} + #else /* SQLITE_OMIT_CONCURRENT */ # define btreePtrmapAllocate(x) SQLITE_OK # define btreePtrmapDelete(x) # define btreePtrmapBegin(x,y) SQLITE_OK # define btreePtrmapEnd(x,y,z) +# define btreePtrmapCheck(y,z) #endif /* SQLITE_OMIT_CONCURRENT */ static void releasePage(MemPage *pPage); /* Forward reference */ @@ -4152,7 +4189,10 @@ static int btreeRelocateRange( if( pEntry->eType==PTRMAP_FREEPAGE ){ Pgno dummy; rc = allocateBtreePage(pBt, &pFree, &dummy, iPg, BTALLOC_EXACT); - releasePage(pFree); + if( pFree ){ + assert( sqlite3PagerPageRefcount(pFree->pDbPage)==1 ); + sqlite3PcacheDrop(pFree->pDbPage); + } assert( rc!=SQLITE_OK || dummy==iPg ); }else if( pnCurrent ){ btreeGetPage(pBt, iPg, &pPg, 0); @@ -4210,6 +4250,8 @@ static int btreeFixUnlocked(Btree *p){ Pgno iHTrunk = get4byte(&p1[32]); u32 nHFree = get4byte(&p1[36]); + btreePtrmapCheck(pBt, nPage); + /* Attach the head database free list to the end of the current ** transactions free-list (if any). */ if( iTrunk!=0 ){ @@ -4236,10 +4278,12 @@ static int btreeFixUnlocked(Btree *p){ /* The current transaction allocated pages pMap->iFirst through ** nPage (inclusive) at the end of the database file. Meanwhile, ** other transactions have allocated (iFirst..nHPage). So move - ** pages (iFirst..MIN(nPage,nHPage)) to (MAX(nPage,nHPage)+1). */ + ** pages (iFirst..MIN(nPage,nHPage)) to (MAX(nPage,nHPage)+1). */ Pgno iLast = MIN(nPage, nHPage); /* Last page to move */ Pgno nCurrent; /* Current size of db */ + nCurrent = MAX(nPage, nHPage); + pBt->nPage = nCurrent; rc = btreeRelocateRange(pBt, pMap->iFirst, iLast, &nCurrent); /* There are now no collisions with the snapshot at the head of the @@ -6229,7 +6273,7 @@ static int allocateBtreePage( ** stores stores the total number of pages on the freelist. */ n = get4byte(&pPage1->aData[36]); testcase( n==mxPage-1 ); - if( ISCONCURRENT==0 && n>=mxPage ){ + if( n>=mxPage ){ return SQLITE_CORRUPT_BKPT; } diff --git a/test/concurrent6.test b/test/concurrent6.test new file mode 100644 index 0000000000..44718b7dbc --- /dev/null +++ b/test/concurrent6.test @@ -0,0 +1,60 @@ +# 2017 May 26 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/lock_common.tcl +source $testdir/wal_common.tcl +set ::testprefix concurrent6 + +ifcapable !concurrent { + finish_test + return +} + +sqlite3 db2 test.db + +do_execsql_test 1.0 { + PRAGMA page_size = 1024; + PRAGMA journal_mode = wal; + CREATE TABLE t1(x); + CREATE TABLE t2(x); + CREATE TABLE t3(x); + CREATE TABLE t4(x); + + INSERT INTO t1 VALUES(zeroblob(1500)); +} {wal} + +do_execsql_test -db db2 1.1 { + BEGIN CONCURRENT; + INSERT INTO t3 VALUES(zeroblob(4000)); + DELETE FROM t1; +} + +do_execsql_test 1.2 { + WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100) + INSERT INTO t2 SELECT zeroblob(1000) FROM s; + + WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100) + INSERT INTO t4 SELECT zeroblob(1000) FROM s; + + DELETE FROM t4; +} + +do_execsql_test -db db2 1.3 { + COMMIT; +} + + +finish_test + diff --git a/test/concurrent7.test b/test/concurrent7.test new file mode 100644 index 0000000000..871e428031 --- /dev/null +++ b/test/concurrent7.test @@ -0,0 +1,52 @@ +# 2018 Jan 5 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# + + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set ::testprefix concurrent7 + +sqlite3 db2 test.db + +do_execsql_test 1 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(x); + CREATE TABLE t2(x); +} {wal} + +do_execsql_test -db db2 2 { + SELECT * FROM t1; +} + +do_execsql_test 3 { + BEGIN CONCURRENT; + INSERT INTO t1 VALUES(randomblob(1500)); + INSERT INTO t1 VALUES(randomblob(1500)); + DELETE FROM t1 WHERE rowid = 1; +} + +do_execsql_test -db db2 4 { + INSERT INTO t2 VALUES(randomblob(1500)); + INSERT INTO t2 VALUES(randomblob(1500)); + INSERT INTO t2 VALUES(randomblob(1500)); + INSERT INTO t2 VALUES(randomblob(1500)); + DELETE FROM t2 WHERE rowid IN (1, 2); +} + +do_execsql_test 5 { + COMMIT; + PRAGMA integrity_check; +} {ok} + +finish_test + + From 834c48c279f8fc016acb0b79e356d3a7f98abc6d Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 3 Dec 2018 20:38:15 +0000 Subject: [PATCH 086/113] Minor change to wal.c on this branch to make it more similar to trunk. FossilOrigin-Name: 6a7af3ead5949c461430c1fa92798dc2bbbc58c8cd504005c5afa38993f0be82 --- manifest | 16 +++++------ manifest.uuid | 2 +- src/wal.c | 73 +++++++++++++++++++-------------------------------- 3 files changed, 35 insertions(+), 56 deletions(-) diff --git a/manifest b/manifest index b00fa69f09..801f2cffb1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Cherrypick\sa\scouple\sof\sfixes\sfrom\sbegin-concurrent-pnu\sinto\sthis\sbranch.\sThe\ndifferences\sbetween\sthe\stwo\sbranches\sare\snow\sthat\sthis\sone\sdoes\snot\shave\n"PRAGMA\snoop_update"\sor\sthe\smutex-free\sPRNG. -D 2018-12-03T19:29:37.766 +C Minor\schange\sto\swal.c\son\sthis\sbranch\sto\smake\sit\smore\ssimilar\sto\strunk. +D 2018-12-03T20:38:15.728 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in a050c8670ea0d7b37b2192306cbb50d392acd9902b84e9b56f3444d006f97a6c @@ -592,7 +592,7 @@ F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7 F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392 F src/vtab.c 70188a745dc4e57d26e942681ff4b2912b7c8249ad5de3f60f0677b4337bcfaa F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 41de67424237a3dd097a093057ba454ccfef26c452f6263fecd5591a15dd5a9a +F src/wal.c 8a12219e699ed737fa4dd8f0449f1bb5dee765502b48710dbd5be747ea58e65b F src/wal.h f325a5856b669f5ba449157485915816103857c8574efc746ac55eba3335c5e0 F src/walker.c fb94aadc9099ff9c6506d0a8b88d51266005bcaa265403f3d7caf732a562eb66 F src/where.c 3818e8a736a05d2cb194e64399af707e367fbcc5c251d785804d02eaf121288e @@ -1792,10 +1792,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 f0ddb358cc68e5ec6d9e758893ab3da058a3b2e705124a7449279c992e672a4a -Q +50c8952c92b9f0c61935fb0df04ed1426d9e266a812071b7bf5b0215c5552757 -Q +570233716032f258b878d52c4d5a47e07292d66fa84e3a85c0388ec15efee625 -Q +dc0fc2aa7cbefeb5f0ba8c992fd3e9adcfb5a4d61e2321c1bd93f4d36ba9aafc -R 0b6ca72792de50021b48db0500a10b60 +P a56506b9387a067ef259504d127694ad20223f4b08781d1676ff7f5fdd9443d8 +R d66e284ab90799b5d6b7d2957b4e83a3 +T +closed 0d12f49feb78a94a1b188e80379b51dfe9bf6c8e60225134e15216192cabed21 U dan -Z e7051457303763dcda2174967ac468b5 +Z 035c0f4c166e3fab14296a764b5a28cd diff --git a/manifest.uuid b/manifest.uuid index 13eb6ed24f..dd8dc8b081 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a56506b9387a067ef259504d127694ad20223f4b08781d1676ff7f5fdd9443d8 \ No newline at end of file +6a7af3ead5949c461430c1fa92798dc2bbbc58c8cd504005c5afa38993f0be82 \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index 031389ea6f..673a159b19 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2854,19 +2854,37 @@ void sqlite3WalEndReadTransaction(Wal *pWal){ } /* -** Search the hash tables for an entry matching page number pgno. Ignore -** any entries that lie after frame iLast within the wal file. +** Search the wal file for page pgno. If found, set *piRead to the frame that +** contains the page. Otherwise, if pgno is not in the wal file, set *piRead +** to zero. +** +** Return SQLITE_OK if successful, or an error code if an error occurs. If an +** error does occur, the final value of *piRead is undefined. */ -static int walFindFrame( - Wal *pWal, - Pgno pgno, - u32 iLast, - u32 *piRead +int sqlite3WalFindFrame( + Wal *pWal, /* WAL handle */ + Pgno pgno, /* Database page number to read data for */ + u32 *piRead /* OUT: Frame number (or zero) */ ){ + u32 iRead = 0; /* If !=0, WAL frame to return data from */ + u32 iLast = pWal->hdr.mxFrame; /* Last page in WAL for this reader */ int iHash; /* Used to loop through N hash tables */ - u32 iRead = 0; int iMinHash; + /* This routine is only be called from within a read transaction. */ + assert( pWal->readLock>=0 || pWal->lockError ); + + /* If the "last page" field of the wal-index header snapshot is 0, then + ** no data will be read from the wal under any circumstances. Return early + ** in this case as an optimization. Likewise, if pWal->readLock==0, + ** then the WAL is ignored by the reader so return early, as if the + ** WAL were empty. + */ + if( iLast==0 || (pWal->readLock==0 && pWal->bShmUnreliable==0) ){ + *piRead = 0; + return SQLITE_OK; + } + /* Each iteration of the following for() loop searches one ** hash table (each hash table indexes up to HASHTABLE_NPAGE frames). ** @@ -2917,43 +2935,6 @@ static int walFindFrame( if( iRead ) break; } - *piRead = iRead; - return SQLITE_OK; -} - -/* -** Search the wal file for page pgno. If found, set *piRead to the frame that -** contains the page. Otherwise, if pgno is not in the wal file, set *piRead -** to zero. -** -** Return SQLITE_OK if successful, or an error code if an error occurs. If an -** error does occur, the final value of *piRead is undefined. -*/ -int sqlite3WalFindFrame( - Wal *pWal, /* WAL handle */ - Pgno pgno, /* Database page number to read data for */ - u32 *piRead /* OUT: Frame number (or zero) */ -){ - u32 iRead = 0; /* If !=0, WAL frame to return data from */ - u32 iLast = pWal->hdr.mxFrame; /* Last page in WAL for this reader */ - int rc; - - /* This routine is only be called from within a read transaction. */ - assert( pWal->readLock>=0 || pWal->lockError ); - - /* If the "last page" field of the wal-index header snapshot is 0, then - ** no data will be read from the wal under any circumstances. Return early - ** in this case as an optimization. Likewise, if pWal->readLock==0, - ** then the WAL is ignored by the reader so return early, as if the - ** WAL were empty. - */ - if( iLast==0 || (pWal->readLock==0 && pWal->bShmUnreliable==0) ){ - *piRead = 0; - return SQLITE_OK; - } - - rc = walFindFrame(pWal, pgno, iLast, &iRead); - #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT /* If expensive assert() statements are available, do a linear search ** of the wal-index file content. Make sure the results agree with the @@ -2973,7 +2954,7 @@ int sqlite3WalFindFrame( #endif *piRead = iRead; - return rc; + return SQLITE_OK; } /* From 50232dd821f419f3f0a667f0f9699e714e567641 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 4 Dec 2018 13:51:43 +0000 Subject: [PATCH 087/113] Fix a problem with SQLITE_ENABLE_EXPENSIVE_ASSERT builds on this branch. FossilOrigin-Name: ddb4a6fbf8619db058b5eb8fcd687084ed4b65a6f69810357e324158257a911f --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/wal.c | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 801f2cffb1..6115220691 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\schange\sto\swal.c\son\sthis\sbranch\sto\smake\sit\smore\ssimilar\sto\strunk. -D 2018-12-03T20:38:15.728 +C Fix\sa\sproblem\swith\sSQLITE_ENABLE_EXPENSIVE_ASSERT\sbuilds\son\sthis\sbranch. +D 2018-12-04T13:51:43.293 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in a050c8670ea0d7b37b2192306cbb50d392acd9902b84e9b56f3444d006f97a6c @@ -592,7 +592,7 @@ F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7 F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392 F src/vtab.c 70188a745dc4e57d26e942681ff4b2912b7c8249ad5de3f60f0677b4337bcfaa F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 8a12219e699ed737fa4dd8f0449f1bb5dee765502b48710dbd5be747ea58e65b +F src/wal.c 6675d84d7bc5d04879e487d79248fb79d9bdad46811cc5ed5ef6233bdf1b70a1 F src/wal.h f325a5856b669f5ba449157485915816103857c8574efc746ac55eba3335c5e0 F src/walker.c fb94aadc9099ff9c6506d0a8b88d51266005bcaa265403f3d7caf732a562eb66 F src/where.c 3818e8a736a05d2cb194e64399af707e367fbcc5c251d785804d02eaf121288e @@ -1792,8 +1792,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a56506b9387a067ef259504d127694ad20223f4b08781d1676ff7f5fdd9443d8 -R d66e284ab90799b5d6b7d2957b4e83a3 -T +closed 0d12f49feb78a94a1b188e80379b51dfe9bf6c8e60225134e15216192cabed21 +P 6a7af3ead5949c461430c1fa92798dc2bbbc58c8cd504005c5afa38993f0be82 +R d464b4876361195a5c5bd9cc28bc9bdf U dan -Z 035c0f4c166e3fab14296a764b5a28cd +Z 0763a5ad9b6082127adcd5e3f801575e diff --git a/manifest.uuid b/manifest.uuid index dd8dc8b081..f3449cc2a0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6a7af3ead5949c461430c1fa92798dc2bbbc58c8cd504005c5afa38993f0be82 \ No newline at end of file +ddb4a6fbf8619db058b5eb8fcd687084ed4b65a6f69810357e324158257a911f \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index 673a159b19..89f475d4d1 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2939,7 +2939,7 @@ int sqlite3WalFindFrame( /* If expensive assert() statements are available, do a linear search ** of the wal-index file content. Make sure the results agree with the ** result obtained using the hash indexes above. */ - if( rc==SQLITE_OK ){ + { u32 iRead2 = 0; u32 iTest; assert( pWal->bShmUnreliable || pWal->minFrame>0 ); From ff9e9b27d54690d93cd0acb5c95a892882d26139 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 29 Dec 2018 20:42:12 +0000 Subject: [PATCH 088/113] Fix a problem causing a corrupt pager-cache if an OOM or IO error was encountered while committing a concurrent transacation. FossilOrigin-Name: 48ca30f9d7817d87a5e9a069fdc51b1a34e00585f8a35771895dd743c7bfe07c --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/pager.c | 8 +++++++- src/wal.c | 14 +++++++++++++- src/wal.h | 4 ++-- test/concfault.test | 41 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 73 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 53ad854a7b..37ed02ff19 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\slatest\strunk\schanges\sinto\sthis\sbranch. -D 2018-12-18T17:20:01.245 +C Fix\sa\sproblem\scausing\sa\scorrupt\spager-cache\sif\san\sOOM\sor\sIO\serror\swas\nencountered\swhile\scommitting\sa\sconcurrent\stransacation. +D 2018-12-29T20:42:12.966 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -498,7 +498,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 86eca42c3d955bebea0082450f978e5633448235f03f86b27a02538bb26e7fff F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 79b8ced46a3c32be19ab4b00d8836292e460411d283a333cb008923c69fbca6a +F src/pager.c 94e8c52c0f91fbf7059ffbbd3be7939ee5122221e0e63855df7ba83100733580 F src/pager.h 389ba8f526d13026aa7081dc581aa742eb7207e3277e7106c522c5b65ad92590 F src/parse.y 8206217fe7fa96652aa1b8a797246e23b30a9d4c1a5175d9c12b13750f51dc2f F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee @@ -593,8 +593,8 @@ F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7 F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392 F src/vtab.c 70188a745dc4e57d26e942681ff4b2912b7c8249ad5de3f60f0677b4337bcfaa F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 6675d84d7bc5d04879e487d79248fb79d9bdad46811cc5ed5ef6233bdf1b70a1 -F src/wal.h f325a5856b669f5ba449157485915816103857c8574efc746ac55eba3335c5e0 +F src/wal.c 2d5771a64354e7a7ef926a38fec8c06193a50fda40cee027c5385c3330abb791 +F src/wal.h ac2100eeda406a4492b8c183154507532d23ab9d5a8e32e208adfe4f9ea554f9 F src/walker.c fb94aadc9099ff9c6506d0a8b88d51266005bcaa265403f3d7caf732a562eb66 F src/where.c 3818e8a736a05d2cb194e64399af707e367fbcc5c251d785804d02eaf121288e F src/whereInt.h f125f29fca80890768e0b2caa14f95db74b2dacd3a122a168f97aa7b64d6968f @@ -730,7 +730,7 @@ F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6 F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151ecac0b95 F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test fb28b3687e03625425bc216edf8b186ce974aa71008e2aa1f426a7dcb75a601d -F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 +F test/concfault.test e5370cd686f601a01909377cac3bbf13dac56d39dd4ad6b04ccbec9eeeaccb18 F test/concurrent.test 86661967a680670127a62a819e60dc93c2d3d49043ac95b26dfa70d3e60dbde5 F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8 F test/concurrent3.test 530671ac706f6a1d0f4992dbdd33a86408330d03cd90fb9e82ecb1b27f5fd081 @@ -1800,7 +1800,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1e13aaa29fb6324b60b3758bdab0491fdef9727e0de603d3da3e1885b52c5caa d64f248da3ce7762fe2c17fbc83f7bea9ffca73723bb3ad0982a85320839da90 -R 25be479282f6f39e20e5b15b242014de +P 123cbb3312917ad5b3c32556547c5b7e8ba4e2d2def8651ff80f9fc1bdc1875c +R 512dc15e0eb54608feb82659e89c990b U dan -Z 3d11aa975cce853c61989d953b5773cd +Z 01d5996e76265f2df93e10aa0e859282 diff --git a/manifest.uuid b/manifest.uuid index b7d011b3bc..ccaa3c2b9b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -123cbb3312917ad5b3c32556547c5b7e8ba4e2d2def8651ff80f9fc1bdc1875c \ No newline at end of file +48ca30f9d7817d87a5e9a069fdc51b1a34e00585f8a35771895dd743c7bfe07c \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 5d7ef14983..fb7b685106 100644 --- a/src/pager.c +++ b/src/pager.c @@ -3213,7 +3213,13 @@ static int pagerRollbackWal(Pager *pPager){ ** + Reload page content from the database (if refcount>0). */ pPager->dbSize = pPager->dbOrigSize; - rc = sqlite3WalUndo(pPager->pWal, pagerUndoCallback, (void *)pPager); + rc = sqlite3WalUndo(pPager->pWal, pagerUndoCallback, (void *)pPager, +#ifdef SQLITE_OMIT_CONCURRENT + 0 +#else + pPager->pAllRead!=0 +#endif + ); pList = sqlite3PcacheDirtyList(pPager->pPCache); #ifndef SQLITE_OMIT_CONCURRENT diff --git a/src/wal.c b/src/wal.c index 89f475d4d1..01cf270f3b 100644 --- a/src/wal.c +++ b/src/wal.c @@ -3256,7 +3256,12 @@ int sqlite3WalEndWriteTransaction(Wal *pWal){ ** Otherwise, if the callback function does not return an error, this ** function returns SQLITE_OK. */ -int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx){ +int sqlite3WalUndo( + Wal *pWal, + int (*xUndo)(void *, Pgno), + void *pUndoCtx, + int bConcurrent /* True if this is a CONCURRENT transaction */ +){ int rc = SQLITE_OK; if( pWal->writeLock ){ Pgno iMax = pWal->hdr.mxFrame; @@ -3266,6 +3271,13 @@ int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx){ ** was in before the client began writing to the database. */ memcpy(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr)); +#ifndef SQLITE_OMIT_CONCURRENT + if( bConcurrent ){ + pWal->hdr.aCksum[0]++; + } +#else + UNUSED_PARAMETER(bConcurrent); +#endif for(iFrame=pWal->hdr.mxFrame+1; ALWAYS(rc==SQLITE_OK) && iFrame<=iMax; diff --git a/src/wal.h b/src/wal.h index 70247f1c2b..9878852c76 100644 --- a/src/wal.h +++ b/src/wal.h @@ -34,7 +34,7 @@ # define sqlite3WalDbsize(y) 0 # define sqlite3WalBeginWriteTransaction(y) 0 # define sqlite3WalEndWriteTransaction(x) 0 -# define sqlite3WalUndo(x,y,z) 0 +# define sqlite3WalUndo(w,x,y,z) 0 # define sqlite3WalSavepoint(y,z) # define sqlite3WalSavepointUndo(y,z) 0 # define sqlite3WalFrames(u,v,w,x,y,z) 0 @@ -83,7 +83,7 @@ int sqlite3WalBeginWriteTransaction(Wal *pWal); int sqlite3WalEndWriteTransaction(Wal *pWal); /* Undo any frames written (but not committed) to the log */ -int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx); +int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx, int); /* Return an integer that records the current (uncommitted) write ** position in the WAL */ diff --git a/test/concfault.test b/test/concfault.test index 6d409c8d74..8c26d3d486 100644 --- a/test/concfault.test +++ b/test/concfault.test @@ -82,5 +82,46 @@ do_faultsim_test 1.3 -prep { faultsim_integrity_check } + +#------------------------------------------------------------------------- +reset_db + +do_execsql_test 2.0 { + PRAGMA auto_vacuum = 0; + PRAGMA journal_mode = wal; + CREATE TABLE t1(a PRIMARY KEY, b); + CREATE TABLE t2(a PRIMARY KEY, b); + INSERT INTO t1 VALUES(randomblob(1000), randomblob(100)); + INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1; + INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1; + INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1; + INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1; + DELETE FROM t1 WHERE rowid%2; +} {wal} + +faultsim_save_and_close +do_faultsim_test 1 -prep { + faultsim_restore_and_reopen + execsql { + SELECT * FROM t1; + BEGIN CONCURRENT; + INSERT INTO t2 VALUES(1, 2); + } + sqlite3 db2 test.db + execsql { + PRAGMA journal_size_limit = 10000; + INSERT INTO t1 VALUES(randomblob(1000), randomblob(1000)); + } db2 + db2 close +} -body { + execsql { COMMIT } +} -test { + faultsim_test_result {0 {}} + catchsql { ROLLBACK } + set res [catchsql { SELECT count(*) FROM t1 }] + if {$res!="0 9"} { error "expected {0 9} got {$res}" } + faultsim_integrity_check +} + finish_test From 77428e6055a4046de1c373f5a8e1792a28c40f49 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 11 Jan 2019 15:06:39 +0000 Subject: [PATCH 089/113] Add new documentation file begin_concurrent.md. FossilOrigin-Name: fdbf97e611ed23f86dc0df9d53421fb04226af0d1c7171d55c11acd0dbe935f0 --- doc/begin_concurrent.md | 107 ++++++++++++++++++++++++++++++++++++++++ manifest | 11 +++-- manifest.uuid | 2 +- 3 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 doc/begin_concurrent.md diff --git a/doc/begin_concurrent.md b/doc/begin_concurrent.md new file mode 100644 index 0000000000..2a06b5872e --- /dev/null +++ b/doc/begin_concurrent.md @@ -0,0 +1,107 @@ + +Begin Concurrent +================ + +## Overview + +Usually, SQLite allows at most one writer to proceed concurrently. The +BEGIN CONCURRENT enhancement allows multiple writers to process write +transactions simultanously if the database is in "wal" or "wal2" mode, +although the system still serializes COMMIT commands. + +When a write-transaction is opened with "BEGIN CONCURRENT", actually +locking the database is deferred until a COMMIT is executed. This means +that any number of transactions started with BEGIN CONCURRENT may proceed +concurrently. The system uses optimistic page-level-locking to prevent +conflicting concurrent transactions from being committed. + +When a BEGIN CONCURRENT transaction is committed, the system checks whether +or not any of the database pages that the transaction has read have been +modified since the BEGIN CONCURRENT was opened. In other words - it asks +if the transaction being committed operates on a different set of data than +all other concurrently executing transactions. If the answer is "yes, this +transaction did not read or modify any data modified by any concurrent +transaction", then the transaction is committed as normal. Otherwise, if the +transaction does conflict, it cannot be committed and an SQLITE_BUSY_SNAPSHOT +error is returned. At this point, all the client can do is ROLLBACK the +transaction. + +If SQLITE_BUSY_SNAPSHOT is returned, messages are output via the sqlite3_log +mechanism indicating the page and table or index on which the conflict +occurred. This can be useful when optimizing concurrency. + +## Application Programming Notes + +In order to serialize COMMIT processing, SQLite takes a lock on the database +as part of each COMMIT command and releases it before returning. At most one +writer may hold this lock at any one time. If a writer cannot obtain the lock, +it uses SQLite's busy-handler to pause and retry for a while: + + + https://www.sqlite.org/c3ref/busy_handler.html + + +If there is significant contention for the writer lock, this mechanism can be +inefficient. In this case it is better for the application to use a mutex or +some other mechanism that supports blocking to ensure that at most one writer +is attempting to COMMIT a BEGIN CONCURRENT transaction at a time. This is +usually easier if all writers are part of the same operating system process. + +If all database clients (readers and writers) are located in the same OS +process, and if that OS is a Unix variant, then it can be more efficient to +the built-in VFS "unix-excl" instead of the default "unix". This is because it +uses more efficient locking primitives. + +The key to maximizing concurrency using BEGIN CONCURRENT is to ensure that +there are a large number of non-conflicting transactions. In SQLite, each +table and each index is stored as a separate b-tree, each of which is +distributed over a discrete set of database pages. This means that: + + * Two transactions that write to different sets of tables never + conflict, and that + + * Two transactions that write to the same tables or indexes only + conflict if the values of the keys (either primary keys or indexed + rows) are fairly close together. For example, given a large + table with the schema: + +
     CREATE TABLE t1(a INTEGER PRIMARY KEY, b BLOB);
+ + writing two rows with adjacent values for "a" probably will cause a + conflict (as the two keys are stored on the same page), but writing two + rows with vastly different values for "a" will not (as the keys will likly + be stored on different pages). + +Note that, in SQLite, if values are not explicitly supplied for an INTEGER +PRIMARY KEY, as for example in: + +> + INSERT INTO t1(b) VALUES(<blob-value>); + +then monotonically increasing values are assigned automatically. This is +terrible for concurrency, as it all but ensures that all new rows are +added to the same database page. In such situations, it is better to +explicitly assign random values to INTEGER PRIMARY KEY fields. + +This problem also comes up for non-WITHOUT ROWID tables that do not have an +explicit INTEGER PRIMARY KEY column. In these cases each table has an implicit +INTEGER PRIMARY KEY column that is assigned increasing values, leading to the +same problem as omitting to assign a value to an explicit INTEGER PRIMARY KEY +column. + +For both explicit and implicit INTEGER PRIMARY KEYs, it is possible to have +SQLite assign values at random (instead of the monotonically increasing +values) by writing a row with a rowid equal to the largest possible signed +64-bit integer to the table. For example: + + INSERT INTO t1(a) VALUES(9223372036854775807); + +Applications should take care not to malfunction due to the presence of such +rows. + +The nature of some types of indexes, for example indexes on timestamp fields, +can also cause problems (as concurrent transactions may assign similar +timestamps that will be stored on the same db page to new records). In these +cases the database schema may need to be rethought to increase the concurrency +provided by page-level-locking. + diff --git a/manifest b/manifest index a02b06615d..50c4c0866b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\slatest\strunk\schanges\sinto\sthis\sbranch. -D 2019-01-02T16:08:14.536 +C Add\snew\sdocumentation\sfile\sbegin_concurrent.md. +D 2019-01-11T15:06:39.819 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -37,6 +37,7 @@ F configure e2b4021dcb8ee6f9a91e7f4011316957868e8065019ac994f68e27363120c272 x F configure.ac 3552d3aecade98a9d4b64bceb48ffb7726cbc85902efde956812942f060fbd0a F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd +F doc/begin_concurrent.md 4bee2c3990d1eb800f1ce3726a911292a8e4b889300b2ffd4b08d357370db299 F doc/lemon.html 24956ab2995e55fe171e55bdd04f22b553957dc8bb43501dbb9311e30187e0d3 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 F doc/vfs-shm.txt e101f27ea02a8387ce46a05be2b1a902a021d37a @@ -1808,7 +1809,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 48ca30f9d7817d87a5e9a069fdc51b1a34e00585f8a35771895dd743c7bfe07c 0465d2fc0d3f8beaa1b6b0bd7bd51d69a524f30d889c9402e7d02cc06164a310 -R 71a7bae1fe784545f177910e02fe6935 +P 5bf212f1a754fde90af0af82dd76f636754829c7372e19df1fd4fa579f0926aa +R 7b08b63629f0fa82321f4b409f15d3b0 U dan -Z c6a4d4a7e90e89246e3383ca332fbf2a +Z ca9bd1f59646fbf4e9e98b47096634fe diff --git a/manifest.uuid b/manifest.uuid index cdb0e920c0..3c0ded4061 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5bf212f1a754fde90af0af82dd76f636754829c7372e19df1fd4fa579f0926aa \ No newline at end of file +fdbf97e611ed23f86dc0df9d53421fb04226af0d1c7171d55c11acd0dbe935f0 \ No newline at end of file From bfaa3dbd61d55da36027e7c252893a0c08dc650b Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 Mar 2019 13:28:15 +0000 Subject: [PATCH 090/113] Bring this branch into closer alignment with begin-concurrent. FossilOrigin-Name: 6433d366175c5be586a0e11b540e76a2515466b358332c4356388f4c449ec0d7 --- doc/begin_concurrent.md | 107 ++++++++++++++++++++++++++++++++++++++++ manifest | 25 +++++----- manifest.uuid | 2 +- src/btree.c | 2 +- src/pager.c | 8 ++- src/sqliteInt.h | 2 +- src/wal.c | 14 +++++- src/wal.h | 4 +- test/concfault.test | 41 ++++++++++++++- test/permutations.test | 1 + 10 files changed, 186 insertions(+), 20 deletions(-) create mode 100644 doc/begin_concurrent.md diff --git a/doc/begin_concurrent.md b/doc/begin_concurrent.md new file mode 100644 index 0000000000..2a06b5872e --- /dev/null +++ b/doc/begin_concurrent.md @@ -0,0 +1,107 @@ + +Begin Concurrent +================ + +## Overview + +Usually, SQLite allows at most one writer to proceed concurrently. The +BEGIN CONCURRENT enhancement allows multiple writers to process write +transactions simultanously if the database is in "wal" or "wal2" mode, +although the system still serializes COMMIT commands. + +When a write-transaction is opened with "BEGIN CONCURRENT", actually +locking the database is deferred until a COMMIT is executed. This means +that any number of transactions started with BEGIN CONCURRENT may proceed +concurrently. The system uses optimistic page-level-locking to prevent +conflicting concurrent transactions from being committed. + +When a BEGIN CONCURRENT transaction is committed, the system checks whether +or not any of the database pages that the transaction has read have been +modified since the BEGIN CONCURRENT was opened. In other words - it asks +if the transaction being committed operates on a different set of data than +all other concurrently executing transactions. If the answer is "yes, this +transaction did not read or modify any data modified by any concurrent +transaction", then the transaction is committed as normal. Otherwise, if the +transaction does conflict, it cannot be committed and an SQLITE_BUSY_SNAPSHOT +error is returned. At this point, all the client can do is ROLLBACK the +transaction. + +If SQLITE_BUSY_SNAPSHOT is returned, messages are output via the sqlite3_log +mechanism indicating the page and table or index on which the conflict +occurred. This can be useful when optimizing concurrency. + +## Application Programming Notes + +In order to serialize COMMIT processing, SQLite takes a lock on the database +as part of each COMMIT command and releases it before returning. At most one +writer may hold this lock at any one time. If a writer cannot obtain the lock, +it uses SQLite's busy-handler to pause and retry for a while: + + + https://www.sqlite.org/c3ref/busy_handler.html + + +If there is significant contention for the writer lock, this mechanism can be +inefficient. In this case it is better for the application to use a mutex or +some other mechanism that supports blocking to ensure that at most one writer +is attempting to COMMIT a BEGIN CONCURRENT transaction at a time. This is +usually easier if all writers are part of the same operating system process. + +If all database clients (readers and writers) are located in the same OS +process, and if that OS is a Unix variant, then it can be more efficient to +the built-in VFS "unix-excl" instead of the default "unix". This is because it +uses more efficient locking primitives. + +The key to maximizing concurrency using BEGIN CONCURRENT is to ensure that +there are a large number of non-conflicting transactions. In SQLite, each +table and each index is stored as a separate b-tree, each of which is +distributed over a discrete set of database pages. This means that: + + * Two transactions that write to different sets of tables never + conflict, and that + + * Two transactions that write to the same tables or indexes only + conflict if the values of the keys (either primary keys or indexed + rows) are fairly close together. For example, given a large + table with the schema: + +
     CREATE TABLE t1(a INTEGER PRIMARY KEY, b BLOB);
+ + writing two rows with adjacent values for "a" probably will cause a + conflict (as the two keys are stored on the same page), but writing two + rows with vastly different values for "a" will not (as the keys will likly + be stored on different pages). + +Note that, in SQLite, if values are not explicitly supplied for an INTEGER +PRIMARY KEY, as for example in: + +> + INSERT INTO t1(b) VALUES(<blob-value>); + +then monotonically increasing values are assigned automatically. This is +terrible for concurrency, as it all but ensures that all new rows are +added to the same database page. In such situations, it is better to +explicitly assign random values to INTEGER PRIMARY KEY fields. + +This problem also comes up for non-WITHOUT ROWID tables that do not have an +explicit INTEGER PRIMARY KEY column. In these cases each table has an implicit +INTEGER PRIMARY KEY column that is assigned increasing values, leading to the +same problem as omitting to assign a value to an explicit INTEGER PRIMARY KEY +column. + +For both explicit and implicit INTEGER PRIMARY KEYs, it is possible to have +SQLite assign values at random (instead of the monotonically increasing +values) by writing a row with a rowid equal to the largest possible signed +64-bit integer to the table. For example: + + INSERT INTO t1(a) VALUES(9223372036854775807); + +Applications should take care not to malfunction due to the presence of such +rows. + +The nature of some types of indexes, for example indexes on timestamp fields, +can also cause problems (as concurrent transactions may assign similar +timestamps that will be stored on the same db page to new records). In these +cases the database schema may need to be rethought to increase the concurrency +provided by page-level-locking. + diff --git a/manifest b/manifest index 5863a05066..acd4386c8b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sthe\slatest\strunk\schanges. -D 2019-03-26T12:16:24.827 +C Bring\sthis\sbranch\sinto\scloser\salignment\swith\sbegin-concurrent. +D 2019-03-26T13:28:15.115 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -38,6 +38,7 @@ F configure b013bf805064650b072817c7c7f0a295cfcec5b1afec15e59ea4e9996543f51e x F configure.ac 3552d3aecade98a9d4b64bceb48ffb7726cbc85902efde956812942f060fbd0a F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd +F doc/begin_concurrent.md 4bee2c3990d1eb800f1ce3726a911292a8e4b889300b2ffd4b08d357370db299 F doc/lemon.html 24956ab2995e55fe171e55bdd04f22b553957dc8bb43501dbb9311e30187e0d3 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 F doc/vfs-shm.txt e101f27ea02a8387ce46a05be2b1a902a021d37a @@ -461,7 +462,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 8433d9e98dd6f2ea3286e0d2fe5d65de1bfc18a706486eb2026b01be066b5806 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c b517c680d108228e4ff2de9182957f96b9932057fed5e4322eaabe0c95e2b7df +F src/btree.c b8d297f81e69bdb52e405d4ba3dca62c02e1421120309fb1ceef0e05f5eece55 F src/btree.h f5c65a8c7ce7d3c493ab5ee4d35ea95610422362d3d207993b05804d2bbcc17c F src/btreeInt.h 9d7f00ca9402f5e881e30eeba1e65814be8544284d59bd843419b6f73b761730 F src/build.c 1d5dc39cb3fd437c8031c13f52f600b1541977ea68fe1c29bf200ceb22217d0f @@ -507,7 +508,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 86eca42c3d955bebea0082450f978e5633448235f03f86b27a02538bb26e7fff F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 56e624829268336890dad1ed864ab62df6cb2eb35633a430ca22d09b9eea3cfb +F src/pager.c da57d6cdd925392aa5e8ed99908e037d562a238c8153e458b9a4b1a13021bfdb F src/pager.h 389ba8f526d13026aa7081dc581aa742eb7207e3277e7106c522c5b65ad92590 F src/parse.y e53f90120fc1c47bfdf2a0894e6ffe0d06f757dbd61eacaaa1731334a1cf08fa F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee @@ -525,7 +526,7 @@ F src/shell.c.in c1986496062f9dba4ed5b70db06b5e0f32e1954cdcfab0b30372c6c18679681 F src/sqlite.h.in 491a9fca996e30b210244f786e062c3513ecf7d0450f93c06a5484f60a10df6a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h 7a67213db1f6217432948f3d898473f48ccfe9c1bc37a11b8d2b8c978fda517c +F src/sqliteInt.h 3a676f6f67929155f6e9bf279230cc339f924104b2151432e3a73d0cbb6d05c2 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -602,8 +603,8 @@ F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7 F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392 F src/vtab.c 2462b7d6fd72b0b916477f5ef210ee49ab58cec195483ebdac0c8c5e3ec42cab F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 59b20f8fd0d7420e8896a1ef7cbd5db7352f383235ec25db08d9c22b55f4b603 -F src/wal.h f325a5856b669f5ba449157485915816103857c8574efc746ac55eba3335c5e0 +F src/wal.c 9ad123ad4695cf5883d03754b9b32a2267b1bdc95857059781c575fc796ce8b2 +F src/wal.h ac2100eeda406a4492b8c183154507532d23ab9d5a8e32e208adfe4f9ea554f9 F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 F src/where.c 8a207cb2ca6b99e1edb1e4bbff9b0504385a759cbf66180d1deb34d80ca4b799 F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 @@ -740,7 +741,7 @@ F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6 F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151ecac0b95 F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test fb28b3687e03625425bc216edf8b186ce974aa71008e2aa1f426a7dcb75a601d -F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43 +F test/concfault.test a88fdcd2dd959ac127a534581160fbe902080349d8703da3a8ac9633d7785a09 F test/concurrent.test 86661967a680670127a62a819e60dc93c2d3d49043ac95b26dfa70d3e60dbde5 F test/concurrent2.test de748c7dd749c77e2af2c4b914b9b09a28ac09608042ca498c0251dc6f46aa1a F test/concurrent3.test 530671ac706f6a1d0f4992dbdd33a86408330d03cd90fb9e82ecb1b27f5fd081 @@ -1209,7 +1210,7 @@ F test/pagesize.test 5769fc62d8c890a83a503f67d47508dfdc543305 F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff -F test/permutations.test a2ea383ba27332d9f964b74fb646680c68a83cb5bb32bdf018a22d2f6422d0f3 +F test/permutations.test 52d2c37fe8cc07ec7362024c214b04bb69432995b3a984a3fbabc60fa6ada3ee F test/pg_common.tcl 301ac19c1a52fd55166d26db929b3b89165c634d52b5f8ad76ea8cb06960db30 F test/pragma.test c267bf02742c823a191960895b3d52933cebd7beee26757d1ed694f213fcd867 F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f @@ -1820,7 +1821,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 667cce3dce39487e970c4eb43efd1bae7efed7ac6ee31030c582bfafa846dcce fade103cbac1b067f9544935b767f36dc266aceb3269cc84a3ae3b04ad9a4823 -R 4f3c8653330ec682cd33c2959e9b41eb +P 51e3e835490a12dca6359ca02b8cbf31091fc4376b265995a986d002d376fad9 +R b33d74604a290882b801e01fd4143d6d U drh -Z 165c946130d99e8a2b3dc34a886a51e9 +Z 04a15b76f4ebf30d6bcb9170bc1c04d2 diff --git a/manifest.uuid b/manifest.uuid index 32ac4b9971..dbbdeaa150 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -51e3e835490a12dca6359ca02b8cbf31091fc4376b265995a986d002d376fad9 \ No newline at end of file +6433d366175c5be586a0e11b540e76a2515466b358332c4356388f4c449ec0d7 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 154af1f039..3f84825e2e 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8024,6 +8024,7 @@ static int balance_nonroot( memset(apOld, 0, (i+1)*sizeof(MemPage*)); goto balance_cleanup; } + setMempageRoot(apOld[i], pgnoRoot); if( apOld[i]->nFree<0 ){ rc = btreeComputeFreeSpace(apOld[i]); if( rc ){ @@ -8031,7 +8032,6 @@ static int balance_nonroot( goto balance_cleanup; } } - setMempageRoot(apOld[i], pgnoRoot); if( (i--)==0 ) break; if( pParent->nOverflow && i+nxDiv==pParent->aiOvfl[0] ){ diff --git a/src/pager.c b/src/pager.c index 2b5db2ceb6..dd6aa85d82 100644 --- a/src/pager.c +++ b/src/pager.c @@ -3216,7 +3216,13 @@ static int pagerRollbackWal(Pager *pPager){ ** + Reload page content from the database (if refcount>0). */ pPager->dbSize = pPager->dbOrigSize; - rc = sqlite3WalUndo(pPager->pWal, pagerUndoCallback, (void *)pPager); + rc = sqlite3WalUndo(pPager->pWal, pagerUndoCallback, (void *)pPager, +#ifdef SQLITE_OMIT_CONCURRENT + 0 +#else + pPager->pAllRead!=0 +#endif + ); pList = sqlite3PcacheDirtyList(pPager->pPCache); #ifndef SQLITE_OMIT_CONCURRENT diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 31546da49d..732cc7e755 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1558,8 +1558,8 @@ struct sqlite3 { #define SQLITE_LegacyAlter 0x04000000 /* Legacy ALTER TABLE behaviour */ #define SQLITE_NoSchemaError 0x08000000 /* Do not report schema parse errors*/ #define SQLITE_Defensive 0x10000000 /* Input SQL is likely hostile */ +#define SQLITE_NoopUpdate 0x20000000 /* UPDATE operations are no-ops */ -#define SQLITE_NoopUpdate 0x01000000 /* UPDATE operations are no-ops */ /* Flags used only if debugging */ #define HI(X) ((u64)(X)<<32) #ifdef SQLITE_DEBUG diff --git a/src/wal.c b/src/wal.c index 4b22ba42ef..bd92fd95c5 100644 --- a/src/wal.c +++ b/src/wal.c @@ -3258,7 +3258,12 @@ int sqlite3WalEndWriteTransaction(Wal *pWal){ ** Otherwise, if the callback function does not return an error, this ** function returns SQLITE_OK. */ -int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx){ +int sqlite3WalUndo( + Wal *pWal, + int (*xUndo)(void *, Pgno), + void *pUndoCtx, + int bConcurrent /* True if this is a CONCURRENT transaction */ +){ int rc = SQLITE_OK; if( pWal->writeLock ){ Pgno iMax = pWal->hdr.mxFrame; @@ -3268,6 +3273,13 @@ int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx){ ** was in before the client began writing to the database. */ memcpy(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr)); +#ifndef SQLITE_OMIT_CONCURRENT + if( bConcurrent ){ + pWal->hdr.aCksum[0]++; + } +#else + UNUSED_PARAMETER(bConcurrent); +#endif for(iFrame=pWal->hdr.mxFrame+1; ALWAYS(rc==SQLITE_OK) && iFrame<=iMax; diff --git a/src/wal.h b/src/wal.h index 70247f1c2b..9878852c76 100644 --- a/src/wal.h +++ b/src/wal.h @@ -34,7 +34,7 @@ # define sqlite3WalDbsize(y) 0 # define sqlite3WalBeginWriteTransaction(y) 0 # define sqlite3WalEndWriteTransaction(x) 0 -# define sqlite3WalUndo(x,y,z) 0 +# define sqlite3WalUndo(w,x,y,z) 0 # define sqlite3WalSavepoint(y,z) # define sqlite3WalSavepointUndo(y,z) 0 # define sqlite3WalFrames(u,v,w,x,y,z) 0 @@ -83,7 +83,7 @@ int sqlite3WalBeginWriteTransaction(Wal *pWal); int sqlite3WalEndWriteTransaction(Wal *pWal); /* Undo any frames written (but not committed) to the log */ -int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx); +int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx, int); /* Return an integer that records the current (uncommitted) write ** position in the WAL */ diff --git a/test/concfault.test b/test/concfault.test index 6d409c8d74..205e1d93be 100644 --- a/test/concfault.test +++ b/test/concfault.test @@ -82,5 +82,44 @@ do_faultsim_test 1.3 -prep { faultsim_integrity_check } -finish_test +#------------------------------------------------------------------------- +reset_db + +do_execsql_test 2.0 { + PRAGMA auto_vacuum = 0; + PRAGMA journal_mode = wal; + CREATE TABLE t1(a PRIMARY KEY, b); + CREATE TABLE t2(a PRIMARY KEY, b); + INSERT INTO t1 VALUES(randomblob(1000), randomblob(100)); + INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1; + INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1; + INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1; + INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1; + DELETE FROM t1 WHERE rowid%2; +} {wal} +faultsim_save_and_close +do_faultsim_test 1 -prep { + faultsim_restore_and_reopen + execsql { + SELECT * FROM t1; + BEGIN CONCURRENT; + INSERT INTO t2 VALUES(1, 2); + } + sqlite3 db2 test.db + execsql { + PRAGMA journal_size_limit = 10000; + INSERT INTO t1 VALUES(randomblob(1000), randomblob(1000)); + } db2 + db2 close +} -body { + execsql { COMMIT } +} -test { + faultsim_test_result {0 {}} + catchsql { ROLLBACK } + set res [catchsql { SELECT count(*) FROM t1 }] + if {$res!="0 9"} { error "expected {0 9} got {$res}" } + faultsim_integrity_check +} + +finish_test diff --git a/test/permutations.test b/test/permutations.test index 91d92bdb23..577cc7bd05 100644 --- a/test/permutations.test +++ b/test/permutations.test @@ -89,6 +89,7 @@ foreach f [glob $testdir/*.test] { lappend alltests [file tail $f] } foreach f [glob -nocomplain \ $testdir/../ext/rtree/*.test \ $testdir/../ext/fts5/test/*.test \ + $testdir/../ext/expert/*.test \ $testdir/../ext/lsm1/test/*.test \ ] { lappend alltests $f From 98424ffbea7f79284922a77f42d280f35bf8f6b2 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 10 Feb 2020 19:37:20 +0000 Subject: [PATCH 091/113] Fix a typo in the in-tree begin-concurrent documentation FossilOrigin-Name: b13dae1cb3f9e20b6dcd697b1d11316e88b6c2d7c8dfe1aebc80ad88827dc887 --- doc/begin_concurrent.md | 3 +-- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/doc/begin_concurrent.md b/doc/begin_concurrent.md index 2a06b5872e..0575972942 100644 --- a/doc/begin_concurrent.md +++ b/doc/begin_concurrent.md @@ -76,7 +76,7 @@ Note that, in SQLite, if values are not explicitly supplied for an INTEGER PRIMARY KEY, as for example in: > - INSERT INTO t1(b) VALUES(<blob-value>); + INSERT INTO t1(b) VALUES(); then monotonically increasing values are assigned automatically. This is terrible for concurrency, as it all but ensures that all new rows are @@ -104,4 +104,3 @@ can also cause problems (as concurrent transactions may assign similar timestamps that will be stored on the same db page to new records). In these cases the database schema may need to be rethought to increase the concurrency provided by page-level-locking. - diff --git a/manifest b/manifest index 54a5dcbdfe..5011996b92 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\slatest\strunk\schanges,\sincluding\sthe\sSQLITE_ENABLE_CORRUPT_PGNO\spatch,\sinto\sthis\sbranch. -D 2020-02-04T20:08:19.364 +C Fix\sa\stypo\sin\sthe\sin-tree\sbegin-concurrent\sdocumentation +D 2020-02-10T19:37:20.516 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -38,7 +38,7 @@ F configure 4bbb5f13998f2faf929b9ae708aea9fbcb08a46cb6dd3150e36c3f09c0a05a75 x F configure.ac 798a24cee2879325ca5b688a618199eb32cc77ed8136edbaa43d9137b470d54e F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd -F doc/begin_concurrent.md 4bee2c3990d1eb800f1ce3726a911292a8e4b889300b2ffd4b08d357370db299 +F doc/begin_concurrent.md e694a2a1c623833e7de8b688e81ec30fd4439a78d6b74be61bce0b1e8f590470 F doc/lemon.html 24956ab2995e55fe171e55bdd04f22b553957dc8bb43501dbb9311e30187e0d3 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 F doc/trusted-schema.md 33625008620e879c7bcfbbfa079587612c434fa094d338b08242288d358c3e8a @@ -1872,7 +1872,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bbbc2881b9e47988ca2b5fcab2b399823c64dac00071cfc7083636e9ee0d2f50 57c36a293e16bb4d9652874124ee1447bef278e08664bc8dd0070a0ee2ef1173 -R 3b6633b40650f463664ef120847ba75a -U dan -Z 9ea8ac62cab8b0445d57995f52fb8d66 +P f253618ac6b7d8dbc6f14c5c243b45c1e2542e51cc2c176c03ebb0979a36e5fd +R c461fd2cb6ed2027deb9de75645cf1bd +U drh +Z f93767e4abaa57b2f64cc5d9c33d2bd4 diff --git a/manifest.uuid b/manifest.uuid index 762ceb2a56..cf058eb4c1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f253618ac6b7d8dbc6f14c5c243b45c1e2542e51cc2c176c03ebb0979a36e5fd \ No newline at end of file +b13dae1cb3f9e20b6dcd697b1d11316e88b6c2d7c8dfe1aebc80ad88827dc887 \ No newline at end of file From f17089eb01bb4b8f8312b59bf2fd0106cbf04ac2 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 13 Mar 2020 07:23:20 +0000 Subject: [PATCH 092/113] Fix a typo causing SQLITE_NOOP_UPDATE builds to fail. FossilOrigin-Name: 1e2109fd339cfb3b906673479672ed2e5a0dc17a94210f364c6fc1a657a62ae8 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/update.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 9a301e4eb0..94860427ea 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\slatest\strunk\schanges,\sincluding\sthe\sSQLITE_ENABLE_CORRUPT_PGNO\spatch,\sinto\sthis\sbranch. -D 2020-02-04T20:09:45.604 +C Fix\sa\stypo\scausing\sSQLITE_NOOP_UPDATE\sbuilds\sto\sfail. +D 2020-03-13T07:23:20.658 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -603,7 +603,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 7b17f6e2f20f6cbcb0b215025a86b7457c38451fc7622f705e553d7a488c572d F src/treeview.c 438c1000587b33faba35e87596bebcf7f40638d98f33781cdd9e04711b18b09c F src/trigger.c a40d50e88bd3355f1d2a73f0a3b2d6b42eae26ca4219001b82ef0d064439badc -F src/update.c feed9db366f68269f816ae4f331eaa1ee80d2f4b92946520ab4adda498d39776 +F src/update.c 1773820c20093142cca1aa3d2ff6641d615fb58d4436ccb73c87c2150aca58e3 F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 736ff76753236ffbc8b5b939f5e0607f28aeaa7c780b3a56b419228f0a81c87b F src/util.c d035b09df9cecbc0e8f07c34b815acbf0d43c8adc8d2c540e3dc92eecb27855a @@ -1872,7 +1872,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e65e6c01d632beec9a21758cce6f7ac2e3bc2c5fac88b3bb393b9040fb2cbea6 57c36a293e16bb4d9652874124ee1447bef278e08664bc8dd0070a0ee2ef1173 -R 9d5cda2c45f63ffe254afb4c707909d3 +P 23bc80cc8681762e42376e5d878fe60ccc9a6533b7d017e54280996ea363c3f5 +R 9dd87835a256722f5a841fd7efa657e0 U dan -Z 31d9d200d5f8fcd198e985dd0d0a0355 +Z ca69e79c36c59c0b831ec71263d78874 diff --git a/manifest.uuid b/manifest.uuid index 992b15ff0d..93329f1198 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -23bc80cc8681762e42376e5d878fe60ccc9a6533b7d017e54280996ea363c3f5 \ No newline at end of file +1e2109fd339cfb3b906673479672ed2e5a0dc17a94210f364c6fc1a657a62ae8 \ No newline at end of file diff --git a/src/update.c b/src/update.c index 6807996031..0d73e0c60c 100644 --- a/src/update.c +++ b/src/update.c @@ -306,7 +306,7 @@ void sqlite3Update( if( db->flags & SQLITE_NoopUpdate ){ Token x; sqlite3ExprDelete(db, pChanges->a[i].pExpr); - x.z = pChanges->a[i].zName; + x.z = pChanges->a[i].zEName; x.n = sqlite3Strlen30(x.z); pChanges->a[i].pExpr = sqlite3PExpr(pParse, TK_UPLUS, sqlite3ExprAlloc(db, TK_ID, &x, 0), 0); From 9a47771710ef03019e7171cee0ee1bd790cc6778 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 16 Jul 2020 20:24:11 +0000 Subject: [PATCH 093/113] Allow BEGIN CONCURRENT transactions to contain schema modifications. However, this causes them to conflict with all other transactions. FossilOrigin-Name: 9a4a02304e3f5dc1d567cf2a9eae4cdb575e02cb37f9ee25928f2325ab192e76 --- manifest | 1901 +---------------------------------------- manifest.uuid | 2 +- src/btree.c | 9 +- src/sqliteInt.h | 9 +- src/vacuum.c | 2 +- src/vdbe.c | 26 +- src/vdbeaux.c | 8 +- src/wal.c | 18 +- test/concurrent.test | 15 +- test/concurrent8.test | 109 +++ 10 files changed, 181 insertions(+), 1918 deletions(-) create mode 100644 test/concurrent8.test diff --git a/manifest b/manifest index 41078227db..b6a1477cd4 100644 --- a/manifest +++ b/manifest @@ -1,1886 +1,15 @@ -C Merge\sversion\s3.32.1\sinto\sthe\sbegin-concurrent\sbranch. -D 2020-05-25T17:27:31.900 -F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 -F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea -F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in 376f53999defeb32b7ad2626fd58aae8f3694c38ab7ee30c2289e0d0525a9238 -F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc 8d00aeba2609bb498dded5eead2890126321f02e292573bf29bf2d18487d37bd -F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a -F VERSION 7d1da8465e06354a9ffb67a9ef3f933552767d8e239b507cb2a08ba417048322 -F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 -F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 -F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 -F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 -F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 -F autoconf/Makefile.am e14b629addaa1ce372b72043f28f40de2e32b7e211b6e0fc18dbb87989197e40 -F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.msc e0f1dafc48d000fd6ddfdb01815271528db55cbc7299ca888df5b93367f0d5a4 -F autoconf/README.first 6c4f34fe115ff55d4e8dbfa3cecf04a0188292f7 -F autoconf/README.txt 4f04b0819303aabaa35fff5f7b257fb0c1ef95f1 -F autoconf/configure.ac 3cd933b959fe514eebd1ca1717dfddbf2c9b825b6bc2c5f744deaf5d63af9288 -F autoconf/tea/Makefile.in b438a7020446c8a8156e8d97c8914a04833da6fd -F autoconf/tea/README 3e9a3c060f29a44344ab50aec506f4db903fb873 -F autoconf/tea/aclocal.m4 52c47aac44ce0ddb1f918b6993e8beb8eee88f43 -F autoconf/tea/configure.ac ea61e07340d97e4a79a081f0b8977198a6073edd060738dbb3ae5cb8d5e96f1c -F autoconf/tea/doc/sqlite3.n e1fe45d4f5286ee3d0ccc877aca2a0def488e9bb -F autoconf/tea/license.terms 13bd403c9610fd2b76ece0ab50c4c5eda933d523 -F autoconf/tea/pkgIndex.tcl.in 3ef61715cf1c7bdcff56947ffadb26bc991ca39d -F autoconf/tea/tclconfig/install-sh bdd5e293591621ae60d9824d86a4b1c5f22c3d00 -F autoconf/tea/tclconfig/tcl.m4 66ddf0a5d5e4b1d29bff472c0985fd7fa89d0fb5 -F autoconf/tea/win/makefile.vc 71915591c07cd5137711dc40ba3e127deb3f4531b9aad220b724cf5b451362bd -F autoconf/tea/win/nmakehlp.c 247538ad8e8c508f33c03ec1fbd67d3a07ef6291 -F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 -F config.guess 883205ddf25b46f10c181818bf42c09da9888884af96f79e1719264345053bd6 -F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc -F config.sub c2d0260f17f3e4bc0b6808fccf1b291cb5e9126c14fc5890efc77b9fd0175559 -F configure 4705718305e176b707e65047b69dca834fe7bc5475584e30fe1f63c8e33751b8 x -F configure.ac 798a24cee2879325ca5b688a618199eb32cc77ed8136edbaa43d9137b470d54e -F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad -F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd -F doc/begin_concurrent.md e694a2a1c623833e7de8b688e81ec30fd4439a78d6b74be61bce0b1e8f590470 -F doc/lemon.html 857495c0ce060a4e2f2ad7111135ad7e28041a32c10612279ab398eddf678f58 -F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 -F doc/trusted-schema.md 33625008620e879c7bcfbbfa079587612c434fa094d338b08242288d358c3e8a -F doc/vfs-shm.txt e101f27ea02a8387ce46a05be2b1a902a021d37a -F ext/README.md fd5f78013b0a2bc6f0067afb19e6ad040e89a10179b4f6f03eee58fac5f169bd -F ext/async/README.txt e12275968f6fde133a80e04387d0e839b0c51f91 -F ext/async/sqlite3async.c 0f3070cc3f5ede78f2b9361fb3b629ce200d7d74 -F ext/async/sqlite3async.h f489b080af7e72aec0e1ee6f1d98ab6cf2e4dcef -F ext/expert/README.md b321c2762bb93c18ea102d5a5f7753a4b8bac646cb392b3b437f633caf2020c3 -F ext/expert/expert.c d548d603a4cc9e61f446cc179c120c6713511c413f82a4a32b1e1e69d3f086a4 -F ext/expert/expert1.test 2e10ff875c31c9e6fc5e324767624181273859771fe34c5daeeadf3f2974a4f7 -F ext/expert/sqlite3expert.c ac008c72c00e6ded0f5116914d22ebd57f415fc0a7ea04738f4e9766dbdd3117 -F ext/expert/sqlite3expert.h ca81efc2679a92373a13a3e76a6138d0310e32be53d6c3bfaedabd158ea8969b -F ext/expert/test_expert.c d56c194b769bdc90cf829a14c9ecbc1edca9c850b837a4d0b13be14095c32a72 -F ext/fts1/README.txt 20ac73b006a70bcfd80069bdaf59214b6cf1db5e -F ext/fts1/ft_hash.c 3927bd880e65329bdc6f506555b228b28924921b -F ext/fts1/ft_hash.h 06df7bba40dadd19597aa400a875dbc2fed705ea -F ext/fts1/fts1.c a39f7d21c2994d27c959ef9c3505c81542c81432 -F ext/fts1/fts1.h 6060b8f62c1d925ea8356cb1a6598073eb9159a6 -F ext/fts1/fts1_hash.c 3196cee866edbebb1c0521e21672e6d599965114 -F ext/fts1/fts1_hash.h e7f0d761353996a8175eda351104acfde23afcb0 -F ext/fts1/fts1_porter.c b1c7304b8988ba3f764a147cdd32043b4913ea7b -F ext/fts1/fts1_tokenizer.h fdea722c38a9f82ed921642981234f666e47919c -F ext/fts1/fts1_tokenizer1.c fd00d1fe4dc30dfc5c64cba695ce34f4af20d2fa -F ext/fts1/fulltext.c 37698e1909584f6d8ea67d1485e3ad39dbf42d19 -F ext/fts1/fulltext.h 08525a47852d1d62a0be81d3fc3fe2d23b094efd -F ext/fts1/simple_tokenizer.c bbfa4e3b2a26ef17d4edc6d98cd4a3f5396d998a -F ext/fts1/tokenizer.h 0c53421b832366d20d720d21ea3e1f6e66a36ef9 -F ext/fts2/README.tokenizers 21e3684ea5a095b55d70f6878b4ce6af5932dfb7 -F ext/fts2/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts2/fts2.c 72c816a9ae448049fbbe8f18a85698765fc7956c -F ext/fts2/fts2.h da5f76c65163301d1068a971fd32f4119e3c95fa -F ext/fts2/fts2_hash.c 011a1d32de45bb1b519a1fd0048e857d6a843558 -F ext/fts2/fts2_hash.h 1824b99dfd8d0225facbdb26a2c87289b2e7dcf8 -F ext/fts2/fts2_icu.c 51c5cd3c04954badd329fa738c95fcdb717b5188 -F ext/fts2/fts2_porter.c 2cd4a507bf3c3085fe66f59b0f2a325f65aaacf5 -F ext/fts2/fts2_tokenizer.c b529493d55e55497213c37e1f31680a77746be26 -F ext/fts2/fts2_tokenizer.h 27a1a99ca2d615cf7e142839b8d79e8751b4529e -F ext/fts2/fts2_tokenizer1.c 07e223eecb483d448313b5f1553a4f299a7fb7a1 -F ext/fts2/mkfts2amal.tcl 974d5d438cb3f7c4a652639262f82418c1e4cff0 -F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 -F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a -F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d -F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 45f5774987a68d36355799503b6d02dbff5286ffb42bec14d928b295d2b93c1b -F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h 2c59cc46aefde134c1782e89a6a5384710ddcd4e783071337aa5d43d07269be3 -F ext/fts3/fts3_aux.c 96708c8b3a7d9b8ca1b68ea2b7e503e283f20e95f145becadedfad096dbd0f34 -F ext/fts3/fts3_expr.c f081e38da641724cd72c20e23b71db2bf4d0c9517c14637442f6910259f11a34 -F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6bdb48b7 -F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf -F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 -F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 -F ext/fts3/fts3_snippet.c 86e7e947a176f0f005720b3ca17631aca2fd2f9daa6729d4adbf2d16ab1b9613 -F ext/fts3/fts3_term.c f45a1e7c6ef464abb1231245d123dae12266b69e05cc56e14045b76591ae92d1 -F ext/fts3/fts3_test.c 73b16e229e517c1b1f0fb8e1046182a4e5dbc8dbe6eea8a5d4353fcce7dbbf39 -F ext/fts3/fts3_tokenize_vtab.c cb792f59212f7799bf2891c7d4579bbf568f124ce8fbb0a9902aa5bd577e8b75 -F ext/fts3/fts3_tokenizer.c 6d8fc150c48238955d5182bf661498db0dd473c8a2a80e00c16994a646fa96e7 -F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 -F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 -F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d -F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c ed869b24d074f2498bdbef915d6db1f88c604ca5811502112061932a0bed5133 -F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 -F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 -F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 -F ext/fts3/tool/fts3view.c 202801a2056995b763864d60c2dee744d46f1677 -F ext/fts3/unicode/CaseFolding.txt 8c678ca52ecc95e16bc7afc2dbf6fc9ffa05db8c -F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7 -F ext/fts3/unicode/mkunicode.tcl bf7fcaa6d68e6d38223467983785d054f1cff4d9e3905dd51f6ed8801bb590d5 -F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb -F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 -F ext/fts5/fts5.h c132a9323f22a972c4c93a8d5a3d901113a6e612faf30ca8e695788438c5ca2a -F ext/fts5/fts5Int.h d7cbc214ee167496f70905667e18f73ea0402f7ef09236ce305e117e0efc866a -F ext/fts5/fts5_aux.c dcc627d8b6e3fc773db528ff67b39955dab7b51628f9dba8e15849e5bedfd7fa -F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6dc8aaca70 -F ext/fts5/fts5_config.c b447948f35ad3354e8fe5e242e0a7e7b5b941555400b9404259944e3aa570037 -F ext/fts5/fts5_expr.c 2be456484786333d559dc2987a00f2750981fab91d52db8452a8046278c5f22e -F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 -F ext/fts5/fts5_index.c f25bec3c00bf050fa2d702d97b773d0706692661172026ddac8df1f164b8b198 -F ext/fts5/fts5_main.c e881a2ea0bf01b3a3ff0bc1b31373c58fd54b6c9f3c43ea3d431bea4e5d4025e -F ext/fts5/fts5_storage.c 3ecda8edadc1f62a355d6789776be0da609f8658c50d72e422674093ab7e1528 -F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 -F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee -F ext/fts5/fts5_test_tok.c f96c6e193c466711d6d7828d5f190407fe7ab897062d371426dd3036f01258e7 -F ext/fts5/fts5_tokenize.c 2e508c6a3bd8ee56c48e98a38052e1a650e49b32a484cce9b189984114bc3b88 -F ext/fts5/fts5_unicode2.c 8bd0cd07396b74c1a05590e4070d635bccfc849812c305619f109e6c0485e250 -F ext/fts5/fts5_varint.c e64d2113f6e1bfee0032972cffc1207b77af63319746951bf1d09885d1dadf80 -F ext/fts5/fts5_vocab.c 7a071833064dc8bca236c3c323e56aac36f583aa2c46ce916d52e31ce87462c9 -F ext/fts5/fts5parse.y eb526940f892ade5693f22ffd6c4f2702543a9059942772526eac1fde256bb05 -F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba -F ext/fts5/test/fts5_common.tcl b01c584144b5064f30e6c648145a2dd6bc440841 -F ext/fts5/test/fts5aa.test 5bd43427b7d08ce2e19c488a26534be450538b9232d4d5305049e8de236e9aa9 -F ext/fts5/test/fts5ab.test 9205c839332c908aaad2b01ab8670ece8b161e8f2ec8a9fabf18ca9385880bb7 -F ext/fts5/test/fts5ac.test a7aa7e1fefc6e1918aa4d3111d5c44a09177168e962c5fd2cca9620de8a7ed6d -F ext/fts5/test/fts5ad.test e8cf959dfcd57c8e46d6f5f25665686f3b6627130a9a981371dafdf6482790de -F ext/fts5/test/fts5ae.test 1142d16d9cc193894dc13cc8f9c7a8a21411ac61b5567a878514df6f9f0d7bb7 -F ext/fts5/test/fts5af.test 724247405b13f8f06cc6ce464dc4f152dc5dd4e86b12c2099685d8f19747bf7b -F ext/fts5/test/fts5ag.test 7816f25a0707578f08145ab539fc0ca025f8951e788b28a6a18a06b2099469dd -F ext/fts5/test/fts5ah.test 27b5a33bfd0363ca8a4dc659e6e2a5df3dea1c3c5b04bc51ca6aeb1277bd9b21 -F ext/fts5/test/fts5ai.test bc97e4758cc93e06bf851d61c98fdf4e8b8f8315ee28a84fb15f916360856414 -F ext/fts5/test/fts5aj.test 745020852d85f5dd49d11cb7ad11d3cc6dafc4fe6d6d24bc0875ac8f43ee4149 -F ext/fts5/test/fts5ak.test fc3595f8e6873bb86d70c9bd4b67d0413ce577bd4793c39a2b60a7b8825b60a6 -F ext/fts5/test/fts5al.test 00c4c1c6a1366b73aa48ce2068c634520867c3cf7f5d1676ebbb775ee1f35734 -F ext/fts5/test/fts5alter.test 5565f7e4605512b69171ac18ca84398603f9f6456dbe377beeca97e83cc242cd -F ext/fts5/test/fts5auto.test 78989e6527ce69c9eddbef7392fea5c10b0010cd2b2ae68eec7bc869c471e691 -F ext/fts5/test/fts5aux.test ebf6f2ff7cb556e83f66991b7f12bff016d3c83d4eab36704b649dd6b1437318 -F ext/fts5/test/fts5auxdata.test eacc97ff04892f1a5f3d4df5a73f8bcbc3955ea1d12c9f24137eb1fc079e7611 -F ext/fts5/test/fts5bigpl.test 6466c89b38439f0aba26ac09e232a6b963f29b1cbe1304f6a664fe1e7a8f5fd3 -F ext/fts5/test/fts5bigtok.test 541119e616c637caea925a8c028c37c2c29e94383e00aa2f9198d530724b6e36 -F ext/fts5/test/fts5cat.test daba0b80659460b0cb60bd1f40b402478a761fe7ea414c3c94c2be25568cc33a -F ext/fts5/test/fts5circref.test f880dfd0d99f6fb73b88ccacb0927d18e833672fd906cc47d6b4e529419eaa62 -F ext/fts5/test/fts5colset.test a30473451321bbf0b6218af62e96b4ae5fa99931cfdb210b5ecc804623b30f75 -F ext/fts5/test/fts5columnsize.test 45459ce4dd9fd853b6044cdc9674921bff89e3d840f348ca8c1630f9edbf5482 -F ext/fts5/test/fts5config.test 60094712debc59286c59aef0e6cf511c37d866802776a825ce437d26afe0817f -F ext/fts5/test/fts5conflict.test 655925678e630d3cdf145d18725a558971806416f453ac8410ca8c04d934238d -F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c073e19b3ae9126b2f4 -F ext/fts5/test/fts5content.test 213506436fb2c87567b8e31f6d43ab30aab99354cec74ed679f22aad0cdbf283 -F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe -F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test fab4ea761b2df254fb3909423989320772a3a757de4d151ddcfa2a40a3b93328 -F ext/fts5/test/fts5corrupt4.test ea805c4d7c68b5f185b9db5d2060a7ae5875339738dd48203c92162f41e7ca91 -F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 -F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e -F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 -F ext/fts5/test/fts5dlidx.test b90852c55881b29dbac6380b274de27beae623ac4b6d567c6c8fb9cdc315a86e -F ext/fts5/test/fts5doclist.test e39a6001495f1dc68e20323586ac965787986c2bf6f515b9b0285627b089d9e6 -F ext/fts5/test/fts5ea.test b01e3a18cdfabbff8104a96a5242a06a68a998a0 -F ext/fts5/test/fts5eb.test 239bb2f02571f8cccfc7018d08f502df1cd8cc6a69b65ed1dde5f6a070e3f669 -F ext/fts5/test/fts5fault1.test d28a65caee75db6897c3cf1358c5230d3bb2a3bf7fb31062c19c7e5382b3d2bd -F ext/fts5/test/fts5fault2.test 69c8fdbef830cd0d450908d4504d5bb86609e255af99c421c20a0756251fe344 -F ext/fts5/test/fts5fault3.test da2f9e3e56ff5740d68ebdd6877c97089e7ed28ddff28a0da87a6afea27e5522 -F ext/fts5/test/fts5fault4.test 1c1db5fcfe59401e7833146100f1d8de284a0a686fac31ddac9fb56c459f725b -F ext/fts5/test/fts5fault5.test a336e4e11847de24c9497f80cce18e00bb3fab7fb11f97d04eb9af898900a762 -F ext/fts5/test/fts5fault6.test a0fc0a8f99e4b16500c31dfc7e38e1defe0f1693ac47650517ac7b723b1956f8 -F ext/fts5/test/fts5fault7.test 0acbec416edb24b8881f154e99c31e9ccf73f539cfcd164090be139e9e97ed4c -F ext/fts5/test/fts5fault8.test 318238659d35f82ad215ecb57ca4c87486ea85d45dbeedaee42f148ff5105ee2 -F ext/fts5/test/fts5fault9.test 098e6b894bbdf9b2192f994a30f4043673fb3f338b6b8ab1624c704422f39119 -F ext/fts5/test/fts5faultA.test be4487576bff8c22cee6597d1893b312f306504a8c6ccd3c53ca85af12290c8c -F ext/fts5/test/fts5faultB.test d606bdb8e81aaeb6f41de3fc9fc7ae315733f0903fbff05cf54f5b045b729ab5 -F ext/fts5/test/fts5faultD.test cc5d1225556e356615e719c612e845d41bff7d5a -F ext/fts5/test/fts5first.test 3fcf2365c00a15fc9704233674789a3b95131d12de18a9b996159f6909dc8079 -F ext/fts5/test/fts5full.test e1701a112354e0ff9a1fdffb0c940c576530c33732ee20ac5e8361777070d717 -F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e -F ext/fts5/test/fts5hash.test a4cf51acad99bfc43c16fb74f9d22495dc221ae0701fc5e908ca963a9b26a02b -F ext/fts5/test/fts5integrity.test 8ffabcd91b058d812aba3e3e0a06f76ce165ba402a18cca20e34204a7feec92e -F ext/fts5/test/fts5interrupt.test 09613247b273a99889808ef852898177e671406fe71fdde7ea00e78ea283d227 -F ext/fts5/test/fts5lastrowid.test be98fe3e03235296585b72daad7aed5717ba0062bae5e5c18dd6e04e194c6b28 -F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc2782680740513c4d1fc114b43d4ad -F ext/fts5/test/fts5matchinfo.test 10c9a6f7fe61fb132299c4183c012770b10c4d5c2f2edb6df0b6607f683d737a -F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6 -F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 -F ext/fts5/test/fts5misc.test 088ac5f0f5de1ad45b0f83197ab5263bcae8130156cdc901bff2375ff2b8af86 -F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581 -F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 -F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd -F ext/fts5/test/fts5onepass.test f9b7d9b2c334900c6542a869760290e2ab5382af8fbd618834bf1fcc3e7b84da -F ext/fts5/test/fts5optimize.test 36a752d24c818792032e4ff502936fc9cc5ef938721696396fdc79214b2717f1 -F ext/fts5/test/fts5phrase.test 13e5d8e9083077b3d9c74315b3c92ec723cc6eb37c8155e0bfe1bba00559f07b -F ext/fts5/test/fts5plan.test 771b999d161e24fd803ce0290adb7c6e7c9b9cc2c6a0adb344813fb89473aa32 -F ext/fts5/test/fts5porter.test 8d08010c28527db66bc3feebd2b8767504aaeb9b101a986342fa7833d49d0d15 -F ext/fts5/test/fts5porter2.test 0d251a673f02fa13ca7f011654873b3add20745f7402f108600a23e52d8c7457 -F ext/fts5/test/fts5prefix.test a0fa67b06650f2deaa7bf27745899d94e0fb547ad9ecbd08bfad98c04912c056 -F ext/fts5/test/fts5query.test ac363b17a442620bb0780e93c24f16a5f963dfe2f23dc85647b869efcfada728 -F ext/fts5/test/fts5rank.test c9fd4a1e36b4fa92d572ec13d846469b97da249d1c2f7fd3ee7e017ce46f2416 -F ext/fts5/test/fts5rebuild.test 55d6f17715cddbf825680dd6551efbc72ed916d8cf1cde40a46fc5d785b451e7 -F ext/fts5/test/fts5restart.test 835ecc8f449e3919f72509ab58056d0cedca40d1fe04108ccf8ac4c2ba41f415 -F ext/fts5/test/fts5rowid.test b8790ec170a8dc1942a15aef3db926a5f3061b1ff171013003d8297203a20ad6 -F ext/fts5/test/fts5savepoint.test fc02929f238d02a22df4172625704e029f7c1e0e92e332d654375690f8e6e43f -F ext/fts5/test/fts5simple.test a298670508c1458b88ce6030440f26a30673931884eb5f4094ac1773b3ba217b -F ext/fts5/test/fts5simple2.test 258a1b0c590409bfa5271e872c79572b319d2a56554d0585f68f146a0da603f0 -F ext/fts5/test/fts5simple3.test d5c74a9d3ca71bd5dd5cacb7c55b86ea12cdddfc8b1910e3de2995206898380f -F ext/fts5/test/fts5synonym.test 1651815b8008de170e8e600dcacc17521d765482ea8f074ae82cfa870d8bb7fb -F ext/fts5/test/fts5synonym2.test b54cce5c34ec08ed616f646635538ae82e34a0e28f947ec60b6fadbc4b3fb17a -F ext/fts5/test/fts5tok1.test ce6551e41ff56f30b69963577324624733bed0d1753589f06120d664d9cd45c9 -F ext/fts5/test/fts5tok2.test dcacb32d4a2a3f0dd3215d4a3987f78ae4be21a2 -F ext/fts5/test/fts5tokenizer.test ac3c9112b263a639fb0508ae73a3ee886bf4866d2153771a8e8a20c721305a43 -F ext/fts5/test/fts5umlaut.test a42fe2fe6387c40c49ab27ccbd070e1ae38e07f38d05926482cc0bccac9ad602 -F ext/fts5/test/fts5unicode.test 17056f4efe6b0a5d4f41fdf7a7dc9af2873004562eaa899d40633b93dc95f5a9 -F ext/fts5/test/fts5unicode2.test 9b3df486de05fb4bde4aa7ee8de2e6dae1df6eb90e3f2e242c9383b95d314e3e -F ext/fts5/test/fts5unicode3.test 590c72e18195bda2446133f9d82d04a4e89d094bba58c75ae10f4afc6faa0744 -F ext/fts5/test/fts5unicode4.test 6463301d669f963c83988017aa354108be0b947d325aef58d3abddf27147b687 -F ext/fts5/test/fts5unindexed.test 9021af86a0fb9fc616f7a69a996db0116e7936d0db63892db6bafabbec21af4d -F ext/fts5/test/fts5update.test b8affd796e45c94a4d19ad5c26606ea06065a0f162a9562d9f005b5a80ccf0bc -F ext/fts5/test/fts5version.test c8f2cc105f0abf0224965f93e584633dee3e06c91478bc67e468f7cfdf97fd6a -F ext/fts5/test/fts5vocab.test 7ed80d9af1ddaaa1637da05e406327b5aac250848bc604c1c1cc667908b87760 -F ext/fts5/test/fts5vocab2.test e0fdc3a3095f6eda68ac9bf9a443ff929a124d46f00af19933604085712e9d47 -F ext/fts5/tool/fts5speed.tcl b0056f91a55b2d1a3684ec05729de92b042e2f85 -F ext/fts5/tool/fts5txt2db.tcl 526a9979c963f1c54fd50976a05a502e533a4c59 -F ext/fts5/tool/loadfts5.tcl 95b03429ee6b138645703c6ca192c3ac96eaf093 -F ext/fts5/tool/mkfts5c.tcl d1c2a9ab8e0ec690a52316f33dd9b1d379942f45 -F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c -F ext/icu/README.txt 1c48ffaf7f255bd73d00a35f68f6de357c2a6594f16cb00506a151be23694706 -F ext/icu/icu.c 91c021c7e3e8bbba286960810fa303295c622e323567b2e6def4ce58e4466e60 -F ext/icu/sqliteicu.h 728867a802baa5a96de7495e9689a8e01715ef37 -F ext/lsm1/Makefile a553b728bba6c11201b795188c5708915cc4290f02b7df6ba7e8c4c943fd5cd9 -F ext/lsm1/Makefile.msc f8c878b467232226de288da320e1ac71c131f5ec91e08b21f502303347260013 -F ext/lsm1/lsm-test/README 87ea529d2abe615e856d4714bfe8bb185e6c2771b8612aa6298588b7b43e6f86 -F ext/lsm1/lsm-test/lsmtest.h cf58528ffe0cfe535e91b44584e2ec5fb1caacdabecef0d8dcf83bf83168bf28 -F ext/lsm1/lsm-test/lsmtest1.c ae6ba48a0851b39be69a7d0eb220bfb9521a526e926223d5014bd385df10abb3 -F ext/lsm1/lsm-test/lsmtest2.c 188b09aec776516aeedcfd13b9c6faf85ba16b3671a0897a2c740ee00a5dc4f8 -F ext/lsm1/lsm-test/lsmtest3.c 9ab87528a36dbf4a61d7c8ad954f5ee368c0878c127b84b942b2e2abe522de26 -F ext/lsm1/lsm-test/lsmtest4.c d258d6a245db5d8eaede096e2368d23f859c5e92c80ab9122463f708514fe10c -F ext/lsm1/lsm-test/lsmtest5.c 8d5242a0f870d65eeada191c8945781fed9cb8ece3886573790ebd373b62dac5 -F ext/lsm1/lsm-test/lsmtest6.c 869cb4a172cd07d1a75b3aeaecd61d0a477787b3b8668bad0d3ff0f43b642b7c -F ext/lsm1/lsm-test/lsmtest7.c 7a917455a0f956a8ed3f44f5c9387ec0ea6627714874464cc3fa5c5a9cabb2f2 -F ext/lsm1/lsm-test/lsmtest8.c 589b68c44531a0f04d5e879bb1e211be5f7100f48eed7e8631e07ed5cbd68f94 -F ext/lsm1/lsm-test/lsmtest9.c dd1a0ebf41134933a744d1e00e60429a2a21fc50d587ae7dd6bdb6e96d805bdc -F ext/lsm1/lsm-test/lsmtest_bt.c d70d9a9be5eef9360af1251dd083948d74fd30137a08f61bef995f7ac04e037f -F ext/lsm1/lsm-test/lsmtest_datasource.c 5d770be191d0ca51315926723009b2c25c0b4b8136840494ef710ac324aa916c -F ext/lsm1/lsm-test/lsmtest_func.c 159aa401bc8032bfa3d8cf2977bd687abebab880255895a5eb45770d626fa38d -F ext/lsm1/lsm-test/lsmtest_io.c cf11b27b129c6bd5818fa1d440176502dc27229f0db892b4479118d61993ea20 -F ext/lsm1/lsm-test/lsmtest_main.c a9bc647738c0dcaebf205d6d194b3ce4a6ef3925801cd2d919f0a4ea33a15aeb -F ext/lsm1/lsm-test/lsmtest_mem.c 4e63c764345ab1df59d4f13a77980c6f3643798210b10d6cdbd785b4b888fda5 -F ext/lsm1/lsm-test/lsmtest_tdb.c 618a8619183fda4f5540fcde15f9068293c5e3180e1a246e34409b0c148758b3 -F ext/lsm1/lsm-test/lsmtest_tdb.h 8733eee249b12956a9df8322994b43d19bd8c02ad2e8b0bb5164db4d6ccc1735 -F ext/lsm1/lsm-test/lsmtest_tdb2.cc 99ea7f2dd9c7536c8fb9bdd329e4cfeb76899f3ddf6f48bdd3926e016922b715 -F ext/lsm1/lsm-test/lsmtest_tdb3.c 7a7ccae189f5bb25bcd1ec3bbd740529706eded7f6729a5a0a9eeaeb57785320 -F ext/lsm1/lsm-test/lsmtest_tdb4.c 47e8bb5eba266472d690fb8264f1855ebdba0ae5a0e541e35fcda61ebf1d277f -F ext/lsm1/lsm-test/lsmtest_util.c 241622db5a332a09c8e6e7606b617d288a37b557f7d3bce0bb97809f67cc2806 -F ext/lsm1/lsm-test/lsmtest_win32.c 0e0a224674c4d3170631c41b026b56c7e1672b151f5261e1b4cc19068641da2d -F ext/lsm1/lsm.h 0f6f64ff071471cb87bf98beb8386566f30ea001 -F ext/lsm1/lsmInt.h 5983690e05e83653cc01ba9d8fbf8455e534ddf8349ed9adedbf46a7549760b0 -F ext/lsm1/lsm_ckpt.c 0eabfaf812ddb4ea43add38f05e430694cd054eb622c3e35af4c43118a2d5321 -F ext/lsm1/lsm_file.c 3c51841d5b3e7da162693cbac9a9f47eeedf6bcbbe2969a4d25e30c428c9fe36 -F ext/lsm1/lsm_log.c a8bf334532109bba05b09a504ee45fc393828b0d034ca61ab45e3940709d9a7c -F ext/lsm1/lsm_main.c b5703f8042e71d3a2d65e671f6832e077e79e89e9975818f67f969922618db63 -F ext/lsm1/lsm_mem.c 4c51ea9fa285ee6e35301b33491642d071740a0a -F ext/lsm1/lsm_mutex.c 378edf0a2b142b4f7640ee982df06d50b98788ea -F ext/lsm1/lsm_shared.c 76adfc1ed9ffebaf92746dde4b370ccc48143ca8b05b563816eadd2aadf1c525 -F ext/lsm1/lsm_sorted.c 6f7d8cf7a7d3d3f1ab5d9ba6347e8f39f3d73c00ec48afcd0c4bcbefd806f9b8 -F ext/lsm1/lsm_str.c 65e361b488c87b10bf3e5c0070b14ffc602cf84f094880bece77bbf6678bca82 -F ext/lsm1/lsm_tree.c 682679d7ef2b8b6f2fe77aeb532c8d29695bca671c220b0abac77069de5fb9fb -F ext/lsm1/lsm_unix.c 57361bcf5b1a1a028f5d66571ee490e9064d2cfb145a2cc9e5ddade467bb551b -F ext/lsm1/lsm_varint.c 43f954af668a66c7928b81597c14d6ad4be9fedbc276bbd80f52fa28a02fdb62 -F ext/lsm1/lsm_vtab.c 169bfe7ef8e6c9de9c77e17c4c50c9ae55fb0167d80be3d1be82c991184b6f35 -F ext/lsm1/lsm_win32.c 0a4acbd7e8d136dd3a5753f0a9e7a9802263a9d96cef3278cf120bcaa724db7c -F ext/lsm1/test/lsm1_common.tcl 5ed4bab07c93be2e4f300ebe46007ecf4b3e20bc5fbe1dedaf04a8774a6d8d82 -F ext/lsm1/test/lsm1_simple.test a04d08e8661ae6fc53786c67f0bd102c6692f003e859dde03ed9ac3f12e066e5 -F ext/lsm1/tool/mklsm1c.tcl f31561bbee5349f0a554d1ad7236ac1991fc09176626f529f6078e07335398b0 -F ext/misc/README.md d6dd0fe1d8af77040216798a6a2b0c46c73054d2f0ea544fbbcdccf6f238c240 -F ext/misc/amatch.c e3ad5532799cee9a97647f483f67f43b38796b84b5a8c60594fe782a4338f358 -F ext/misc/anycollseq.c 5ffdfde9829eeac52219136ad6aa7cd9a4edb3b15f4f2532de52f4a22525eddb -F ext/misc/appendvfs.c 3777f22ec1057dc4e5fd89f2fbddcc7a29fbeef1ad038c736c54411bb1967af7 -F ext/misc/blobio.c a867c4c4617f6ec223a307ebfe0eabb45e0992f74dd47722b96f3e631c0edb2a -F ext/misc/btreeinfo.c 26004b7a6be320ec08fc20ca8d0f01fccb00a98cbe0f3197446794ff2a506aa3 -F ext/misc/carray.c 91e9a7f512fda934894bed30464552fffa7d3073b5be04189ae0bd0c59f26bfd -F ext/misc/cksumvfs.c b0d07f2e1bb08f8b6f311f4e454360b6a7f0021912c326428d74900020f29c31 -F ext/misc/closure.c dbfd8543b2a017ae6b1a5843986b22ddf99ff126ec9634a2f4047cd14c85c243 -F ext/misc/completion.c a0efe03edfdc4f717c61e6c9b0bfe2708ff7878010dae3174980a68fdf76aabc -F ext/misc/compress.c 3354c77a7c8e86e07d849916000cdac451ed96500bfb5bd83b20eb61eee012c9 -F ext/misc/csv.c 3ed979c1eb35e35a98b30ef545a2facf62994594217681d9138b4b75faf6b0d7 -F ext/misc/dbdata.c e316fba936571584e55abd5b974a32a191727a6b746053a0c9d439bd2cf93940 -F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287c336 -F ext/misc/eval.c 04bc9aada78c888394204b4ed996ab834b99726fb59603b0ee3ed6e049755dc1 -F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f -F ext/misc/fileio.c 9b69e25da3b51d4a1d905a464ccb96709792ad627a742ba09215bc0d1447e7bd -F ext/misc/fossildelta.c 1240b2d3e52eab1d50c160c7fe1902a9bd210e052dc209200a750bbf885402d5 -F ext/misc/fuzzer.c eae560134f66333e9e1ca4c8ffea75df42056e2ce8456734565dbe1c2a92bf3d -F ext/misc/ieee754.c eaffd9b364d7c8371727e9c43fc8bec38cdacc4d11fc26beffaa3ca05a0ea9d6 -F ext/misc/json1.c 3a42e3231d716516a8ae33b0a052d3ed5f52943e3d627b68744a427a6e552ae3 -F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d -F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b -F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567 -F ext/misc/mmapwarm.c 8c5fe90d807a23e44a8b93e96e8b812b19b300d5fd8c1d40a4fd1d8224e33f46 -F ext/misc/nextchar.c 7877914c2a80c2f181dd04c3dbef550dfb54c93495dc03da2403b5dd58f34edd -F ext/misc/noop.c 81efe4cad9ec740e64388b14281cb983e6e2c223fed43eb77ab3e34946e0c1ab -F ext/misc/normalize.c b4290464f542bae7a97b43f15bd197949b833ffd668b7c313631bd5d4610212c -F ext/misc/percentile.c b9086e223d583bdaf8cb73c98a6539d501a2fc4282654adbfea576453d82e691 -F ext/misc/prefixes.c 0f4f8cff5aebc00a7e3ac4021fd59cfe1a8e17c800ceaf592859ecb9cbc38196 -F ext/misc/regexp.c 246244c714267f303df76acf73dcf110cf2eaf076896aaaba8db6d6d21a129db -F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c -F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c -F ext/misc/scrub.c db9fff56fed322ca587d73727c6021b11ae79ce3f31b389e1d82891d144f22ad -F ext/misc/series.c 4057dda3579b38ff88b2d3b13b4dd92dbd9d6f90dac2b55c19b0a8ed87ee4959 -F ext/misc/sha1.c c8f2253c8792ffab9517695ea7d88c079f0395a5505eefef5c8198fe184ed5ac -F ext/misc/shathree.c 135b7c145db4a09b1650c3e7aff9cb538763a9a361e834c015dd1aaf8d5c9a00 -F ext/misc/showauth.c 732578f0fe4ce42d577e1c86dc89dd14a006ab52 -F ext/misc/spellfix.c 94df9bbfa514a563c1484f684a2df3d128a2f7209a84ca3ca100c68a0163e29f -F ext/misc/sqlar.c 0ace5d3c10fe736dc584bf1159a36b8e2e60fab309d310cd8a0eecd9036621b6 -F ext/misc/stmt.c 35063044a388ead95557e4b84b89c1b93accc2f1c6ddea3f9710e8486a7af94a -F ext/misc/templatevtab.c 8a16a91a5ceaccfcbd6aaaa56d46828806e460dd194965b3f77bf38f14b942c4 -F ext/misc/totype.c fa4aedeb07f66169005dffa8de3b0a2b621779fd44f85c103228a42afa71853b -F ext/misc/uint.c 053fed3bce2e89583afcd4bf804d75d659879bbcedac74d0fa9ed548839a030b -F ext/misc/unionvtab.c 36237f0607ca954ac13a4a0e2d2ac40c33bc6e032a5f55f431713061ef1625f9 -F ext/misc/urifuncs.c f71360d14fa9e7626b563f1f781c6148109462741c5235ac63ae0f8917b9c751 -F ext/misc/uuid.c 5bb2264c1b64d163efa46509544fd7500cb8769cb7c16dd52052da8d961505cf -F ext/misc/vfslog.c 3b25c2f56ba60788db247287be6ab024b53c4afffd412b4876db563389be0d35 -F ext/misc/vfsstat.c 389ea13983d3af926504c314f06a83cc858d5adc24b40af74aaed1fece00c118 -F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae -F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd -F ext/misc/wholenumber.c 520f34c3099e5b7d546f13708607dc2fa173c46b68952eecf0d19cd675fec85e -F ext/misc/zipfile.c d1be54ea83ac9ad71b8b6ffc4b60db8946ce2ceacdf6bff063fcd9489f41bb49 -F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64 -F ext/rbu/rbu.c 8681f6157db6adc82c34af24b14ea8a3be0146ad2a3b6c1d5da6cb8a5796c8ce -F ext/rbu/rbu1.test 221d9c18a5e600ac9ac6b1810d99d9f99163a7909ba61597876ab6e4d4beb3d6 -F ext/rbu/rbu10.test 0a201c32202143f23c81c0144503da339786fc20acb7a2fda11601b65659f314 -F ext/rbu/rbu11.test 5c834cf491086b45e071eabf71f708febc143e86a384a92de69e0b1a4cace144 -F ext/rbu/rbu12.test 29f8b2118f6c96fac3755bd6d2b55c2db24f878b1f11fbfbe294f3a230a3dcdc -F ext/rbu/rbu13.test 1285298e3360ec74511764841b3c174dcfe21da2f618c22febf1a20abd0365c2 -F ext/rbu/rbu14.test 4a7bf0b3a4516d3ab0bc0ba4ceb53eb7e3324147ccda152e561060f659dbba31 -F ext/rbu/rbu3.test d6c6cc7a1326e8e23b9820f30bd3054f22092e503fadfd2a660ae006653f6d80 -F ext/rbu/rbu5.test 724b38ea5f722e3d22dc76343860bd998bb676c3f78c4bc8175df5c5d7720e23 -F ext/rbu/rbu6.test 401064236d3cf86b7edc01c586d7c5554f48553946fbfa1a3af35d7e47dce9e3 -F ext/rbu/rbu7.test ae25f47b56f178197fc1098537a35a39176cc73d1629b03dc9d795929fc36ec2 -F ext/rbu/rbu8.test b98a6fc58ead84a0e6ddee775b9702cd981f318d5d4fd1d4df0fa0c40db7251b -F ext/rbu/rbu9.test 0e4d985e25620d61920597e8ea69c871c9e8c1f5a0be2ae9fa70bb641d74378c -F ext/rbu/rbuA.test b34a90cb495682c25b5fc03a9d5e7a4fc99541c29256f25e2e2a4f6542b4f5b3 -F ext/rbu/rbuB.test 52b07158824c6927b7e25554ace92a695cdebfc296ae3d308ac386984aded9bc -F ext/rbu/rbuC.test 80f1cc2fb74f44b1128fd0ed8eedab3a76fefeb72a947860e2869ef76fc8dc6b -F ext/rbu/rbu_common.tcl 60d904133ff843fe72cc0514e9dd2486707181e6e0fbab20979da28c48d21de9 -F ext/rbu/rbucollate.test cac528a9a46318cba42e61258bb42660bbbf4fdb9a8c863de5a54ad0c658d197 -F ext/rbu/rbucrash.test 000981a1fe8a6e4d9a684232f6a129e66a3ef595f5ed74655e2f9c68ffa613b4 -F ext/rbu/rbucrash2.test efa143cc94228eb0266d3f1abfbee60a5838a84cef7cc3fcb8c145b74d96fd41 -F ext/rbu/rbudiff.test 156957851136b63c143478518dc1bda6c832103cdbe8ac1d7cdd47edb3cbe0a3 -F ext/rbu/rbudor.test e3e8623926012f43eebe51fedf06a102df2640750d971596b052495f2536db20 -F ext/rbu/rbuexpr.test 10d0420537c3bc7666e576d72adeffe7e86cfbb00dcc30aa9ce096c042415190 -F ext/rbu/rbufault.test 2d7f567b79d558f6e093c58808cab4354f8a174e3802f69e7790a9689b3c09f8 -F ext/rbu/rbufault2.test c81327a3ac2c385b9b954db3644d4e0df93eeebfc3de9f1f29975a1e73fd3d0c -F ext/rbu/rbufault3.test b2fcc9db5c982b869f67d1d4688d8cb515d5b92f58011fff95665f2e62cec179 -F ext/rbu/rbufault4.test 03d2849c3df7d7bd14a622e789ff049e5080edd34a79cd432e01204db2a5930a -F ext/rbu/rbufts.test 0ae8d1da191c75bd776b86e24456db0fb6e97b7c944259fae5407ea55d23c31d -F ext/rbu/rbumisc.test 329986cf5dd51890c4eb906c2f960ebb773a79a64bed90f506b7c417825b37eb -F ext/rbu/rbumulti.test 5fb139058f37ddc5a113c5b93238de915b769b7792de41b44c983bc7c18cf5b9 -F ext/rbu/rbupartial.test f25df014b8dbe3c5345851fba6e66f79ab237f57dc201b2d5f0dbae658ae5a4c -F ext/rbu/rbuprogress.test 857cf1f8166c83ef977edb9ef4fc42d80f71fbd798652b46ae2f3a7031870f8d -F ext/rbu/rburesume.test dbdc4ca504e9c76375a69e5f0d91205db967dcc509a5166ca80231f8fda49eb1 -F ext/rbu/rbusave.test f4190a1a86fccf84f723af5c93813365ae33feda35845ba107b59683d1cdd926 -F ext/rbu/rbusplit.test b37e7b40b38760881dc9c854bd40b4744c6b6cd74990754eca3bda0f407051e8 -F ext/rbu/rbutemplimit.test 05ceefa90a2e26a99f40dd48282ed63a00df5e59c1f2bfd479c143e201a1b0ba -F ext/rbu/rbuvacuum.test 55e101e90168c2b31df6c9638fe73dc7f7cc666b6142266d1563697d79f73534 -F ext/rbu/rbuvacuum2.test b8e5b51dc8b2c0153373d024c0936be3f66f9234acbd6d0baab0869d56b14e6b -F ext/rbu/rbuvacuum3.test 8addd82e4b83b4c93fa47428eae4fd0dbf410f8512c186f38e348feb49ba03dc -F ext/rbu/rbuvacuum4.test a78898e438a44803eb2bc897ba3323373c9f277418e2d6d76e90f2f1dbccfd10 -F ext/rbu/sqlite3rbu.c 77a47f3231f5f363b2c584dba3e310a7efdaf073ad8c18728ab846b38de2879c -F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812 -F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a -F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15 -F ext/repair/checkfreelist.c 0dbae18c1b552f58d64f8969e4fb1e7f11930c60a8c2a9a8d50b7f15bdfd54bd -F ext/repair/checkindex.c 7d28c01a2e012ac64257d230fc452b2cafb78311a91a343633d01d95220f66f3 -F ext/repair/sqlite3_checker.c.in 4a5a3af3f450fe503e5a2985e98516dc2a6b9ad247449e284c1cf140fc91720f -F ext/repair/sqlite3_checker.tcl a9a2caa9660567257c177a91124d8c0dccdfa341e25c51e6da7f1fd9e601eafa -F ext/repair/test/README.md 34b2f542cf5be7bffe479242b33ee3492cea30711e447cc4a1a86cb5915f419e -F ext/repair/test/checkfreelist01.test 3e8aa6aeb4007680c94a8d07b41c339aa635cc78249442da72ff3f8297398a69 -F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c335096108c12c01bddbadcec -F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c -F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 -F ext/rtree/geopoly.c cac70b5502742bd0ba8877a1329a74e86a379c78567546a2a18cf5f9c3787f73 -F ext/rtree/rtree.c 0ee39cc787b95aa03a012e09e6090b0fa452154fa812af9a379898560fd6c00f -F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 -F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e -F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d -F ext/rtree/rtree3.test 4ee5d7df86040efe3d8d84f141f2962a7745452200a7cba1db06f86d97050499 -F ext/rtree/rtree4.test 304de65d484540111b896827e4261815e5dca4ce28eeecd58be648cd73452c4b -F ext/rtree/rtree5.test 49c9041d713d54560b315c2c7ef7207ee287eba1b20f8266968a06f2e55d3142 -F ext/rtree/rtree6.test 1252a0439da01d2f1f5cbbdeeb80455a2d68b9bae2a9787937b167a5e3957828 -F ext/rtree/rtree7.test c8fb2e555b128dd0f0bdb520c61380014f497f8a23c40f2e820acc9f9e4fdce5 -F ext/rtree/rtree8.test 2d99006a1386663978c9e1df167554671e4f711c419175b39f332719deb1ce0e -F ext/rtree/rtree9.test c646f12c8c1c68ef015c6c043d86a0c42488e2e68ed1bb1b0771a7ca246cbabf -F ext/rtree/rtreeA.test ed2f1be9c06dde0b1ab93a95dd9e87eeaa02db2d30bcb4b9179b69ee3dc3319b -F ext/rtree/rtreeB.test 4cec297f8e5c588654bbf3c6ed0903f10612be8a2878055dd25faf8c71758bc9 -F ext/rtree/rtreeC.test 6aa87eba4d9a3003b941a1ba77db259c5cabc3fd92fc5a6360f5369520eb9a4d -F ext/rtree/rtreeD.test fe46aa7f012e137bd58294409b16c0d43976c3bb92c8f710481e577c4a1100dc -F ext/rtree/rtreeE.test e65d3fc625da1800b412fc8785817327d43ccfec5f5973912d8c9e471928caa9 -F ext/rtree/rtreeF.test 81ffa7ef51c4e4618d497a57328c265bf576990c7070633b623b23cd450ed331 -F ext/rtree/rtreeG.test 1b9ca6e3effb48f4161edaa463ddeaa8fca4b2526d084f9cbf5dbe4e0184939c -F ext/rtree/rtreeH.test 0885151ee8429242625600ae47142cca935332c70a06737f35af53a7bd7aaf90 -F ext/rtree/rtreeI.test 608e77f7fde9be5a12eae316baef640fffaafcfa90a3d67443e78123e19c4ca4 -F ext/rtree/rtree_perf.tcl 6c18c1f23cd48e0f948930c98dfdd37dfccb5195 -F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b587936f5f6bceed -F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 -F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e -F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/rtreefuzz001.test eef1ed593bb15886cd5d5367a2f2492f81e315848896cdf7afb6e21454978827 -F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 -F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de -F ext/rtree/util/randomshape.tcl 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff -F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 -F ext/rtree/visual01.txt e9c2564083bcd30ec51b07f881bffbf0e12b50a3f6fced0c222c5c1d2f94ac66 -F ext/session/changebatch1.test 9ceaa8f7b2a505933e250fbe6cbc550e4ce1e59d -F ext/session/changebatchfault.test be49c793219bf387ad692a60856b921f0854ad6d -F ext/session/changeset.c 7a1e6a14c7e92d36ca177e92e88b5281acd709f3b726298dc34ec0fb58869cb5 -F ext/session/changesetfuzz.c 227076ab0ae4447d742c01ee88a564da6478bbf26b65108bf8fac9cd8b0b24aa -F ext/session/changesetfuzz1.test 2e1b90d888fbf0eea5e1bd2f1e527a48cc85f8e0ff75df1ec4e320b21f580b3a -F ext/session/session1.test 0b2f88995832ea040ae8e83a1ad4afa99c00b85c779d213da73a95ea4113233e -F ext/session/session2.test 284de45abae4cc1082bc52012ee81521d5ac58e0 -F ext/session/session3.test ce9ce3dfa489473987f899e9f6a0f2db9bde3479 -F ext/session/session4.test 6778997065b44d99c51ff9cece047ff9244a32856b328735ae27ddef68979c40 -F ext/session/session5.test 716bc6fafd625ce60dfa62ae128971628c1a1169 -F ext/session/session6.test 443789bc2fca12e4f7075cf692c60b8a2bea1a26 -F ext/session/session8.test 8e194b3f655d861ca36de5d4de53f702751bab3b -F ext/session/session9.test 5409d90d8141881d08285ed1c2c0d8d10fb92069 -F ext/session/sessionA.test 1feeab0b8e03527f08f2f1defb442da25480138f -F ext/session/sessionB.test c4fb7f8a688787111606e123a555f18ee04f65bb9f2a4bb2aa71d55ce4e6d02c -F ext/session/sessionC.test f8a5508bc059ae646e5ec9bdbca66ad24bc92fe99fda5790ac57e1f59fce2fdf -F ext/session/sessionD.test 4f91d0ca8afc4c3969c72c9f0b5ea9527e21de29039937d0d973f821e8470724 -F ext/session/sessionE.test b2010949c9d7415306f64e3c2072ddabc4b8250c98478d3c0c4d064bce83111d -F ext/session/sessionF.test d37ed800881e742c208df443537bf29aa49fd56eac520d0f0c6df3e6320f3401 -F ext/session/sessionG.test 3828b944cd1285f4379340fd36f8b64c464fc84df6ff3ccbc95578fd87140b9c -F ext/session/sessionH.test b17afdbd3b8f17e9bab91e235acf167cf35485db2ab2df0ea8893fbb914741a4 -F ext/session/session_common.tcl 29ec9910aca1e996ca1c8531b8cecabf96eb576aa53de65a8ff03d848b9a2a8b -F ext/session/session_speed_test.c dcf0ef58d76b70c8fbd9eab3be77cf9deb8bc1638fed8be518b62d6cbdef88b3 -F ext/session/sessionat.test efe88965e74ff1bc2af9c310b28358c02d420c1fb2705cc7a28f0c1cc142c3ec -F ext/session/sessiondiff.test ad13dd65664bae26744e1f18eb3cbd5588349b7e9118851d8f9364248d67bcec -F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7 -F ext/session/sessionfault2.test dd593f80b6b4786f7adfe83c5939620bc505559770cc181332da26f29cddd7bb -F ext/session/sessioninvert.test ae1a003a9ab1f8d64227dbb5c3a4c97e65b561b01e7b2953cf48683fb2724169 -F ext/session/sessionrebase.test ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2f05e82363b9142810 -F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5 -F ext/session/sessionwor.test 67b5ab91d4f93ce65ff1f58240ac5ddf73f8670facc1ffa49cef56293d52818d -F ext/session/sqlite3changebatch.c d5553b79e012ee2cb06c0a96bdf9dfe19e66354390ea0036cc46c4953142d517 -F ext/session/sqlite3changebatch.h e72016998c9a22d439ddfd547b69e1ebac810c24 -F ext/session/sqlite3session.c 7c2afba706139f61645472309146d5133d900d7f470044619666fe5eb3e394c4 -F ext/session/sqlite3session.h ba1b5dc7b159a76d9300228719e1248a4cb5ba7ee6ebd4c19a32fdc23891d22a -F ext/session/test_session.c 60e15d5db8ae7a0f521e70a7504ba1f74fc50548a25a5397808f487bc6a92b5d -F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3 -F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04 -F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865f002fc80cb -F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x -F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 -F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk b786ce086d5c37515473535722abc93a81ec645fca5f0baac3de9a446b90faad -F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 -F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 -F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 -F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421 -F mptest/crash02.subtest f4ef05adcd15d60e5d2bd654204f2c008b519df8 -F mptest/mptest.c aa41ace6dbc5050d76b02548d3521e6bbccae4f0 -F mptest/multiwrite01.test dab5c5f8f9534971efce679152c5146da265222d -F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca -F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b -F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 -F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 826bc4561456094cf758f095776026f25892a2bb3a7cd86742323267dc9bdb5f -F src/analyze.c 953a6c43870ccaf080597244e1eeb4dc2ff6cb84f9501b24e46323de36970b61 -F src/attach.c ff2daea0fe62080192e3f262670e4f61f5a86c1e7bea9cec34e960fe79852aa1 -F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 -F src/backup.c b1c90cd4110248c8e1273ff4578d3a84c0c34725e1b96dacd4a6294a908702de -F src/bitvec.c 8433d9e98dd6f2ea3286e0d2fe5d65de1bfc18a706486eb2026b01be066b5806 -F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 0f2b08c7214fe3401617ec7e7d63d7f122c30d937933242a73f5ca991e46dba7 -F src/btree.h 024ee56278d64622b7fe9350b0a0cdadd57ccb1f6f2de279d2053458b16cae8c -F src/btreeInt.h d92bf22ef471c3d877daa32e677755ac9578707089116a679481c646e6b3e0b0 -F src/build.c 87e14ac12acd6151b631537697a36c1cc2dd8b01c6bd3a6a74971cce077ddac3 -F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c -F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e -F src/ctime.c e98518d2d3d4029a13c805e07313fb60c877be56db76e90dd5f3af73085d0ce6 -F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384 -F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a -F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f -F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4 -F src/expr.c b46669d9fc9e0361dba6cc289901a013789e0b1dc629c4c1bc88ec9403633b38 -F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 -F src/func.c 3796e7e269a9f23867ad3e64152399d5f850f83b9ee3ba57a931da7e46ef9c00 -F src/global.c 79a988b56b06ce2d08ebefe1d35da9aa25b3851faa47ea5233361c4827185a64 -F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 -F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 -F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 -F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 92b07a7f7e682114948ce59fd6511ffec7672b508cc343a804ef6afee21b6c11 -F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa -F src/loadext.c 421310045bd78afefb772294a99e50f37d87ae578786a6169074e6291e30d969 -F src/main.c 1290592ac9c7bd928f17e30fe442e523d30ce7e9ebabf56e7979735c1c7ede36 -F src/malloc.c d0400b0366e1a3a2414ca4534b4a7406df34732835f37a15cb4642eb7df1a363 -F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 -F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de -F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 -F src/mem3.c 8768ac94694f31ffaf8b4d0ea5dc08af7010a35a -F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memdb.c 252137ca122acb8f54a99b48cf9f96a31d5130f19d174381a53294446d8b64a3 -F src/memjournal.c 7561c01c90958f3ba9bc6cb2d857123d932bdfa5539ea34427a0957b2e35154d -F src/msvc.h 3a15918220367a8876be3fa4f2abe423a861491e84b864fb2b7426bf022a28f8 -F src/mutex.c 5e3409715552348732e97b9194abe92fdfcd934cfb681df4ba0ab87ac6c18d25 -F src/mutex.h a7b2293c48db5f27007c3bdb21d438873637d12658f5a0bf8ad025bb96803c4a -F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4 -F src/mutex_unix.c aaf9ebc3f89df28483c52208497a99a02cc3650011422fc9d4c57e4392f7fe58 -F src/mutex_w32.c 7670d770c94bbfe8289bec9d7f1394c5a00a57c37f892aab6b6612d085255235 -F src/notify.c 9711a7575036f0d3040ba61bc6e217f13a9888e7 -F src/os.c 669cc3839cc35d20f81faf0be1ab6d4581cea35e9d8f3a9d48a98d6571f7c285 -F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 -F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 -F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c 550f4daf483619ef8357d98e9caa7cc613d13369ed8ffef17994d5020c12879d -F src/os_win.c e832e21e830c1f9409c9c54053939b6dcb14c1e92128b756204ce1e3e331d678 -F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 779602d1afdf69599d7537217f3b8fe136e76fce4576694d51bbae8d8304cb6e -F src/pager.h 7fed31537daa2593ad18df5f4e00b2988a2e25d74de2ab525500a6e26673687d -F src/parse.y 0724899be1d00dc438d0acadbfc2baddd4132a47268f25676ac79d56c1ee7351 -F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 -F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 -F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a -F src/pragma.c 1b0db48177e52b256c003b8dc6ac708b1079a82cded944a23820574586a4731f -F src/pragma.h 8168e588536bffd95319451f34e9a754dc37d205ebe433031a7813c5b286beae -F src/prepare.c 8d4d6c8aa6afefc48027c54b41cdf134b4d6bc2fc4badbe483ad7fd9e1728a28 -F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 -F src/random.c f27af4099afaea7284ade5c206224dcfdb2334cfd119d018b470d46356b3f27d -F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d -F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c f92fe19c23e802e58a299d1f95b4644e201a2270fc32149b6d10bd43aff0160c -F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b6 -F src/sqlite.h.in bfd502d24286258ce9091c7a2865c4e6e953958d489d50ad23e46ca1e37b03cc -F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 -F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h d26d6ed7bdb0924393a793aa196576a4963d081f685459c68bf87662e54408a8 -F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 -F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 -F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 -F src/tclsqlite.c 986b6391f02cd9b53c1d688be55899f6ffddeb8e8014cd83c1b73ff912579a71 -F src/test1.c c84b9ca57d9953e17410b0ca17b8c4b18a6b44676fa95bc5524caa0f0820d6bd -F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 -F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 -F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb -F src/test5.c 328aae2c010c57a9829d255dc099d6899311672d -F src/test6.c e8d839fbc552ce044bec8234561a2d5b8819b48e29548ad0ba400471697946a8 -F src/test7.c 5612e9aecf934d6df7bba6ce861fdf5ba5456010 -F src/test8.c 3f7d0cc4e12e06832ba3db4455cb16867ccadafa602eb6ff5fcf097bffce56ed -F src/test9.c 12e5ba554d2d1cbe0158f6ab3f7ffcd7a86ee4e5 -F src/test_async.c 195ab49da082053fdb0f949c114b806a49ca770a -F src/test_autoext.c 915d245e736652a219a907909bb6710f0d587871 -F src/test_backup.c bf5da90c9926df0a4b941f2d92825a01bbe090a0 -F src/test_bestindex.c 78809f11026f18a93fcfd798d9479cba37e1201c830260bf1edc674b2fa9b857 -F src/test_blob.c ae4a0620b478548afb67963095a7417cd06a4ec0a56adb453542203bfdcb31ce -F src/test_btree.c 8b2dc8b8848cf3a4db93f11578f075e82252a274 -F src/test_config.c 2882bb5dfb6429a79736029766fd12f4fcf25a721dd9e48e71eeca3ccf2c94df -F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f -F src/test_demovfs.c 86142ba864d4297d54c5b2e972e74f3141ae4b30f05b3a95824184ed2d3d7f91 -F src/test_devsym.c 6109b45c3db3ef7b002320947ed448c027356ab8b885156ff535fd8684d4a571 -F src/test_fs.c ba1e1dc18fd3159fdba0b9c4256f14032159785320dfbd6776eb9973cb75d480 -F src/test_func.c 181f992e5495644434c4f0e3cc72362a78c295eb2cf3ff4d02498b8bde7aa276 -F src/test_hexio.c d170d0e1a6431afdeac086a250d2595078288c2257615d37949355361399bcaa -F src/test_init.c 4413c211a94b62157ca4c145b3f27c497f03c664 -F src/test_intarray.c 39b4181662a0f33a427748d87218e7578d913e683dc27eab7098bb41617cac71 -F src/test_intarray.h d57ae92f420cda25e22790dac474d60961bd0c500cbaa3338a05152d4a669ef7 -F src/test_journal.c a0b9709b2f12b1ec819eea8a1176f283bca6d688a6d4a502bd6fd79786f4e287 -F src/test_loadext.c 337056bae59f80b9eb00ba82088b39d0f4fe6dfd -F src/test_malloc.c dec0aa821b230773aeb3dd11d652c1193f7cedb18a20b25659bc672288115242 -F src/test_md5.c 7268e1e8c399d4a5e181b64ac20e1e6f3bc4dd9fc87abac02db145a3d951fa8c -F src/test_multiplex.c 46e278397bef99b10530c1a695b4f6f23823fde6d6589b182f14e9bd43440b57 -F src/test_multiplex.h 5436d03f2d0501d04f3ed50a75819e190495b635 -F src/test_mutex.c 7f4337ba23ee6b1d2ec81c189653608cb069926a -F src/test_onefile.c f31e52e891c5fef6709b9fcef54ce660648a34172423a9cbdf4cbce3ba0049f4 -F src/test_osinst.c 98ef31ff03d55497829ca0f6c74a9f4e1aa48690 -F src/test_pcache.c a5cd24730cb43c5b18629043314548c9169abb00 -F src/test_quota.c 6cb9297115b551f433a9ad1741817a9831abed99 -F src/test_quota.h 2a8ad1952d1d2ca9af0ce0465e56e6c023b5e15d -F src/test_rtree.c 671f3fae50ff116ef2e32a3bf1fe21b5615b4b7b -F src/test_schema.c f575932cb6274d12147a77e13ea4b49d52408513 -F src/test_server.c a2615049954cbb9cfb4a62e18e2f0616e4dc38fe -F src/test_sqllog.c 11e6ce7575f489155c604ac4b439f2ac1d3d5aef -F src/test_superlock.c 4839644b9201da822f181c5bc406c0b2385f672e -F src/test_syscall.c 1073306ba2e9bfc886771871a13d3de281ed3939 -F src/test_tclsh.c eeafce33ad2136d57e5dec10f1e9a4347447eb72ffd504a1c7b9c6bfe2e71578 -F src/test_tclvar.c 33ff42149494a39c5fbb0df3d25d6fafb2f668888e41c0688d07273dcb268dfc -F src/test_thread.c 269ea9e1fa5828dba550eb26f619aa18aedbc29fd92f8a5f6b93521fbb74a61c -F src/test_vdbecov.c f60c6f135ec42c0de013a1d5136777aa328a776d33277f92abac648930453d43 -F src/test_vfs.c 36822d696789535bdd0260f07d2c9a46546082fea8bb1d0a7354c7f9366e37ea -F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698 -F src/test_windirent.c a895e2c068a06644eef91a7f0a32182445a893b9a0f33d0cdb4283dca2486ac1 -F src/test_windirent.h 90dfbe95442c9762357fe128dc7ae3dc199d006de93eb33ba3972e0a90484215 -F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f -F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 -F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c -F src/tokenize.c eee7bae3ec0bc4abee951554bf46a8ba567c0f7752ac90c820ed8afff4c612dc -F src/treeview.c 9df54af6e5830fd527496e62ae0148e1ba33197205d8e232c2826537d42d4063 -F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04 -F src/update.c 3199098455830fc2d8c8fc4ae3ec2ea513eef64339ae9a7048db62b21169bc7a -F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 -F src/utf.c d7a61c1dfdac3eb091d43341a674032dca5a34e122f78ef0b5bd2d5a31967dde -F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 -F src/vacuum.c 28f9a2430bf250c04bbf40a70d749e8c081c007b99602df61717d35b29b817ab -F src/vdbe.c 6c2fdb92f247c4174b00961142de873b21444362b0e27e579ee9e1eda2b18adc -F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 -F src/vdbeInt.h 571413068b5ac07e2ed8ca7a02fa529622fd5455ae6981498376e5e492d2e5ef -F src/vdbeapi.c e467b75a710ea099f8d2d022abf601d2ccd05e28f63b44b12d93000b6a75f4a8 -F src/vdbeaux.c af90721686bc750f0ea4961c734648ed9233984521a53d59c5e58158abe413be -F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 -F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 -F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df -F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vdbevtab.c ee5b4c902fdda2230f9503ac7b84c6d614c91e8f6f4dc1633e2e8dfef8ffb144 -F src/vtab.c 7b452592ed2ee95dedb1f323d557cebede5a6f3b4558b21a5dca527e6ae9b12c -F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 7269fd4f79ecdc71c52a1705fb893fb07b3fc7de17f3f5110b707295944e372a -F src/wal.h 7ffe787437f20a098af347011967a6d3bb8e5c3dc645e6be59eff44d2b2c5297 -F src/walker.c 3df26a33dc4f54e8771600fb7fdebe1ece0896c2ad68c30ab40b017aa4395049 -F src/where.c 9546c82056e8cdb27291f98cf1adca5d271240b399bb97b32f77fc2bea6146c9 -F src/whereInt.h 6b874aa15f94e43a2cec1080be64d955b04deeafeac90ffb5d6975c0d511be3c -F src/wherecode.c 7b939de85d65cc4b4bfa197513136b9e0ae03167e3b82842ca5a0ba1055ba65d -F src/whereexpr.c 264d58971eaf8256eb5b0917bcd7fc7a1f1109fdda183a8382308a1b18a2dce7 -F src/window.c 66c5fd1e48af7581cf90b97700268294f4da4037f120f367715f912e1148d3f9 -F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 -F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 -F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d -F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 -F test/aggnested.test 12106f0748e8e9bfc1a8e6840e203e051eae06a26ed13fc9fd5db108a8d6db54 -F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 -F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13 -F test/alter.test 25e109787dc5e631e117eb6e1c57f96a572bb51228db3b4f8b5f41d665e2ccaa -F test/alter2.test a966ccfcddf9ce0a4e0e6ff1aca9e6e7948e0e242cd7e43fc091948521807687 -F test/alter3.test e487958dec7932453e0b83baf21d6b1e71d5e7d9a55bc20eadfa62a51ddffc29 -F test/alter4.test dfd6086faf461b27ca2d2999848dcd207edf23352fc1592d0005c0844f3f08cf -F test/alterauth.test 63442ba61ceb0c1eeb63aac1f4f5cebfa509d352276059d27106ae256bafc959 -F test/alterauth2.test c0a1ddf5b93d93cb0d15ba7acaf0c5c6fb515bbe861ede75b2d3fabad33b6499 -F test/altercol.test 1d6a6fe698b81e626baea4881f5717f9bc53d7d07f1cd23ee7ad1b931f117ddf -F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3eab2f44b -F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 -F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b -F test/altertab.test 523ba6368e0da19f462f7c05563c569675736d946724cac1c4ae848f76783434 -F test/altertab2.test b0d62f323ca5dab42b0bc028c52e310ebdd13e655e8fac070fe622bad7852c2b -F test/altertab3.test 155b8dc225ce484454a7fb4c8ba745680b6fa0fc3e08919cbbc19f9309d128ff -F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f -F test/analyze.test 547bb700f903107b38611b014ca645d6b5bb819f5210d7bf39c40802aafeb7d7 -F test/analyze3.test 01f0b122e3e54ad2544f14f7cc7dcb4c2cb8753cad5e88c6b8d49615b3fd6a2b -F test/analyze4.test cdf88f3f72b0f0643a1ff6c730fc5af1e42464d47478d9fbac84c333f72c014e -F test/analyze5.test fa5131952303ac4146aba101b116b9c8cb89e2637531c334a6df7f7d19dddc0d -F test/analyze6.test 6c3f7df2996cb6872f355a6ac1eb6d5de00a5a9288214bad7ef25c97d9cc72dc -F test/analyze7.test 6ef0b12369f61ddeadc7d8a705c40e6b52cb29f63de3a4c56581b510b46b5783 -F test/analyze8.test 36ce54947710bd44e4f9484e1ad07e725ef01a9d7078b417c1bc884356febe4d -F test/analyze9.test 9fbf0e0101eef4f5dc149769aa14e10b76ee06e7c28598264b32173cd1999a54 -F test/analyzeC.test 489fe2ea3be3f17548e8dd895f1b41c9669b52de1b0861f5bffe6eec46eac710 -F test/analyzeD.test e50cd0b3e6063216cc0c88a1776e8645dc0bd65a6bb275769cbee33b7fd8d90c -F test/analyzeE.test 8684e8ac5722fb97c251887ad97e5d496a98af1d -F test/analyzeF.test 9e1a0537949eb5483642b1140a5c39e5b4025939024b935398471fa552f4dabb -F test/analyzeG.test a48c0f324dd14de9a40d52abe5ca2637f682b9a791d2523dd619f6efa14e345b -F test/analyzer1.test 459fa02c445ddbf0101a3bad47b34290a35f2e49 -F test/async.test 1d0e056ba1bb9729283a0f22718d3a25e82c277b -F test/async2.test c0a9bd20816d7d6a2ceca7b8c03d3d69c28ffb8b -F test/async3.test d73a062002376d7edc1fe3edff493edbec1fc2f7 -F test/async4.test 1787e3952128aa10238bf39945126de7ca23685a -F test/async5.test 383ab533fdb9f7ad228cc99ee66e1acb34cc0dc0 -F test/atof1.test 1ccfc96a6888566597b83d882c81b3c04258dc39317e8c1cec89ba481eaa2fba -F test/atomic.test 065a453dde33c77ff586d91ccaa6ed419829d492dbb1a5694b8a09f3f9d7d061 -F test/atomic2.test b6863b4aa552543874f80b42fb3063f1c8c2e3d8e56b6562f00a3cc347b5c1da -F test/atrc.c ec92d56d8fbed9eb3e11aaf1ab98cf7dd59e69dae31f128013f1d97e54e7dfed -F test/attach.test d42862c72fef3d54367d962d41dcfb5363442a4a1bd898c22ae950cea1aa0dd3 -F test/attach2.test 256bd240da1835fb8408dd59fb7ef71f8358c7a756c46662434d11d07ba3a0ce -F test/attach3.test c59d92791070c59272e00183b7353eeb94915976 -F test/attach4.test aa05b1d8218b24eba5a7cccf4f224f514ba57ba705c9267f09d2bb63fed0eea1 -F test/attachmalloc.test 12c4f028e570acf9e0a4b0b7fe6f536e21f3d5ebddcece423603d0569beaf438 -F test/auth.test 2154625c05bc79f0e0ea72cb2358395a8041243caa0fd7ce7617d50da4331794 -F test/auth2.test 9eb7fce9f34bf1f50d3f366fb3e606be5a2000a1 -F test/auth3.test db21405b95257c24d29273b6b31d0efc59e1d337e3d5804ba2d1fd4897b1ae49 -F test/autoanalyze1.test b9cc3f32a990fa56669b668d237c6d53e983554ae80c0604992e18869a0b2dec -F test/autoinc.test 997d6f185f138229dc4251583a1d04816423dddc2fc034871a01aeb1d728cb39 -F test/autoindex1.test 96185415f5faacd5b8d7a7f505efddd5abb1f111d58338e9c0b1dc40b87cd3cc -F test/autoindex2.test 12ef578928102baaa0dc23ad397601a2f4ecb0df -F test/autoindex3.test 2dd997d6590438b53e4f715f9278aa91c9299cf3f81246a0915269c35beb790e -F test/autoindex4.test 49d3cd791a9baa16fb461d7ea3de80d019a819cf -F test/autoindex5.test a5d72fe8c217cc0ea356dc6fa06a282a8a3fc53aa807709d79dba07a8f248102 -F test/autovacuum.test 0831cd34e14695d297187f7f6519265e3121c5b0a1720e548e86829e796129e9 -F test/autovacuum_ioerr2.test 8a367b224183ad801e0e24dcb7d1501f45f244b4 -F test/avtrans.test b7dc25459ecbd86c6fa9c606ee3068f59d81e225118617dcf2bbb6ded2ade89e -F test/backcompat.test 3e64cedda754c778ef6bbe417b6e7a295e662a4d -F test/backup.test dd4a5ff756e3df3931dacb1791db0584d4bad989 -F test/backup2.test 1fd1ad8c5b3d2d5b9c0cce4143a4fc610d51ddc6ae16a7a122973d43e6b50bbd -F test/backup4.test 8f6fd48e0dfde77b9a3bb26dc471ede3e101df32 -F test/backup5.test ee5da6d7fe5082f5b9b0bbfa31d016f52412a2e4 -F test/backup_ioerr.test 4c3c7147cee85b024ecf6e150e090c32fdbb5135 -F test/backup_malloc.test 0c9abdf74c51e7bedb66d504cd684f28d4bd4027 -F test/badutf.test d5360fc31f643d37a973ab0d8b4fb85799c3169f -F test/badutf2.test f310fd3b24a491b6b77bccdf14923b85d6ebcce751068c180d93a6b8ff854399 -F test/bc_common.tcl b5e42d80305be95697e6370e015af571e5333a1c -F test/bc_test1.c e0a092579552e066ed4ce7bcdaecfa69c4aacc8d -F test/bestindex1.test 705b57d7f51d53ee5fd043dd9666236e1fc18f4d59abf51da0ea5ea1b4804947 -F test/bestindex2.test 9a0ccd320b6525eec3a706aae6cdab7e1b7b5abca75027e39f39f755e76e5928 -F test/bestindex3.test 7622e792ff2da16d262d3cea6ad914591ac4806d57ed128e6c940b7920b47b84 -F test/bestindex4.test 038e3d0789332f3f1d61474f9bbc9c6d08c6bd1783a978f31f38ad82688de601 -F test/bestindex5.test 67c1166131bb59f9e47c00118f7d432ca5491e6cae6ca3f87ca9db20103a78f9 -F test/bestindex6.test d856a9bb63d927493575823eed44053bc36251e241aa364e54d0f2a2d302e1d4 -F test/bestindex7.test f36ada201973d3022cf7afffffe08de9e58341996020e7a2df9a1d2f2be20132 -F test/between.test 68137a6e941c221417c15b6fe2d55f27bb1b6ab48bdf9e2aa51efdd85bc53802 -F test/bigfile.test aa74f4e5db51c8e54a1d9de9fa65d01d1eb20b59 -F test/bigfile2.test 1b489a3a39ae90c7f027b79110d6b4e1dbc71bfc -F test/bigmmap.test 31dad31573638bd32de866cdefd11843f75685be4ba6aec1a47918f098f1899b -F test/bigrow.test f0aeb7573dcb8caaafea76454be3ade29b7fc747 -F test/bigsort.test 8299fa9298f4f1e02fc7d2712e8b77d6cd60e5a2 -F test/bind.test 1e136709b306f7ed3192d349c2930d89df6ab621654ad6f1a72381d3fe76f483 -F test/bindxfer.test efecd12c580c14df5f4ad3b3e83c667744a4f7e0 -F test/bitvec.test 75894a880520164d73b1305c1c3f96882615e142 -F test/blob.test e7ac6c7d3a985cc4678c64f325292529a69ae252 -F test/boundary1.tcl 6421b2d920d8b09539503a8673339d32f7609eb1 -F test/boundary1.test 66d7f4706ccdb42d58eafdb081de07b0eb42d77b -F test/boundary2.tcl e34ef4e930cf1083150d4d2c603e146bd3b76bcb -F test/boundary2.test 9ae758d7dab7e882c8b6cc4a6a10278385bff8fa -F test/boundary3.tcl 23361e108a125dca9c4080c2feb884fe54d69243 -F test/boundary3.test 56ef82096b4329aca2be74fa1e2b0f762ea0eb45 -F test/boundary4.tcl 0bb4b1a94f4fc5ae59b79b9a2b7a140c405e2983 -F test/boundary4.test 89e02fa66397b8a325d5eb102b5806f961f8ec4b -F test/btree01.test e08b3613540145b353f20c81cb18ead54ff12e0f -F test/btree02.test 7555a5440453d900410160a52554fe6478af4faf53098f7235f1f443d5a1d6cc -F test/btreefault.test c2bcb542685eea44621275cfedbd8a13f65201e3 -F test/busy.test 510dc6daaad18bcbbc085bcc6217d6dc418def5e73f72ce1475eea0cb7834727 -F test/cache.test 13bc046b26210471ca6f2889aceb1ea52dc717de -F test/cacheflush.test af25bb1509df04c1da10e38d8f322d66eceedf61 -F test/cachespill.test 895997f84a25b323b166aecb69baab2d6380ea98f9e0bcc688c4493c535cfab9 -F test/capi2.test 34a1a9a96d543a2ec2c209696b11b164444f57253b1f2cba1c2e53fadede6c7b -F test/capi3.test 3910a73c38ac76d69778dd9eb481ab7cd6ed59117fc047b4f6056a5c72529de1 -F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 -F test/capi3c.test 54e2dc0c8fd7c34ad1590d1be6864397da2438c95a9f5aee2f8fbc60c112e44b -F test/capi3d.test aba917805573a03deed961a21f07a5a84505ad0a616f7e3fc1508844a15bccc4 -F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe -F test/cast.test 2906ccab6a3ebd147ffa63304b635be903ce58264110d0a0eb4fd9939422bb53 -F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef -F test/check.test 9776af795bb5d0f197b7f8fe248052e3ca2ed35304d863efcdbf8b1316e11f65 -F test/checkfault.test da6cb3d50247169efcb20bdf57863a3ccfa1d27d9e55cd324f0680096970f014 -F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760 -F test/close.test eccbad8ecd611d974cbf47278c3d4e5874faf02d811338d5d348af42d56d647c -F test/closure01.test 9905883f1b171a4638f98fc764879f154e214a306d3d8daf412a15e7f3a9b1e0 -F test/coalesce.test cee0dccb9fbd2d494b77234bccf9dc6c6786eb91 -F test/collate1.test 532b4992f78e91dd80c2e3c7bd944fada8cbe3d6c0ded0b20f7182b4dfca0006 -F test/collate2.test 9aaa410a00734e48bcb27f3872617d6f69b2a621 -F test/collate3.test 89defc49983ddfbf0a0555aca8c0521a676f56a5 -F test/collate4.test c953715fb498b87163e3e73dd94356bff1f317bd -F test/collate5.test 65d928034d30d2d263a80f6359f7549ee1598ec6 -F test/collate6.test 8be65a182abaac8011a622131486dafb8076e907 -F test/collate7.test 8ec29d98f3ee4ccebce6e16ce3863fb6b8c7b868 -F test/collate8.test cd9b3d3f999b8520ffaa7cc1647061fc5bab1334 -F test/collate9.test 3adcc799229545940df2f25308dd1ad65869145a -F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6 -F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151ecac0b95 -F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 -F test/colname.test 87ad5458bb8709312dac0d6755fd30e8e4ca83298d0a9ef6e5c24277a3c3390e -F test/concfault.test e5370cd686f601a01909377cac3bbf13dac56d39dd4ad6b04ccbec9eeeaccb18 -F test/concurrent.test 86661967a680670127a62a819e60dc93c2d3d49043ac95b26dfa70d3e60dbde5 -F test/concurrent2.test de748c7dd749c77e2af2c4b914b9b09a28ac09608042ca498c0251dc6f46aa1a -F test/concurrent3.test 530671ac706f6a1d0f4992dbdd33a86408330d03cd90fb9e82ecb1b27f5fd081 -F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44 -F test/concurrent5.test 0c16cbf7446af162a14e6def30445e94016064eb994e5aa4ebb2bebc59554176 -F test/concurrent6.test a7860e9ca13bb5fb76bcf41c5524fbfa9c37e6e258ecf84ffb5748a272488c67 -F test/concurrent7.test b96fa5c4cfdf8d5c0bc66b6934214500bad0260884a736f054ccc76e81aae85d -F test/conflict.test 58857e2533fb9f2e0358ea7cb191215657846be1dd9da3b3d6df3e750c02ae03 -F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c -F test/conflict3.test 81865d9599609aca394fb3b9cd5f561d4729ea5b176bece3644f6ecb540f88ac -F test/contrib01.test 2a1cbc0f2f48955d7d073f725765da6fbceda6b4 -F test/corrupt.test d7cb0300e4a297147b6a05e92a1684bc8973635c3bcaa3d66e983c9cbdbf47a3 -F test/corrupt2.test bb50042cf9a1f1023d73af325d47eb02a6bb11e3c52f8812644b220c5d4bca35 -F test/corrupt3.test f95d7bf78109e0b84eb285a787ce91a3fd6a2dd7d0cb55882abff3bdc081a57e -F test/corrupt4.test 8d1d86b850fcc43e417450454f2044e52d55778a -F test/corrupt5.test 387be3250795e2a86e6234745558b80efb248a357d0cd8e53bce75c7463f545d -F test/corrupt6.test fc6a891716139665dae0073b6945e3670bf92568 -F test/corrupt7.test b036f94bda4b0b23a2919bf717046ce9ecca4543 -F test/corrupt8.test 2399dfe40d2c0c63af86706e30f3e6302a8d0516 -F test/corrupt9.test 730a3db08d4ab9aa43392ea30d9c2b4879cbff85 -F test/corruptA.test 112f4b2ae0b95ebf3ea63718642fb969a93acea557ace3a307234d19c245989b -F test/corruptB.test 73a8d6c0b9833697ecf16b63e3c5c05c945b5dec -F test/corruptC.test 74d4498fd25759618b393f1e9cde111de828b88c1848ab320f6c179fd52b5a60 -F test/corruptD.test 33a37ce3ed56a20093ceee778cd2d7109c7085a59f3213d2baede11d952e8e50 -F test/corruptE.test 4143791f2dfb443aec5b7fabfa5821e6063eccc3b49b06f212c2f014715fd476 -F test/corruptF.test be9fde98e4c93648f1ba52b74e5318edc8f59fe4 -F test/corruptG.test adf79b669cbfd19e28c8191a610d083ae53a6d51 -F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 -F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b -F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 -F test/corruptK.test 5b4212fe346699831c5ad559a62c54e11c0611bdde1ea8423a091f9c01aa32af -F test/corruptL.test 13ef74a93223af25015d223add0df4c2d375f0b958b546a2a72033f2fdab7a70 -F test/corruptM.test 7d574320e08c1b36caa3e47262061f186367d593a7e305d35f15289cc2c3e067 -F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34 -F test/count.test e0699a15712bc2a4679d60e408921c2cce7f6365a30340e790c98e0f334a9c77 -F test/countofview.test e17d6e6688cf74f22783c9ec6e788c0790ee4fbbaee713affd00b1ac0bb39b86 -F test/coveridxscan.test 5ec98719a2e2914e8908dc75f7247d9b54a26df04625f846ac7900d5483f7296 -F test/crash.test fb9dc4a02dcba30d4aa5c2c226f98b220b2b959f -F test/crash2.test 5b14d4eb58b880e231361d3b609b216acda86651 -F test/crash3.test 8f5de9d32ab9ab95475a9efe7f47a940aa889418 -F test/crash4.test fe2821baf37168dc59dd733dcf7dba2a401487bc -F test/crash5.test f14ff37eddc41991be4eb63568f86caa306fd9962a0ae3750db8836777bb7aae -F test/crash6.test 4c56f1e40d0291e1110790a99807aa875b1647ba -F test/crash7.test 1a194c4900a255258cf94b7fcbfd29536db572df -F test/crash8.test 64366e459c28dd62edfb7ad87253a409c7533b92d16fcc479a6a8131bdcc3100 -F test/crashM.test d95f59046fa749b0d0822edf18a717788c8f318d -F test/crashtest1.c 09c1c7d728ccf4feb9e481671e29dda5669bbcc2 -F test/createtab.test 85cdfdae5c3de331cd888d6c66e1aba575b47c2e3c3cc4a1d6f54140699f5165 -F test/cse.test 00b3aea44b16828833c94fbe92475fd6977583fcb064ae0bc590986812b38d0c -F test/csv01.test c9c3af0d58c34e9ac970c5875a77939edb958762c8aafb95409e19a3f088b6cd -F test/ctime.test 78749e6c9a5f0010d67985be80788f841e3cd2da18114e2ed6010399a7d807f3 -F test/cursorhint.test 0175e4404181ace3ceca8b114eb0a98eae600d565aa4e2705abbe6614c7fe201 -F test/cursorhint2.test 6f3aa9cb19e7418967a10ec6905209bcbb5968054da855fc36c8beee9ae9c42f -F test/dataversion1.test 6e5e86ac681f0782e766ebcb56c019ae001522d114e0e111e5ebf68ccf2a7bb8 -F test/date.test 9b73bbeb1b82d9c1f44dec5cf563bf7da58d2373 -F test/date2.test 5ef8265c71460cda6b1698bf18f4bb0ffb40ac08c5092f6afe84d398c2feb5be -F test/dbdata.test 042f49acff3438f940eeba5868d3af080ae64ddf26ae78f80c92bec3ca7d8603 -F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e -F test/dbfuzz001.test 42aad1dcef6219fbee86a9b7d08832c9bbb2e41508f6f128ae91745927276292 -F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c c2c9cb40082a77b7e95ffb8b2da1e93322efadfb1c8c1e0001c95a0af1e156c2 -F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 -F test/dbstatus.test 4a4221a883025ffd39696b3d1b3910b928fb097d77e671351acb35f3aed42759 -F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef -F test/default.test 9687cfb16717e4b8238c191697c98be88c0b16e568dd5368cd9284154097ef50 -F test/delete.test 31832b0c45ecb51a54348c68db173be462985901e6ed7f403d6d7a8f70ab4ef0 -F test/delete2.test 3a03f2cca1f9a67ec469915cb8babd6485db43fa -F test/delete3.test 555e84a00a99230b7d049d477a324a631126a6ab -F test/delete4.test 6aa279f459f4aa792cc251435c3809415c1ecaf9f27dce91675e26f05b503db3 -F test/delete_db.test 096d828493c7907f9ea11a7098ea6a0f73edba89406487d5d6cc2228dc4ab8b0 -F test/descidx1.test edc8adee58d491b06c7157c50364eaf1c3605c9c19f8093cb1ea2b6184f3ac13 -F test/descidx2.test a0ba347037ff3b811f4c6ceca5fd0f9d5d72e74e59f2d9de346a9d2f6ad78298 -F test/descidx3.test 953c831df7ea219c73826dfbf2f6ee02d95040725aa88ccb4fa43d1a1999b926 -F test/diskfull.test 106391384780753ea6896b7b4f005d10e9866b6e -F test/distinct.test e7d0cf371944dd0cbedff86420744e2f1ea2b528156451c97eb6ff41a99b9236 -F test/distinct2.test 11b0594c932098e969d084ba45ab81d5040f4d4e766db65d49146705a305ed98 -F test/distinctagg.test 1a6ef9c87a58669438fc771450d7a72577417376 -F test/e_blobbytes.test 439a945953b35cb6948a552edaec4dc31fd70a05 -F test/e_blobclose.test 4b3c8c60c2171164d472059c73e9f3c1844bb66d -F test/e_blobopen.test e95e1d40f995056f6f322cd5e1a1b83a27e1a145 -F test/e_blobwrite.test f87ff598b67af5b3ec002a8d83e804dc8d23808e88cf0080c176612fc9ffce14 -F test/e_changes.test fd66105385153dbf21fdb35eb8ef6c3e1eade579 -F test/e_createtable.test ea27082d6f84df61e1d9e383f3fd79220418856a4a8afc41af75d458b8e7ac33 -F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e -F test/e_droptrigger.test 3cd080807622c13e5bbb61fc9a57bd7754da2412 -F test/e_dropview.test 74e405df7fa0f762e0c9445b166fe03955856532e2bb234c372f7c51228d75e7 -F test/e_expr.test 62000e6675d5bcf4b09276fe011a27779629ff8f6678ba5937fb6f1b78d645ff -F test/e_fkey.test b497feb7c436693e16a36cdaba8d81ffe12f23659d139ee71dfa57c0c52d1e5b -F test/e_fts3.test 17ba7c373aba4d4f5696ba147ee23fd1a1ef70782af050e03e262ca187c5ee07 -F test/e_insert.test f02f7f17852b2163732c6611d193f84fc67bc641fb4882c77a464076e5eba80e -F test/e_reindex.test 2b0e29344497d9a8a999453a003cb476b6b1d2eef2d6c120f83c2d3a429f3164 -F test/e_resolve.test a61751c368b109db73df0f20fc75fb47e166b1d8 -F test/e_select.test f9474205669a7736ef725b29cc7ae9e8601919a3d0ffc0ab30745a028f2a4b61 -F test/e_select2.test aceb80ab927d46fba5ce7586ebabf23e2bb0604f -F test/e_totalchanges.test b12ee5809d3e63aeb83238dd501a7bca7fd72c10 -F test/e_update.test f46c2554d915c9197548681e8d8c33a267e84528 -F test/e_uri.test 47eeb2960e74613f0f8722b2f13aef08fde69daa16e5380ac93df84dac8b1f72 -F test/e_vacuum.test 0d8832a2ce92350db0d0cff47b419465fd9772562e1f77ff7d9478c07a4980d2 -F test/e_wal.test ae9a593207a77d711443ee69ffe081fda9243625 -F test/e_walauto.test 248af31e73c98df23476a22bdb815524c9dc3ba8 -F test/e_walckpt.test 28c371a6bb5e5fe7f31679c1df1763a19d19e8a0 -F test/e_walhook.test 01b494287ba9e60b70f6ebf3c6c62e0ffe01788e344a4846b08e5de0b344cb66 -F test/emptytable.test a38110becbdfa6325cd65cb588dca658cd885f62 -F test/enc.test 9a7be5479da985381d740b15f432800f65e2c87029ee57a318f42cb2eb43763a -F test/enc2.test 848bf05f15b011719f478dddb7b5e9aea35e39e457493cba4c4eef75d849a5ec -F test/enc3.test 6807f7a7740a00361ca8d0ccd66bc60c8dc5f2b6 -F test/enc4.test c8f1ce3618508fd0909945beb8b8831feef2c020 -F test/eqp.test 84879b63e3110552bf8ce648a3507dc3ceb72109ecec83c2aef0db37a27f6382 -F test/errmsg.test eae9f091eb39ce7e20305de45d8e5d115b68fa856fba4ea6757b6ca3705ff7f9 -F test/eval.test a64c9105d6ff163df7cf09d6ac29cdad5922078c -F test/exclusive.test 7ff63be7503990921838d5c9f77f6e33e68e48ed1a9d48cd28745bf650bf0747 -F test/exclusive2.test 984090e8e9d1b331d2e8111daf6e5d61dda0bef7 -F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7 -F test/exists.test 79a75323c78f02bbe9c251ea502a092f9ef63dac -F test/expr.test 26cd01e8485bc48c8aa6a1add598e9ce1e706b4eb4f3f554e0b0223022e8c2cf -F test/expr2.test c27327ae9c017a7ff6280123f67aff496f912da74d78c888926d68b46ec75fd8 -F test/extension01.test 00d13cec817f331a687a243e0e5a2d87b0e358c9 -F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 -F test/fallocate.test 37a62e396a68eeede8f8d2ecf23573a80faceb630788d314d0a073d862616717 -F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3 -F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4 -F test/filter1.test 8a6f047a000ef391db2ca17b6beecc0006f4e0f9ca8bbe272b2443c7316e66b1 -F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f93393e8 -F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a -F test/filterfault.test c08fb491d698e8df6c122c98f7db1c65ffcfcad2c1ab0e07fa8a5be1b34eaa8b -F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768 -F test/fkey2.test b1b6a8c5556dc0ccf31291b1fed8aa57e404b38f3236110e19ab4dc6aa93edf2 -F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49 -F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d -F test/fkey5.test 24dd28eb3d9f1b5a174f47e9899ace5facb08373a4223593c8c631e6cf9f7d5a -F test/fkey6.test d078a1e323a740062bed38df32b8a736fd320dc0 -F test/fkey7.test 64fb28da03da5dfe3cdef5967aa7e832c2507bf7fb8f0780cacbca1f2338d031 -F test/fkey8.test 48ef829d63f5f7b37aabd4df9363ac05f65539d1da8c4a44251631769d920579 -F test/fkey_malloc.test 594a7ea1fbab553c036c70813cd8bd9407d63749 -F test/fordelete.test ba98f14446b310f9c9d935b97ec748753d0144a28b356ba30d1f4f6958fdde5c -F test/format4.test eeae341953db8b6bda7f549044797c3278a6cc345d11ada81471671b654f8ef4 -F test/fts-9fd058691.test 78b887e30ae6816df0e1fed6259de4b5a64ad33c -F test/fts1a.test 46090311f85da51bb33bd5ce84f7948359c6d8d7 -F test/fts1b.test 5d8a01aefbecc8b7442b36c94c05eb7a845462d5 -F test/fts1c.test 85a525ce7428907469b4cce13d5563ce542ce64c -F test/fts1d.test a73deace5c18df4a549b12908bade4f05dcf1a2f -F test/fts1e.test 77244843e925560b5a0b70069c3e7ab62f181ed2 -F test/fts1f.test 2d6cb10d8b7a4e6edc321bbdb3982f1f48774714 -F test/fts1i.test 6bfe08cdfdced063a39a50c8601da65e6274d879 -F test/fts1j.test e3797475796043a161e348c46a309664cac83f7f -F test/fts1k.test 65d3b41487b9f738d11b0f00eca375c0ca6bd970 -F test/fts1l.test 15c119ed2362b2b28d5300c0540a6a43eab66c36 -F test/fts1m.test 2d9ca67b095d49f037a914087cc0a61e89da4f0c -F test/fts1n.test a2317dcd27b1d087ee3878b30e0a59c593c98b7a -F test/fts1o.test d1554caede42bba2c82fe613bcc921856c196b752449ead0470fac52a20fd3b8 -F test/fts1porter.test d86e9c3e0c7f8ff95add6582b4b585fb4e02b96d -F test/fts2.test e3fb95f96a650411574efc136f3fb10eef479ed7 -F test/fts2a.test 473a5c8b473a4e21a8e3fddaed1e59666e0c6ab7 -F test/fts2b.test 964abc0236c849c07ca1ae496bb25c268ae94816 -F test/fts2c.test ffb5a35230ac72c4354535c547965ce6824537c0 -F test/fts2d.test b7eaa671ca9a16997f3e5b158ee777ae21052b0b -F test/fts2e.test 2da13dbc2d009105f42196845c1e1ce136c03d38 -F test/fts2f.test cf84096235991709c1e61caa389632aa0a4f976d -F test/fts2g.test 3d26fe171bda6133ebf5a380731d70eaa2ef2f6f73d79769cf8946e622b6d597 -F test/fts2h.test 223af921323b409d4b5b18ff4e51619541b174bb -F test/fts2i.test 1b22451d1f13f7c509baec620dc3a4a754885dd6 -F test/fts2j.test 298fa1670aa21cd445b282d139b70c72e7ade12b -F test/fts2k.test c7ebf4a4937594aa07459e3e1bca1251c1be8659 -F test/fts2l.test 3333336621524cf7d60bb62d6ef6ab69647866ed -F test/fts2m.test 4b30142ead6f3ed076e880a2a464064c5ad58c51 -F test/fts2n.test 12b9c5352128cebd1c6b8395e43788d4b09087c2 -F test/fts2o.test 4054ac7433eb5440f1b1d200cfa449342dc4aabd991759139813e17c73e5bf9a -F test/fts2p.test 4b48c35c91e6a7dbf5ac8d1e5691823cc999aafb -F test/fts2q.test b2fbbe038b7a31a52a6079b215e71226d8c6a682 -F test/fts2r.test b154c30b63061d8725e320fba1a39e2201cadd5e -F test/fts2token.test d8070b241a15ff13592a9ae4a8b7c171af6f445a -F test/fts3.test 672a040ea57036fb4b6fdc09027c18d7d24ab654 -F test/fts3_common.tcl dffad248f9ce090800e272017d2898005c28ee6314fc1dd5550643a02666907a -F test/fts3aa.test 814d60a1ba30b4a71d8f9306a6564bc7b636dd6efacd2ad80306f9b23ef3ebee -F test/fts3ab.test 7f6cf260ae80dda064023df8e8e503e9a412b91f -F test/fts3ac.test 636ed7486043055d4f126a0e385f2d5a82ebbf63 -F test/fts3ad.test e40570cb6f74f059129ad48bcef3d7cbc20dda49 -F test/fts3ae.test ce32a13b34b0260928e4213b4481acf801533bda -F test/fts3af.test d394978c534eabf22dd0837e718b913fd66b499c -F test/fts3ag.test c003672a215124df7fc6000036d896f498b26b53 -F test/fts3ah.test dc9f66c32c296f1bc8bcc4535126bddfeca62894 -F test/fts3ai.test 24058fdc6e9e5102c1fd8459591b114b6a85d285 -F test/fts3aj.test 0ed71e1dd9b03b843a857dc3eb9b15630e0104fc -F test/fts3ak.test bd14deafe9d1586e8e9bf032411026ac4f8c925d -F test/fts3al.test 07d64326e79bbdbab20ee87fc3328fbf01641c9f -F test/fts3am.test 218aa6ba0dfc50c7c16b2022aac5c6be593d08d8 -F test/fts3an.test a49ccadc07a2f7d646ec1b81bc09da2d85a85b18 -F test/fts3ao.test 266989148fec6d9f1bb6c5382f7aa3dcea0e9cd444576e28dd2b9287ac7dd220 -F test/fts3atoken.test dc2078ce464914efe3a8dfc545dd034a0fc14f2ab425c240471d5a5f1c721400 -F test/fts3auto.test 649aa4c198d7acc5cd6355e19ee073d051c40d9e88a43fc3d88af46bdf3e99d5 -F test/fts3aux1.test 7a170e172afdbceb67f5baa05941fd4fbf56af42f61daa3d140f4b4bf4cb68f6 -F test/fts3aux2.test 2459e7fa3e22734aed237d1e2ae192f5541c4d8b218956ad2d90754977bf907f -F test/fts3b.test c15c4a9d04e210d0be67e54ce6a87b927168fbf9c1e3faec8c1a732c366fd491 -F test/fts3c.test fc723a9cf10b397fdfc2b32e73c53c8b1ec02958 -F test/fts3comp1.test a0f5b16a2df44dd0b15751787130af2183167c0c -F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f5a76b -F test/fts3corrupt.test 79a32ffdcd5254e2f7fa121d9656e61949ad049c3c6554229911b7ceac37c9c6 -F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 -F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test fde292a4712753c7ef235a199273c5d196e18a56bd2c4d2db7ccaf59b7027a0a -F test/fts3corrupt5.test 0549f85ec4bd22e992f645f13c59b99d652f2f5e643dac75568bfd23a6db7ed5 -F test/fts3cov.test 7eacdbefd756cfa4dc2241974e3db2834e9b372ca215880e00032222f32194cf -F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f -F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de -F test/fts3defer2.test 3da52ca2114e300e9971eee2f0cc1a2e5f27e6a9ee67957d49e63e41fdfcc0e7 -F test/fts3defer3.test dd53fc13223c6d8264a98244e9b19abd35ed71cd -F test/fts3drop.test 1b906e293d6773812587b3dc458cb9e8f3f0c297 -F test/fts3e.test 1f6c6ac9cc8b772ca256e6b22aaeed50c9350851 -F test/fts3expr.test ebae205a7a89446c32583bcd492dcb817b9f6b31819bb4dde2583bb99c77e526 -F test/fts3expr2.test 18da930352e5693eaa163a3eacf96233b7290d1a -F test/fts3expr3.test c4d4a7d6327418428c96e0a3a1137c251b8dfbf8 -F test/fts3expr4.test f5b2832549f01b1f7f73389fa21d4b875499bc95bf7c8b36271844888c6a0938 -F test/fts3expr5.test a5b9a053becbdb8e973fbf4d6d3abaabeb42d511d1848bd57931f3e0a1cf983e -F test/fts3fault.test 798e45af84be7978ca33d5bdc94246eb44724db24174b5d8e9b1ac46c57fb08d -F test/fts3fault2.test 6a17a11d8034b1c4eca9f3091649273d56c49ff049e2173df8060f94341e9da0 -F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641 -F test/fts3fuzz001.test e3c7b0ce9b04cc02281dcc96812a277f02df03cd7dc082055d87e11eb18aaf56 -F test/fts3join.test 949b4f5ae3ae9cc2423cb865d711e32476bdb205ab2be923fdf48246e4a44166 -F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6 -F test/fts3matchinfo.test aa66cc50615578b30f6df9984819ae5b702511cf8a94251ec7c594096a703a4a -F test/fts3matchinfo2.test 00144e841704b8debfcdf6097969cd9f2a1cf759e2203cda42583648f2e6bf58 -F test/fts3misc.test 9ec15e7c0b5831a6353bd4c46bf3acdf1360eda5d9f396f667db4d05bcf92ecf -F test/fts3near.test 7e3354d46f155a822b59c0e957fd2a70c1d7e905 -F test/fts3offsets.test b85fd382abdc78ebce721d8117bd552dfb75094c -F test/fts3prefix.test fa794eaab0bdae466494947b0b153d7844478ab2 -F test/fts3prefix2.test e1f0a822ca661dced7f12ce392e14eaf65609dce -F test/fts3query.test ca033ff2ebcc22c69d89032fb0bc1850997d31e7e60ecd26440796ba1654e78f -F test/fts3rank.test cd99bc83a3c923c8d52afd90d86979cf05fc41849f892faeac3988055ef37b99 -F test/fts3rnd.test 1320d8826a845e38a96e769562bf83d7a92a15d0 -F test/fts3shared.test 57e26a801f21027b7530da77db54286a6fe4997e -F test/fts3snippet.test 0887196d67cffbe365edde535b95ecc642a532ce8551ccd9a73aab5999c3ffae -F test/fts3snippet2.test 2dabb5889eda4c9980aad325e688b470781f97ce7c0fca0db125616fae0a2cdd -F test/fts3sort.test ed34c716a11cc2009a35210e84ad5f9c102362ca -F test/fts3tok1.test a663f4cac22a9505400bc22aacb818d7055240409c28729669ea7d4cc2120d15 -F test/fts3tok_err.test 52273cd193b9036282f7bacb43da78c6be87418d -F test/fts3varint.test 0b84a3fd4eba8a39f3687523804d18f3b322e6d4539a55bf342079c3614f2ada -F test/fts4aa.test 0e6bfd6a81695a39b23e448dda25d864e63dda75bde6949c45ddc95426c6c3f5 -F test/fts4check.test 6259f856604445d7b684c9b306b2efb6346834c3f50e8fc4a59a2ca6d5319ad0 -F test/fts4content.test 73bbb123420d2c46ef2fb3b24761e9acdb78b0877179d3a5d7d57aada08066f6 -F test/fts4docid.test e33c383cfbdff0284685604d256f347a18fdbf01 -F test/fts4growth.test 289833c34ad45a5e6e6133b53b6a71647231fb89d36ddcb8d9c87211b6721d7f -F test/fts4growth2.test 13ad4e76451af6e6906c95cdc725d01b00044269 -F test/fts4incr.test 4e353a0bd886ea984e56fce9e77724fc923b8d0d -F test/fts4langid.test 89e623218935507bca69d076ca254a7a8969dfc681c282b6374feaea8c7de784 -F test/fts4lastrowid.test 185835895948d5325c7710649824042373b2203149abe8024a9319d25234dfd7 -F test/fts4merge.test e2b2ec21e287d54ec09824ccfb41e66896eeca568fc818ba0e0eb2efd94c35d2 -F test/fts4merge2.test 5faa558d1b672f82b847d2a337465fa745e46891 -F test/fts4merge3.test 8d9ccb4a3d41c4c617a149d6c4b13ad02de797d0 -F test/fts4merge4.test d895b1057a7798b67e03455d0fa50e9ea836c47b -F test/fts4merge5.test 69932d85cda8a1c4dcfb742865900ed8fbda51724b8cf9a45bbe226dfd06c596 -F test/fts4min.test 1c11e4bde16674a0c795953509cbc3731a7d9cbd1ddc7f35467bf39d632d749f -F test/fts4noti.test 5553d7bb2e20bf4a06b23e849352efc022ce6309 -F test/fts4onepass.test d69ddc4ee3415e40b0c5d1d0408488a87614d4f63ba9c44f3e52db541d6b7cc7 -F test/fts4opt.test 0fd0cc84000743ff2a883b9b84b4a5be07249f0ba790c8848a757164cdd46b2a -F test/fts4record.test a48508f69a84c9287c8019d3a1ae712f5730d8335ffaf8e2101e691d078950bb -F test/fts4rename.test 15fd9985c2bce6dea20da2245b22029ec89bd4710ed317c4c53abbe3cfd0c880 -F test/fts4umlaut.test fcaca4471de7e78c9d1f7e8976e3e8704d7d8ad979d57a739d00f3f757380429 -F test/fts4unicode.test ceca76422abc251818cb25dabe33d3c3970da5f7c90e1540f190824e6b3a7c95 -F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d -F test/func.test f673822636fb8ed618dd2b80230d16e495d19c8f2e2e7d6c22e93e2b3de097ad -F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f -F test/func3.test 2bb0f31ab7baaed690b962a88544d7be6b34fa389364bc36a44e441ed3e3f1e6 -F test/func4.test a94858a8c1f10a408b0b3db439c990b59dbb2349411d503de011ac4e2b5f27a6 -F test/func5.test 863e6d1bd0013d09c17236f8a13ea34008dd857d87d85a13a673960e4c25d82a -F test/func6.test 90e42b64c4f9fb6f04f44cb8a1da586c8542502e926b19c76504fe74ff2a9b7c -F test/fuzz-oss1.test e58330d01cbbd8215ee636b17a03fe220b37dbfa -F test/fuzz.test 96083052bf5765e4518c1ba686ce2bab785670d1 -F test/fuzz2.test 76dc35b32b6d6f965259508508abce75a6c4d7e1 -F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c31 -F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 -F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 -F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 656ee850f331872a784e7d6a10649efe2af123bdaacb728b5a03e4faee8b959c -F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f -F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f -F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba -F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e42ed2 -F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 -F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 -F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 209623791b0ad72ab39110c867af2080a79004e493c4da14ad661e790b5d1ed8 -F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 -F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 -F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 -F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test e89eafdf03245e2609ddf6e9b0add37a17ce229095836c409131764c3a5282a5 -F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 -F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 -F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 -F test/hidden.test 23c1393a79e846d68fd902d72c85d5e5dcf98711 -F test/hook.test 1604b3b2f5931430087540404555c1b6be3618600b81558657c66b533ed70b13 -F test/hook2.test b9ff3b8c6519fb67f33192f1afe86e7782ee4ac8 -F test/icu.test 716a6b89fbabe5cc63e0cd4c260befb08fd7b9d761f04d43669233292f0753b1 -F test/ieee754.test 806fc0ce7f305f57e3331eaceeddcfec9339e607 -F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 -F test/in.test ae4ba0fe3232fdd84ef1090a68c5cd6ccd93f1f8774d5c967dd0c1b301492eed -F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 -F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 -F test/in4.test 65460600d48933adba4283c6ebd089aae173d16136ab9d01f74c89089090c5a5 -F test/in5.test b32ce7f4a93f44c5dee94af16886d922cc16ebe33c8e1765c73d4049d0f4b40f -F test/in6.test 8562d0945195cab3cc4ab3794e9118e72cb44c43f785c2b04d48a9d06ca6b4ec -F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822 -F test/incrblob2.test a494c9e848560039a23974b9119cfc2cf3ad3bd15cc2694ee6367ae537ef8f1f -F test/incrblob3.test d8d036fde015d4a159cd3cbae9d29003b37227a4 -F test/incrblob4.test 21a52a6843a56cdcce968c6a86b72a7066d0e6ba -F test/incrblob_err.test 89372a28f1d98254f03fed705f9efcd34ef61a674df16d2dbb4726944a2de5e9 -F test/incrblobfault.test 74dd8ac108304cea0b4a0df6df63a1567e558758 -F test/incrcorrupt.test 6c567fbf870aa9e91866fe52ce6f200cd548939a -F test/incrvacuum.test 2aaee202b1f230e55779f70d155f6ba67bbdff8481d650214d256ab0f97d4a2b -F test/incrvacuum2.test 7d26cfda66c7e55898d196de54ac4ec7d86a4e3d -F test/incrvacuum3.test 75256fb1377e7c39ef2de62bfc42bbff67be295a -F test/incrvacuum_ioerr.test 6ae2f783424e47a0033304808fe27789cf93e635 -F test/index.test a2e948ed949e575487b5c1d521767d4584ac42d352f2dcd8e48004638e7bc7dc -F test/index2.test f835d5e13ca163bd78c4459ca15fd2e4ed487407 -F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473ade0 -F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 -F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 -F test/index6.test f172653b35b20233e59200e8b92a76db61bf7285437bf777b93b306ba26a47e7 -F test/index7.test 1d764c0cca45f5a76150b08e127ccc8d52492cfa788b5fafed4be784a351b020 -F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 -F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 -F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e -F test/indexexpr1.test 284e119999d132cc8bf37735a928c9859b28e8e295d02b7a6a4f93977c7f9ba5 -F test/indexexpr2.test dba11dbb0a58fcba4cd694f46b4004976123b81b0501f525d43c9be59f0207b1 -F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 -F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 -F test/insert.test 4e3f0de67aac3c5be1f4aaedbcea11638f1b5cdc9a3115be14d19aa9db7623c6 -F test/insert2.test 4d14b8f1b810a41995f6286b64a6943215d52208 -F test/insert3.test 1b7db95a03ad9c5013fdf7d6722b6cd66ee55e30 -F test/insert4.test fb9e0f752c75f453555990250b449f6d123ae6a3ebf054d14e4470de4498dce3 -F test/insert5.test 394f96728d1258f406fe5f5aeb0aaf29487c39a6 -F test/insertfault.test ac63d14ea3b49c573673a572f4014b9117383a03e497c58f308b5c776e4a7f74 -F test/instr.test 107df2b9b74a4b59315916b575590a08f2a714de0754abe541f10a0971d0a2a4 -F test/instrfault.test 95e28efade652e6d51ae11b377088fe523a581a07ec428009e152a4dd0e0f44c -F test/intarray.test bb976b0b3df0ebb6a2eddfb61768280440e672beba5460ed49679ea984ccf440 -F test/interrupt.test 16ea879ec728cb76414c148c5f24afd5d1f91054 -F test/interrupt2.test e4408ca770a6feafbadb0801e54a0dcd1a8d108d -F test/intpkey.test ac71107a49a06492b69b82aafaf225400598d3c8 -F test/intreal.test 2a87e85a5949bd55e41ef04c58f5800587c5380bdbc559ff1c79b614b0e6a533 -F test/io.test f95bca1783b01ea7761671560d023360d2dfa4cc -F test/ioerr.test 470fcc78e9cd352d162baf782fe301ea807d764241f58a48fc58109c2dfcdb6b -F test/ioerr2.test 2593563599e2cc6b6b4fcf5878b177bdd5d8df26 -F test/ioerr3.test d3cec5e1a11ad6d27527d0d38573fbff14c71bdd -F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c -F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 -F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b -F test/istrue.test 75327829744e65cc8700e69340b8e6c192e10e39dfae7ccb0e970d3c4f49090a -F test/join.test bca044589e94bb466e4c1e91fb6fecdc3f3326ca6b3f590f555f1958156eb321 -F test/join2.test 7d24d095ab88d3910228d53a3b548b7baf2e0e7d8aac6731a273e300e1b34b61 -F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 -F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 -F test/join5.test 3a96dc62f0b45402d7207e22d1993fe0c2fce1c57644a11439891dd62b990eb7 -F test/join6.test cfe6503791ceb0cbb509966740286ec423cbf10b -F test/journal1.test c7b768041b7f494471531e17abc2f4f5ebf9e5096984f43ed17c4eb80ba34497 -F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4 -F test/journal3.test 7c3cf23ffc77db06601c1fcfc9743de8441cb77db9d1aa931863d94f5ffa140e -F test/jrnlmode.test 9b5bc01dac22223cb60ec2d5f97acf568d73820794386de5634dcadbea9e1946 -F test/jrnlmode2.test 8759a1d4657c064637f8b079592651530db738419e1d649c6df7048cd724363d -F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa -F test/json101.test bb71538005f2d9e18620bdd3b76839a93ca0be61903eb8d751a64e78cf99b8fb -F test/json102.test eeb54efa221e50b74a2d6fb9259963b48d7414dca3ce2fdfdeed45cb28487bc1 -F test/json103.test aff6b7a4c17d5a20b487a7bc1a274bfdc63b829413bdfb83bedac42ec7f67e3b -F test/json104.test 317f4ec4b2d87afbba4d2460cf5be297aea76f2285eb618d276dbcd40a50950f -F test/json105.test 45f7d6a9a54c85f8a9589b68d3e7a1f42d02f2359911a8cdbad1f9988f571173 -F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff -F test/kvtest.c 94da54bb66aae7a54e47cf7e4ea4acecc0f217560f79ad3abfcc0361d6d557ba -F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63 -F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200 -F test/lemon-test01.y 58b764610fd934e189ffbb0bbfa33d171b9cb06019b55bdc04d090d6767e11d7 -F test/like.test 47b81d5de2ff19d996d49a65d50ec9754246aacbe0e950b48d186d9d8171eaf0 -F test/like2.test 3b2ee13149ba4a8a60b59756f4e5d345573852da -F test/like3.test 03d1bdf848483b78d2cfd1db283d75c4ec2e37c8b8eccc006813f3978d78fbbd -F test/limit.test 0c99a27a87b14c646a9d583c7c89fd06c352663e -F test/limit2.test 9409b033284642a859fafc95f29a5a6a557bd57c1f0d7c3f554bd64ed69df77e -F test/loadext.test faa4f6eed07a5aac35d57fdd7bc07f8fc82464cfd327567c10cf0ba3c86cde04 -F test/loadext2.test 0408380b57adca04004247179837a18e866a74f7 -F test/lock.test be4fe08118fb988fed741f429b7dd5d65e1c90db -F test/lock2.test 5242d8ac4e2d59c403aebff606af449b455aceff -F test/lock3.test f271375930711ae044080f4fe6d6eda930870d00 -F test/lock4.test 27143363eda1622f03c133efc8db808fc331afd973486cb571ea71cd717d37b8 -F test/lock5.test c6c5e0ebcb21c61a572870cc86c0cb9f14cede38 -F test/lock6.test ad5b387a3a8096afd3c68a55b9535056431b0cf5 -F test/lock7.test 49f1eaff1cdc491cc5dee3669f3c671d9f172431 -F test/lock_common.tcl 2f3f7f2e9637f93ccf609df48ef5b27a50278b6b1cd752b445d52262e5841413 -F test/lookaside.test 5a828e7256f1ee4da8e1bdaa03373a3ccdb0f1ff98dfa82e9b76cb41a45b1083 -F test/main.test 6bbb3999fd461eb8fb335cbab97409a3d7f91bbb8da60635e8be3e4a04a77772 -F test/make-where7.tcl 05c16b5d4f5d6512881dfec560cb793915932ef9 -F test/malloc.test 18dd1c4188c81ca79cf123527c71b19ee0c31feb9947fdffb0dc6ceb1436816a -F test/malloc3.test 6e88bae6312854a4adb4ecc2a6a5ea8c59b4db778b724ba718e1c43fc8c3c136 -F test/malloc4.test 957337613002b7058a85116493a262f679f3a261 -F test/malloc5.test 2e4ad7684a13389a44a840499cd47173a8d05f22f082d7d083eece433a7a64eb -F test/malloc6.test 2f039d9821927eacae43e1831f815e157659a151 -F test/malloc7.test 7c68a32942858bc715284856c5507446bba88c3a -F test/malloc8.test 9b7a3f8cb9cf0b12fff566e80a980b1767bd961d -F test/malloc9.test 2307c6ee3703b0a21391f3ea92388b4b73f9105e -F test/mallocA.test aea76f2dd8bcc2d19748f6b911e876cefda74a563753bf26af046e9d34bb97e6 -F test/mallocAll.test 98f1be74bc9f49a858bc4f361fc58e26486798be -F test/mallocB.test bc475ab850cda896142ab935bbfbc74c24e51ed6 -F test/mallocC.test 3dffe16532f109293ce1ccecd0c31dca55ef08c4 -F test/mallocD.test f78c295e8e18ea3029e65ca08278690e00c22100 -F test/mallocE.test db1ed69d7eded1b080952e2a7c37f364ad241b08 -F test/mallocF.test 2d5c590ebc2fc7f0dcebdf5aa8498b9aed69107e -F test/mallocG.test 0ff91b65c50bdaba680fb75d87fe4ad35bb7934f -F test/mallocH.test 79b65aed612c9b3ed2dcdaa727c85895fd1bfbdb -F test/mallocI.test 6c23a71df077fa5d387be90e7e669c5b368ca38a -F test/mallocJ.test b5d1839da331d96223e5f458856f8ffe1366f62e -F test/mallocK.test 1f4b5efbf61715ab79b20b38739ff4b3d110ceb53f54e5db6da1f01c083707ab -F test/mallocL.test fb311ff80afddf3b1a75e52289081f4754d901dc -F test/mallocM.test 78bbe9d3da84a5c679123cdb40d7b2010b18fc46e13897e4f253c6ba6fbff134 -F test/malloc_common.tcl aac62499b76be719fac31e7a3e54a7fd53272e7f -F test/malloctraceviewer.tcl b7a54595270c1d201abf1c3f3d461f27eaf24cdef623ad08a0fe5e411264c8a9 -F test/manydb.test 28385ae2087967aa05c38624cec7d96ec74feb3e -F test/mem5.test c6460fba403c5703141348cd90de1c294188c68f -F test/memdb.test c1f2a343ad14398d5d6debda6ea33e80d0dafcc7 -F test/memdb1.test 58d92c2bf622cc5f0f41461e1b35cf64f3f787199544c2c1dada37d88753f9d4 -F test/memleak.test 10b9c6c57e19fc68c32941495e9ba1c50123f6e2 -F test/memsubsys1.test 9e7555a22173b8f1c96c281ce289b338fcba2abe8b157f8798ca195bbf1d347e -F test/memsubsys2.test 3e4a8d0c05fd3e5fa92017c64666730a520c7e08 -F test/minmax.test 6751e87b409fe11b02e70a306d846fa544e25a41 -F test/minmax2.test 1edf66901ddfab26ae1e04165e8da834c8d3284e2b20aefb26b80ef217962eab -F test/minmax3.test cc1e8b010136db0d01a6f2a29ba5a9f321034354 -F test/minmax4.test 272ca395257f05937dc96441c9dde4bc9fbf116a8d4fa02baeb0d13d50e36c87 -F test/misc1.test 7ce84b25df9872e7d7878613a96815d2ba5bc974ac4e15a50118dde8f3917599 -F test/misc2.test 00d7de54eda90e237fc9a38b9e5ccc769ebf6d4d -F test/misc3.test cf3dda47d5dda3e53fc5804a100d3c82be736c9d -F test/misc4.test 10cd6addb2fa9093df4751a1b92b50440175dd5468a6ec84d0386e78f087db0e -F test/misc5.test c4aeaa0fa28faa08f2485309c38db4719e6cd1364215d5687a5b96d340a3fa58 -F test/misc6.test 953cc693924d88e6117aeba16f46f0bf5abede91 -F test/misc7.test 4f21954012e4eb0a923c54a311f38c81bf6798ccdd7b51584db46d4007f63daa -F test/misc8.test 8782708f4c8a459591c3e8fe1215bd2048bffb4024b3df249e9b9ed407dc61ed -F test/misuse.test 9e7f78402005e833af71dcab32d048003869eca5abcaccc985d4f8dc1d86bcc7 -F test/mjournal.test 28a08d5cb5fb5b5702a46e19176e45e964e0800d1f894677169e79f34030e152 -F test/mmap1.test fb04e0c10492455007624ade884ca0c8852ff3e4e11d95408f9709ca2ef7f626 -F test/mmap2.test 9d6dd9ddb4ad2379f29cc78f38ce1e63ed418022 -F test/mmap3.test b3c297e78e6a8520aafcc1a8f140535594c9086e -F test/mmap4.test 2e2b4e32555b58da15176e6fe750f17c9dcf7f93 -F test/mmapfault.test d4c9eff9cd8c2dc14bc43e71e042f175b0a26fe3 -F test/mmapwarm.test 2272005969cd17a910077bd5082f70bc1fefad9a875afec7fc9af483898ecaf3 -F test/multiplex.test dc0d67b66f84b484a83cb8bbdf3f0a7f49562ccd -F test/multiplex2.test 580ca5817c7edbe4cc68fa150609c9473393003a -F test/multiplex3.test d228f59eac91839a977eac19f21d053f03e4d101 -F test/multiplex4.test e8ae4c4bd70606a5727743241f13b5701990abe4 -F test/mutex1.test ea2cc74d97f077b9e74c84cbd024f14d79a8126f -F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660 -F test/nan.test 437d40e6d0778b050d7750726c0cbd2c9936b81962926e8f8c48ca698f00f4d1 -F test/nockpt.test 8c43b25af63b0bd620cf1b003529e37b6f1dc53bd22690e96a1bd73f78dde53a -F test/nolock.test f196cf8b8fbea4e2ca345140a2b3f3b0da45c76e -F test/normalize.test f23b6c5926c59548635fcf39678ac613e726121e073dd902a3062fbb83903b72 -F test/notify1.test 669b2b743618efdc18ca4b02f45423d5d2304abf -F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 -F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 -F test/notnull.test a37b663d5bb728d66fc182016613fb8e4a0a4bbf3d75b8876a7527f7d4ed3f18 -F test/null.test 0dcce4f04284ec66108c503327ad6d224c0752b3 -F test/nulls1.test 82c5bc33148405f21205865abf13c786084438d573a4ac4e87e11b6091cde526 -F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1 -F test/numindex1.test 20a5450d4b056e48cd5db30e659f13347a099823 -F test/offset1.test f06b83657bcf26f9ce805e67450e189e282143b2 -F test/openv2.test 0d3040974bf402e19b7df4b783e447289d7ab394 -F test/optfuzz-db01.c a0c256905c8ac79f9a5de2f374a3d9f757bef0dca2a238dc7c10cc8a38031834 -F test/optfuzz-db01.txt 21f6bdeadc701cf11528276e2a55c70bfcb846ba42df327f979bd9e7b6ce7041 -F test/optfuzz.c 50e330304eb1992e15ddd11f3daaad9bcc0d9aaad09cb2bcc77f9515df2e88b1 -F test/orderby1.test 6bf0ce45cbfb1cf4779dd418ac5e8cf66abfa04de2c1d2edf1e0e85f1520d8f3 -F test/orderby2.test bc11009f7cd99d96b1b11e57b199b00633eb5b04 -F test/orderby3.test 8619d06a3debdcd80a27c0fdea5c40b468854b99 -F test/orderby4.test 4d39bfbaaa3ae64d026ca2ff166353d2edca4ba4 -F test/orderby5.test bd7d9e3380e87e5dcf6ea817ebaab6d15da213c7804b38767e1b3e695e85650b -F test/orderby6.test 8b38138ab0972588240b3fca0985d2e400432859 -F test/orderby7.test 3d1383d52ade5b9eb3a173b3147fdd296f0202da -F test/orderby8.test 23ef1a5d72bd3adcc2f65561c654295d1b8047bd -F test/orderby9.test 87fb9548debcc2cd141c5299002dd94672fa76a3 -F test/orderbyA.test df608e59efc2ef50c1eddf1a773b272de3252e9401bfec86d04b52fd973866d5 -F test/oserror.test 1fc9746b83d778e70d115049747ba19c7fba154afce7cc165b09feb6ca6abbc5 -F test/ossfuzz.c 9636dad2092a05a32110df0ca06713038dd0c43dd89a77dabe4b8b0d71096715 -F test/ossshell.c f125c5bd16e537a2549aa579b328dd1c59905e7ab1338dfc210e755bb7b69f17 -F test/ovfl.test 199c482696defceacee8c8e0e0ef36da62726b2f -F test/pager1.test 1e9ee778bdeaf4f7f09997d029cdaca6a42dfc2092edafe4f5e590acbf1eab13 -F test/pager2.test 67b8f40ae98112bcdba1f2b2d03ea83266418c71 -F test/pager3.test 4e9a83d6ca0838d7c602c9eb93d1357562d9059c1e02ffb138a8271020838370 -F test/pager4.test a122e9e6925d5b23b31e3dfef8c6a44bbf19590e -F test/pagerfault.test 63c5da625562c66345ab4528790327ca63db2f6f9cbae2aba8cb7c51de3d1628 -F test/pagerfault2.test caf4c7facb914fd3b03a17b31ae2b180c8d6ca1f -F test/pagerfault3.test 1003fcda009bf48a8e22a516e193b6ef0dd1bbd8 -F test/pageropt.test 84e4cc5cbca285357f7906e99b21be4f2bf5abc0 -F test/pagesize.test 5769fc62d8c890a83a503f67d47508dfdc543305 -F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b -F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 -F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff -F test/permutations.test c83339862d72b6272f957905205f874e6eefdbad2823380452c4f0128fd3d906 -F test/pg_common.tcl 222a1bad1c41c308fa366313cd7b51b3be7e9b21c8736a421b974ac941693b54 -F test/pragma.test 59becdfd720b80d463ab750f69f7118fde10dfd556aa5d554f3bf6b7e5ea7533 -F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f -F test/pragma3.test 92a46bbea12322dd94a404f49edcfbfc913a2c98115f0d030a7459bb4712ef31 -F test/pragma4.test 10c624e45a83c0096a82a7579a5ff658542391d3b77355192da6572c8c17c00b -F test/pragma5.test 7b33fc43e2e41abf17f35fb73f71b49671a380ea92a6c94b6ce530a25f8d9102 -F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8 -F test/prefixes.test b524a1c44bffec225b9aec98bd728480352aa8532ac4c15771fb85e8beef65d9 -F test/printf.test 1e0e469f5f8a09afa8a182f34647e3d9b8c01978cbbe2313a194ccc3a8471506 -F test/printf2.test 30b5dd0b4b992dc5626496846ecce17ff592cacbcb11c3e589f3ac4d7e129dae -F test/progress.test ebab27f670bd0d4eb9d20d49cef96e68141d92fb -F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc -F test/pushdown.test 5e72c51c5e33253ed639ccee1e01ce62d62b6eee5ca893cd82334e4ee7b1d7fc -F test/queryonly.test 5f653159e0f552f0552d43259890c1089391dcca -F test/quick.test 1681febc928d686362d50057c642f77a02c62e57 -F test/quota-glob.test 32901e9eed6705d68ca3faee2a06b73b57cb3c26 -F test/quota.test bfb269ce81ea52f593f9648316cd5013d766dd2a -F test/quota2.test 7dc12e08b11cbc4c16c9ba2aa2e040ea8d8ab4b8 -F test/quote.test 626149eda89ee64d81a3790de370f9f0211921b11568a49c28c861f394330508 -F test/randexpr1.tcl 40dec52119ed3a2b8b2a773bce24b63a3a746459 -F test/randexpr1.test eda062a97e60f9c38ae8d806b03b0ddf23d796df -F test/rbu.test 168573d353cd0fd10196b87b0caa322c144ef736 -F test/rdonly.test 64e2696c322e3538df0b1ed624e21f9a23ed9ff8 -F test/recover.test ccb8c2623902a92ebb76770edd075cb4f75a4760bb7afde38026572c6e79070d -F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 -F test/regexp2.test 40e894223b3d6672655481493f1be12012f2b33c -F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2118d -F test/releasetest.tcl fb76d8fcc95ac29d6356cd9e52b726ab9e43a24082897618dfbcb7c2b0049153 x -F test/releasetest_data.tcl 9919fc6ac5bc92f8878fecfd1840db15999f660a6c9f609240b41aa62b885c88 -F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b -F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb -F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa -F test/rollback2.test bc868d57899dc6972e2b4483faae0e03365a0556941474eec487ae21d8d38bb6 -F test/rollbackfault.test 0e646aeab8840c399cfbfa43daab46fd609cf04a -F test/round1.test 768018b04522ca420b1aba8a24bd76091d269f3bce3902af3ec6ebcee41ab21e -F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc -F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81 -F test/rowid.test bfbd7b97d9267660be3c8f28507c4ed7f205196b8877c0db42df347c2e8845e3 -F test/rowvalue.test 8964f95b253d3b5cc8dc1cfd0cdb7529bce3ecc6b6259e23c5f829f80f4d51cd -F test/rowvalue2.test 060d238b7e5639a7c5630cb5e63e311b44efef2b -F test/rowvalue3.test 3068f508753af69884b12125995f023da0dbb256 -F test/rowvalue4.test 02e35f7762371c2f57ebd856aa056eac56cb27ef7715a0bb31eac1895a745356 -F test/rowvalue5.test c81c7d8cf36711ab37675ad7376084ae2a359cb6 -F test/rowvalue6.test d19b54feb604d5601f8614b15e214e0774c01087 -F test/rowvalue7.test c1cbdbf407029db01f87764097c6ac02a1c5a37efd2776eff32a9cdfdf6f2dba -F test/rowvalue8.test 5900eddad9e2c3c2e26f1a95f74aafc1232ee5e0 -F test/rowvalue9.test d8dd2c6ecac432dadaa79e41dc2434f007be1b6b -F test/rowvaluefault.test 7cd9ccc6c2fbdd881672984087aad0491bb75504 -F test/rowvaluevtab.test cd9747bb3f308086944c07968f547ad6b05022e698d80b9ffbdfe09ce0b8da6f -F test/rtree.test 0c8d9dd458d6824e59683c19ab2ffa9ef946f798 -F test/run-wordcount.sh 891e89c4c2d16e629cd45951d4ed899ad12afc09 -F test/savepoint.test 1f8a6b1aea9a0d05837adc463d4bf47bd9d0f1c842f1c2a9caccd639baf34bf9 -F test/savepoint2.test 9b8543940572a2f01a18298c3135ad0c9f4f67d7 -F test/savepoint4.test c8f8159ade6d2acd9128be61e1230f1c1edc6cc0 -F test/savepoint5.test 0735db177e0ebbaedc39812c8d065075d563c4fd -F test/savepoint6.test f41279c5e137139fa5c21485773332c7adb98cd7 -F test/savepoint7.test cde525ea3075283eb950cdcdefe23ead4f700daa -F test/savepointfault.test f044eac64b59f09746c7020ee261734de82bf9b2 -F test/scanstatus.test 874e35011779b07725a47dbf1dd6282b0ca04af7e028fb0b534ee544b571be42 -F test/schema.test 5dd11c96ba64744de955315d2e4f8992e447533690153b93377dffb2a5ef5431 -F test/schema2.test 906408621ea881fdb496d878b1822572a34e32c5 -F test/schema3.test 1bc1008e1f8cb5654b248c55f27249366eb7ed38 -F test/schema4.test 3b26c9fa916abb6dadf894137adcf41b7796f7b9 -F test/schema5.test 29699b4421f183c8f0e88bd28ce7d75d13ea653e -F test/schema6.test e4bd1f23d368695eb9e7b51ef6e02ca0642ea2ab4a52579959826b5e7dce1f9b -F test/schemafault.test 1936bceca55ac82c5efbcc9fc91a1933e45c8d1e1d106b9a7e56c972a5a2a51e -F test/securedel.test 2f70b2449186a1921bd01ec9da407fbfa98c3a7a5521854c300c194b2ff09384 -F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5 -F test/select1.test 009a6d8eacd9684d046302b8d13b50846a87e39d6f08e92178aa13e95ea29a2d -F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56 -F test/select3.test ddd1bc6d0c8dece136321c11bd26d0d8ad17f2b27c72935fdd6574d8cb99d1d4 -F test/select4.test e8a2502e3623f3058871030599a48abb35789d2244d5b380ecf3696873fdd4a4 -F test/select5.test df9ec0d218cedceb4fe7b63262025b547b50a55e59148c6f40b60ca25f1d4546 -F test/select6.test 319d45e414cdd321bf17cfacedaf19e3935ad64dac357c53f1492338c6e9b801 -F test/select7.test f659f231489349e8c5734e610803d7654207318f -F test/select8.test 8c8f5ae43894c891efc5755ed905467d1d67ad5d -F test/select9.test aebc2bb0c3bc44606125033cbcaac2c8d1f33a95 -F test/selectA.test b8a590f6493cad5b0bb4dfe1709bf7dcda0b6c40bb4caf32d1e36a89eebc8fc5 -F test/selectB.test 954e4e49cf1f896d61794e440669e03a27ceea25 -F test/selectC.test e25243f8ca503e06f252eb0218976d07cfeceac3 -F test/selectD.test fc20452847a01775710090383cfb4423275d2f745fed61f34fbf37573ac0d214 -F test/selectE.test a8730ca330fcf40ace158f134f4fe0eb00c7edbf -F test/selectF.test 21c94e6438f76537b72532fa9fd4710cdd455fc3 -F test/selectG.test 089f7d3d7e6db91566f00b036cb353107a2cca6220eb1cb264085a836dae8840 -F test/server1.test c2b00864514a68a0e6fd518659dc95d0050307a357a08969872bef027d785dc4 -F test/session.test 78fa2365e93d3663a6e933f86e7afc395adf18be -F test/sessionfuzz-data1.db 1f8d5def831f19b1c74571037f0d53a588ea49a6c4ca2a028fc0c27ef896dbcb -F test/sessionfuzz.c be9c4d4afd359ce80024d8b541b9b8a880510aef5cf263df56fc0e9b947727f1 -F test/shared.test 1826673eb5eb745fb91a3bdac99a7737057742ae38dcb0fe076a384d6727578b -F test/shared2.test 03eb4a8d372e290107d34b6ce1809919a698e879 -F test/shared3.test ab693f9b6e156b8bfb2a0ad94f29fe69602a5d38 -F test/shared4.test c75f476804e76e26bf6fa0e7b421fb0ca7d07558 -F test/shared6.test 866bb4982c45ce216c61ded5e8fde4e7e2f3ffa9 -F test/shared7.test a81e99f83e6c51b02ac99c96fb3a2a7b5978c956 -F test/shared8.test 933ed7d71f598bb6c7a8c192a3cd30f2562fdccf514df383798599c34ffa672f -F test/shared9.test 5f2a8f79b4d6c7d107a01ffa1ed05ae7e6333e21 -F test/sharedA.test 49d87ec54ab640fbbc3786ee3c01de94aaa482a3a9f834ad3fe92770eb69e281 -F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e -F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939 -F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 -F test/shell1.test 5bd10014ec494744f5e966a1521334e9d612119a0afcfa5251684a4e1f2ffc66 -F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b -F test/shell3.test ac8c2b744014c3e9a0e26bfd829ab65f00923dc1a91ffd044863e9423cc91494 -F test/shell4.test 1c6aef11daaa2d6830acaba3ac9cbec93fbc1c3d5530743a637f39b3987d08ce -F test/shell5.test 84a30b55722a95a5b72989e691c469a999ca7591e7aa00b7fabc783ea5c9a6fe -F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 -F test/shell7.test 115132f66d0463417f408562cc2cf534f6bbc6d83a6d50f0072a9eb171bae97f -F test/shell8.test 96be02ea0c21f05b24c1883d7b711a1fa8525a68ab7b636aacf6057876941013 -F test/shmlock.test 3dbf017d34ab0c60abe6a44e447d3552154bd0c87b41eaf5ceacd408dd13fda5 -F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 -F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5 -F test/shrink.test 1b4330b1fd9e818c04726d45cb28db73087535ce -F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329 -F test/skipscan1.test ed524bc86f27646b3a297f45d6557b55db338977b6838f8064b196b35848b31b -F test/skipscan2.test 3eb703ce794f139e7b83567911046298bcde29606116727f9b700ce34f559d2d -F test/skipscan3.test ec5bab3f81c7038b43450e7b3062e04a198bdbb5 -F test/skipscan5.test 67817a4b6857c47e0e33ba3e506da6f23ef68de2 -F test/skipscan6.test 0b4cd1b4ac9f84d91454df513c99a4932fa07e8f27b8049bea605068b3e34ac7 -F test/snapshot.test a504f2e7009f512ef66c719f0ea1c55a556bdaf1e1312c80a04d46fc1a3e9632 -F test/snapshot2.test 8d6ff5dd9cc503f6e12d408a30409c3f9c653507b24408d9cd7195931c89bc54 -F test/snapshot3.test 8744313270c55f6e18574283553d3c5c5fe4c5970585663613a0e75c151e599b -F test/snapshot4.test d4e9347ef2fcabc491fc893506c7bbaf334da3be111d6eb4f3a97cc623b78322 -F test/snapshot_fault.test f6c5ef7cb93bf92fbb4e864ecc5c87df7d3a250064838822db5b4d3a5563ede4 -F test/snapshot_up.test a0a29c4cf33475fcef07c3f8e64af795e24ab91b4cc68295863402a393cdd41c -F test/soak.test 18944cf21b94a7fe0df02016a6ee1e9632bc4e8d095a0cb49d95e15d5cca2d5c -F test/softheap1.test 843cd84db9891b2d01b9ab64cef3e9020f98d087 -F test/sort.test c2adc635c2564241fefec0b3a68391ef6868fd3b -F test/sort2.test cc23b7c19d684657559e8a55b02f7fcee03851d0 -F test/sort3.test 1480ed7c4c157682542224e05e3b75faf4a149e5 -F test/sort4.test 5c34d9623a4ae5921d956dfa2b70e77ed0fc6e5c -F test/sort5.test 6b43ae0e2169b5ceed441844492e55ba7f1ae0790528395ddf7888ab3094525d -F test/sorterref.test a13ed207a0eea3c7898f308f979bfb518f68c598ec737d2c494dfd3deaa83506 -F test/sortfault.test d4ccf606a0c77498e2beb542764fd9394acb4d66 -F test/speed1.test f2974a91d79f58507ada01864c0e323093065452 -F test/speed1p.explain d841e650a04728b39e6740296b852dccdca9b2cb -F test/speed1p.test b180e98609c7677382cf618c0ec9b69f789033a8 -F test/speed2.test 53177056baf6556dcbdcf032bbdfc41c1aa74ded -F test/speed3.test 694affeb9100526007436334cf7d08f3d74b85ef -F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 -F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa -F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c -F test/speedtest1.c d564e7689a731f691adfe2cf3f3f735d3e11f100eebb065e2a0a267fdc39fb26 -F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e -F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 -F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 -F test/spellfix4.test 51c7c26514ade169855c66bcf130bd5acfb4d7fd090cc624645ab275ae6a41fb -F test/sqldiff1.test 28cd737cf1b0078b1ec1bbf425e674c47785835e -F test/sqllimits1.test 264f4b0f941800ba139d25e33ee919c5d95fea06dfbe8ac291d6811a30984ca5 -F test/sqllog.test 6af6cb0b09f4e44e1917e06ce85be7670302517a -F test/stat.test 423257dc36e5865fb9dd1d9051ac985763b6fba1daec134932f37772d5ed1e64 -F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 -F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 -F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 -F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49 -F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f -F test/subquery2.test 90cf944b9de8204569cf656028391e4af1ccc8c0cc02d4ef38ee3be8de1ffb12 -F test/subselect.test 0966aa8e720224dbd6a5e769a3ec2a723e332303 -F test/substr.test 18f57c4ca8a598805c4d64e304c418734d843c1a -F test/subtype1.test 7fe09496352f97053af1437150751be2d0a0cae8 -F test/superlock.test ec94f0556b6488d97f71c79f9061ae08d9ab8f12 -F test/swarmvtab.test 9a3fd5ab3e9b3c976ad1b3d7646aab725114f2ac26b59395d0778b33bab6cdaf -F test/swarmvtab2.test c948cb2fdfc5b01d85e8f6d6504854202dc1a0782ab2a0ed61538f27cbd0aa5c -F test/swarmvtab3.test 247aa38b6ebd2b99db2075847ae47e789ac34f1c2ab5c720dfcffd990004c544 -F test/swarmvtabfault.test 8a67a9f27c61073a47990829e92bc0c64420a807cb642b15a25f6c788210ed95 -F test/symlink.test 72b22238d4405ba34df8e60b335d290a3b1129fd5c260835c944c1e4e77288a9 -F test/symlink2.test 9531f475a53d8781c4f81373f87faf2e2aff4f5fb2102ec6386e0c827916a670 -F test/sync.test 89539f4973c010eda5638407e71ca7fddbcd8e0594f4c9980229f804d4333092 -F test/sync2.test 8f9f7d4f6d5be8ca8941a8dadcc4299e558cb6a1ff653a9469146c7a76ef2039 -F test/syscall.test a39d9a36f852ae6e4800f861bc2f2e83f68bbc2112d9399931ecfadeabd2d69d -F test/sysfault.test c9f2b0d8d677558f74de750c75e12a5454719d04 -F test/tabfunc01.test 5ca6d004157a3e886a55a9387b960cc0db41acd88753eb597ff409ec6cfb1be0 -F test/table.test eb3463b7add9f16a5bb836badf118cf391b809d09fdccd1f79684600d07ec132 -F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f177f4 -F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 -F test/tclsqlite.test 79a473f5797e317c08f2c4f8192edb3eea6a67329b1087453328b66a7cb31070 -F test/tempdb.test 4cdaa23ddd8acb4d79cbb1b68ccdfd09b0537aaba909ca69a876157c2a2cbd08 -F test/tempdb2.test 353864e96fd3ae2f70773d0ffbf8b1fe48589b02c2ec05013b540879410c3440 -F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900 -F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 -F test/temptable2.test d2940417496e2b9548e01d09990763fbe88c316504033256d51493e1f1a5ce6a -F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637 -F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc -F test/tester.tcl fd9d134a7cc4e31b307ad028a195f51cdcf556fc620d74b680515562f0137f25 -F test/thread001.test b61a29dd87cf669f5f6ac96124a7c97d71b0c80d9012746072055877055cf9ef -F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 -F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7 -F test/thread004.test f51dfc3936184aaf73ee85f315224baad272a87f -F test/thread005.test 50d10b5684399676174bd96c94ad4250b1a2c8b6 -F test/thread1.test df115faa10a4ba1d456e9d4d9ec165016903eae4 -F test/thread2.test f35d2106452b77523b3a2b7d1dcde2e5ee8f9e46 -F test/thread_common.tcl 334639cadcb9f912bf82aa73f49efd5282e6cadd -F test/threadtest1.c 6029d9c5567db28e6dc908a0c63099c3ba6c383b -F test/threadtest2.c a70a8e94bef23339d34226eb9521015ef99f4df8 -F test/threadtest3.c 4b413718ab3ef5e4f9f1ab0502b89707c5a9ccdc -F test/threadtest4.c c1e67136ceb6c7ec8184e56ac61db28f96bd2925 -F test/time-wordcount.sh 8e0b0f8109367827ad5d58f5cc849705731e4b90 -F test/tkt-02a8e81d44.test 6c80d9c7514e2a42d4918bf87bf6bc54f379110c -F test/tkt-18458b1a.test 6a62cb1ee50fa3c620da59e3a6f531eb38fceaf7e2166203816b724524e6f1d6 -F test/tkt-26ff0c2d1e.test c15bec890c4d226c0da2f35ff30f9e84c169cfef90e73a8cb5cec11d723dfa96 -F test/tkt-2a5629202f.test 0521bd25658428baa26665aa53ffed9367d33af2 -F test/tkt-2d1a5c67d.test be1326f3061caec85085f4c9ee4490561ca037c0 -F test/tkt-2ea2425d34.test 1cf13e6f75d149b3209a0cb32927a82d3d79fb28 -F test/tkt-31338dca7e.test 6fb8807851964da0d24e942f2e19c7c705b9fb58 -F test/tkt-313723c356.test 4b306ad45c736cedf2f5221f6155b92143244b6d -F test/tkt-385a5b56b9.test 5204a7cba0e28c99df0acbf95af5e1af4d32965a7a14de6eccebf949607618b1 -F test/tkt-38cb5df375.test f3cc8671f1eb604d4ae9cf886ed4366bec656678 -F test/tkt-3998683a16.test 6d1d04d551ed1704eb3396ca87bb9ccc8c5c1eb7 -F test/tkt-3a77c9714e.test 90e3e8455ee945a4076d4c44062b8845708af24a880355328fe7008f2047c9f0 -F test/tkt-3fe897352e.test 27e26eb0f1811aeba4d65aba43a4c52e99da5e70 -F test/tkt-4a03edc4c8.test 91c0e135888cdc3d4eea82406a44b05c8c1648d0 -F test/tkt-4c86b126f2.test cbcc611becd0396890169ab23102dd70048bbc9a -F test/tkt-4dd95f6943.test 3d0ce415d2ee15d3d564121960016b9c7be79407 -F test/tkt-4ef7e3cfca.test 3965ae11cc9cf6e334f9d7d3c1e20bf8d56254b1 -F test/tkt-54844eea3f.test a12b851128f46a695e4e378cca67409b9b8f5894 -F test/tkt-5d863f876e.test 726e76d725f6fe0eb2fc8a522b721b79807380ee -F test/tkt-5e10420e8d.test 904d1687b3c06d43e5b3555bbcf6802e7c0ffd84 -F test/tkt-5ee23731f.test 9db6e1d7209dc0794948b260d6f82b2b1de83a9f -F test/tkt-6bfb98dfc0.test 24780633627b5cfc0635a5500c2389ebfb563336 -F test/tkt-752e1646fc.test ea78d88d14fe9866bdd991c634483334639e13bf -F test/tkt-78e04e52ea.test cb44d0f5e7940223be740a39913a1b9b9b30d7e4a17ed3349141f893bae1b8f2 -F test/tkt-7a31705a7e6.test 9e9c057b6a9497c8f7ba7b16871029414ccf6550e7345d9085d6d71c9a56bb6f -F test/tkt-7bbfb7d442.test 7b2cd79c7a17ae6750e75ec1a7846712a69c9d18 -F test/tkt-80ba201079.test 105a721e6aad0ae3c5946d7615d1e4d03f6145b8 -F test/tkt-80e031a00f.test 9ee36348b761bf7c14261e002b75a4c0d5a04d4c -F test/tkt-8454a207b9.test c583a9f814a82a2b5ba95207f55001c9f0cd816c -F test/tkt-868145d012.test a5f941107ece6a64410ca4755c6329b7eb57a356 -F test/tkt-8c63ff0ec.test 258b7fc8d7e4e1cb5362c7d65c143528b9c4cbed -F test/tkt-91e2e8ba6f.test 08c4f94ae07696b05c9b822da0b4e5337a2f54c5 -F test/tkt-94c04eaadb.test f738c57c7f68ab8be1c054415af7774617cb6223 -F test/tkt-9a8b09f8e6.test b2ef151d0984b2ebf237760dbeaa50724e5a0667 -F test/tkt-9d68c883.test 16f7cb96781ba579bc2e19bb14b4ad609d9774b6 -F test/tkt-9f2eb3abac.test cb6123ac695a08b4454c3792fbe85108f67fabf8 -F test/tkt-a7b7803e.test 159ef554234fa1f9fb318c751b284bd1cf858da4 -F test/tkt-a7debbe0.test e295fa83cd4416a8ca37b354eb5fadefc5e81fb55253db538d35261fe9c95067 -F test/tkt-a8a0d2996a.test 002e1cde8fc30c39611b52cf981c88200b858765748556822da72e0d32fac73e -F test/tkt-b1d3a2e531.test 8f7576e41ca179289ee1a8fee28386fd8e4b0550 -F test/tkt-b351d95f9.test d14a503c414c5c58fdde3e80f9a3cfef986498c0 -F test/tkt-b72787b1.test a95e8cdad0b98af1853ac7f0afd4ab27b77bf5f3 -F test/tkt-b75a9ca6b0.test ade89229d853a67a21bbd5e6e1e787a8f9d21f19908d1b7fca6bf3d4d5aa0767 -F test/tkt-ba7cbfaedc.test b4c0deccc12aeb55cfdb57935b16b5d67c5a9877 -F test/tkt-bd484a090c.test 60460bf946f79a79712b71f202eda501ca99b898 -F test/tkt-bdc6bbbb38.test fc38bb09bdd440e3513a1f5f98fc60a075182d7d -F test/tkt-c48d99d690.test ba61977d62ab612fc515b3c488a6fbd6464a2447 -F test/tkt-c694113d5.test 82c461924ada5c14866c47e85535b0b0923ba16a2e907e370061a5ca77f65d77 -F test/tkt-cbd054fa6b.test 708475ef4d730a6853512c8ce363bcbd3becf0e26826e1f4cd46e2f52ff38edf -F test/tkt-d11f09d36e.test d999b548fef885d1d1afa49a0e8544ecf436869d -F test/tkt-d635236375.test 9d37e988b47d87505bc9445be0ca447002df5d09 -F test/tkt-d82e3f3721.test bcc0dfba658d15bab30fd4a9320c9e35d214ce30 -F test/tkt-f3e5abed55.test d5a0126118142d13e27f6ce9f4c47096e9321c00 -F test/tkt-f67b41381a.test a23bc124c981662db712167bacd0ed8ad11abac9 -F test/tkt-f777251dc7a.test d1a8fc3eefb7a9e64d19ff24d5c8c94c34a632fb -F test/tkt-f7b4edec.test d998a08ff2b18b7f62edce8e3044317c45efe6c7 -F test/tkt-f973c7ac31.test 28ef85c7f015477916795246d8286aeda39d4ead -F test/tkt-fa7bf5ec.test 9102dfea58aa371d78969da735f9392c57e2e035 -F test/tkt-fc62af4523.test 72825d3febdedcd5593a27989fc05accdbfc2bb4 -F test/tkt-fc7bd6358f.test 634bb4af7d661e82d6b61b80c86727bad698e08f -F test/tkt1435.test f8c52c41de6e5ca02f1845f3a46e18e25cadac00 -F test/tkt1443.test bacc311da5c96a227bf8c167e77a30c99f8e8368 -F test/tkt1444.test a9d72f9e942708bd82dde6c707da61c489e213e9 -F test/tkt1449.test 93584a449752d52b07d2cfc280a69842b6e16ed5 -F test/tkt1473.test 9d000af3e11a4450d4c596f5e58b4b0d24eb0f8b -F test/tkt1501.test 2064f98e00871848af4b2f517e46c1a7fb2e32db -F test/tkt1512.test a1df1f66caf0b9122d6220c15dcee230298c2c2f -F test/tkt1514.test ddef38e34fea72eb1ab935ded9f17a3fb71dd9df -F test/tkt1536.test 83ff7a7b6e248016f8d682d4f7a4ae114070d466 -F test/tkt1537.test e3a14332de9770be8ff14bd15c19a49cbec10808 -F test/tkt1567.test 52f329386ac77e59260d4af1c58490d61377db20 -F test/tkt1644.test 80b6a2bb17885f3cf1cb886d97cdad13232bb869 -F test/tkt1667.test 4700d931ed19ea3983e8e703becb28079250b460 -F test/tkt1873.test 0e1b8c023050a430c2525179ed4022ddc7c31264 -F test/tkt2141.test f543d96f50d5a5dc0bc744f7db74ea166720ce46 -F test/tkt2192.test ff40157e5f42e65f844255d220fc6b290470942f -F test/tkt2213.test a9702175601a57b61aba095a233b001d6f362474 -F test/tkt2251.test 5aab8c7898cd2df2a68fe19289cc29e8f5cf8c82 -F test/tkt2285.test cca17be61cf600b397188e77e7143844d2b977e9 -F test/tkt2332.test fc955609b958ca86dfa102832243370a0cc84070 -F test/tkt2339.test 73bd17818924cd2ac442e5fd9916b58565739450 -F test/tkt2391.test ab7a11be7402da8b51a5be603425367aa0684567 -F test/tkt2409.test be0d60e7d283f639dccea4b0b5e1cd3a4851fb5b -F test/tkt2450.test 77ed94863f2049c1420288ddfea2d41e5e0971d6 -F test/tkt2565.test 8be666e927cb207aae88188f31c331870878b650 -F test/tkt2640.test 28134f5d1e05658ef182520cf0b680fa3de5211b -F test/tkt2643.test 3f3ebb743da00d4fed4fcf6daed92a0e18e57813 -F test/tkt2686.test 6ee01c9b9e9c48f6d3a1fdd553b1cc4258f903d6 -F test/tkt2767.test 569000d842678f9cf2db7e0d1b27cbc9011381b0 -F test/tkt2817.test f31839e01f4243cff7399ef654d3af3558cb8d8d -F test/tkt2820.test 39940276b3436d125deb7d8ebeee053e4cf13213 -F test/tkt2822.test f391776423a7c0d0949edfce375708bfb0f3141e -F test/tkt2832.test a9b0b74a02dca166a04d9e37739c414b10929caa -F test/tkt2854.test e432965db29e27e16f539b2ba7f502eb2ccc49af -F test/tkt2920.test a8737380e4ae6424e00c0273dc12775704efbebf -F test/tkt2927.test 4752868b9eeeb07a217f7f19f4cbaac98d6d086d -F test/tkt2942.test c5c87d179799ca6d1fbe83c815510b87cd5ec7ce -F test/tkt3080.test 1bca7579260920a66b4dd7e196e807c0f25ff804 -F test/tkt3093.test fbdbc5b4969244ad11f540759003e361fcaf391f -F test/tkt3121.test 536df66a02838c26a12fe98639354ca1290ca68b -F test/tkt3201.test f1500ccecc0d578dc4cde7d3242008297c4d59b3 -F test/tkt3292.test 7bad4423cf5eb075dbb58511d66d46fe816744754c9f0050ae60157f71a4fca7 -F test/tkt3298.test 20fd8773b825cb602e033aa04f8602e1ebdcd93c -F test/tkt3334.test 9756631e3c4aa3c416362c279e3c0953a83b7ca8274cb81a13264bb56296d8b0 -F test/tkt3346.test 6f67c3ed7db94dfc5df4f5f0b63809a1f611e01a -F test/tkt3357.test 77c37c6482b526fe89941ce951c22d011f5922ed -F test/tkt3419.test 1bbf36d7ea03b638c15804251287c2391f5c1f6b -F test/tkt3424.test 61f831bd2b071bd128fa5d00fbda57e656ca5812 -F test/tkt3442.test a1fc47c669e651d16494de3ff349bcb53281456f2ca02c8bc14220b6044bbfe8 -F test/tkt3457.test 5651e2cbb94645b677ec663160b9e192b87b7d365aecdfb24e19f749575a6fc2 -F test/tkt3461.test 228ea328a5a21e8663f80ee3d212a6ad92549a19 -F test/tkt3493.test 1686cbde85f8721fc1bdc0ee72f2ef2f63139218 -F test/tkt3508.test d75704db9501625c7f7deec119fcaf1696aefb7d -F test/tkt3522.test 22ce2ebbcb04a6be56c0977d405c207967318fd6 -F test/tkt3527.test 1a6a48441b560bdc53aec581a868eb576234874d -F test/tkt3541.test 5dc257bde9bc833ab9cc6844bf170b998dbb950a -F test/tkt3554.test f599967f279077bace39220cbe76085c7b423725 -F test/tkt3581.test 1966b7193f1e3f14951cce8c66907ae69454e9a3 -F test/tkt35xx.test f38c1b03713179d414969187c941466e44945b35 -F test/tkt3630.test 9a934c58c259f89a0ae6bb6bb846c56285a6fd0f -F test/tkt3718.test 3b59dcb5c4e7754dacd91e7fd353a61492cc402a -F test/tkt3731.test 0c5f4cbffe102d43c3b2188af91a9e36348f974b -F test/tkt3757.test 10cd679a88675c880533083fc79ac04324525595 -F test/tkt3761.test b95ea9c98f21cf91325f18a984887e62caceab33 -F test/tkt3762.test 4d439ff7abdc8d9323150269d182c37c2d514576 -F test/tkt3773.test 7bca904d2a647a6a4a291bd86d7fd7c73855b789 -F test/tkt3791.test a6624b9a80b216a26cf473607f42f3e51898c267 -F test/tkt3793.test d90ffd75c52413908d15e1c44fc2ea9c80fcc449 -F test/tkt3810.test 09608d81c63a6ff3aaf7bc70717909c51f5f4048 -F test/tkt3824.test 150aa00bb6220672e5f0eb14dc8eaa36750425f0 -F test/tkt3832.test 2300d10d57562b89875b72148338ac3e14f8847d -F test/tkt3838.test 292e72489101cd1320d7278dc111c173ebf334d4 -F test/tkt3841.test 4659845bc53f809a5932c61c6ce8c5bb9d6b947f -F test/tkt3871.test d921703d07c68f4fd5312073215a17fa34b0401d -F test/tkt3879.test 2ad5bef2c87e9991ce941e054c31abe26ef7fb90 -F test/tkt3911.test 74cd324f3ba653040cc6d94cc4857b290d12d633 -F test/tkt3918.test ea78bf164e4d55cbde0d83c671ef6fbe930a0032 -F test/tkt3922.test f26be40ab4fe6c00795629bd2006d96e270d9b1a -F test/tkt3929.test cdf67acf5aa936ec4ffead81db87f8a71fe40e59 -F test/tkt3935.test e15261fedb9e30a4305a311da614a5d8e693c767 -F test/tkt3992.test f3e7d548ac26f763b47bc0f750da3d03c81071da -F test/tkt3997.test a335fa41ca3985660a139df7b734a26ef53284bd -F test/tkt4018.test 18dbc6617f7a4b90e938d1bd6d26ad18daafaf08 -F test/tokenize.test ce430a7aed48fc98301611429595883fdfcab5d7 -F test/tpch01.test 7c4eb8cdd79c568f46d344b3e789c9fdb8a766d112871352704861f3fca32a2a -F test/trace.test a659a9862957f4789e37a92b3bf6d2caf5c86b02cdeefc41e850ae53acf6992a -F test/trace2.test f5cb67ad3bc09e0c58e8cca78dfd0b5639259983 -F test/trace3.test 1dff966888773ff1bfea01c080caf15417892b3f998408fe920c4791f7337144 -F test/trans.test 6e1b4c6a42dba31bd65f8fa5e61a2708e08ddde6 -F test/trans2.test 62bd045bfc7a1c14c5ba83ba64d21ade31583f76 -F test/trans3.test 91a100e5412b488e22a655fe423a14c26403ab94 -F test/transitive1.test 293300f46916569f08875cdb2fe2134be2c27677 -F test/trigger1.test d30cd09ae8ac365a088f09daba583cc5c0b8fc7d4e1d70809d0b4be3bf6ae2ab -F test/trigger2.test d15da46f7012832faf3e0c536b47024409d5fb1722d2bb77e29c06d96d704bb1 -F test/trigger3.test aa640bb2bbb03edd5ff69c055117ea088f121945 -F test/trigger4.test 74700b76ebf3947b2f7a92405141eb2cf2a5d359 -F test/trigger5.test 619391a3e9fc194081d22cefd830d811e7badf83 -F test/trigger6.test 0e411654f122552da6590f0b4e6f781048a4a9b9 -F test/trigger7.test e7ce54bfda67a88d778aea42544e151c465547a7e617127b6914c2221a6d53c1 -F test/trigger8.test 30cb0530bd7c4728055420e3f739aa00412eafa4 -F test/trigger9.test 2226ec795a33b0460ab5cf8891e9054cc7edef41 -F test/triggerA.test 837be862d8721f903dba3f3ceff05b32e0bee5214cf6ea3da5fadf12d3650e9d -F test/triggerB.test 56780c031b454abac2340dbb3b71ac5c56c3d7fe -F test/triggerC.test 29f5a28d0fe39e6e2c01f6e1f53f08c0955170ae10a63ad023e33cb0a1682a51 -F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650 -F test/triggerE.test ede2e4bce4ba802337bd69d39447fa04a938e06d84a8bfc53c76850fc36ed86d -F test/triggerF.test 5d76f0a8c428ff87a4d5ed52da06f6096a2c787a1e21b846111dfac4123de3ad -F test/triggerG.test 2b816093c91ba73c733cfa8aedcc210ad819d72a98b1da30768a3c56505233e9 -F test/trustschema1.test 4e970aef0bfe0cee139703cc7209d0e0f07725d999b180ba50770f49edef1494 -F test/tt3_checkpoint.c 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1 -F test/tt3_core.c 8cd89ead95410f70e7fb02c79f1e040f9c5ad5cf -F test/tt3_index.c 39eec10a35f57672225be4d182862152896dee4a -F test/tt3_lookaside1.c 0377e202c3c2a50d688cb65ba203afeda6fafeb9 -F test/tt3_stress.c c57d804716165811d979d4a719e05baccd79277f -F test/tt3_vacuum.c 1753f45917699c9c1f66b64c717a717c9379f776 -F test/types.test bf816ce73c7dfcfe26b700c19f97ef4050d194ff -F test/types2.test 1aeb81976841a91eef292723649b5c4fe3bc3cac -F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a -F test/unionvtab.test e1704ab1b4c1bb3ffc9da4681f8e85a0b909fd80b937984fc94b27415ac8e5a4 -F test/unionvtabfault.test e8759f3d14fb938ce9657e2342db34aeac0fb9bc1692b0d1ebb0069630151d06 -F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 -F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2 -F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97 -F test/unordered.test ffeea7747d5ba962a8009a20b7e53d68cbae05b063604c68702c5998eb50c981 -F test/update.test e906ca7cb1dc6f52af1ea243e08f727edfa79f924c2691f2f9e72481f847310d -F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 -F test/upsert1.test 88f9e258c6a0eeeb85937b08831e8daad440ba41f125af48439e9d33f266fb18 -F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09 -F test/upsert3.test 88d7d590a1948a9cb6eac1b54b0642f67a9f35a1fc0f19b200e97d5d39e3179c -F test/upsert4.test 25d2a1da92f149331ae0c51ca6e3eee78189577585eab92de149900d62994fa5 -F test/upsertfault.test f21ca47740841fdb4d61acfa7b17646d773e67724fe8c185b71c018db8a94b35 -F test/uri.test 3481026f00ade6dfe8adb7acb6e1e47b04369568 -F test/uri2.test 9d3ba7a53ee167572d53a298ee4a5d38ec4a8fb7 -F test/userauth01.test e740a2697a7b40d7c5003a7d7edaee16acd349a9 -F test/utf16align.test 54cd35a27c005a9b6e7815d887718780b6a462ae -F test/vacuum-into.test 48f4cec354fb6f27c98ef58d2fe49a11b71ff131af0cd9140efacc9858b9f670 -F test/vacuum.test ce91c39f7f91a4273bf620efad21086b5aa6ef1d -F test/vacuum2.test aa048abee196c16c9ba308465494009057b79f9b -F test/vacuum3.test 77ecdd54592b45a0bcb133339f99f1ae0ae94d0d -F test/vacuum4.test 7ea76b769fffeb41f925303b04cbcf5a5bbeabe55e4c60ae754ff24eeeb7c010 -F test/vacuum5.test 263b144d537e92ad8e9ca8a73cc6e1583f41cfd0dda9432b87f7806174a2f48c -F test/vacuummem.test 7b42abb3208bd82dd23a7536588396f295a314f2 -F test/varint.test bbce22cda8fc4d135bcc2b589574be8410614e62 -F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 -F test/view.test 10ea54300a097d7c0337fd104abffe4a4786d1598b94017a37efe0e0d3e04dd5 -F test/vtab1.test c5d9e90ed02bcacd776dcbb7360199d290f7f53c26b484ddece543060c54319f -F test/vtab2.test 14d4ab26cee13ba6cf5c5601b158e4f57552d3b055cdd9406cf7f711e9c84082 -F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e -F test/vtab4.test 8e73ed268f3d596bc3590f45fc948fb40f28e9c3 -F test/vtab5.test 889f444970393c73f1e077e2bdc5d845e157a391 -F test/vtab6.test 8e789f526e6594cf7ae933d1adee0caa87dc9f78 -F test/vtab7.test 70c6f4a1d6177144a8236e4172d5fba92e683440374664ad1f04851fbb335d3c -F test/vtab8.test e19fa4a538fcd1bb66c22825fa8f71618fb13583 -F test/vtab9.test ea58d2b95d61955f87226381716b2d0b1d4e4f9b -F test/vtabA.test 1317f06a03597eee29f40a49b6c21e1aaba4285f -F test/vtabB.test 04df5dc531b9f44d9ca65b9c1b79f12b5922a796 -F test/vtabC.test 4528f459a13136f982e75614d120aef165f17292 -F test/vtabD.test 05b3f1d77117271671089e48719524b676842e96 -F test/vtabE.test 2a143fe75a11275781d1fd1988d86b66a3f69cb98f4add62e3da8fd0f637b45f -F test/vtabF.test 1918844c7c902f6a16c8dacf1ec8f84886d6e78b -F test/vtabH.test 2efb5a24b0bb50796b21eca23032cfb77abfa4b0c03938e38ce5897abac404ca -F test/vtabI.test 751b07636700dbdea328e4265b6077ccd6811a3f -F test/vtabJ.test d7b73675708cf63cfcb9d443bb451fc01a028347275b7311e51f9fdf3ca6757f -F test/vtab_alter.test 736e66fb5ec7b4fee58229aa3ada2f27ec58bc58c00edae4836890c3784c6783 -F test/vtab_err.test dcc8b7b9cb67522b3fe7a272c73856829dae4ab7fdb30399aea1b6981bda2b65 -F test/vtab_shared.test 5253bff2355a9a3f014c15337da7e177ab0ef8ad -F test/vtabdrop.test 65d4cf6722972e5499bdaf0c0d70ee3b8133944a4e4bc31862563f32a7edca12 -F test/wal.test 16180bc4becda176428ad02eaea437b4b8f5ae099314de443a4e12b2dcc007a2 -F test/wal2.test 6af203a0eb4be054661d9e0072cb22402c78dea4a89a10b77e9118ae3b91148a -F test/wal3.test 2a93004bc0fb2b5c29888964024695bade278ab2 -F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c -F test/wal5.test 9c11da7aeccd83a46d79a556ad11a18d3cb15aa9 -F test/wal6.test b602704e4b066199bc89d91ca9000f335dcf4572 -F test/wal64k.test 2a525c0f45d709bae3765c71045ccec5df7d100ccbd3a7860fdba46c9addb965 -F test/wal7.test 2ae8f427d240099cc4b2dfef63cff44e2a68a1bd -F test/wal8.test d9df3fba4caad5854ed69ed673c68482514203c8 -F test/wal9.test 378e76a9ad09cd9bee06c172ad3547b0129a6750 -F test/wal_common.tcl 37902864b63794e9bf59393b8887e21a9cbd4db8 -F test/walbak.test 018d4e5a3d45c6298d11b99f09a8ef6876527946 -F test/walbig.test f437473a16cfb314867c6b5d1dbcd519e73e3434 -F test/walblock.test be48f3a75eff0b4456209f26b3ce186c2015497d -F test/walcksum.test bb234a1bb42248b3515d992b719708015c384278 -F test/walcrash.test 21038858cc552077b0522f50b0fa87e38139306a -F test/walcrash2.test a0edab4e5390f03b99a790de89aad15d6ec70b36 -F test/walcrash3.test e426aa58122d20f2b9fbe9a507f9eb8cab85b8af -F test/walcrash4.test e7b6e7639a950a0cca8e210e248c8dad4d63bf20 -F test/walfault.test 09b8ad7e52d2f54bce50e31aa7ea51412bb9f70ac13c74e669ddcd8b48b0d98d -F test/walfault2.test e039ac66c78d5561683cacde04097213cdad3b58e2b3f3fe1112862217bfd915 -F test/walhook.test ed00a40ba7255da22d6b66433ab61fab16a63483 -F test/walmode.test cd6e7cff618eaaa5910ce57c3657aa50110397f86213886a2400afb9bfec7b7b -F test/walnoshm.test 84ca10c544632a756467336b7c3b864d493ee496 -F test/waloverwrite.test dad2f26567f1b45174e54fbf9a8dc1cb876a7f03 -F test/walpersist.test 8c6b7e3ec1ba91b5e4dc4e0921d6d3f87cd356a6 -F test/walprotocol.test a112aba0b79e3adeaa485fed09484b32c654e97df58e454aa8489ac2cd57bf84 -F test/walprotocol2.test 7d3b6b4bf0b12f8007121b1e6ef714bc99101fb3b48e46371df1db868eebc131 -F test/walro.test cb438d05ba0d191f10b688e39c4f0cd5b71569a1d1f4440e5bdf3c6880e08c20 -F test/walro2.test 0e79dd15cbdb4f482c01ea248373669c732414a726b357d04846a816afafb768 -F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cfd51af68 -F test/walsetlk.test 11f7fe792fdce54cf09874dab824e0627f2eedecfb9f7983e325606ec5184e0c -F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 -F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f -F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 -F test/walvfs.test ca81c9f427e0e5434076dfa948fd1d8e6d5ddd192b2fb6991635d81da5f3f5d4 -F test/wapp.tcl b440cd8cf57953d3a49e7ee81e6a18f18efdaf113b69f7d8482b0710a64566ec -F test/wapptest.tcl 3cca775aede0591756a1fc0da55bbb3715d8c363873fd2cfdd4d555b0a4af57d x -F test/where.test 19c709c9f0f6ed12c23f909f6592aa55fba34269d5a2898537aa27a22b9ce650 -F test/where2.test 478d2170637b9211f593120648858593bf2445a1 -F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c -F test/where4.test 4a371bfcc607f41d233701bdec33ac2972908ba8 -F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2 -F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b -F test/where7.test 75722434c486ac9e74718caa6cce234f45ba34c0b6c0f9555b29eb8bb5f6ade1 -F test/where8.test 461ca40265ed996a6305da99bb024b0e41602bb586acf544c08f95922358e49f -F test/where9.test 2c554b97bbdb2fdf26c57099f60db8a52bfcf7c147f2c256f9798fa0e267ca85 -F test/whereA.test 6c6a420ca7d313242f9b1bd471dc80e4d0f8323700ba9c78df0bb843d4daa3b4 -F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5 -F test/whereC.test cae295158703cb3fc23bf1a108a9ab730efff0f6 -F test/whereD.test c1c335e914e28b122e000e9310f02d2be83e1c9dbca2e29f46bd732703944d1b -F test/whereE.test b3a055eef928c992b0a33198a7b8dc10eea5ad2f -F test/whereF.test 3d9412b1199d3e2bed34fcb76b4c48d0bf4df95d27e3f8dd27b6f8b4716d0d89 -F test/whereG.test c9378b285828754377ef47fbece7264018c0a3743e7eb686e89917bb9df10885 -F test/whereH.test e4b07f7a3c2f5d31195cd33710054c78667573b2 -F test/whereI.test a2874062140ed4aba9ffae76e6190a3df6fc73d1373fdfa8fd632945082a5364 -F test/whereJ.test 88287550f6ee604422403b053455b1ad894eeaa5c35d348532dfa1439286cb9a -F test/whereK.test f8e3cf26a8513ecc7f514f54df9f0572c046c42b -F test/whereL.test e05cedc9389c6f09ad55bd5999a3fddccebec90672fb989433c145dcdaf26996 -F test/wherefault.test 1374c3aa198388925246475f84ad4cd5f9528864 -F test/wherelfault.test 9012e4ef5259058b771606616bd007af5d154e64cc25fa9fd4170f6411db44e3 -F test/wherelimit.test 592081800806d297dd7449b1030c863d2883d6d42901837ccd2e5a9bd962edb0 -F test/wherelimit2.test 9bf0aa56cca40ea0e4c5e2915341355a2bbc0859ec4ce1589197fe2a9d94635f -F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2aeee74 -F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 -F test/win32longpath.test 4baffc3acb2e5188a5e3a895b2b543ed09e62f7c72d713c1feebf76222fe9976 -F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 502a3e72fce895aaaa633bbe709f6de3c24eed3ecb8098ab9fb8b47584b4452c -F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 -F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c -F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 -F test/window3.test e9959a993c8a71e96433be8daaa1827d78b8921e4f12debd7bdbeb3c856ef3cb -F test/window4.tcl 6f85307eb67242b654d051f7da32a996a66aee039a09c5ae358541aa61720742 -F test/window4.test fbead87f681400ac07ef3555e0488b544a47d35491f8bf09a7474b6f76ce9b4e -F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652821e -F test/window6.test f8d674254b23289cc17c84d79dec7eda7caa1dfb7836c43122cfdf3640d1df32 -F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d76108f -F test/window7.test 1d31276961ae7801edc72173edaf7593e3cbc79c06d1f1f09e20d8418af403cd -F test/window8.tcl f2711aa3571e4e6b0dad98db8d95fd6cb8d9db0c92bbdf535f153b07606a1ce2 -F test/window8.test c4331b27a6f66d69fa8f8bab10cc731db1a81d293ae108a68f7c3487fa94e65b -F test/window9.test c22c25377c820613e1842fe7ad4af7c03df625f6a7caee99e6fdb4fcd52e0a8b -F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be -F test/windowB.test 7a983ea1cc1cf72be7f378e4b32f6cb2d73014c5cd8b25aaee825164cd4269e5 -F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 -F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b -F test/windowfault.test 72375ae71031eabf96bc88d0af128c8628a091ddc99b5a394e848b3df5fc17ad -F test/with1.test 584580a5ae79868a91873863f8cb2d00040006dc1e4c332ef1d8642f2815dc6e -F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab -F test/with3.test 13b3336739da648a9e4dfa11bb04e73a920c97620041007c5f75d5d14084c346 -F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 -F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 -F test/without_rowid1.test 9cfb83705c506e3849fa7efc88a3c9a15f9a50bf9b1516b41757a7cef9bba8c3 -F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 -F test/without_rowid3.test f8e6b9f7cb32a3570bab743dd4f28d2000e2107808d57585e776f5c3eb076241 -F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a -F test/without_rowid5.test 89b1c587bd92a0590e440da33e7666bf4891572a -F test/without_rowid6.test 8463b20098e9f75a501a9f17dfb42fffc79068eac0b2775fe56ef2281d2df45e -F test/without_rowid7.test d7c59a93d726b55812d620f8f284e01904a5b85f9ee9eea8f2f68571a5e8c40e -F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912adec66 -F test/writecrash.test f1da7f7adfe8d7f09ea79b42e5ca6dcc41102f27f8e334ad71539501ddd910cc -F test/zeroblob.test 07a5b11ab591d1f26c626945fb7f228f68b993533b2ada77273edf6ee29db174 -F test/zerodamage.test 9c41628db7e8d9e8a0181e59ea5f189df311a9f6ce99cc376dc461f66db6f8dc -F test/zipfile.test 429cb81c518487fa1b644b6b04b6e9af704a4fa767bd1a110204c5f03b2e8616 -F test/zipfile2.test 9903388a602a3834189857a985106ff95c3bba6a3969e0134127df991889db5d -F test/zipfilefault.test 44d4d7a7f7cca7521d569d7f71026b241d65a6b1757aa409c1a168827edbbc2c -F tool/GetFile.cs 47852aa0d806fe47ed1ac5138bdce7f000fe87aaa7f28107d0cb1e26682aeb44 -F tool/GetTclKit.bat 8995df40c4209808b31f24de0b58f90930239a234f7591e3675d45bfbb990c5d -F tool/Replace.cs 02c67258801c2fb5f63231e0ac0f220b4b36ba91 -F tool/build-all-msvc.bat c12328d06c45fec8baada5949e3d5af54bf8c887 x -F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367 -F tool/cg_anno.tcl c1f875f5a4c9caca3d59937b16aff716f8b1883935f1b4c9ae23124705bc8099 x -F tool/checkSpacing.c 810e51703529a204fc4e1eb060e9ab663e3c06d2 -F tool/dbhash.c 19560c9a2aa2b269b6a5108259b93d26d12f8f0877c31fe9f8f61dfbd219ba63 -F tool/dbtotxt.c b2221864a20fb391c46bd31bc1fbdc4a96f5c8a89bef58f421eb9b9c36b1702c -F tool/dbtotxt.md c9a57af8739957ef36d2cfad5c4b1443ff3688ed33e4901ee200c8b651f43f3c -F tool/extract-sqlite3h.tcl 069ceab0cee26cba99952bfa08c0b23e35941c837acabe143f0c355d96c9e2eb x -F tool/extract.c 054069d81b095fbdc189a6f5d4466e40380505e2 -F tool/fast_vacuum.c 5ba0d6f5963a0a63bdc42840f678bad75b2ebce1 -F tool/fragck.tcl 5265a95126abcf6ab357f7efa544787e5963f439 -F tool/fuzzershell.c e1d90a03ca790d7c331c2aae08ca46ff435f1ae1faa6cb9cc48f4687c18fdc6e -F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4 -F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a5a4f -F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce -F tool/index_usage.c 9ec344d29cbeb03fdc0fce668eedfb7495792170de933adf95cf8d6904a166ad -F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f -F tool/lemon.c a361b85fa230560b783006ac002a6a8bad214c3b9d7fa48980aecc2b691ddcad -F tool/lempar.c e8899b28488f060d0ff931539ea6311b16b22dce068c086c788a06d5e8d01ab7 -F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 -F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 -F tool/logest.c 11346aa019e2e77a00902aa7d0cabd27bd2e8cca -F tool/max-limits.c cbb635fbb37ae4d05f240bfb5b5270bb63c54439 -F tool/mkautoconfamal.sh 422fc365358a2e92876ffc62971a0ff28ed472fc8bcf9de0df921c736fdeca5e -F tool/mkccode.tcl 86463e68ce9c15d3041610fedd285ce32a5cf7a58fc88b3202b8b76837650dbe x -F tool/mkctimec.tcl dd183b73ae1c28249669741c250525f0407e579a70482371668fd5f130d9feb3 -F tool/mkkeywordhash.c 11a3f3af8e787d0c5ca459ed66fe80fd09e661876506e7b978ec08c19477bdc2 -F tool/mkmsvcmin.tcl 6ecab9fe22c2c8de4d82d4c46797bda3d2deac8e763885f5a38d0c44a895ab33 -F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c -F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 -F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa -F tool/mkpragmatab.tcl d348a4bf71ac068bddf89326562071cbbd962273d88f9b5e5d622f3e73b78bdf -F tool/mkshellc.tcl 70a9978e363b0f3280ca9ce1c46d72563ff479c1930a12a7375e3881b7325712 -F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 -F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 -F tool/mksqlite3c-noext.tcl 4f7cfef5152b0c91920355cbfc1d608a4ad242cb819f1aea07f6d0274f584a7f -F tool/mksqlite3c.tcl 3ab95bcf7b765f9d6d99cbeb8c4f150b38b0bb1f001ffac688f2ad02ebce2123 -F tool/mksqlite3h.tcl 080873e3856eceb9d289a08a00c4b30f875ea3feadcbece796bd509b1532792c -F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b -F tool/mkvsix.tcl b9e0777a213c23156b6542842c238479e496ebf5 -F tool/offsets.c fe4262fdfa378e8f5499a42136d17bf3b98f6091 -F tool/omittest.tcl 6616fbf384f0f630113eab27d41d4530435dd94e2883307759988b45f0604a3b -F tool/opcodesum.tcl 740ed206ba8c5040018988129abbf3089a0ccf4a -F tool/pagesig.c ff0ca355fd3c2398e933da5e22439bbff89b803b -F tool/replace.tcl 60f91e8dd06ab81f74d213ecbd9c9945f32ac048 -F tool/restore_jrnl.tcl 6957a34f8f1f0f8285e07536225ec3b292a9024a -F tool/rollback-test.c 9fc98427d1e23e84429d7e6d07d9094fbdec65a5 -F tool/run-speed-test.sh f95d19fd669b68c4c38b6b475242841d47c66076 -F tool/showdb.c 9b2dbb4b7a00afaf8fc1719f0d775775effa5b135ac1a2c23f1c3f5d670c4e15 -F tool/showjournal.c 5bad7ae8784a43d2b270d953060423b8bd480818 -F tool/showlocks.c 9920bcc64f58378ff1118caead34147201f48c68 -F tool/showshm.c a0ab6ec32dd1f11218ca2a4018f8fb875b59414801ab8ceed8b2e69b7b45a809 -F tool/showstat4.c 0682ebea7abf4d3657f53c4a243f2e7eab48eab344ed36a94bb75dcd19a5c2a1 -F tool/showwal.c ad9d768f96ca6199ad3a8c9562d679680bd032dd01204ea3e5ea6fb931d81847 -F tool/soak1.tcl 8d407956e1a45b485a8e072470a3e629a27037fe -F tool/spaceanal.tcl c161d838825d0242317c7cc13b1eb2126f8cec031950ef31114d42732cb2674e -F tool/speed-check.sh 2b042d703a9472f08c3b13be27afac658426f8e4fc87cd2d575953fda86f08d1 -F tool/speedtest.tcl 06c76698485ccf597b9e7dbb1ac70706eb873355 -F tool/speedtest16.c ecb6542862151c3e6509bbc00509b234562ae81e -F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff -F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 -F tool/speedtest8inst1.c 7ce07da76b5e745783e703a834417d725b7d45fd -F tool/split-sqlite3c.tcl 3efcd4240b738f6bb2b5af0aea7e1e0ef9bc1c61654f645076cec883030b710c -F tool/sqldiff.c 7b9b7238284f02131dbb8f21a4e862409bff728045c5473139d28c67ac87580e -F tool/sqlite3_analyzer.c.in 7eeaae8b0d7577662acaabbb11107af0659d1b41bc1dfdd4d91422de27127968 -F tool/sqltclsh.c.in 1bcc2e9da58fadf17b0bf6a50e68c1159e602ce057210b655d50bad5aaaef898 -F tool/sqltclsh.tcl 862f4cf1418df5e1315b5db3b5ebe88969e2a784525af5fbf9596592f14ed848 -F tool/srcck1.c 371de5363b70154012955544f86fdee8f6e5326f -F tool/stack_usage.tcl f8e71b92cdb099a147dad572375595eae55eca43 -F tool/symbols-mingw.sh 4dbcea7e74768305384c9fd2ed2b41bbf9f0414d -F tool/symbols.sh 1612bd947750e21e7b47befad5f6b3825b06cce0705441f903bf35ced65ae9b9 -F tool/varint.c 5d94cb5003db9dbbcbcc5df08d66f16071aee003 -F tool/vdbe-compress.tcl 5926c71f9c12d2ab73ef35c29376e756eb68361c -F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f -F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 -F tool/warnings.sh 09311479bdc290e20ec8e35a3d1b14b096bbd96222277cfd6274c3a99b3d012f -F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -F vsixtest/App.xaml b76d3b48860e7454775c47ea38ffea9c4abe3e85 -F vsixtest/App.xaml.cpp c465147f50871165c60ca16955219f6c5812d6d8 -F vsixtest/App.xaml.h 4a9768e2983d05600ad1e1c2f1b00a132967da9f -F vsixtest/Assets/LockScreenLogo.scale-200.png e820c9a3deb909197081b0bf3216c06e13905f0a -F vsixtest/Assets/SplashScreen.scale-200.png cab70988ca71bebec7bfeb3b6dbafe17b9ab0b4a -F vsixtest/Assets/Square150x150Logo.scale-200.png e17b40817db7a239fc239d83efcc951fb824e3ff -F vsixtest/Assets/Square44x44Logo.scale-200.png 2f166237094dea94d952d10b9eeae81806844f1c -F vsixtest/Assets/Square44x44Logo.targetsize-24_altform-unplated.png 5f6a6d391b95a3061ccca6e6fdd6955ede63b4ed -F vsixtest/Assets/StoreLogo.png 0828b7257db74a4ecd5eeb6b7b4971f0fdc4d9d1 -F vsixtest/Assets/Wide310x150Logo.scale-200.png 04ddefe5bc5f43ae12a7433f6f236ddab101ac42 -F vsixtest/MainPage.xaml 34f49897e3ca533a7e74506ba0759b66eebce151 -F vsixtest/MainPage.xaml.cpp 7f31fc6de751b64676c0924c97a5485d950a91d7 -F vsixtest/MainPage.xaml.h cc05cca10d50a003f6c6e4448b701cdd07f52f29 -F vsixtest/Package.appxmanifest 6b6db1eb7df3a315c5d681059754d5f0e0c47a93 -F vsixtest/pch.cpp cb823cfac36f1a39a7eb0acbd7e9a0b0de8f23af -F vsixtest/pch.h 9cab7980f2ac4baa40807d8b5e52af32a21cf78c -F vsixtest/vsixtest.sln 77cadbe4e96c1fe1bf51cd77de9e9b0a12ada547 -F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 -F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc -F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e -F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 79ad4ea2c8e7f4c90983d78a9a6ebb6a70a057124d708076a0bbf0db8696cdaa 0c1fcf4711a2e66c813aed38cf41cd3e2123ee8eb6db98118086764c4ba83350 -R ff8bbf0cb33919238e1d83d9acca0ab2 -U drh -Z c49885c8426ca3d95a42421fcf39d579 +B 5e08e36067c509360040638cd0c6c79ed1eb105c492c7e72af660bd355da4fba +C Allow\sBEGIN\sCONCURRENT\stransactions\sto\scontain\sschema\smodifications.\sHowever,\sthis\scauses\sthem\sto\sconflict\swith\sall\sother\stransactions. +D 2020-07-16T20:24:11.213 +F src/btree.c e1b94261d229d7c60665df0b73caac308c0a1c459f4db0322160c235a096abd7 +F src/sqliteInt.h 2c4cc451a4c16f7d8a91ae1826dff6c87e3e2d6ff4257976b32d4e54c6fc7dd8 +F src/vacuum.c c32e7add30cd49b8a7e165036a076487f59383bfef7d8576c0c98beea6822d38 +F src/vdbe.c 03054bb2d9ee214415a43e624b9c382979f01b8eeef1b96188d5bf5e42deb950 +F src/vdbeaux.c 3353626ada59b81f318fb37d1894914f12022772c054ad619901bc8acc4f9f71 +F src/wal.c 85a5d4587b31e7e1d1f08914f3c05796626ed4267d0bd1e97e5370dd660ee533 +F test/concurrent.test a0248ec6e3e79a5948453649cf86b5b359175cba55ea636b15426d6f0fa6c3da +F test/concurrent8.test b93937e74a8efb8b84f2fea7595b53418c5f29777bbe9cbdb5dc219b3dd72a7d +P 5e08e36067c509360040638cd0c6c79ed1eb105c492c7e72af660bd355da4fba +R c01349529e7c571a116d00c1bf5a6b8e +U dan +Z bbcd78b5bc7aeaa6e3f4b3bd1bcd6490 diff --git a/manifest.uuid b/manifest.uuid index 4194390da8..3b555ae8ed 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5e08e36067c509360040638cd0c6c79ed1eb105c492c7e72af660bd355da4fba \ No newline at end of file +9a4a02304e3f5dc1d567cf2a9eae4cdb575e02cb37f9ee25928f2325ab192e76 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 471c15789e..12c50ceb77 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3624,7 +3624,7 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ BtShared *pBt = p->pBt; Pager *pPager = pBt->pPager; int rc = SQLITE_OK; - int bConcurrent = (p->db->bConcurrent && !ISAUTOVACUUM); + int bConcurrent = (p->db->eConcurrent && !ISAUTOVACUUM); sqlite3BtreeEnter(p); btreeIntegrity(p); @@ -4446,7 +4446,7 @@ int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zMaster){ sqlite3PagerTruncateImage(pBt->pPager, pBt->nPage); } #endif - if( rc==SQLITE_OK && ISCONCURRENT ){ + if( rc==SQLITE_OK && ISCONCURRENT && p->db->eConcurrent==CONCURRENT_OPEN ){ rc = btreeFixUnlocked(p); } if( rc==SQLITE_OK ){ @@ -11010,7 +11010,10 @@ int sqlite3BtreeExclusiveLock(Btree *p){ BtShared *pBt = p->pBt; assert( p->inTrans==TRANS_WRITE && pBt->pPage1 ); sqlite3BtreeEnter(p); - rc = sqlite3PagerExclusiveLock(pBt->pPager, pBt->pPage1->pDbPage, &pgno); + rc = sqlite3PagerExclusiveLock(pBt->pPager, + (p->db->eConcurrent==CONCURRENT_SCHEMA) ? 0 : pBt->pPage1->pDbPage, + &pgno + ); #ifdef SQLITE_OMIT_CONCURRENT assert( pgno==0 ); #else diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 29e1a9a37c..4961807a03 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1460,7 +1460,7 @@ struct sqlite3 { u16 dbOptFlags; /* Flags to enable/disable optimizations */ u8 enc; /* Text encoding */ u8 autoCommit; /* The auto-commit flag. */ - u8 bConcurrent; /* Current transaction is "CONCURRENT" */ + u8 eConcurrent; /* CONCURRENT_* value */ u8 temp_store; /* 1: file 2: memory 0: default */ u8 mallocFailed; /* True if we have seen a malloc failure */ u8 bBenignMalloc; /* Do not require OOMs if true */ @@ -1578,6 +1578,13 @@ struct sqlite3 { #endif }; +/* +** Candidate values for sqlite3.eConcurrent +*/ +#define CONCURRENT_NONE 0 +#define CONCURRENT_OPEN 1 +#define CONCURRENT_SCHEMA 2 + /* ** A macro to discover the encoding of a database. */ diff --git a/src/vacuum.c b/src/vacuum.c index 0211d8a18f..79e8d6efc0 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -387,7 +387,7 @@ SQLITE_NOINLINE int sqlite3RunVacuum( ** is closed by the DETACH. */ db->autoCommit = 1; - assert( db->bConcurrent==0 ); + assert( db->eConcurrent==0 ); if( pDb ){ sqlite3BtreeClose(pDb->pBt); diff --git a/src/vdbe.c b/src/vdbe.c index e3cda05bd5..73271a4756 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3318,7 +3318,7 @@ case OP_Savepoint: { ** is committed. */ int isTransaction = pSavepoint->pNext==0 && db->isTransactionSavepoint; - assert( db->bConcurrent==0 || db->isTransactionSavepoint==0 ); + assert( db->eConcurrent==0 || db->isTransactionSavepoint==0 ); if( isTransaction && p1==SAVEPOINT_RELEASE ){ if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ goto vdbe_return; @@ -3426,7 +3426,7 @@ case OP_AutoCommit: { assert( desiredAutoCommit==1 || desiredAutoCommit==0 ); assert( desiredAutoCommit==1 || iRollback==0 ); assert( desiredAutoCommit==0 || bConcurrent==0 ); - assert( db->autoCommit==0 || db->bConcurrent==0 ); + assert( db->autoCommit==0 || db->eConcurrent==CONCURRENT_NONE ); assert( db->nVdbeActive>0 ); /* At least this one VM is active */ assert( p->bIsReader ); @@ -3435,9 +3435,9 @@ case OP_AutoCommit: { assert( desiredAutoCommit==1 ); sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); db->autoCommit = 1; - db->bConcurrent = 0; + db->eConcurrent = CONCURRENT_NONE; }else if( desiredAutoCommit - && (db->nVdbeWrite>0 || (db->bConcurrent && db->nVdbeActive>1)) ){ + && (db->nVdbeWrite>0 || (db->eConcurrent && db->nVdbeActive>1)) ){ /* A transaction may only be committed if there are no other active ** writer VMs. If the transaction is CONCURRENT, then it may only be ** committed if there are no active VMs at all (readers or writers). @@ -3463,7 +3463,8 @@ case OP_AutoCommit: { rc = SQLITE_BUSY; goto vdbe_return; } - db->bConcurrent = (u8)bConcurrent; + assert( bConcurrent==CONCURRENT_NONE || bConcurrent==CONCURRENT_OPEN ); + db->eConcurrent = (u8)bConcurrent; sqlite3CloseSavepoints(db); if( p->rc==SQLITE_OK ){ rc = SQLITE_DONE; @@ -3655,7 +3656,7 @@ case OP_SetCookie: { assert( pDb->pBt!=0 ); assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) ); #ifndef SQLITE_OMIT_CONCURRENT - if( db->bConcurrent + if( db->eConcurrent && (pOp->p2==BTREE_USER_VERSION || pOp->p2==BTREE_APPLICATION_ID) ){ rc = SQLITE_ERROR; @@ -3669,7 +3670,6 @@ case OP_SetCookie: { rc = sqlite3BtreeUpdateMeta(pDb->pBt, pOp->p2, pOp->p3); if( pOp->p2==BTREE_SCHEMA_VERSION ){ /* When the schema cookie changes, record the new cookie internally */ - assert( pOp->p1==1 || db->bConcurrent==0 ); pDb->pSchema->schema_cookie = pOp->p3; db->mDbFlags |= DBFLAG_SchemaChange; }else if( pOp->p2==BTREE_FILE_FORMAT ){ @@ -3812,6 +3812,11 @@ case OP_OpenWrite: pX = pDb->pBt; assert( pX!=0 ); if( pOp->opcode==OP_OpenWrite ){ +#ifndef SQLITE_OMIT_CONCURRENT + if( db->eConcurrent==CONCURRENT_OPEN && p2==1 && iDb!=1 ){ + db->eConcurrent = CONCURRENT_SCHEMA; + } +#endif assert( OPFLAG_FORDELETE==BTREE_FORDELETE ); wrFlag = BTREE_WRCSR | (pOp->p5 & OPFLAG_FORDELETE); assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); @@ -7186,11 +7191,8 @@ case OP_CursorUnlock: { case OP_TableLock: { u8 isWriteLock = (u8)pOp->p3; #ifndef SQLITE_OMIT_CONCURRENT - if( isWriteLock && db->bConcurrent && pOp->p2==1 && pOp->p1!=1 ){ - rc = SQLITE_ERROR; - sqlite3VdbeError(p, - "cannot modify database schema within CONCURRENT transaction"); - goto abort_due_to_error; + if( isWriteLock && db->eConcurrent && pOp->p2==1 && pOp->p1!=1 ){ + db->eConcurrent = CONCURRENT_SCHEMA; } #endif if( isWriteLock || 0==(db->flags&SQLITE_ReadUncommit) ){ diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 27af7b7258..58cfaf8891 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2691,7 +2691,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ } #ifndef SQLITE_OMIT_CONCURRENT - if( db->bConcurrent && (rc & 0xFF)==SQLITE_BUSY ){ + if( db->eConcurrent && (rc & 0xFF)==SQLITE_BUSY ){ /* An SQLITE_BUSY or SQLITE_BUSY_SNAPSHOT was encountered while ** attempting to take the WRITER lock on a wal file. Release the ** WRITER locks on all wal files and return early. */ @@ -3102,7 +3102,7 @@ int sqlite3VdbeHalt(Vdbe *p){ sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); sqlite3CloseSavepoints(db); db->autoCommit = 1; - db->bConcurrent = 0; + db->eConcurrent = CONCURRENT_NONE; p->nChange = 0; } } @@ -3165,7 +3165,7 @@ int sqlite3VdbeHalt(Vdbe *p){ sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); sqlite3CloseSavepoints(db); db->autoCommit = 1; - db->bConcurrent = 0; + db->eConcurrent = CONCURRENT_NONE; p->nChange = 0; } } @@ -3187,7 +3187,7 @@ int sqlite3VdbeHalt(Vdbe *p){ sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); sqlite3CloseSavepoints(db); db->autoCommit = 1; - db->bConcurrent = 0; + db->eConcurrent = CONCURRENT_NONE; p->nChange = 0; } } diff --git a/src/wal.c b/src/wal.c index 7f5a92daf9..3a4042d5a4 100644 --- a/src/wal.c +++ b/src/wal.c @@ -3239,11 +3239,10 @@ static int walUpgradeReadlock(Wal *pWal){ */ int sqlite3WalLockForCommit( Wal *pWal, - PgHdr *pPage1, + PgHdr *pPg1, Bitvec *pAllRead, Pgno *piConflict ){ - Pager *pPager = pPage1->pPager; int rc = walWriteLock(pWal); /* If the database has been modified since this transaction was started, @@ -3267,13 +3266,19 @@ int sqlite3WalLockForCommit( rc = SQLITE_BUSY_SNAPSHOT; }else if( memcmp(&pWal->hdr, (void*)&head, sizeof(WalIndexHdr))!=0 ){ int iHash; - int iLastHash = walFramePage(head.mxFrame); + int iLast = walFramePage(head.mxFrame); u32 iFirst = pWal->hdr.mxFrame+1; /* First wal frame to check */ if( memcmp(pWal->hdr.aSalt, (u32*)head.aSalt, sizeof(u32)*2) ){ assert( pWal->readLock==0 ); iFirst = 1; } - for(iHash=walFramePage(iFirst); iHash<=iLastHash; iHash++){ + if( pPg1==0 ){ + /* If pPg1==0, then the current transaction modified the database + ** schema. This means it conflicts with all other transactions. */ + *piConflict = 1; + rc = SQLITE_BUSY_SNAPSHOT; + } + for(iHash=walFramePage(iFirst); rc==SQLITE_OK && iHash<=iLast; iHash++){ WalHashLoc sLoc; rc = walHashGet(pWal, iHash, &sLoc); @@ -3289,7 +3294,7 @@ int sqlite3WalLockForCommit( /* Check that the schema cookie has not been modified. If ** it has not, the commit can proceed. */ u8 aNew[4]; - u8 *aOld = &((u8*)pPage1->pData)[40]; + u8 *aOld = &((u8*)pPg1->pData)[40]; int sz; i64 iOffset; sz = pWal->hdr.szPage; @@ -3302,7 +3307,7 @@ int sqlite3WalLockForCommit( }else if( sqlite3BitvecTestNotNull(pAllRead, sLoc.aPgno[i]) ){ *piConflict = sLoc.aPgno[i]; rc = SQLITE_BUSY_SNAPSHOT; - }else if( (pPg = sqlite3PagerLookup(pPager, sLoc.aPgno[i])) ){ + }else if( (pPg = sqlite3PagerLookup(pPg1->pPager, sLoc.aPgno[i])) ){ /* Page aPgno[i], which is present in the pager cache, has been ** modified since the current CONCURRENT transaction was started. ** However it was not read by the current transaction, so is not @@ -3326,7 +3331,6 @@ int sqlite3WalLockForCommit( } } } - if( rc!=SQLITE_OK ) break; } } } diff --git a/test/concurrent.test b/test/concurrent.test index b94071a8f1..ad1e15d71c 100644 --- a/test/concurrent.test +++ b/test/concurrent.test @@ -107,6 +107,7 @@ foreach {tn trans commit_ok} { #------------------------------------------------------------------------- # CONCURRENT transactions may not modify the db schema. # +sqlite3 db2 test.db foreach {tn sql} { 1 { CREATE TABLE xx(a, b) } 2 { DROP TABLE t1 } @@ -116,14 +117,22 @@ foreach {tn sql} { do_catchsql_test 1.7.0.$tn.1 " BEGIN CONCURRENT; $sql - " {1 {cannot modify database schema within CONCURRENT transaction}} + " {0 {}} + + db2 eval {INSERT INTO t1 DEFAULT VALUES} + + do_catchsql_test 1.7.0.$tn.2 { + COMMIT + } {1 {database is locked}} + + do_execsql_test 1.7.0.$tn.2 ROLLBACK - do_execsql_test 1.7.0.$tn.2 { + do_execsql_test 1.7.0.$tn.3 { SELECT sql FROM sqlite_master; SELECT sql FROM sqlite_temp_master; } {{CREATE TABLE t1(a, b)}} - do_execsql_test 1.7.0.$tn.3 COMMIT + #do_execsql_test 1.7.0.$tn.3 COMMIT } # Except the temp db schema. diff --git a/test/concurrent8.test b/test/concurrent8.test new file mode 100644 index 0000000000..c27799764c --- /dev/null +++ b/test/concurrent8.test @@ -0,0 +1,109 @@ +# 2020 July 17 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# + + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set ::testprefix concurrent8 + +source $testdir/lock_common.tcl + +ifcapable !concurrent { + finish_test + return +} + +do_multiclient_test tn { + + do_test 1.$tn.0 { + sql1 { + CREATE TABLE t1(x, y); + PRAGMA journal_mode = wal; + } + } {wal} + + do_test 1.$tn.1 { + sql1 { + BEGIN CONCURRENT; + INSERT INTO t1 VALUES(1, 1); + } + } {} + + do_test 1.$tn.2 { + sql2 { + CREATE TABLE t2(a, b); + } + } {} + + do_test 1.$tn.3 { + list [catch { sql1 { COMMIT } } msg] $msg + } {1 {database is locked}} + + do_test 1.$tn.4 { + code1 { db errorcode } + } {517} ;# SQLITE_BUSY_SNAPSHOT + + do_test 1.$tn.5 { + sql1 { + ROLLBACK; + BEGIN CONCURRENT; + CREATE TABLE t3(a, b); + COMMIT; + } + } {} + + do_test 1.$tn.6 { + set nPg [sql1 {PRAGMA page_count}] + sql1 "BEGIN CONCURRENT" + for {set i 0} {$i<250} {incr i} { + sql1 "CREATE TABLE z$i (a, b, c)" + } + sql1 "COMMIT" + set nPg2 [sql1 {PRAGMA page_count}] + expr $nPg2>$nPg + } {1} + + do_test 1.$tn.7 { + sql2 { PRAGMA integrity_check } + } {ok} + + do_test 1.$tn.8 { + sql1 { + BEGIN CONCURRENT; + CREATE TABLE t4(a, b); + } + sql2 { + INSERT INTO t1 VALUES(2, 2); + } + list [catch { sql1 COMMIT } msg] $msg + } {1 {database is locked}} + sql1 ROLLBACK + + do_test 1.$tn.9 { + sql1 { + BEGIN CONCURRENT; + CREATE TEMP TABLE t5(a, b); + INSERT INTO t2 VALUES('x', 'x'); + } + sql2 { + INSERT INTO t1 VALUES(3, 3); + CREATE TEMP TABLE t1(x, y); + } + sql1 COMMIT + } {} +} + + + +finish_test + + From 3dc850321e3b6e1bf9e58fc9c70a8f7ec1e08ee1 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 16 Jul 2020 20:39:59 +0000 Subject: [PATCH 094/113] Allow BEGIN CONCURRENT transactions to contain schema modifications. However, this causes them to conflict with all other transactions. FossilOrigin-Name: e9393a18cb987d258fff56f80ad6b1525f124fb19e8e4a9c953b86a57ef9a7e6 --- manifest | 1902 +---------------------------------------- manifest.uuid | 2 +- src/btree.c | 9 +- src/sqliteInt.h | 9 +- src/vacuum.c | 2 +- src/vdbe.c | 26 +- src/vdbeaux.c | 8 +- src/wal.c | 18 +- test/concurrent.test | 15 +- test/concurrent8.test | 109 +++ 10 files changed, 182 insertions(+), 1918 deletions(-) create mode 100644 test/concurrent8.test diff --git a/manifest b/manifest index 6cb0d2c360..639a41afd7 100644 --- a/manifest +++ b/manifest @@ -1,1886 +1,16 @@ -C Merge\sversoin\s3.32.1\sinto\sthe\sbegin-concurrent-pnu\sbranch. -D 2020-05-25T18:03:34.278 -F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 -F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea -F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in 376f53999defeb32b7ad2626fd58aae8f3694c38ab7ee30c2289e0d0525a9238 -F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc 8d00aeba2609bb498dded5eead2890126321f02e292573bf29bf2d18487d37bd -F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a -F VERSION 7d1da8465e06354a9ffb67a9ef3f933552767d8e239b507cb2a08ba417048322 -F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 -F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 -F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 -F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 -F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 -F autoconf/Makefile.am e14b629addaa1ce372b72043f28f40de2e32b7e211b6e0fc18dbb87989197e40 -F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.msc e0f1dafc48d000fd6ddfdb01815271528db55cbc7299ca888df5b93367f0d5a4 -F autoconf/README.first 6c4f34fe115ff55d4e8dbfa3cecf04a0188292f7 -F autoconf/README.txt 4f04b0819303aabaa35fff5f7b257fb0c1ef95f1 -F autoconf/configure.ac 3cd933b959fe514eebd1ca1717dfddbf2c9b825b6bc2c5f744deaf5d63af9288 -F autoconf/tea/Makefile.in b438a7020446c8a8156e8d97c8914a04833da6fd -F autoconf/tea/README 3e9a3c060f29a44344ab50aec506f4db903fb873 -F autoconf/tea/aclocal.m4 52c47aac44ce0ddb1f918b6993e8beb8eee88f43 -F autoconf/tea/configure.ac ea61e07340d97e4a79a081f0b8977198a6073edd060738dbb3ae5cb8d5e96f1c -F autoconf/tea/doc/sqlite3.n e1fe45d4f5286ee3d0ccc877aca2a0def488e9bb -F autoconf/tea/license.terms 13bd403c9610fd2b76ece0ab50c4c5eda933d523 -F autoconf/tea/pkgIndex.tcl.in 3ef61715cf1c7bdcff56947ffadb26bc991ca39d -F autoconf/tea/tclconfig/install-sh bdd5e293591621ae60d9824d86a4b1c5f22c3d00 -F autoconf/tea/tclconfig/tcl.m4 66ddf0a5d5e4b1d29bff472c0985fd7fa89d0fb5 -F autoconf/tea/win/makefile.vc 71915591c07cd5137711dc40ba3e127deb3f4531b9aad220b724cf5b451362bd -F autoconf/tea/win/nmakehlp.c 247538ad8e8c508f33c03ec1fbd67d3a07ef6291 -F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 -F config.guess 883205ddf25b46f10c181818bf42c09da9888884af96f79e1719264345053bd6 -F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc -F config.sub c2d0260f17f3e4bc0b6808fccf1b291cb5e9126c14fc5890efc77b9fd0175559 -F configure 4705718305e176b707e65047b69dca834fe7bc5475584e30fe1f63c8e33751b8 x -F configure.ac 798a24cee2879325ca5b688a618199eb32cc77ed8136edbaa43d9137b470d54e -F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad -F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd -F doc/begin_concurrent.md 4bee2c3990d1eb800f1ce3726a911292a8e4b889300b2ffd4b08d357370db299 -F doc/lemon.html 857495c0ce060a4e2f2ad7111135ad7e28041a32c10612279ab398eddf678f58 -F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 -F doc/trusted-schema.md 33625008620e879c7bcfbbfa079587612c434fa094d338b08242288d358c3e8a -F doc/vfs-shm.txt e101f27ea02a8387ce46a05be2b1a902a021d37a -F ext/README.md fd5f78013b0a2bc6f0067afb19e6ad040e89a10179b4f6f03eee58fac5f169bd -F ext/async/README.txt e12275968f6fde133a80e04387d0e839b0c51f91 -F ext/async/sqlite3async.c 0f3070cc3f5ede78f2b9361fb3b629ce200d7d74 -F ext/async/sqlite3async.h f489b080af7e72aec0e1ee6f1d98ab6cf2e4dcef -F ext/expert/README.md b321c2762bb93c18ea102d5a5f7753a4b8bac646cb392b3b437f633caf2020c3 -F ext/expert/expert.c d548d603a4cc9e61f446cc179c120c6713511c413f82a4a32b1e1e69d3f086a4 -F ext/expert/expert1.test 2e10ff875c31c9e6fc5e324767624181273859771fe34c5daeeadf3f2974a4f7 -F ext/expert/sqlite3expert.c ac008c72c00e6ded0f5116914d22ebd57f415fc0a7ea04738f4e9766dbdd3117 -F ext/expert/sqlite3expert.h ca81efc2679a92373a13a3e76a6138d0310e32be53d6c3bfaedabd158ea8969b -F ext/expert/test_expert.c d56c194b769bdc90cf829a14c9ecbc1edca9c850b837a4d0b13be14095c32a72 -F ext/fts1/README.txt 20ac73b006a70bcfd80069bdaf59214b6cf1db5e -F ext/fts1/ft_hash.c 3927bd880e65329bdc6f506555b228b28924921b -F ext/fts1/ft_hash.h 06df7bba40dadd19597aa400a875dbc2fed705ea -F ext/fts1/fts1.c a39f7d21c2994d27c959ef9c3505c81542c81432 -F ext/fts1/fts1.h 6060b8f62c1d925ea8356cb1a6598073eb9159a6 -F ext/fts1/fts1_hash.c 3196cee866edbebb1c0521e21672e6d599965114 -F ext/fts1/fts1_hash.h e7f0d761353996a8175eda351104acfde23afcb0 -F ext/fts1/fts1_porter.c b1c7304b8988ba3f764a147cdd32043b4913ea7b -F ext/fts1/fts1_tokenizer.h fdea722c38a9f82ed921642981234f666e47919c -F ext/fts1/fts1_tokenizer1.c fd00d1fe4dc30dfc5c64cba695ce34f4af20d2fa -F ext/fts1/fulltext.c 37698e1909584f6d8ea67d1485e3ad39dbf42d19 -F ext/fts1/fulltext.h 08525a47852d1d62a0be81d3fc3fe2d23b094efd -F ext/fts1/simple_tokenizer.c bbfa4e3b2a26ef17d4edc6d98cd4a3f5396d998a -F ext/fts1/tokenizer.h 0c53421b832366d20d720d21ea3e1f6e66a36ef9 -F ext/fts2/README.tokenizers 21e3684ea5a095b55d70f6878b4ce6af5932dfb7 -F ext/fts2/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts2/fts2.c 72c816a9ae448049fbbe8f18a85698765fc7956c -F ext/fts2/fts2.h da5f76c65163301d1068a971fd32f4119e3c95fa -F ext/fts2/fts2_hash.c 011a1d32de45bb1b519a1fd0048e857d6a843558 -F ext/fts2/fts2_hash.h 1824b99dfd8d0225facbdb26a2c87289b2e7dcf8 -F ext/fts2/fts2_icu.c 51c5cd3c04954badd329fa738c95fcdb717b5188 -F ext/fts2/fts2_porter.c 2cd4a507bf3c3085fe66f59b0f2a325f65aaacf5 -F ext/fts2/fts2_tokenizer.c b529493d55e55497213c37e1f31680a77746be26 -F ext/fts2/fts2_tokenizer.h 27a1a99ca2d615cf7e142839b8d79e8751b4529e -F ext/fts2/fts2_tokenizer1.c 07e223eecb483d448313b5f1553a4f299a7fb7a1 -F ext/fts2/mkfts2amal.tcl 974d5d438cb3f7c4a652639262f82418c1e4cff0 -F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 -F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a -F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d -F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 45f5774987a68d36355799503b6d02dbff5286ffb42bec14d928b295d2b93c1b -F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h 2c59cc46aefde134c1782e89a6a5384710ddcd4e783071337aa5d43d07269be3 -F ext/fts3/fts3_aux.c 96708c8b3a7d9b8ca1b68ea2b7e503e283f20e95f145becadedfad096dbd0f34 -F ext/fts3/fts3_expr.c f081e38da641724cd72c20e23b71db2bf4d0c9517c14637442f6910259f11a34 -F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6bdb48b7 -F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf -F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 -F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 -F ext/fts3/fts3_snippet.c 86e7e947a176f0f005720b3ca17631aca2fd2f9daa6729d4adbf2d16ab1b9613 -F ext/fts3/fts3_term.c f45a1e7c6ef464abb1231245d123dae12266b69e05cc56e14045b76591ae92d1 -F ext/fts3/fts3_test.c 73b16e229e517c1b1f0fb8e1046182a4e5dbc8dbe6eea8a5d4353fcce7dbbf39 -F ext/fts3/fts3_tokenize_vtab.c cb792f59212f7799bf2891c7d4579bbf568f124ce8fbb0a9902aa5bd577e8b75 -F ext/fts3/fts3_tokenizer.c 6d8fc150c48238955d5182bf661498db0dd473c8a2a80e00c16994a646fa96e7 -F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 -F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 -F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d -F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c ed869b24d074f2498bdbef915d6db1f88c604ca5811502112061932a0bed5133 -F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 -F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 -F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 -F ext/fts3/tool/fts3view.c 202801a2056995b763864d60c2dee744d46f1677 -F ext/fts3/unicode/CaseFolding.txt 8c678ca52ecc95e16bc7afc2dbf6fc9ffa05db8c -F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7 -F ext/fts3/unicode/mkunicode.tcl bf7fcaa6d68e6d38223467983785d054f1cff4d9e3905dd51f6ed8801bb590d5 -F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb -F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 -F ext/fts5/fts5.h c132a9323f22a972c4c93a8d5a3d901113a6e612faf30ca8e695788438c5ca2a -F ext/fts5/fts5Int.h d7cbc214ee167496f70905667e18f73ea0402f7ef09236ce305e117e0efc866a -F ext/fts5/fts5_aux.c dcc627d8b6e3fc773db528ff67b39955dab7b51628f9dba8e15849e5bedfd7fa -F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6dc8aaca70 -F ext/fts5/fts5_config.c b447948f35ad3354e8fe5e242e0a7e7b5b941555400b9404259944e3aa570037 -F ext/fts5/fts5_expr.c 2be456484786333d559dc2987a00f2750981fab91d52db8452a8046278c5f22e -F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 -F ext/fts5/fts5_index.c f25bec3c00bf050fa2d702d97b773d0706692661172026ddac8df1f164b8b198 -F ext/fts5/fts5_main.c e881a2ea0bf01b3a3ff0bc1b31373c58fd54b6c9f3c43ea3d431bea4e5d4025e -F ext/fts5/fts5_storage.c 3ecda8edadc1f62a355d6789776be0da609f8658c50d72e422674093ab7e1528 -F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 -F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee -F ext/fts5/fts5_test_tok.c f96c6e193c466711d6d7828d5f190407fe7ab897062d371426dd3036f01258e7 -F ext/fts5/fts5_tokenize.c 2e508c6a3bd8ee56c48e98a38052e1a650e49b32a484cce9b189984114bc3b88 -F ext/fts5/fts5_unicode2.c 8bd0cd07396b74c1a05590e4070d635bccfc849812c305619f109e6c0485e250 -F ext/fts5/fts5_varint.c e64d2113f6e1bfee0032972cffc1207b77af63319746951bf1d09885d1dadf80 -F ext/fts5/fts5_vocab.c 7a071833064dc8bca236c3c323e56aac36f583aa2c46ce916d52e31ce87462c9 -F ext/fts5/fts5parse.y eb526940f892ade5693f22ffd6c4f2702543a9059942772526eac1fde256bb05 -F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba -F ext/fts5/test/fts5_common.tcl b01c584144b5064f30e6c648145a2dd6bc440841 -F ext/fts5/test/fts5aa.test 5bd43427b7d08ce2e19c488a26534be450538b9232d4d5305049e8de236e9aa9 -F ext/fts5/test/fts5ab.test 9205c839332c908aaad2b01ab8670ece8b161e8f2ec8a9fabf18ca9385880bb7 -F ext/fts5/test/fts5ac.test a7aa7e1fefc6e1918aa4d3111d5c44a09177168e962c5fd2cca9620de8a7ed6d -F ext/fts5/test/fts5ad.test e8cf959dfcd57c8e46d6f5f25665686f3b6627130a9a981371dafdf6482790de -F ext/fts5/test/fts5ae.test 1142d16d9cc193894dc13cc8f9c7a8a21411ac61b5567a878514df6f9f0d7bb7 -F ext/fts5/test/fts5af.test 724247405b13f8f06cc6ce464dc4f152dc5dd4e86b12c2099685d8f19747bf7b -F ext/fts5/test/fts5ag.test 7816f25a0707578f08145ab539fc0ca025f8951e788b28a6a18a06b2099469dd -F ext/fts5/test/fts5ah.test 27b5a33bfd0363ca8a4dc659e6e2a5df3dea1c3c5b04bc51ca6aeb1277bd9b21 -F ext/fts5/test/fts5ai.test bc97e4758cc93e06bf851d61c98fdf4e8b8f8315ee28a84fb15f916360856414 -F ext/fts5/test/fts5aj.test 745020852d85f5dd49d11cb7ad11d3cc6dafc4fe6d6d24bc0875ac8f43ee4149 -F ext/fts5/test/fts5ak.test fc3595f8e6873bb86d70c9bd4b67d0413ce577bd4793c39a2b60a7b8825b60a6 -F ext/fts5/test/fts5al.test 00c4c1c6a1366b73aa48ce2068c634520867c3cf7f5d1676ebbb775ee1f35734 -F ext/fts5/test/fts5alter.test 5565f7e4605512b69171ac18ca84398603f9f6456dbe377beeca97e83cc242cd -F ext/fts5/test/fts5auto.test 78989e6527ce69c9eddbef7392fea5c10b0010cd2b2ae68eec7bc869c471e691 -F ext/fts5/test/fts5aux.test ebf6f2ff7cb556e83f66991b7f12bff016d3c83d4eab36704b649dd6b1437318 -F ext/fts5/test/fts5auxdata.test eacc97ff04892f1a5f3d4df5a73f8bcbc3955ea1d12c9f24137eb1fc079e7611 -F ext/fts5/test/fts5bigpl.test 6466c89b38439f0aba26ac09e232a6b963f29b1cbe1304f6a664fe1e7a8f5fd3 -F ext/fts5/test/fts5bigtok.test 541119e616c637caea925a8c028c37c2c29e94383e00aa2f9198d530724b6e36 -F ext/fts5/test/fts5cat.test daba0b80659460b0cb60bd1f40b402478a761fe7ea414c3c94c2be25568cc33a -F ext/fts5/test/fts5circref.test f880dfd0d99f6fb73b88ccacb0927d18e833672fd906cc47d6b4e529419eaa62 -F ext/fts5/test/fts5colset.test a30473451321bbf0b6218af62e96b4ae5fa99931cfdb210b5ecc804623b30f75 -F ext/fts5/test/fts5columnsize.test 45459ce4dd9fd853b6044cdc9674921bff89e3d840f348ca8c1630f9edbf5482 -F ext/fts5/test/fts5config.test 60094712debc59286c59aef0e6cf511c37d866802776a825ce437d26afe0817f -F ext/fts5/test/fts5conflict.test 655925678e630d3cdf145d18725a558971806416f453ac8410ca8c04d934238d -F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c073e19b3ae9126b2f4 -F ext/fts5/test/fts5content.test 213506436fb2c87567b8e31f6d43ab30aab99354cec74ed679f22aad0cdbf283 -F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe -F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test fab4ea761b2df254fb3909423989320772a3a757de4d151ddcfa2a40a3b93328 -F ext/fts5/test/fts5corrupt4.test ea805c4d7c68b5f185b9db5d2060a7ae5875339738dd48203c92162f41e7ca91 -F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 -F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e -F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 -F ext/fts5/test/fts5dlidx.test b90852c55881b29dbac6380b274de27beae623ac4b6d567c6c8fb9cdc315a86e -F ext/fts5/test/fts5doclist.test e39a6001495f1dc68e20323586ac965787986c2bf6f515b9b0285627b089d9e6 -F ext/fts5/test/fts5ea.test b01e3a18cdfabbff8104a96a5242a06a68a998a0 -F ext/fts5/test/fts5eb.test 239bb2f02571f8cccfc7018d08f502df1cd8cc6a69b65ed1dde5f6a070e3f669 -F ext/fts5/test/fts5fault1.test d28a65caee75db6897c3cf1358c5230d3bb2a3bf7fb31062c19c7e5382b3d2bd -F ext/fts5/test/fts5fault2.test 69c8fdbef830cd0d450908d4504d5bb86609e255af99c421c20a0756251fe344 -F ext/fts5/test/fts5fault3.test da2f9e3e56ff5740d68ebdd6877c97089e7ed28ddff28a0da87a6afea27e5522 -F ext/fts5/test/fts5fault4.test 1c1db5fcfe59401e7833146100f1d8de284a0a686fac31ddac9fb56c459f725b -F ext/fts5/test/fts5fault5.test a336e4e11847de24c9497f80cce18e00bb3fab7fb11f97d04eb9af898900a762 -F ext/fts5/test/fts5fault6.test a0fc0a8f99e4b16500c31dfc7e38e1defe0f1693ac47650517ac7b723b1956f8 -F ext/fts5/test/fts5fault7.test 0acbec416edb24b8881f154e99c31e9ccf73f539cfcd164090be139e9e97ed4c -F ext/fts5/test/fts5fault8.test 318238659d35f82ad215ecb57ca4c87486ea85d45dbeedaee42f148ff5105ee2 -F ext/fts5/test/fts5fault9.test 098e6b894bbdf9b2192f994a30f4043673fb3f338b6b8ab1624c704422f39119 -F ext/fts5/test/fts5faultA.test be4487576bff8c22cee6597d1893b312f306504a8c6ccd3c53ca85af12290c8c -F ext/fts5/test/fts5faultB.test d606bdb8e81aaeb6f41de3fc9fc7ae315733f0903fbff05cf54f5b045b729ab5 -F ext/fts5/test/fts5faultD.test cc5d1225556e356615e719c612e845d41bff7d5a -F ext/fts5/test/fts5first.test 3fcf2365c00a15fc9704233674789a3b95131d12de18a9b996159f6909dc8079 -F ext/fts5/test/fts5full.test e1701a112354e0ff9a1fdffb0c940c576530c33732ee20ac5e8361777070d717 -F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e -F ext/fts5/test/fts5hash.test a4cf51acad99bfc43c16fb74f9d22495dc221ae0701fc5e908ca963a9b26a02b -F ext/fts5/test/fts5integrity.test 8ffabcd91b058d812aba3e3e0a06f76ce165ba402a18cca20e34204a7feec92e -F ext/fts5/test/fts5interrupt.test 09613247b273a99889808ef852898177e671406fe71fdde7ea00e78ea283d227 -F ext/fts5/test/fts5lastrowid.test be98fe3e03235296585b72daad7aed5717ba0062bae5e5c18dd6e04e194c6b28 -F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc2782680740513c4d1fc114b43d4ad -F ext/fts5/test/fts5matchinfo.test 10c9a6f7fe61fb132299c4183c012770b10c4d5c2f2edb6df0b6607f683d737a -F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6 -F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 -F ext/fts5/test/fts5misc.test 088ac5f0f5de1ad45b0f83197ab5263bcae8130156cdc901bff2375ff2b8af86 -F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581 -F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 -F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd -F ext/fts5/test/fts5onepass.test f9b7d9b2c334900c6542a869760290e2ab5382af8fbd618834bf1fcc3e7b84da -F ext/fts5/test/fts5optimize.test 36a752d24c818792032e4ff502936fc9cc5ef938721696396fdc79214b2717f1 -F ext/fts5/test/fts5phrase.test 13e5d8e9083077b3d9c74315b3c92ec723cc6eb37c8155e0bfe1bba00559f07b -F ext/fts5/test/fts5plan.test 771b999d161e24fd803ce0290adb7c6e7c9b9cc2c6a0adb344813fb89473aa32 -F ext/fts5/test/fts5porter.test 8d08010c28527db66bc3feebd2b8767504aaeb9b101a986342fa7833d49d0d15 -F ext/fts5/test/fts5porter2.test 0d251a673f02fa13ca7f011654873b3add20745f7402f108600a23e52d8c7457 -F ext/fts5/test/fts5prefix.test a0fa67b06650f2deaa7bf27745899d94e0fb547ad9ecbd08bfad98c04912c056 -F ext/fts5/test/fts5query.test ac363b17a442620bb0780e93c24f16a5f963dfe2f23dc85647b869efcfada728 -F ext/fts5/test/fts5rank.test c9fd4a1e36b4fa92d572ec13d846469b97da249d1c2f7fd3ee7e017ce46f2416 -F ext/fts5/test/fts5rebuild.test 55d6f17715cddbf825680dd6551efbc72ed916d8cf1cde40a46fc5d785b451e7 -F ext/fts5/test/fts5restart.test 835ecc8f449e3919f72509ab58056d0cedca40d1fe04108ccf8ac4c2ba41f415 -F ext/fts5/test/fts5rowid.test b8790ec170a8dc1942a15aef3db926a5f3061b1ff171013003d8297203a20ad6 -F ext/fts5/test/fts5savepoint.test fc02929f238d02a22df4172625704e029f7c1e0e92e332d654375690f8e6e43f -F ext/fts5/test/fts5simple.test a298670508c1458b88ce6030440f26a30673931884eb5f4094ac1773b3ba217b -F ext/fts5/test/fts5simple2.test 258a1b0c590409bfa5271e872c79572b319d2a56554d0585f68f146a0da603f0 -F ext/fts5/test/fts5simple3.test d5c74a9d3ca71bd5dd5cacb7c55b86ea12cdddfc8b1910e3de2995206898380f -F ext/fts5/test/fts5synonym.test 1651815b8008de170e8e600dcacc17521d765482ea8f074ae82cfa870d8bb7fb -F ext/fts5/test/fts5synonym2.test b54cce5c34ec08ed616f646635538ae82e34a0e28f947ec60b6fadbc4b3fb17a -F ext/fts5/test/fts5tok1.test ce6551e41ff56f30b69963577324624733bed0d1753589f06120d664d9cd45c9 -F ext/fts5/test/fts5tok2.test dcacb32d4a2a3f0dd3215d4a3987f78ae4be21a2 -F ext/fts5/test/fts5tokenizer.test ac3c9112b263a639fb0508ae73a3ee886bf4866d2153771a8e8a20c721305a43 -F ext/fts5/test/fts5umlaut.test a42fe2fe6387c40c49ab27ccbd070e1ae38e07f38d05926482cc0bccac9ad602 -F ext/fts5/test/fts5unicode.test 17056f4efe6b0a5d4f41fdf7a7dc9af2873004562eaa899d40633b93dc95f5a9 -F ext/fts5/test/fts5unicode2.test 9b3df486de05fb4bde4aa7ee8de2e6dae1df6eb90e3f2e242c9383b95d314e3e -F ext/fts5/test/fts5unicode3.test 590c72e18195bda2446133f9d82d04a4e89d094bba58c75ae10f4afc6faa0744 -F ext/fts5/test/fts5unicode4.test 6463301d669f963c83988017aa354108be0b947d325aef58d3abddf27147b687 -F ext/fts5/test/fts5unindexed.test 9021af86a0fb9fc616f7a69a996db0116e7936d0db63892db6bafabbec21af4d -F ext/fts5/test/fts5update.test b8affd796e45c94a4d19ad5c26606ea06065a0f162a9562d9f005b5a80ccf0bc -F ext/fts5/test/fts5version.test c8f2cc105f0abf0224965f93e584633dee3e06c91478bc67e468f7cfdf97fd6a -F ext/fts5/test/fts5vocab.test 7ed80d9af1ddaaa1637da05e406327b5aac250848bc604c1c1cc667908b87760 -F ext/fts5/test/fts5vocab2.test e0fdc3a3095f6eda68ac9bf9a443ff929a124d46f00af19933604085712e9d47 -F ext/fts5/tool/fts5speed.tcl b0056f91a55b2d1a3684ec05729de92b042e2f85 -F ext/fts5/tool/fts5txt2db.tcl 526a9979c963f1c54fd50976a05a502e533a4c59 -F ext/fts5/tool/loadfts5.tcl 95b03429ee6b138645703c6ca192c3ac96eaf093 -F ext/fts5/tool/mkfts5c.tcl d1c2a9ab8e0ec690a52316f33dd9b1d379942f45 -F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c -F ext/icu/README.txt 1c48ffaf7f255bd73d00a35f68f6de357c2a6594f16cb00506a151be23694706 -F ext/icu/icu.c 91c021c7e3e8bbba286960810fa303295c622e323567b2e6def4ce58e4466e60 -F ext/icu/sqliteicu.h 728867a802baa5a96de7495e9689a8e01715ef37 -F ext/lsm1/Makefile a553b728bba6c11201b795188c5708915cc4290f02b7df6ba7e8c4c943fd5cd9 -F ext/lsm1/Makefile.msc f8c878b467232226de288da320e1ac71c131f5ec91e08b21f502303347260013 -F ext/lsm1/lsm-test/README 87ea529d2abe615e856d4714bfe8bb185e6c2771b8612aa6298588b7b43e6f86 -F ext/lsm1/lsm-test/lsmtest.h cf58528ffe0cfe535e91b44584e2ec5fb1caacdabecef0d8dcf83bf83168bf28 -F ext/lsm1/lsm-test/lsmtest1.c ae6ba48a0851b39be69a7d0eb220bfb9521a526e926223d5014bd385df10abb3 -F ext/lsm1/lsm-test/lsmtest2.c 188b09aec776516aeedcfd13b9c6faf85ba16b3671a0897a2c740ee00a5dc4f8 -F ext/lsm1/lsm-test/lsmtest3.c 9ab87528a36dbf4a61d7c8ad954f5ee368c0878c127b84b942b2e2abe522de26 -F ext/lsm1/lsm-test/lsmtest4.c d258d6a245db5d8eaede096e2368d23f859c5e92c80ab9122463f708514fe10c -F ext/lsm1/lsm-test/lsmtest5.c 8d5242a0f870d65eeada191c8945781fed9cb8ece3886573790ebd373b62dac5 -F ext/lsm1/lsm-test/lsmtest6.c 869cb4a172cd07d1a75b3aeaecd61d0a477787b3b8668bad0d3ff0f43b642b7c -F ext/lsm1/lsm-test/lsmtest7.c 7a917455a0f956a8ed3f44f5c9387ec0ea6627714874464cc3fa5c5a9cabb2f2 -F ext/lsm1/lsm-test/lsmtest8.c 589b68c44531a0f04d5e879bb1e211be5f7100f48eed7e8631e07ed5cbd68f94 -F ext/lsm1/lsm-test/lsmtest9.c dd1a0ebf41134933a744d1e00e60429a2a21fc50d587ae7dd6bdb6e96d805bdc -F ext/lsm1/lsm-test/lsmtest_bt.c d70d9a9be5eef9360af1251dd083948d74fd30137a08f61bef995f7ac04e037f -F ext/lsm1/lsm-test/lsmtest_datasource.c 5d770be191d0ca51315926723009b2c25c0b4b8136840494ef710ac324aa916c -F ext/lsm1/lsm-test/lsmtest_func.c 159aa401bc8032bfa3d8cf2977bd687abebab880255895a5eb45770d626fa38d -F ext/lsm1/lsm-test/lsmtest_io.c cf11b27b129c6bd5818fa1d440176502dc27229f0db892b4479118d61993ea20 -F ext/lsm1/lsm-test/lsmtest_main.c a9bc647738c0dcaebf205d6d194b3ce4a6ef3925801cd2d919f0a4ea33a15aeb -F ext/lsm1/lsm-test/lsmtest_mem.c 4e63c764345ab1df59d4f13a77980c6f3643798210b10d6cdbd785b4b888fda5 -F ext/lsm1/lsm-test/lsmtest_tdb.c 618a8619183fda4f5540fcde15f9068293c5e3180e1a246e34409b0c148758b3 -F ext/lsm1/lsm-test/lsmtest_tdb.h 8733eee249b12956a9df8322994b43d19bd8c02ad2e8b0bb5164db4d6ccc1735 -F ext/lsm1/lsm-test/lsmtest_tdb2.cc 99ea7f2dd9c7536c8fb9bdd329e4cfeb76899f3ddf6f48bdd3926e016922b715 -F ext/lsm1/lsm-test/lsmtest_tdb3.c 7a7ccae189f5bb25bcd1ec3bbd740529706eded7f6729a5a0a9eeaeb57785320 -F ext/lsm1/lsm-test/lsmtest_tdb4.c 47e8bb5eba266472d690fb8264f1855ebdba0ae5a0e541e35fcda61ebf1d277f -F ext/lsm1/lsm-test/lsmtest_util.c 241622db5a332a09c8e6e7606b617d288a37b557f7d3bce0bb97809f67cc2806 -F ext/lsm1/lsm-test/lsmtest_win32.c 0e0a224674c4d3170631c41b026b56c7e1672b151f5261e1b4cc19068641da2d -F ext/lsm1/lsm.h 0f6f64ff071471cb87bf98beb8386566f30ea001 -F ext/lsm1/lsmInt.h 5983690e05e83653cc01ba9d8fbf8455e534ddf8349ed9adedbf46a7549760b0 -F ext/lsm1/lsm_ckpt.c 0eabfaf812ddb4ea43add38f05e430694cd054eb622c3e35af4c43118a2d5321 -F ext/lsm1/lsm_file.c 3c51841d5b3e7da162693cbac9a9f47eeedf6bcbbe2969a4d25e30c428c9fe36 -F ext/lsm1/lsm_log.c a8bf334532109bba05b09a504ee45fc393828b0d034ca61ab45e3940709d9a7c -F ext/lsm1/lsm_main.c b5703f8042e71d3a2d65e671f6832e077e79e89e9975818f67f969922618db63 -F ext/lsm1/lsm_mem.c 4c51ea9fa285ee6e35301b33491642d071740a0a -F ext/lsm1/lsm_mutex.c 378edf0a2b142b4f7640ee982df06d50b98788ea -F ext/lsm1/lsm_shared.c 76adfc1ed9ffebaf92746dde4b370ccc48143ca8b05b563816eadd2aadf1c525 -F ext/lsm1/lsm_sorted.c 6f7d8cf7a7d3d3f1ab5d9ba6347e8f39f3d73c00ec48afcd0c4bcbefd806f9b8 -F ext/lsm1/lsm_str.c 65e361b488c87b10bf3e5c0070b14ffc602cf84f094880bece77bbf6678bca82 -F ext/lsm1/lsm_tree.c 682679d7ef2b8b6f2fe77aeb532c8d29695bca671c220b0abac77069de5fb9fb -F ext/lsm1/lsm_unix.c 57361bcf5b1a1a028f5d66571ee490e9064d2cfb145a2cc9e5ddade467bb551b -F ext/lsm1/lsm_varint.c 43f954af668a66c7928b81597c14d6ad4be9fedbc276bbd80f52fa28a02fdb62 -F ext/lsm1/lsm_vtab.c 169bfe7ef8e6c9de9c77e17c4c50c9ae55fb0167d80be3d1be82c991184b6f35 -F ext/lsm1/lsm_win32.c 0a4acbd7e8d136dd3a5753f0a9e7a9802263a9d96cef3278cf120bcaa724db7c -F ext/lsm1/test/lsm1_common.tcl 5ed4bab07c93be2e4f300ebe46007ecf4b3e20bc5fbe1dedaf04a8774a6d8d82 -F ext/lsm1/test/lsm1_simple.test a04d08e8661ae6fc53786c67f0bd102c6692f003e859dde03ed9ac3f12e066e5 -F ext/lsm1/tool/mklsm1c.tcl f31561bbee5349f0a554d1ad7236ac1991fc09176626f529f6078e07335398b0 -F ext/misc/README.md d6dd0fe1d8af77040216798a6a2b0c46c73054d2f0ea544fbbcdccf6f238c240 -F ext/misc/amatch.c e3ad5532799cee9a97647f483f67f43b38796b84b5a8c60594fe782a4338f358 -F ext/misc/anycollseq.c 5ffdfde9829eeac52219136ad6aa7cd9a4edb3b15f4f2532de52f4a22525eddb -F ext/misc/appendvfs.c 3777f22ec1057dc4e5fd89f2fbddcc7a29fbeef1ad038c736c54411bb1967af7 -F ext/misc/blobio.c a867c4c4617f6ec223a307ebfe0eabb45e0992f74dd47722b96f3e631c0edb2a -F ext/misc/btreeinfo.c 26004b7a6be320ec08fc20ca8d0f01fccb00a98cbe0f3197446794ff2a506aa3 -F ext/misc/carray.c 91e9a7f512fda934894bed30464552fffa7d3073b5be04189ae0bd0c59f26bfd -F ext/misc/cksumvfs.c b0d07f2e1bb08f8b6f311f4e454360b6a7f0021912c326428d74900020f29c31 -F ext/misc/closure.c dbfd8543b2a017ae6b1a5843986b22ddf99ff126ec9634a2f4047cd14c85c243 -F ext/misc/completion.c a0efe03edfdc4f717c61e6c9b0bfe2708ff7878010dae3174980a68fdf76aabc -F ext/misc/compress.c 3354c77a7c8e86e07d849916000cdac451ed96500bfb5bd83b20eb61eee012c9 -F ext/misc/csv.c 3ed979c1eb35e35a98b30ef545a2facf62994594217681d9138b4b75faf6b0d7 -F ext/misc/dbdata.c e316fba936571584e55abd5b974a32a191727a6b746053a0c9d439bd2cf93940 -F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287c336 -F ext/misc/eval.c 04bc9aada78c888394204b4ed996ab834b99726fb59603b0ee3ed6e049755dc1 -F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f -F ext/misc/fileio.c 9b69e25da3b51d4a1d905a464ccb96709792ad627a742ba09215bc0d1447e7bd -F ext/misc/fossildelta.c 1240b2d3e52eab1d50c160c7fe1902a9bd210e052dc209200a750bbf885402d5 -F ext/misc/fuzzer.c eae560134f66333e9e1ca4c8ffea75df42056e2ce8456734565dbe1c2a92bf3d -F ext/misc/ieee754.c eaffd9b364d7c8371727e9c43fc8bec38cdacc4d11fc26beffaa3ca05a0ea9d6 -F ext/misc/json1.c 3a42e3231d716516a8ae33b0a052d3ed5f52943e3d627b68744a427a6e552ae3 -F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d -F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b -F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567 -F ext/misc/mmapwarm.c 8c5fe90d807a23e44a8b93e96e8b812b19b300d5fd8c1d40a4fd1d8224e33f46 -F ext/misc/nextchar.c 7877914c2a80c2f181dd04c3dbef550dfb54c93495dc03da2403b5dd58f34edd -F ext/misc/noop.c 81efe4cad9ec740e64388b14281cb983e6e2c223fed43eb77ab3e34946e0c1ab -F ext/misc/normalize.c b4290464f542bae7a97b43f15bd197949b833ffd668b7c313631bd5d4610212c -F ext/misc/percentile.c b9086e223d583bdaf8cb73c98a6539d501a2fc4282654adbfea576453d82e691 -F ext/misc/prefixes.c 0f4f8cff5aebc00a7e3ac4021fd59cfe1a8e17c800ceaf592859ecb9cbc38196 -F ext/misc/regexp.c 246244c714267f303df76acf73dcf110cf2eaf076896aaaba8db6d6d21a129db -F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c -F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c -F ext/misc/scrub.c db9fff56fed322ca587d73727c6021b11ae79ce3f31b389e1d82891d144f22ad -F ext/misc/series.c 4057dda3579b38ff88b2d3b13b4dd92dbd9d6f90dac2b55c19b0a8ed87ee4959 -F ext/misc/sha1.c c8f2253c8792ffab9517695ea7d88c079f0395a5505eefef5c8198fe184ed5ac -F ext/misc/shathree.c 135b7c145db4a09b1650c3e7aff9cb538763a9a361e834c015dd1aaf8d5c9a00 -F ext/misc/showauth.c 732578f0fe4ce42d577e1c86dc89dd14a006ab52 -F ext/misc/spellfix.c 94df9bbfa514a563c1484f684a2df3d128a2f7209a84ca3ca100c68a0163e29f -F ext/misc/sqlar.c 0ace5d3c10fe736dc584bf1159a36b8e2e60fab309d310cd8a0eecd9036621b6 -F ext/misc/stmt.c 35063044a388ead95557e4b84b89c1b93accc2f1c6ddea3f9710e8486a7af94a -F ext/misc/templatevtab.c 8a16a91a5ceaccfcbd6aaaa56d46828806e460dd194965b3f77bf38f14b942c4 -F ext/misc/totype.c fa4aedeb07f66169005dffa8de3b0a2b621779fd44f85c103228a42afa71853b -F ext/misc/uint.c 053fed3bce2e89583afcd4bf804d75d659879bbcedac74d0fa9ed548839a030b -F ext/misc/unionvtab.c 36237f0607ca954ac13a4a0e2d2ac40c33bc6e032a5f55f431713061ef1625f9 -F ext/misc/urifuncs.c f71360d14fa9e7626b563f1f781c6148109462741c5235ac63ae0f8917b9c751 -F ext/misc/uuid.c 5bb2264c1b64d163efa46509544fd7500cb8769cb7c16dd52052da8d961505cf -F ext/misc/vfslog.c 3b25c2f56ba60788db247287be6ab024b53c4afffd412b4876db563389be0d35 -F ext/misc/vfsstat.c 389ea13983d3af926504c314f06a83cc858d5adc24b40af74aaed1fece00c118 -F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae -F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd -F ext/misc/wholenumber.c 520f34c3099e5b7d546f13708607dc2fa173c46b68952eecf0d19cd675fec85e -F ext/misc/zipfile.c d1be54ea83ac9ad71b8b6ffc4b60db8946ce2ceacdf6bff063fcd9489f41bb49 -F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64 -F ext/rbu/rbu.c 8681f6157db6adc82c34af24b14ea8a3be0146ad2a3b6c1d5da6cb8a5796c8ce -F ext/rbu/rbu1.test 221d9c18a5e600ac9ac6b1810d99d9f99163a7909ba61597876ab6e4d4beb3d6 -F ext/rbu/rbu10.test 0a201c32202143f23c81c0144503da339786fc20acb7a2fda11601b65659f314 -F ext/rbu/rbu11.test 5c834cf491086b45e071eabf71f708febc143e86a384a92de69e0b1a4cace144 -F ext/rbu/rbu12.test 29f8b2118f6c96fac3755bd6d2b55c2db24f878b1f11fbfbe294f3a230a3dcdc -F ext/rbu/rbu13.test 1285298e3360ec74511764841b3c174dcfe21da2f618c22febf1a20abd0365c2 -F ext/rbu/rbu14.test 4a7bf0b3a4516d3ab0bc0ba4ceb53eb7e3324147ccda152e561060f659dbba31 -F ext/rbu/rbu3.test d6c6cc7a1326e8e23b9820f30bd3054f22092e503fadfd2a660ae006653f6d80 -F ext/rbu/rbu5.test 724b38ea5f722e3d22dc76343860bd998bb676c3f78c4bc8175df5c5d7720e23 -F ext/rbu/rbu6.test 401064236d3cf86b7edc01c586d7c5554f48553946fbfa1a3af35d7e47dce9e3 -F ext/rbu/rbu7.test ae25f47b56f178197fc1098537a35a39176cc73d1629b03dc9d795929fc36ec2 -F ext/rbu/rbu8.test b98a6fc58ead84a0e6ddee775b9702cd981f318d5d4fd1d4df0fa0c40db7251b -F ext/rbu/rbu9.test 0e4d985e25620d61920597e8ea69c871c9e8c1f5a0be2ae9fa70bb641d74378c -F ext/rbu/rbuA.test b34a90cb495682c25b5fc03a9d5e7a4fc99541c29256f25e2e2a4f6542b4f5b3 -F ext/rbu/rbuB.test 52b07158824c6927b7e25554ace92a695cdebfc296ae3d308ac386984aded9bc -F ext/rbu/rbuC.test 80f1cc2fb74f44b1128fd0ed8eedab3a76fefeb72a947860e2869ef76fc8dc6b -F ext/rbu/rbu_common.tcl 60d904133ff843fe72cc0514e9dd2486707181e6e0fbab20979da28c48d21de9 -F ext/rbu/rbucollate.test cac528a9a46318cba42e61258bb42660bbbf4fdb9a8c863de5a54ad0c658d197 -F ext/rbu/rbucrash.test 000981a1fe8a6e4d9a684232f6a129e66a3ef595f5ed74655e2f9c68ffa613b4 -F ext/rbu/rbucrash2.test efa143cc94228eb0266d3f1abfbee60a5838a84cef7cc3fcb8c145b74d96fd41 -F ext/rbu/rbudiff.test 156957851136b63c143478518dc1bda6c832103cdbe8ac1d7cdd47edb3cbe0a3 -F ext/rbu/rbudor.test e3e8623926012f43eebe51fedf06a102df2640750d971596b052495f2536db20 -F ext/rbu/rbuexpr.test 10d0420537c3bc7666e576d72adeffe7e86cfbb00dcc30aa9ce096c042415190 -F ext/rbu/rbufault.test 2d7f567b79d558f6e093c58808cab4354f8a174e3802f69e7790a9689b3c09f8 -F ext/rbu/rbufault2.test c81327a3ac2c385b9b954db3644d4e0df93eeebfc3de9f1f29975a1e73fd3d0c -F ext/rbu/rbufault3.test b2fcc9db5c982b869f67d1d4688d8cb515d5b92f58011fff95665f2e62cec179 -F ext/rbu/rbufault4.test 03d2849c3df7d7bd14a622e789ff049e5080edd34a79cd432e01204db2a5930a -F ext/rbu/rbufts.test 0ae8d1da191c75bd776b86e24456db0fb6e97b7c944259fae5407ea55d23c31d -F ext/rbu/rbumisc.test 329986cf5dd51890c4eb906c2f960ebb773a79a64bed90f506b7c417825b37eb -F ext/rbu/rbumulti.test 5fb139058f37ddc5a113c5b93238de915b769b7792de41b44c983bc7c18cf5b9 -F ext/rbu/rbupartial.test f25df014b8dbe3c5345851fba6e66f79ab237f57dc201b2d5f0dbae658ae5a4c -F ext/rbu/rbuprogress.test 857cf1f8166c83ef977edb9ef4fc42d80f71fbd798652b46ae2f3a7031870f8d -F ext/rbu/rburesume.test dbdc4ca504e9c76375a69e5f0d91205db967dcc509a5166ca80231f8fda49eb1 -F ext/rbu/rbusave.test f4190a1a86fccf84f723af5c93813365ae33feda35845ba107b59683d1cdd926 -F ext/rbu/rbusplit.test b37e7b40b38760881dc9c854bd40b4744c6b6cd74990754eca3bda0f407051e8 -F ext/rbu/rbutemplimit.test 05ceefa90a2e26a99f40dd48282ed63a00df5e59c1f2bfd479c143e201a1b0ba -F ext/rbu/rbuvacuum.test 55e101e90168c2b31df6c9638fe73dc7f7cc666b6142266d1563697d79f73534 -F ext/rbu/rbuvacuum2.test b8e5b51dc8b2c0153373d024c0936be3f66f9234acbd6d0baab0869d56b14e6b -F ext/rbu/rbuvacuum3.test 8addd82e4b83b4c93fa47428eae4fd0dbf410f8512c186f38e348feb49ba03dc -F ext/rbu/rbuvacuum4.test a78898e438a44803eb2bc897ba3323373c9f277418e2d6d76e90f2f1dbccfd10 -F ext/rbu/sqlite3rbu.c 77a47f3231f5f363b2c584dba3e310a7efdaf073ad8c18728ab846b38de2879c -F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812 -F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a -F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15 -F ext/repair/checkfreelist.c 0dbae18c1b552f58d64f8969e4fb1e7f11930c60a8c2a9a8d50b7f15bdfd54bd -F ext/repair/checkindex.c 7d28c01a2e012ac64257d230fc452b2cafb78311a91a343633d01d95220f66f3 -F ext/repair/sqlite3_checker.c.in 4a5a3af3f450fe503e5a2985e98516dc2a6b9ad247449e284c1cf140fc91720f -F ext/repair/sqlite3_checker.tcl a9a2caa9660567257c177a91124d8c0dccdfa341e25c51e6da7f1fd9e601eafa -F ext/repair/test/README.md 34b2f542cf5be7bffe479242b33ee3492cea30711e447cc4a1a86cb5915f419e -F ext/repair/test/checkfreelist01.test 3e8aa6aeb4007680c94a8d07b41c339aa635cc78249442da72ff3f8297398a69 -F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c335096108c12c01bddbadcec -F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c -F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 -F ext/rtree/geopoly.c cac70b5502742bd0ba8877a1329a74e86a379c78567546a2a18cf5f9c3787f73 -F ext/rtree/rtree.c 0ee39cc787b95aa03a012e09e6090b0fa452154fa812af9a379898560fd6c00f -F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 -F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e -F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d -F ext/rtree/rtree3.test 4ee5d7df86040efe3d8d84f141f2962a7745452200a7cba1db06f86d97050499 -F ext/rtree/rtree4.test 304de65d484540111b896827e4261815e5dca4ce28eeecd58be648cd73452c4b -F ext/rtree/rtree5.test 49c9041d713d54560b315c2c7ef7207ee287eba1b20f8266968a06f2e55d3142 -F ext/rtree/rtree6.test 1252a0439da01d2f1f5cbbdeeb80455a2d68b9bae2a9787937b167a5e3957828 -F ext/rtree/rtree7.test c8fb2e555b128dd0f0bdb520c61380014f497f8a23c40f2e820acc9f9e4fdce5 -F ext/rtree/rtree8.test 2d99006a1386663978c9e1df167554671e4f711c419175b39f332719deb1ce0e -F ext/rtree/rtree9.test c646f12c8c1c68ef015c6c043d86a0c42488e2e68ed1bb1b0771a7ca246cbabf -F ext/rtree/rtreeA.test ed2f1be9c06dde0b1ab93a95dd9e87eeaa02db2d30bcb4b9179b69ee3dc3319b -F ext/rtree/rtreeB.test 4cec297f8e5c588654bbf3c6ed0903f10612be8a2878055dd25faf8c71758bc9 -F ext/rtree/rtreeC.test 6aa87eba4d9a3003b941a1ba77db259c5cabc3fd92fc5a6360f5369520eb9a4d -F ext/rtree/rtreeD.test fe46aa7f012e137bd58294409b16c0d43976c3bb92c8f710481e577c4a1100dc -F ext/rtree/rtreeE.test e65d3fc625da1800b412fc8785817327d43ccfec5f5973912d8c9e471928caa9 -F ext/rtree/rtreeF.test 81ffa7ef51c4e4618d497a57328c265bf576990c7070633b623b23cd450ed331 -F ext/rtree/rtreeG.test 1b9ca6e3effb48f4161edaa463ddeaa8fca4b2526d084f9cbf5dbe4e0184939c -F ext/rtree/rtreeH.test 0885151ee8429242625600ae47142cca935332c70a06737f35af53a7bd7aaf90 -F ext/rtree/rtreeI.test 608e77f7fde9be5a12eae316baef640fffaafcfa90a3d67443e78123e19c4ca4 -F ext/rtree/rtree_perf.tcl 6c18c1f23cd48e0f948930c98dfdd37dfccb5195 -F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b587936f5f6bceed -F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 -F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e -F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/rtreefuzz001.test eef1ed593bb15886cd5d5367a2f2492f81e315848896cdf7afb6e21454978827 -F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 -F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de -F ext/rtree/util/randomshape.tcl 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff -F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 -F ext/rtree/visual01.txt e9c2564083bcd30ec51b07f881bffbf0e12b50a3f6fced0c222c5c1d2f94ac66 -F ext/session/changebatch1.test 9ceaa8f7b2a505933e250fbe6cbc550e4ce1e59d -F ext/session/changebatchfault.test be49c793219bf387ad692a60856b921f0854ad6d -F ext/session/changeset.c 7a1e6a14c7e92d36ca177e92e88b5281acd709f3b726298dc34ec0fb58869cb5 -F ext/session/changesetfuzz.c 227076ab0ae4447d742c01ee88a564da6478bbf26b65108bf8fac9cd8b0b24aa -F ext/session/changesetfuzz1.test 2e1b90d888fbf0eea5e1bd2f1e527a48cc85f8e0ff75df1ec4e320b21f580b3a -F ext/session/session1.test 0b2f88995832ea040ae8e83a1ad4afa99c00b85c779d213da73a95ea4113233e -F ext/session/session2.test 284de45abae4cc1082bc52012ee81521d5ac58e0 -F ext/session/session3.test ce9ce3dfa489473987f899e9f6a0f2db9bde3479 -F ext/session/session4.test 6778997065b44d99c51ff9cece047ff9244a32856b328735ae27ddef68979c40 -F ext/session/session5.test 716bc6fafd625ce60dfa62ae128971628c1a1169 -F ext/session/session6.test 443789bc2fca12e4f7075cf692c60b8a2bea1a26 -F ext/session/session8.test 8e194b3f655d861ca36de5d4de53f702751bab3b -F ext/session/session9.test 5409d90d8141881d08285ed1c2c0d8d10fb92069 -F ext/session/sessionA.test 1feeab0b8e03527f08f2f1defb442da25480138f -F ext/session/sessionB.test c4fb7f8a688787111606e123a555f18ee04f65bb9f2a4bb2aa71d55ce4e6d02c -F ext/session/sessionC.test f8a5508bc059ae646e5ec9bdbca66ad24bc92fe99fda5790ac57e1f59fce2fdf -F ext/session/sessionD.test 4f91d0ca8afc4c3969c72c9f0b5ea9527e21de29039937d0d973f821e8470724 -F ext/session/sessionE.test b2010949c9d7415306f64e3c2072ddabc4b8250c98478d3c0c4d064bce83111d -F ext/session/sessionF.test d37ed800881e742c208df443537bf29aa49fd56eac520d0f0c6df3e6320f3401 -F ext/session/sessionG.test 3828b944cd1285f4379340fd36f8b64c464fc84df6ff3ccbc95578fd87140b9c -F ext/session/sessionH.test b17afdbd3b8f17e9bab91e235acf167cf35485db2ab2df0ea8893fbb914741a4 -F ext/session/session_common.tcl 29ec9910aca1e996ca1c8531b8cecabf96eb576aa53de65a8ff03d848b9a2a8b -F ext/session/session_speed_test.c dcf0ef58d76b70c8fbd9eab3be77cf9deb8bc1638fed8be518b62d6cbdef88b3 -F ext/session/sessionat.test efe88965e74ff1bc2af9c310b28358c02d420c1fb2705cc7a28f0c1cc142c3ec -F ext/session/sessiondiff.test ad13dd65664bae26744e1f18eb3cbd5588349b7e9118851d8f9364248d67bcec -F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7 -F ext/session/sessionfault2.test dd593f80b6b4786f7adfe83c5939620bc505559770cc181332da26f29cddd7bb -F ext/session/sessioninvert.test ae1a003a9ab1f8d64227dbb5c3a4c97e65b561b01e7b2953cf48683fb2724169 -F ext/session/sessionrebase.test ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2f05e82363b9142810 -F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5 -F ext/session/sessionwor.test 67b5ab91d4f93ce65ff1f58240ac5ddf73f8670facc1ffa49cef56293d52818d -F ext/session/sqlite3changebatch.c d5553b79e012ee2cb06c0a96bdf9dfe19e66354390ea0036cc46c4953142d517 -F ext/session/sqlite3changebatch.h e72016998c9a22d439ddfd547b69e1ebac810c24 -F ext/session/sqlite3session.c 7c2afba706139f61645472309146d5133d900d7f470044619666fe5eb3e394c4 -F ext/session/sqlite3session.h ba1b5dc7b159a76d9300228719e1248a4cb5ba7ee6ebd4c19a32fdc23891d22a -F ext/session/test_session.c 60e15d5db8ae7a0f521e70a7504ba1f74fc50548a25a5397808f487bc6a92b5d -F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3 -F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04 -F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865f002fc80cb -F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x -F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 -F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk b786ce086d5c37515473535722abc93a81ec645fca5f0baac3de9a446b90faad -F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 -F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 -F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 -F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421 -F mptest/crash02.subtest f4ef05adcd15d60e5d2bd654204f2c008b519df8 -F mptest/mptest.c aa41ace6dbc5050d76b02548d3521e6bbccae4f0 -F mptest/multiwrite01.test dab5c5f8f9534971efce679152c5146da265222d -F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca -F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b -F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 -F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 826bc4561456094cf758f095776026f25892a2bb3a7cd86742323267dc9bdb5f -F src/analyze.c 953a6c43870ccaf080597244e1eeb4dc2ff6cb84f9501b24e46323de36970b61 -F src/attach.c ff2daea0fe62080192e3f262670e4f61f5a86c1e7bea9cec34e960fe79852aa1 -F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 -F src/backup.c b1c90cd4110248c8e1273ff4578d3a84c0c34725e1b96dacd4a6294a908702de -F src/bitvec.c 8433d9e98dd6f2ea3286e0d2fe5d65de1bfc18a706486eb2026b01be066b5806 -F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 9cdd780b9eefae9d9356b907903afd407581a0d143de507238a82fa9259964e6 -F src/btree.h 024ee56278d64622b7fe9350b0a0cdadd57ccb1f6f2de279d2053458b16cae8c -F src/btreeInt.h d92bf22ef471c3d877daa32e677755ac9578707089116a679481c646e6b3e0b0 -F src/build.c 87e14ac12acd6151b631537697a36c1cc2dd8b01c6bd3a6a74971cce077ddac3 -F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c -F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e -F src/ctime.c e98518d2d3d4029a13c805e07313fb60c877be56db76e90dd5f3af73085d0ce6 -F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384 -F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a -F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f -F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4 -F src/expr.c b46669d9fc9e0361dba6cc289901a013789e0b1dc629c4c1bc88ec9403633b38 -F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 -F src/func.c 3796e7e269a9f23867ad3e64152399d5f850f83b9ee3ba57a931da7e46ef9c00 -F src/global.c 79a988b56b06ce2d08ebefe1d35da9aa25b3851faa47ea5233361c4827185a64 -F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 -F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 -F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 -F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 92b07a7f7e682114948ce59fd6511ffec7672b508cc343a804ef6afee21b6c11 -F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa -F src/loadext.c 421310045bd78afefb772294a99e50f37d87ae578786a6169074e6291e30d969 -F src/main.c 1290592ac9c7bd928f17e30fe442e523d30ce7e9ebabf56e7979735c1c7ede36 -F src/malloc.c d0400b0366e1a3a2414ca4534b4a7406df34732835f37a15cb4642eb7df1a363 -F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 -F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de -F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 -F src/mem3.c 8768ac94694f31ffaf8b4d0ea5dc08af7010a35a -F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memdb.c 252137ca122acb8f54a99b48cf9f96a31d5130f19d174381a53294446d8b64a3 -F src/memjournal.c 7561c01c90958f3ba9bc6cb2d857123d932bdfa5539ea34427a0957b2e35154d -F src/msvc.h 3a15918220367a8876be3fa4f2abe423a861491e84b864fb2b7426bf022a28f8 -F src/mutex.c 5e3409715552348732e97b9194abe92fdfcd934cfb681df4ba0ab87ac6c18d25 -F src/mutex.h a7b2293c48db5f27007c3bdb21d438873637d12658f5a0bf8ad025bb96803c4a -F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4 -F src/mutex_unix.c aaf9ebc3f89df28483c52208497a99a02cc3650011422fc9d4c57e4392f7fe58 -F src/mutex_w32.c 7670d770c94bbfe8289bec9d7f1394c5a00a57c37f892aab6b6612d085255235 -F src/notify.c 9711a7575036f0d3040ba61bc6e217f13a9888e7 -F src/os.c 669cc3839cc35d20f81faf0be1ab6d4581cea35e9d8f3a9d48a98d6571f7c285 -F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 -F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 -F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c 550f4daf483619ef8357d98e9caa7cc613d13369ed8ffef17994d5020c12879d -F src/os_win.c e832e21e830c1f9409c9c54053939b6dcb14c1e92128b756204ce1e3e331d678 -F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 6f559d65b422f773b12a9eca2c25eb4eee333b26a15c556a0a2e001f998a2624 -F src/pager.h 7fed31537daa2593ad18df5f4e00b2988a2e25d74de2ab525500a6e26673687d -F src/parse.y 0724899be1d00dc438d0acadbfc2baddd4132a47268f25676ac79d56c1ee7351 -F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 -F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 -F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a -F src/pragma.c 1b0db48177e52b256c003b8dc6ac708b1079a82cded944a23820574586a4731f -F src/pragma.h f45ac571c578e80533f6c72df0725b7879bdf861fdf1f5b75433495dbecdb0aa -F src/prepare.c 8d4d6c8aa6afefc48027c54b41cdf134b4d6bc2fc4badbe483ad7fd9e1728a28 -F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 -F src/random.c f27af4099afaea7284ade5c206224dcfdb2334cfd119d018b470d46356b3f27d -F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d -F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c f92fe19c23e802e58a299d1f95b4644e201a2270fc32149b6d10bd43aff0160c -F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b6 -F src/sqlite.h.in bfd502d24286258ce9091c7a2865c4e6e953958d489d50ad23e46ca1e37b03cc -F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 -F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h d434b8d810bd6891bcf2d39bdb8185092ad947276c9750c0268b6468cbc6564c -F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 -F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 -F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 -F src/tclsqlite.c 986b6391f02cd9b53c1d688be55899f6ffddeb8e8014cd83c1b73ff912579a71 -F src/test1.c c84b9ca57d9953e17410b0ca17b8c4b18a6b44676fa95bc5524caa0f0820d6bd -F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 -F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 -F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb -F src/test5.c 328aae2c010c57a9829d255dc099d6899311672d -F src/test6.c e8d839fbc552ce044bec8234561a2d5b8819b48e29548ad0ba400471697946a8 -F src/test7.c 5612e9aecf934d6df7bba6ce861fdf5ba5456010 -F src/test8.c 3f7d0cc4e12e06832ba3db4455cb16867ccadafa602eb6ff5fcf097bffce56ed -F src/test9.c 12e5ba554d2d1cbe0158f6ab3f7ffcd7a86ee4e5 -F src/test_async.c 195ab49da082053fdb0f949c114b806a49ca770a -F src/test_autoext.c 915d245e736652a219a907909bb6710f0d587871 -F src/test_backup.c bf5da90c9926df0a4b941f2d92825a01bbe090a0 -F src/test_bestindex.c 78809f11026f18a93fcfd798d9479cba37e1201c830260bf1edc674b2fa9b857 -F src/test_blob.c ae4a0620b478548afb67963095a7417cd06a4ec0a56adb453542203bfdcb31ce -F src/test_btree.c 8b2dc8b8848cf3a4db93f11578f075e82252a274 -F src/test_config.c 2882bb5dfb6429a79736029766fd12f4fcf25a721dd9e48e71eeca3ccf2c94df -F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f -F src/test_demovfs.c 86142ba864d4297d54c5b2e972e74f3141ae4b30f05b3a95824184ed2d3d7f91 -F src/test_devsym.c 6109b45c3db3ef7b002320947ed448c027356ab8b885156ff535fd8684d4a571 -F src/test_fs.c ba1e1dc18fd3159fdba0b9c4256f14032159785320dfbd6776eb9973cb75d480 -F src/test_func.c 181f992e5495644434c4f0e3cc72362a78c295eb2cf3ff4d02498b8bde7aa276 -F src/test_hexio.c d170d0e1a6431afdeac086a250d2595078288c2257615d37949355361399bcaa -F src/test_init.c 4413c211a94b62157ca4c145b3f27c497f03c664 -F src/test_intarray.c 39b4181662a0f33a427748d87218e7578d913e683dc27eab7098bb41617cac71 -F src/test_intarray.h d57ae92f420cda25e22790dac474d60961bd0c500cbaa3338a05152d4a669ef7 -F src/test_journal.c a0b9709b2f12b1ec819eea8a1176f283bca6d688a6d4a502bd6fd79786f4e287 -F src/test_loadext.c 337056bae59f80b9eb00ba82088b39d0f4fe6dfd -F src/test_malloc.c dec0aa821b230773aeb3dd11d652c1193f7cedb18a20b25659bc672288115242 -F src/test_md5.c 7268e1e8c399d4a5e181b64ac20e1e6f3bc4dd9fc87abac02db145a3d951fa8c -F src/test_multiplex.c 46e278397bef99b10530c1a695b4f6f23823fde6d6589b182f14e9bd43440b57 -F src/test_multiplex.h 5436d03f2d0501d04f3ed50a75819e190495b635 -F src/test_mutex.c 7f4337ba23ee6b1d2ec81c189653608cb069926a -F src/test_onefile.c f31e52e891c5fef6709b9fcef54ce660648a34172423a9cbdf4cbce3ba0049f4 -F src/test_osinst.c 98ef31ff03d55497829ca0f6c74a9f4e1aa48690 -F src/test_pcache.c a5cd24730cb43c5b18629043314548c9169abb00 -F src/test_quota.c 6cb9297115b551f433a9ad1741817a9831abed99 -F src/test_quota.h 2a8ad1952d1d2ca9af0ce0465e56e6c023b5e15d -F src/test_rtree.c 671f3fae50ff116ef2e32a3bf1fe21b5615b4b7b -F src/test_schema.c f575932cb6274d12147a77e13ea4b49d52408513 -F src/test_server.c a2615049954cbb9cfb4a62e18e2f0616e4dc38fe -F src/test_sqllog.c 11e6ce7575f489155c604ac4b439f2ac1d3d5aef -F src/test_superlock.c 4839644b9201da822f181c5bc406c0b2385f672e -F src/test_syscall.c 1073306ba2e9bfc886771871a13d3de281ed3939 -F src/test_tclsh.c eeafce33ad2136d57e5dec10f1e9a4347447eb72ffd504a1c7b9c6bfe2e71578 -F src/test_tclvar.c 33ff42149494a39c5fbb0df3d25d6fafb2f668888e41c0688d07273dcb268dfc -F src/test_thread.c 269ea9e1fa5828dba550eb26f619aa18aedbc29fd92f8a5f6b93521fbb74a61c -F src/test_vdbecov.c f60c6f135ec42c0de013a1d5136777aa328a776d33277f92abac648930453d43 -F src/test_vfs.c 36822d696789535bdd0260f07d2c9a46546082fea8bb1d0a7354c7f9366e37ea -F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698 -F src/test_windirent.c a895e2c068a06644eef91a7f0a32182445a893b9a0f33d0cdb4283dca2486ac1 -F src/test_windirent.h 90dfbe95442c9762357fe128dc7ae3dc199d006de93eb33ba3972e0a90484215 -F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f -F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 -F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c -F src/tokenize.c eee7bae3ec0bc4abee951554bf46a8ba567c0f7752ac90c820ed8afff4c612dc -F src/treeview.c 9df54af6e5830fd527496e62ae0148e1ba33197205d8e232c2826537d42d4063 -F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04 -F src/update.c c4f659b15422b96bfad29cd98ce6e7884516abd12552491fcc5421463bbb7c4a -F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 -F src/utf.c d7a61c1dfdac3eb091d43341a674032dca5a34e122f78ef0b5bd2d5a31967dde -F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 -F src/vacuum.c 28f9a2430bf250c04bbf40a70d749e8c081c007b99602df61717d35b29b817ab -F src/vdbe.c 6c2fdb92f247c4174b00961142de873b21444362b0e27e579ee9e1eda2b18adc -F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 -F src/vdbeInt.h 571413068b5ac07e2ed8ca7a02fa529622fd5455ae6981498376e5e492d2e5ef -F src/vdbeapi.c e467b75a710ea099f8d2d022abf601d2ccd05e28f63b44b12d93000b6a75f4a8 -F src/vdbeaux.c af90721686bc750f0ea4961c734648ed9233984521a53d59c5e58158abe413be -F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 -F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 -F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df -F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vdbevtab.c ee5b4c902fdda2230f9503ac7b84c6d614c91e8f6f4dc1633e2e8dfef8ffb144 -F src/vtab.c 7b452592ed2ee95dedb1f323d557cebede5a6f3b4558b21a5dca527e6ae9b12c -F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 7269fd4f79ecdc71c52a1705fb893fb07b3fc7de17f3f5110b707295944e372a -F src/wal.h 7ffe787437f20a098af347011967a6d3bb8e5c3dc645e6be59eff44d2b2c5297 -F src/walker.c 3df26a33dc4f54e8771600fb7fdebe1ece0896c2ad68c30ab40b017aa4395049 -F src/where.c 9546c82056e8cdb27291f98cf1adca5d271240b399bb97b32f77fc2bea6146c9 -F src/whereInt.h 6b874aa15f94e43a2cec1080be64d955b04deeafeac90ffb5d6975c0d511be3c -F src/wherecode.c 7b939de85d65cc4b4bfa197513136b9e0ae03167e3b82842ca5a0ba1055ba65d -F src/whereexpr.c 264d58971eaf8256eb5b0917bcd7fc7a1f1109fdda183a8382308a1b18a2dce7 -F src/window.c 66c5fd1e48af7581cf90b97700268294f4da4037f120f367715f912e1148d3f9 -F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 -F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 -F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d -F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 -F test/aggnested.test 12106f0748e8e9bfc1a8e6840e203e051eae06a26ed13fc9fd5db108a8d6db54 -F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 -F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13 -F test/alter.test 25e109787dc5e631e117eb6e1c57f96a572bb51228db3b4f8b5f41d665e2ccaa -F test/alter2.test a966ccfcddf9ce0a4e0e6ff1aca9e6e7948e0e242cd7e43fc091948521807687 -F test/alter3.test e487958dec7932453e0b83baf21d6b1e71d5e7d9a55bc20eadfa62a51ddffc29 -F test/alter4.test dfd6086faf461b27ca2d2999848dcd207edf23352fc1592d0005c0844f3f08cf -F test/alterauth.test 63442ba61ceb0c1eeb63aac1f4f5cebfa509d352276059d27106ae256bafc959 -F test/alterauth2.test c0a1ddf5b93d93cb0d15ba7acaf0c5c6fb515bbe861ede75b2d3fabad33b6499 -F test/altercol.test 1d6a6fe698b81e626baea4881f5717f9bc53d7d07f1cd23ee7ad1b931f117ddf -F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3eab2f44b -F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 -F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b -F test/altertab.test 523ba6368e0da19f462f7c05563c569675736d946724cac1c4ae848f76783434 -F test/altertab2.test b0d62f323ca5dab42b0bc028c52e310ebdd13e655e8fac070fe622bad7852c2b -F test/altertab3.test 155b8dc225ce484454a7fb4c8ba745680b6fa0fc3e08919cbbc19f9309d128ff -F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f -F test/analyze.test 547bb700f903107b38611b014ca645d6b5bb819f5210d7bf39c40802aafeb7d7 -F test/analyze3.test 01f0b122e3e54ad2544f14f7cc7dcb4c2cb8753cad5e88c6b8d49615b3fd6a2b -F test/analyze4.test cdf88f3f72b0f0643a1ff6c730fc5af1e42464d47478d9fbac84c333f72c014e -F test/analyze5.test fa5131952303ac4146aba101b116b9c8cb89e2637531c334a6df7f7d19dddc0d -F test/analyze6.test 6c3f7df2996cb6872f355a6ac1eb6d5de00a5a9288214bad7ef25c97d9cc72dc -F test/analyze7.test 6ef0b12369f61ddeadc7d8a705c40e6b52cb29f63de3a4c56581b510b46b5783 -F test/analyze8.test 36ce54947710bd44e4f9484e1ad07e725ef01a9d7078b417c1bc884356febe4d -F test/analyze9.test 9fbf0e0101eef4f5dc149769aa14e10b76ee06e7c28598264b32173cd1999a54 -F test/analyzeC.test 489fe2ea3be3f17548e8dd895f1b41c9669b52de1b0861f5bffe6eec46eac710 -F test/analyzeD.test e50cd0b3e6063216cc0c88a1776e8645dc0bd65a6bb275769cbee33b7fd8d90c -F test/analyzeE.test 8684e8ac5722fb97c251887ad97e5d496a98af1d -F test/analyzeF.test 9e1a0537949eb5483642b1140a5c39e5b4025939024b935398471fa552f4dabb -F test/analyzeG.test a48c0f324dd14de9a40d52abe5ca2637f682b9a791d2523dd619f6efa14e345b -F test/analyzer1.test 459fa02c445ddbf0101a3bad47b34290a35f2e49 -F test/async.test 1d0e056ba1bb9729283a0f22718d3a25e82c277b -F test/async2.test c0a9bd20816d7d6a2ceca7b8c03d3d69c28ffb8b -F test/async3.test d73a062002376d7edc1fe3edff493edbec1fc2f7 -F test/async4.test 1787e3952128aa10238bf39945126de7ca23685a -F test/async5.test 383ab533fdb9f7ad228cc99ee66e1acb34cc0dc0 -F test/atof1.test 1ccfc96a6888566597b83d882c81b3c04258dc39317e8c1cec89ba481eaa2fba -F test/atomic.test 065a453dde33c77ff586d91ccaa6ed419829d492dbb1a5694b8a09f3f9d7d061 -F test/atomic2.test b6863b4aa552543874f80b42fb3063f1c8c2e3d8e56b6562f00a3cc347b5c1da -F test/atrc.c ec92d56d8fbed9eb3e11aaf1ab98cf7dd59e69dae31f128013f1d97e54e7dfed -F test/attach.test d42862c72fef3d54367d962d41dcfb5363442a4a1bd898c22ae950cea1aa0dd3 -F test/attach2.test 256bd240da1835fb8408dd59fb7ef71f8358c7a756c46662434d11d07ba3a0ce -F test/attach3.test c59d92791070c59272e00183b7353eeb94915976 -F test/attach4.test aa05b1d8218b24eba5a7cccf4f224f514ba57ba705c9267f09d2bb63fed0eea1 -F test/attachmalloc.test 12c4f028e570acf9e0a4b0b7fe6f536e21f3d5ebddcece423603d0569beaf438 -F test/auth.test 2154625c05bc79f0e0ea72cb2358395a8041243caa0fd7ce7617d50da4331794 -F test/auth2.test 9eb7fce9f34bf1f50d3f366fb3e606be5a2000a1 -F test/auth3.test db21405b95257c24d29273b6b31d0efc59e1d337e3d5804ba2d1fd4897b1ae49 -F test/autoanalyze1.test b9cc3f32a990fa56669b668d237c6d53e983554ae80c0604992e18869a0b2dec -F test/autoinc.test 997d6f185f138229dc4251583a1d04816423dddc2fc034871a01aeb1d728cb39 -F test/autoindex1.test 96185415f5faacd5b8d7a7f505efddd5abb1f111d58338e9c0b1dc40b87cd3cc -F test/autoindex2.test 12ef578928102baaa0dc23ad397601a2f4ecb0df -F test/autoindex3.test 2dd997d6590438b53e4f715f9278aa91c9299cf3f81246a0915269c35beb790e -F test/autoindex4.test 49d3cd791a9baa16fb461d7ea3de80d019a819cf -F test/autoindex5.test a5d72fe8c217cc0ea356dc6fa06a282a8a3fc53aa807709d79dba07a8f248102 -F test/autovacuum.test 0831cd34e14695d297187f7f6519265e3121c5b0a1720e548e86829e796129e9 -F test/autovacuum_ioerr2.test 8a367b224183ad801e0e24dcb7d1501f45f244b4 -F test/avtrans.test b7dc25459ecbd86c6fa9c606ee3068f59d81e225118617dcf2bbb6ded2ade89e -F test/backcompat.test 3e64cedda754c778ef6bbe417b6e7a295e662a4d -F test/backup.test dd4a5ff756e3df3931dacb1791db0584d4bad989 -F test/backup2.test 1fd1ad8c5b3d2d5b9c0cce4143a4fc610d51ddc6ae16a7a122973d43e6b50bbd -F test/backup4.test 8f6fd48e0dfde77b9a3bb26dc471ede3e101df32 -F test/backup5.test ee5da6d7fe5082f5b9b0bbfa31d016f52412a2e4 -F test/backup_ioerr.test 4c3c7147cee85b024ecf6e150e090c32fdbb5135 -F test/backup_malloc.test 0c9abdf74c51e7bedb66d504cd684f28d4bd4027 -F test/badutf.test d5360fc31f643d37a973ab0d8b4fb85799c3169f -F test/badutf2.test f310fd3b24a491b6b77bccdf14923b85d6ebcce751068c180d93a6b8ff854399 -F test/bc_common.tcl b5e42d80305be95697e6370e015af571e5333a1c -F test/bc_test1.c e0a092579552e066ed4ce7bcdaecfa69c4aacc8d -F test/bestindex1.test 705b57d7f51d53ee5fd043dd9666236e1fc18f4d59abf51da0ea5ea1b4804947 -F test/bestindex2.test 9a0ccd320b6525eec3a706aae6cdab7e1b7b5abca75027e39f39f755e76e5928 -F test/bestindex3.test 7622e792ff2da16d262d3cea6ad914591ac4806d57ed128e6c940b7920b47b84 -F test/bestindex4.test 038e3d0789332f3f1d61474f9bbc9c6d08c6bd1783a978f31f38ad82688de601 -F test/bestindex5.test 67c1166131bb59f9e47c00118f7d432ca5491e6cae6ca3f87ca9db20103a78f9 -F test/bestindex6.test d856a9bb63d927493575823eed44053bc36251e241aa364e54d0f2a2d302e1d4 -F test/bestindex7.test f36ada201973d3022cf7afffffe08de9e58341996020e7a2df9a1d2f2be20132 -F test/between.test 68137a6e941c221417c15b6fe2d55f27bb1b6ab48bdf9e2aa51efdd85bc53802 -F test/bigfile.test aa74f4e5db51c8e54a1d9de9fa65d01d1eb20b59 -F test/bigfile2.test 1b489a3a39ae90c7f027b79110d6b4e1dbc71bfc -F test/bigmmap.test 31dad31573638bd32de866cdefd11843f75685be4ba6aec1a47918f098f1899b -F test/bigrow.test f0aeb7573dcb8caaafea76454be3ade29b7fc747 -F test/bigsort.test 8299fa9298f4f1e02fc7d2712e8b77d6cd60e5a2 -F test/bind.test 1e136709b306f7ed3192d349c2930d89df6ab621654ad6f1a72381d3fe76f483 -F test/bindxfer.test efecd12c580c14df5f4ad3b3e83c667744a4f7e0 -F test/bitvec.test 75894a880520164d73b1305c1c3f96882615e142 -F test/blob.test e7ac6c7d3a985cc4678c64f325292529a69ae252 -F test/boundary1.tcl 6421b2d920d8b09539503a8673339d32f7609eb1 -F test/boundary1.test 66d7f4706ccdb42d58eafdb081de07b0eb42d77b -F test/boundary2.tcl e34ef4e930cf1083150d4d2c603e146bd3b76bcb -F test/boundary2.test 9ae758d7dab7e882c8b6cc4a6a10278385bff8fa -F test/boundary3.tcl 23361e108a125dca9c4080c2feb884fe54d69243 -F test/boundary3.test 56ef82096b4329aca2be74fa1e2b0f762ea0eb45 -F test/boundary4.tcl 0bb4b1a94f4fc5ae59b79b9a2b7a140c405e2983 -F test/boundary4.test 89e02fa66397b8a325d5eb102b5806f961f8ec4b -F test/btree01.test e08b3613540145b353f20c81cb18ead54ff12e0f -F test/btree02.test 7555a5440453d900410160a52554fe6478af4faf53098f7235f1f443d5a1d6cc -F test/btreefault.test c2bcb542685eea44621275cfedbd8a13f65201e3 -F test/busy.test 510dc6daaad18bcbbc085bcc6217d6dc418def5e73f72ce1475eea0cb7834727 -F test/cache.test 13bc046b26210471ca6f2889aceb1ea52dc717de -F test/cacheflush.test af25bb1509df04c1da10e38d8f322d66eceedf61 -F test/cachespill.test 895997f84a25b323b166aecb69baab2d6380ea98f9e0bcc688c4493c535cfab9 -F test/capi2.test 34a1a9a96d543a2ec2c209696b11b164444f57253b1f2cba1c2e53fadede6c7b -F test/capi3.test 3910a73c38ac76d69778dd9eb481ab7cd6ed59117fc047b4f6056a5c72529de1 -F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 -F test/capi3c.test 54e2dc0c8fd7c34ad1590d1be6864397da2438c95a9f5aee2f8fbc60c112e44b -F test/capi3d.test aba917805573a03deed961a21f07a5a84505ad0a616f7e3fc1508844a15bccc4 -F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe -F test/cast.test 2906ccab6a3ebd147ffa63304b635be903ce58264110d0a0eb4fd9939422bb53 -F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef -F test/check.test 9776af795bb5d0f197b7f8fe248052e3ca2ed35304d863efcdbf8b1316e11f65 -F test/checkfault.test da6cb3d50247169efcb20bdf57863a3ccfa1d27d9e55cd324f0680096970f014 -F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760 -F test/close.test eccbad8ecd611d974cbf47278c3d4e5874faf02d811338d5d348af42d56d647c -F test/closure01.test 9905883f1b171a4638f98fc764879f154e214a306d3d8daf412a15e7f3a9b1e0 -F test/coalesce.test cee0dccb9fbd2d494b77234bccf9dc6c6786eb91 -F test/collate1.test 532b4992f78e91dd80c2e3c7bd944fada8cbe3d6c0ded0b20f7182b4dfca0006 -F test/collate2.test 9aaa410a00734e48bcb27f3872617d6f69b2a621 -F test/collate3.test 89defc49983ddfbf0a0555aca8c0521a676f56a5 -F test/collate4.test c953715fb498b87163e3e73dd94356bff1f317bd -F test/collate5.test 65d928034d30d2d263a80f6359f7549ee1598ec6 -F test/collate6.test 8be65a182abaac8011a622131486dafb8076e907 -F test/collate7.test 8ec29d98f3ee4ccebce6e16ce3863fb6b8c7b868 -F test/collate8.test cd9b3d3f999b8520ffaa7cc1647061fc5bab1334 -F test/collate9.test 3adcc799229545940df2f25308dd1ad65869145a -F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6 -F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151ecac0b95 -F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 -F test/colname.test 87ad5458bb8709312dac0d6755fd30e8e4ca83298d0a9ef6e5c24277a3c3390e -F test/concfault.test a88fdcd2dd959ac127a534581160fbe902080349d8703da3a8ac9633d7785a09 -F test/concurrent.test 86661967a680670127a62a819e60dc93c2d3d49043ac95b26dfa70d3e60dbde5 -F test/concurrent2.test de748c7dd749c77e2af2c4b914b9b09a28ac09608042ca498c0251dc6f46aa1a -F test/concurrent3.test 530671ac706f6a1d0f4992dbdd33a86408330d03cd90fb9e82ecb1b27f5fd081 -F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44 -F test/concurrent5.test 0c16cbf7446af162a14e6def30445e94016064eb994e5aa4ebb2bebc59554176 -F test/concurrent6.test a7860e9ca13bb5fb76bcf41c5524fbfa9c37e6e258ecf84ffb5748a272488c67 -F test/concurrent7.test b96fa5c4cfdf8d5c0bc66b6934214500bad0260884a736f054ccc76e81aae85d -F test/conflict.test 58857e2533fb9f2e0358ea7cb191215657846be1dd9da3b3d6df3e750c02ae03 -F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c -F test/conflict3.test 81865d9599609aca394fb3b9cd5f561d4729ea5b176bece3644f6ecb540f88ac -F test/contrib01.test 2a1cbc0f2f48955d7d073f725765da6fbceda6b4 -F test/corrupt.test d7cb0300e4a297147b6a05e92a1684bc8973635c3bcaa3d66e983c9cbdbf47a3 -F test/corrupt2.test bb50042cf9a1f1023d73af325d47eb02a6bb11e3c52f8812644b220c5d4bca35 -F test/corrupt3.test f95d7bf78109e0b84eb285a787ce91a3fd6a2dd7d0cb55882abff3bdc081a57e -F test/corrupt4.test 8d1d86b850fcc43e417450454f2044e52d55778a -F test/corrupt5.test 387be3250795e2a86e6234745558b80efb248a357d0cd8e53bce75c7463f545d -F test/corrupt6.test fc6a891716139665dae0073b6945e3670bf92568 -F test/corrupt7.test b036f94bda4b0b23a2919bf717046ce9ecca4543 -F test/corrupt8.test 2399dfe40d2c0c63af86706e30f3e6302a8d0516 -F test/corrupt9.test 730a3db08d4ab9aa43392ea30d9c2b4879cbff85 -F test/corruptA.test 112f4b2ae0b95ebf3ea63718642fb969a93acea557ace3a307234d19c245989b -F test/corruptB.test 73a8d6c0b9833697ecf16b63e3c5c05c945b5dec -F test/corruptC.test 74d4498fd25759618b393f1e9cde111de828b88c1848ab320f6c179fd52b5a60 -F test/corruptD.test 33a37ce3ed56a20093ceee778cd2d7109c7085a59f3213d2baede11d952e8e50 -F test/corruptE.test 4143791f2dfb443aec5b7fabfa5821e6063eccc3b49b06f212c2f014715fd476 -F test/corruptF.test be9fde98e4c93648f1ba52b74e5318edc8f59fe4 -F test/corruptG.test adf79b669cbfd19e28c8191a610d083ae53a6d51 -F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 -F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b -F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 -F test/corruptK.test 5b4212fe346699831c5ad559a62c54e11c0611bdde1ea8423a091f9c01aa32af -F test/corruptL.test 13ef74a93223af25015d223add0df4c2d375f0b958b546a2a72033f2fdab7a70 -F test/corruptM.test 7d574320e08c1b36caa3e47262061f186367d593a7e305d35f15289cc2c3e067 -F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34 -F test/count.test e0699a15712bc2a4679d60e408921c2cce7f6365a30340e790c98e0f334a9c77 -F test/countofview.test e17d6e6688cf74f22783c9ec6e788c0790ee4fbbaee713affd00b1ac0bb39b86 -F test/coveridxscan.test 5ec98719a2e2914e8908dc75f7247d9b54a26df04625f846ac7900d5483f7296 -F test/crash.test fb9dc4a02dcba30d4aa5c2c226f98b220b2b959f -F test/crash2.test 5b14d4eb58b880e231361d3b609b216acda86651 -F test/crash3.test 8f5de9d32ab9ab95475a9efe7f47a940aa889418 -F test/crash4.test fe2821baf37168dc59dd733dcf7dba2a401487bc -F test/crash5.test f14ff37eddc41991be4eb63568f86caa306fd9962a0ae3750db8836777bb7aae -F test/crash6.test 4c56f1e40d0291e1110790a99807aa875b1647ba -F test/crash7.test 1a194c4900a255258cf94b7fcbfd29536db572df -F test/crash8.test 64366e459c28dd62edfb7ad87253a409c7533b92d16fcc479a6a8131bdcc3100 -F test/crashM.test d95f59046fa749b0d0822edf18a717788c8f318d -F test/crashtest1.c 09c1c7d728ccf4feb9e481671e29dda5669bbcc2 -F test/createtab.test 85cdfdae5c3de331cd888d6c66e1aba575b47c2e3c3cc4a1d6f54140699f5165 -F test/cse.test 00b3aea44b16828833c94fbe92475fd6977583fcb064ae0bc590986812b38d0c -F test/csv01.test c9c3af0d58c34e9ac970c5875a77939edb958762c8aafb95409e19a3f088b6cd -F test/ctime.test 78749e6c9a5f0010d67985be80788f841e3cd2da18114e2ed6010399a7d807f3 -F test/cursorhint.test 0175e4404181ace3ceca8b114eb0a98eae600d565aa4e2705abbe6614c7fe201 -F test/cursorhint2.test 6f3aa9cb19e7418967a10ec6905209bcbb5968054da855fc36c8beee9ae9c42f -F test/dataversion1.test 6e5e86ac681f0782e766ebcb56c019ae001522d114e0e111e5ebf68ccf2a7bb8 -F test/date.test 9b73bbeb1b82d9c1f44dec5cf563bf7da58d2373 -F test/date2.test 5ef8265c71460cda6b1698bf18f4bb0ffb40ac08c5092f6afe84d398c2feb5be -F test/dbdata.test 042f49acff3438f940eeba5868d3af080ae64ddf26ae78f80c92bec3ca7d8603 -F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e -F test/dbfuzz001.test 42aad1dcef6219fbee86a9b7d08832c9bbb2e41508f6f128ae91745927276292 -F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c c2c9cb40082a77b7e95ffb8b2da1e93322efadfb1c8c1e0001c95a0af1e156c2 -F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 -F test/dbstatus.test 4a4221a883025ffd39696b3d1b3910b928fb097d77e671351acb35f3aed42759 -F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef -F test/default.test 9687cfb16717e4b8238c191697c98be88c0b16e568dd5368cd9284154097ef50 -F test/delete.test 31832b0c45ecb51a54348c68db173be462985901e6ed7f403d6d7a8f70ab4ef0 -F test/delete2.test 3a03f2cca1f9a67ec469915cb8babd6485db43fa -F test/delete3.test 555e84a00a99230b7d049d477a324a631126a6ab -F test/delete4.test 6aa279f459f4aa792cc251435c3809415c1ecaf9f27dce91675e26f05b503db3 -F test/delete_db.test 096d828493c7907f9ea11a7098ea6a0f73edba89406487d5d6cc2228dc4ab8b0 -F test/descidx1.test edc8adee58d491b06c7157c50364eaf1c3605c9c19f8093cb1ea2b6184f3ac13 -F test/descidx2.test a0ba347037ff3b811f4c6ceca5fd0f9d5d72e74e59f2d9de346a9d2f6ad78298 -F test/descidx3.test 953c831df7ea219c73826dfbf2f6ee02d95040725aa88ccb4fa43d1a1999b926 -F test/diskfull.test 106391384780753ea6896b7b4f005d10e9866b6e -F test/distinct.test e7d0cf371944dd0cbedff86420744e2f1ea2b528156451c97eb6ff41a99b9236 -F test/distinct2.test 11b0594c932098e969d084ba45ab81d5040f4d4e766db65d49146705a305ed98 -F test/distinctagg.test 1a6ef9c87a58669438fc771450d7a72577417376 -F test/e_blobbytes.test 439a945953b35cb6948a552edaec4dc31fd70a05 -F test/e_blobclose.test 4b3c8c60c2171164d472059c73e9f3c1844bb66d -F test/e_blobopen.test e95e1d40f995056f6f322cd5e1a1b83a27e1a145 -F test/e_blobwrite.test f87ff598b67af5b3ec002a8d83e804dc8d23808e88cf0080c176612fc9ffce14 -F test/e_changes.test fd66105385153dbf21fdb35eb8ef6c3e1eade579 -F test/e_createtable.test ea27082d6f84df61e1d9e383f3fd79220418856a4a8afc41af75d458b8e7ac33 -F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e -F test/e_droptrigger.test 3cd080807622c13e5bbb61fc9a57bd7754da2412 -F test/e_dropview.test 74e405df7fa0f762e0c9445b166fe03955856532e2bb234c372f7c51228d75e7 -F test/e_expr.test 62000e6675d5bcf4b09276fe011a27779629ff8f6678ba5937fb6f1b78d645ff -F test/e_fkey.test b497feb7c436693e16a36cdaba8d81ffe12f23659d139ee71dfa57c0c52d1e5b -F test/e_fts3.test 17ba7c373aba4d4f5696ba147ee23fd1a1ef70782af050e03e262ca187c5ee07 -F test/e_insert.test f02f7f17852b2163732c6611d193f84fc67bc641fb4882c77a464076e5eba80e -F test/e_reindex.test 2b0e29344497d9a8a999453a003cb476b6b1d2eef2d6c120f83c2d3a429f3164 -F test/e_resolve.test a61751c368b109db73df0f20fc75fb47e166b1d8 -F test/e_select.test f9474205669a7736ef725b29cc7ae9e8601919a3d0ffc0ab30745a028f2a4b61 -F test/e_select2.test aceb80ab927d46fba5ce7586ebabf23e2bb0604f -F test/e_totalchanges.test b12ee5809d3e63aeb83238dd501a7bca7fd72c10 -F test/e_update.test f46c2554d915c9197548681e8d8c33a267e84528 -F test/e_uri.test 47eeb2960e74613f0f8722b2f13aef08fde69daa16e5380ac93df84dac8b1f72 -F test/e_vacuum.test 0d8832a2ce92350db0d0cff47b419465fd9772562e1f77ff7d9478c07a4980d2 -F test/e_wal.test ae9a593207a77d711443ee69ffe081fda9243625 -F test/e_walauto.test 248af31e73c98df23476a22bdb815524c9dc3ba8 -F test/e_walckpt.test 28c371a6bb5e5fe7f31679c1df1763a19d19e8a0 -F test/e_walhook.test 01b494287ba9e60b70f6ebf3c6c62e0ffe01788e344a4846b08e5de0b344cb66 -F test/emptytable.test a38110becbdfa6325cd65cb588dca658cd885f62 -F test/enc.test 9a7be5479da985381d740b15f432800f65e2c87029ee57a318f42cb2eb43763a -F test/enc2.test 848bf05f15b011719f478dddb7b5e9aea35e39e457493cba4c4eef75d849a5ec -F test/enc3.test 6807f7a7740a00361ca8d0ccd66bc60c8dc5f2b6 -F test/enc4.test c8f1ce3618508fd0909945beb8b8831feef2c020 -F test/eqp.test 84879b63e3110552bf8ce648a3507dc3ceb72109ecec83c2aef0db37a27f6382 -F test/errmsg.test eae9f091eb39ce7e20305de45d8e5d115b68fa856fba4ea6757b6ca3705ff7f9 -F test/eval.test a64c9105d6ff163df7cf09d6ac29cdad5922078c -F test/exclusive.test 7ff63be7503990921838d5c9f77f6e33e68e48ed1a9d48cd28745bf650bf0747 -F test/exclusive2.test 984090e8e9d1b331d2e8111daf6e5d61dda0bef7 -F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7 -F test/exists.test 79a75323c78f02bbe9c251ea502a092f9ef63dac -F test/expr.test 26cd01e8485bc48c8aa6a1add598e9ce1e706b4eb4f3f554e0b0223022e8c2cf -F test/expr2.test c27327ae9c017a7ff6280123f67aff496f912da74d78c888926d68b46ec75fd8 -F test/extension01.test 00d13cec817f331a687a243e0e5a2d87b0e358c9 -F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 -F test/fallocate.test 37a62e396a68eeede8f8d2ecf23573a80faceb630788d314d0a073d862616717 -F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3 -F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4 -F test/filter1.test 8a6f047a000ef391db2ca17b6beecc0006f4e0f9ca8bbe272b2443c7316e66b1 -F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f93393e8 -F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a -F test/filterfault.test c08fb491d698e8df6c122c98f7db1c65ffcfcad2c1ab0e07fa8a5be1b34eaa8b -F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768 -F test/fkey2.test b1b6a8c5556dc0ccf31291b1fed8aa57e404b38f3236110e19ab4dc6aa93edf2 -F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49 -F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d -F test/fkey5.test 24dd28eb3d9f1b5a174f47e9899ace5facb08373a4223593c8c631e6cf9f7d5a -F test/fkey6.test d078a1e323a740062bed38df32b8a736fd320dc0 -F test/fkey7.test 64fb28da03da5dfe3cdef5967aa7e832c2507bf7fb8f0780cacbca1f2338d031 -F test/fkey8.test 48ef829d63f5f7b37aabd4df9363ac05f65539d1da8c4a44251631769d920579 -F test/fkey_malloc.test 594a7ea1fbab553c036c70813cd8bd9407d63749 -F test/fordelete.test ba98f14446b310f9c9d935b97ec748753d0144a28b356ba30d1f4f6958fdde5c -F test/format4.test eeae341953db8b6bda7f549044797c3278a6cc345d11ada81471671b654f8ef4 -F test/fts-9fd058691.test 78b887e30ae6816df0e1fed6259de4b5a64ad33c -F test/fts1a.test 46090311f85da51bb33bd5ce84f7948359c6d8d7 -F test/fts1b.test 5d8a01aefbecc8b7442b36c94c05eb7a845462d5 -F test/fts1c.test 85a525ce7428907469b4cce13d5563ce542ce64c -F test/fts1d.test a73deace5c18df4a549b12908bade4f05dcf1a2f -F test/fts1e.test 77244843e925560b5a0b70069c3e7ab62f181ed2 -F test/fts1f.test 2d6cb10d8b7a4e6edc321bbdb3982f1f48774714 -F test/fts1i.test 6bfe08cdfdced063a39a50c8601da65e6274d879 -F test/fts1j.test e3797475796043a161e348c46a309664cac83f7f -F test/fts1k.test 65d3b41487b9f738d11b0f00eca375c0ca6bd970 -F test/fts1l.test 15c119ed2362b2b28d5300c0540a6a43eab66c36 -F test/fts1m.test 2d9ca67b095d49f037a914087cc0a61e89da4f0c -F test/fts1n.test a2317dcd27b1d087ee3878b30e0a59c593c98b7a -F test/fts1o.test d1554caede42bba2c82fe613bcc921856c196b752449ead0470fac52a20fd3b8 -F test/fts1porter.test d86e9c3e0c7f8ff95add6582b4b585fb4e02b96d -F test/fts2.test e3fb95f96a650411574efc136f3fb10eef479ed7 -F test/fts2a.test 473a5c8b473a4e21a8e3fddaed1e59666e0c6ab7 -F test/fts2b.test 964abc0236c849c07ca1ae496bb25c268ae94816 -F test/fts2c.test ffb5a35230ac72c4354535c547965ce6824537c0 -F test/fts2d.test b7eaa671ca9a16997f3e5b158ee777ae21052b0b -F test/fts2e.test 2da13dbc2d009105f42196845c1e1ce136c03d38 -F test/fts2f.test cf84096235991709c1e61caa389632aa0a4f976d -F test/fts2g.test 3d26fe171bda6133ebf5a380731d70eaa2ef2f6f73d79769cf8946e622b6d597 -F test/fts2h.test 223af921323b409d4b5b18ff4e51619541b174bb -F test/fts2i.test 1b22451d1f13f7c509baec620dc3a4a754885dd6 -F test/fts2j.test 298fa1670aa21cd445b282d139b70c72e7ade12b -F test/fts2k.test c7ebf4a4937594aa07459e3e1bca1251c1be8659 -F test/fts2l.test 3333336621524cf7d60bb62d6ef6ab69647866ed -F test/fts2m.test 4b30142ead6f3ed076e880a2a464064c5ad58c51 -F test/fts2n.test 12b9c5352128cebd1c6b8395e43788d4b09087c2 -F test/fts2o.test 4054ac7433eb5440f1b1d200cfa449342dc4aabd991759139813e17c73e5bf9a -F test/fts2p.test 4b48c35c91e6a7dbf5ac8d1e5691823cc999aafb -F test/fts2q.test b2fbbe038b7a31a52a6079b215e71226d8c6a682 -F test/fts2r.test b154c30b63061d8725e320fba1a39e2201cadd5e -F test/fts2token.test d8070b241a15ff13592a9ae4a8b7c171af6f445a -F test/fts3.test 672a040ea57036fb4b6fdc09027c18d7d24ab654 -F test/fts3_common.tcl dffad248f9ce090800e272017d2898005c28ee6314fc1dd5550643a02666907a -F test/fts3aa.test 814d60a1ba30b4a71d8f9306a6564bc7b636dd6efacd2ad80306f9b23ef3ebee -F test/fts3ab.test 7f6cf260ae80dda064023df8e8e503e9a412b91f -F test/fts3ac.test 636ed7486043055d4f126a0e385f2d5a82ebbf63 -F test/fts3ad.test e40570cb6f74f059129ad48bcef3d7cbc20dda49 -F test/fts3ae.test ce32a13b34b0260928e4213b4481acf801533bda -F test/fts3af.test d394978c534eabf22dd0837e718b913fd66b499c -F test/fts3ag.test c003672a215124df7fc6000036d896f498b26b53 -F test/fts3ah.test dc9f66c32c296f1bc8bcc4535126bddfeca62894 -F test/fts3ai.test 24058fdc6e9e5102c1fd8459591b114b6a85d285 -F test/fts3aj.test 0ed71e1dd9b03b843a857dc3eb9b15630e0104fc -F test/fts3ak.test bd14deafe9d1586e8e9bf032411026ac4f8c925d -F test/fts3al.test 07d64326e79bbdbab20ee87fc3328fbf01641c9f -F test/fts3am.test 218aa6ba0dfc50c7c16b2022aac5c6be593d08d8 -F test/fts3an.test a49ccadc07a2f7d646ec1b81bc09da2d85a85b18 -F test/fts3ao.test 266989148fec6d9f1bb6c5382f7aa3dcea0e9cd444576e28dd2b9287ac7dd220 -F test/fts3atoken.test dc2078ce464914efe3a8dfc545dd034a0fc14f2ab425c240471d5a5f1c721400 -F test/fts3auto.test 649aa4c198d7acc5cd6355e19ee073d051c40d9e88a43fc3d88af46bdf3e99d5 -F test/fts3aux1.test 7a170e172afdbceb67f5baa05941fd4fbf56af42f61daa3d140f4b4bf4cb68f6 -F test/fts3aux2.test 2459e7fa3e22734aed237d1e2ae192f5541c4d8b218956ad2d90754977bf907f -F test/fts3b.test c15c4a9d04e210d0be67e54ce6a87b927168fbf9c1e3faec8c1a732c366fd491 -F test/fts3c.test fc723a9cf10b397fdfc2b32e73c53c8b1ec02958 -F test/fts3comp1.test a0f5b16a2df44dd0b15751787130af2183167c0c -F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f5a76b -F test/fts3corrupt.test 79a32ffdcd5254e2f7fa121d9656e61949ad049c3c6554229911b7ceac37c9c6 -F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 -F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test fde292a4712753c7ef235a199273c5d196e18a56bd2c4d2db7ccaf59b7027a0a -F test/fts3corrupt5.test 0549f85ec4bd22e992f645f13c59b99d652f2f5e643dac75568bfd23a6db7ed5 -F test/fts3cov.test 7eacdbefd756cfa4dc2241974e3db2834e9b372ca215880e00032222f32194cf -F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f -F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de -F test/fts3defer2.test 3da52ca2114e300e9971eee2f0cc1a2e5f27e6a9ee67957d49e63e41fdfcc0e7 -F test/fts3defer3.test dd53fc13223c6d8264a98244e9b19abd35ed71cd -F test/fts3drop.test 1b906e293d6773812587b3dc458cb9e8f3f0c297 -F test/fts3e.test 1f6c6ac9cc8b772ca256e6b22aaeed50c9350851 -F test/fts3expr.test ebae205a7a89446c32583bcd492dcb817b9f6b31819bb4dde2583bb99c77e526 -F test/fts3expr2.test 18da930352e5693eaa163a3eacf96233b7290d1a -F test/fts3expr3.test c4d4a7d6327418428c96e0a3a1137c251b8dfbf8 -F test/fts3expr4.test f5b2832549f01b1f7f73389fa21d4b875499bc95bf7c8b36271844888c6a0938 -F test/fts3expr5.test a5b9a053becbdb8e973fbf4d6d3abaabeb42d511d1848bd57931f3e0a1cf983e -F test/fts3fault.test 798e45af84be7978ca33d5bdc94246eb44724db24174b5d8e9b1ac46c57fb08d -F test/fts3fault2.test 6a17a11d8034b1c4eca9f3091649273d56c49ff049e2173df8060f94341e9da0 -F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641 -F test/fts3fuzz001.test e3c7b0ce9b04cc02281dcc96812a277f02df03cd7dc082055d87e11eb18aaf56 -F test/fts3join.test 949b4f5ae3ae9cc2423cb865d711e32476bdb205ab2be923fdf48246e4a44166 -F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6 -F test/fts3matchinfo.test aa66cc50615578b30f6df9984819ae5b702511cf8a94251ec7c594096a703a4a -F test/fts3matchinfo2.test 00144e841704b8debfcdf6097969cd9f2a1cf759e2203cda42583648f2e6bf58 -F test/fts3misc.test 9ec15e7c0b5831a6353bd4c46bf3acdf1360eda5d9f396f667db4d05bcf92ecf -F test/fts3near.test 7e3354d46f155a822b59c0e957fd2a70c1d7e905 -F test/fts3offsets.test b85fd382abdc78ebce721d8117bd552dfb75094c -F test/fts3prefix.test fa794eaab0bdae466494947b0b153d7844478ab2 -F test/fts3prefix2.test e1f0a822ca661dced7f12ce392e14eaf65609dce -F test/fts3query.test ca033ff2ebcc22c69d89032fb0bc1850997d31e7e60ecd26440796ba1654e78f -F test/fts3rank.test cd99bc83a3c923c8d52afd90d86979cf05fc41849f892faeac3988055ef37b99 -F test/fts3rnd.test 1320d8826a845e38a96e769562bf83d7a92a15d0 -F test/fts3shared.test 57e26a801f21027b7530da77db54286a6fe4997e -F test/fts3snippet.test 0887196d67cffbe365edde535b95ecc642a532ce8551ccd9a73aab5999c3ffae -F test/fts3snippet2.test 2dabb5889eda4c9980aad325e688b470781f97ce7c0fca0db125616fae0a2cdd -F test/fts3sort.test ed34c716a11cc2009a35210e84ad5f9c102362ca -F test/fts3tok1.test a663f4cac22a9505400bc22aacb818d7055240409c28729669ea7d4cc2120d15 -F test/fts3tok_err.test 52273cd193b9036282f7bacb43da78c6be87418d -F test/fts3varint.test 0b84a3fd4eba8a39f3687523804d18f3b322e6d4539a55bf342079c3614f2ada -F test/fts4aa.test 0e6bfd6a81695a39b23e448dda25d864e63dda75bde6949c45ddc95426c6c3f5 -F test/fts4check.test 6259f856604445d7b684c9b306b2efb6346834c3f50e8fc4a59a2ca6d5319ad0 -F test/fts4content.test 73bbb123420d2c46ef2fb3b24761e9acdb78b0877179d3a5d7d57aada08066f6 -F test/fts4docid.test e33c383cfbdff0284685604d256f347a18fdbf01 -F test/fts4growth.test 289833c34ad45a5e6e6133b53b6a71647231fb89d36ddcb8d9c87211b6721d7f -F test/fts4growth2.test 13ad4e76451af6e6906c95cdc725d01b00044269 -F test/fts4incr.test 4e353a0bd886ea984e56fce9e77724fc923b8d0d -F test/fts4langid.test 89e623218935507bca69d076ca254a7a8969dfc681c282b6374feaea8c7de784 -F test/fts4lastrowid.test 185835895948d5325c7710649824042373b2203149abe8024a9319d25234dfd7 -F test/fts4merge.test e2b2ec21e287d54ec09824ccfb41e66896eeca568fc818ba0e0eb2efd94c35d2 -F test/fts4merge2.test 5faa558d1b672f82b847d2a337465fa745e46891 -F test/fts4merge3.test 8d9ccb4a3d41c4c617a149d6c4b13ad02de797d0 -F test/fts4merge4.test d895b1057a7798b67e03455d0fa50e9ea836c47b -F test/fts4merge5.test 69932d85cda8a1c4dcfb742865900ed8fbda51724b8cf9a45bbe226dfd06c596 -F test/fts4min.test 1c11e4bde16674a0c795953509cbc3731a7d9cbd1ddc7f35467bf39d632d749f -F test/fts4noti.test 5553d7bb2e20bf4a06b23e849352efc022ce6309 -F test/fts4onepass.test d69ddc4ee3415e40b0c5d1d0408488a87614d4f63ba9c44f3e52db541d6b7cc7 -F test/fts4opt.test 0fd0cc84000743ff2a883b9b84b4a5be07249f0ba790c8848a757164cdd46b2a -F test/fts4record.test a48508f69a84c9287c8019d3a1ae712f5730d8335ffaf8e2101e691d078950bb -F test/fts4rename.test 15fd9985c2bce6dea20da2245b22029ec89bd4710ed317c4c53abbe3cfd0c880 -F test/fts4umlaut.test fcaca4471de7e78c9d1f7e8976e3e8704d7d8ad979d57a739d00f3f757380429 -F test/fts4unicode.test ceca76422abc251818cb25dabe33d3c3970da5f7c90e1540f190824e6b3a7c95 -F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d -F test/func.test f673822636fb8ed618dd2b80230d16e495d19c8f2e2e7d6c22e93e2b3de097ad -F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f -F test/func3.test 2bb0f31ab7baaed690b962a88544d7be6b34fa389364bc36a44e441ed3e3f1e6 -F test/func4.test a94858a8c1f10a408b0b3db439c990b59dbb2349411d503de011ac4e2b5f27a6 -F test/func5.test 863e6d1bd0013d09c17236f8a13ea34008dd857d87d85a13a673960e4c25d82a -F test/func6.test 90e42b64c4f9fb6f04f44cb8a1da586c8542502e926b19c76504fe74ff2a9b7c -F test/fuzz-oss1.test e58330d01cbbd8215ee636b17a03fe220b37dbfa -F test/fuzz.test 96083052bf5765e4518c1ba686ce2bab785670d1 -F test/fuzz2.test 76dc35b32b6d6f965259508508abce75a6c4d7e1 -F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c31 -F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 -F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 -F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 656ee850f331872a784e7d6a10649efe2af123bdaacb728b5a03e4faee8b959c -F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f -F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f -F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba -F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e42ed2 -F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 -F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 -F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 209623791b0ad72ab39110c867af2080a79004e493c4da14ad661e790b5d1ed8 -F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 -F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 -F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 -F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test e89eafdf03245e2609ddf6e9b0add37a17ce229095836c409131764c3a5282a5 -F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 -F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 -F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 -F test/hidden.test 23c1393a79e846d68fd902d72c85d5e5dcf98711 -F test/hook.test 1604b3b2f5931430087540404555c1b6be3618600b81558657c66b533ed70b13 -F test/hook2.test b9ff3b8c6519fb67f33192f1afe86e7782ee4ac8 -F test/icu.test 716a6b89fbabe5cc63e0cd4c260befb08fd7b9d761f04d43669233292f0753b1 -F test/ieee754.test 806fc0ce7f305f57e3331eaceeddcfec9339e607 -F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 -F test/in.test ae4ba0fe3232fdd84ef1090a68c5cd6ccd93f1f8774d5c967dd0c1b301492eed -F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 -F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 -F test/in4.test 65460600d48933adba4283c6ebd089aae173d16136ab9d01f74c89089090c5a5 -F test/in5.test b32ce7f4a93f44c5dee94af16886d922cc16ebe33c8e1765c73d4049d0f4b40f -F test/in6.test 8562d0945195cab3cc4ab3794e9118e72cb44c43f785c2b04d48a9d06ca6b4ec -F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822 -F test/incrblob2.test a494c9e848560039a23974b9119cfc2cf3ad3bd15cc2694ee6367ae537ef8f1f -F test/incrblob3.test d8d036fde015d4a159cd3cbae9d29003b37227a4 -F test/incrblob4.test 21a52a6843a56cdcce968c6a86b72a7066d0e6ba -F test/incrblob_err.test 89372a28f1d98254f03fed705f9efcd34ef61a674df16d2dbb4726944a2de5e9 -F test/incrblobfault.test 74dd8ac108304cea0b4a0df6df63a1567e558758 -F test/incrcorrupt.test 6c567fbf870aa9e91866fe52ce6f200cd548939a -F test/incrvacuum.test 2aaee202b1f230e55779f70d155f6ba67bbdff8481d650214d256ab0f97d4a2b -F test/incrvacuum2.test 7d26cfda66c7e55898d196de54ac4ec7d86a4e3d -F test/incrvacuum3.test 75256fb1377e7c39ef2de62bfc42bbff67be295a -F test/incrvacuum_ioerr.test 6ae2f783424e47a0033304808fe27789cf93e635 -F test/index.test a2e948ed949e575487b5c1d521767d4584ac42d352f2dcd8e48004638e7bc7dc -F test/index2.test f835d5e13ca163bd78c4459ca15fd2e4ed487407 -F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473ade0 -F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 -F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 -F test/index6.test f172653b35b20233e59200e8b92a76db61bf7285437bf777b93b306ba26a47e7 -F test/index7.test 1d764c0cca45f5a76150b08e127ccc8d52492cfa788b5fafed4be784a351b020 -F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 -F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 -F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e -F test/indexexpr1.test 284e119999d132cc8bf37735a928c9859b28e8e295d02b7a6a4f93977c7f9ba5 -F test/indexexpr2.test dba11dbb0a58fcba4cd694f46b4004976123b81b0501f525d43c9be59f0207b1 -F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 -F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 -F test/insert.test 4e3f0de67aac3c5be1f4aaedbcea11638f1b5cdc9a3115be14d19aa9db7623c6 -F test/insert2.test 4d14b8f1b810a41995f6286b64a6943215d52208 -F test/insert3.test 1b7db95a03ad9c5013fdf7d6722b6cd66ee55e30 -F test/insert4.test fb9e0f752c75f453555990250b449f6d123ae6a3ebf054d14e4470de4498dce3 -F test/insert5.test 394f96728d1258f406fe5f5aeb0aaf29487c39a6 -F test/insertfault.test ac63d14ea3b49c573673a572f4014b9117383a03e497c58f308b5c776e4a7f74 -F test/instr.test 107df2b9b74a4b59315916b575590a08f2a714de0754abe541f10a0971d0a2a4 -F test/instrfault.test 95e28efade652e6d51ae11b377088fe523a581a07ec428009e152a4dd0e0f44c -F test/intarray.test bb976b0b3df0ebb6a2eddfb61768280440e672beba5460ed49679ea984ccf440 -F test/interrupt.test 16ea879ec728cb76414c148c5f24afd5d1f91054 -F test/interrupt2.test e4408ca770a6feafbadb0801e54a0dcd1a8d108d -F test/intpkey.test ac71107a49a06492b69b82aafaf225400598d3c8 -F test/intreal.test 2a87e85a5949bd55e41ef04c58f5800587c5380bdbc559ff1c79b614b0e6a533 -F test/io.test f95bca1783b01ea7761671560d023360d2dfa4cc -F test/ioerr.test 470fcc78e9cd352d162baf782fe301ea807d764241f58a48fc58109c2dfcdb6b -F test/ioerr2.test 2593563599e2cc6b6b4fcf5878b177bdd5d8df26 -F test/ioerr3.test d3cec5e1a11ad6d27527d0d38573fbff14c71bdd -F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c -F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 -F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b -F test/istrue.test 75327829744e65cc8700e69340b8e6c192e10e39dfae7ccb0e970d3c4f49090a -F test/join.test bca044589e94bb466e4c1e91fb6fecdc3f3326ca6b3f590f555f1958156eb321 -F test/join2.test 7d24d095ab88d3910228d53a3b548b7baf2e0e7d8aac6731a273e300e1b34b61 -F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 -F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 -F test/join5.test 3a96dc62f0b45402d7207e22d1993fe0c2fce1c57644a11439891dd62b990eb7 -F test/join6.test cfe6503791ceb0cbb509966740286ec423cbf10b -F test/journal1.test c7b768041b7f494471531e17abc2f4f5ebf9e5096984f43ed17c4eb80ba34497 -F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4 -F test/journal3.test 7c3cf23ffc77db06601c1fcfc9743de8441cb77db9d1aa931863d94f5ffa140e -F test/jrnlmode.test 9b5bc01dac22223cb60ec2d5f97acf568d73820794386de5634dcadbea9e1946 -F test/jrnlmode2.test 8759a1d4657c064637f8b079592651530db738419e1d649c6df7048cd724363d -F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa -F test/json101.test bb71538005f2d9e18620bdd3b76839a93ca0be61903eb8d751a64e78cf99b8fb -F test/json102.test eeb54efa221e50b74a2d6fb9259963b48d7414dca3ce2fdfdeed45cb28487bc1 -F test/json103.test aff6b7a4c17d5a20b487a7bc1a274bfdc63b829413bdfb83bedac42ec7f67e3b -F test/json104.test 317f4ec4b2d87afbba4d2460cf5be297aea76f2285eb618d276dbcd40a50950f -F test/json105.test 45f7d6a9a54c85f8a9589b68d3e7a1f42d02f2359911a8cdbad1f9988f571173 -F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff -F test/kvtest.c 94da54bb66aae7a54e47cf7e4ea4acecc0f217560f79ad3abfcc0361d6d557ba -F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63 -F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200 -F test/lemon-test01.y 58b764610fd934e189ffbb0bbfa33d171b9cb06019b55bdc04d090d6767e11d7 -F test/like.test 47b81d5de2ff19d996d49a65d50ec9754246aacbe0e950b48d186d9d8171eaf0 -F test/like2.test 3b2ee13149ba4a8a60b59756f4e5d345573852da -F test/like3.test 03d1bdf848483b78d2cfd1db283d75c4ec2e37c8b8eccc006813f3978d78fbbd -F test/limit.test 0c99a27a87b14c646a9d583c7c89fd06c352663e -F test/limit2.test 9409b033284642a859fafc95f29a5a6a557bd57c1f0d7c3f554bd64ed69df77e -F test/loadext.test faa4f6eed07a5aac35d57fdd7bc07f8fc82464cfd327567c10cf0ba3c86cde04 -F test/loadext2.test 0408380b57adca04004247179837a18e866a74f7 -F test/lock.test be4fe08118fb988fed741f429b7dd5d65e1c90db -F test/lock2.test 5242d8ac4e2d59c403aebff606af449b455aceff -F test/lock3.test f271375930711ae044080f4fe6d6eda930870d00 -F test/lock4.test 27143363eda1622f03c133efc8db808fc331afd973486cb571ea71cd717d37b8 -F test/lock5.test c6c5e0ebcb21c61a572870cc86c0cb9f14cede38 -F test/lock6.test ad5b387a3a8096afd3c68a55b9535056431b0cf5 -F test/lock7.test 49f1eaff1cdc491cc5dee3669f3c671d9f172431 -F test/lock_common.tcl 2f3f7f2e9637f93ccf609df48ef5b27a50278b6b1cd752b445d52262e5841413 -F test/lookaside.test 5a828e7256f1ee4da8e1bdaa03373a3ccdb0f1ff98dfa82e9b76cb41a45b1083 -F test/main.test 6bbb3999fd461eb8fb335cbab97409a3d7f91bbb8da60635e8be3e4a04a77772 -F test/make-where7.tcl 05c16b5d4f5d6512881dfec560cb793915932ef9 -F test/malloc.test 18dd1c4188c81ca79cf123527c71b19ee0c31feb9947fdffb0dc6ceb1436816a -F test/malloc3.test 6e88bae6312854a4adb4ecc2a6a5ea8c59b4db778b724ba718e1c43fc8c3c136 -F test/malloc4.test 957337613002b7058a85116493a262f679f3a261 -F test/malloc5.test 2e4ad7684a13389a44a840499cd47173a8d05f22f082d7d083eece433a7a64eb -F test/malloc6.test 2f039d9821927eacae43e1831f815e157659a151 -F test/malloc7.test 7c68a32942858bc715284856c5507446bba88c3a -F test/malloc8.test 9b7a3f8cb9cf0b12fff566e80a980b1767bd961d -F test/malloc9.test 2307c6ee3703b0a21391f3ea92388b4b73f9105e -F test/mallocA.test aea76f2dd8bcc2d19748f6b911e876cefda74a563753bf26af046e9d34bb97e6 -F test/mallocAll.test 98f1be74bc9f49a858bc4f361fc58e26486798be -F test/mallocB.test bc475ab850cda896142ab935bbfbc74c24e51ed6 -F test/mallocC.test 3dffe16532f109293ce1ccecd0c31dca55ef08c4 -F test/mallocD.test f78c295e8e18ea3029e65ca08278690e00c22100 -F test/mallocE.test db1ed69d7eded1b080952e2a7c37f364ad241b08 -F test/mallocF.test 2d5c590ebc2fc7f0dcebdf5aa8498b9aed69107e -F test/mallocG.test 0ff91b65c50bdaba680fb75d87fe4ad35bb7934f -F test/mallocH.test 79b65aed612c9b3ed2dcdaa727c85895fd1bfbdb -F test/mallocI.test 6c23a71df077fa5d387be90e7e669c5b368ca38a -F test/mallocJ.test b5d1839da331d96223e5f458856f8ffe1366f62e -F test/mallocK.test 1f4b5efbf61715ab79b20b38739ff4b3d110ceb53f54e5db6da1f01c083707ab -F test/mallocL.test fb311ff80afddf3b1a75e52289081f4754d901dc -F test/mallocM.test 78bbe9d3da84a5c679123cdb40d7b2010b18fc46e13897e4f253c6ba6fbff134 -F test/malloc_common.tcl aac62499b76be719fac31e7a3e54a7fd53272e7f -F test/malloctraceviewer.tcl b7a54595270c1d201abf1c3f3d461f27eaf24cdef623ad08a0fe5e411264c8a9 -F test/manydb.test 28385ae2087967aa05c38624cec7d96ec74feb3e -F test/mem5.test c6460fba403c5703141348cd90de1c294188c68f -F test/memdb.test c1f2a343ad14398d5d6debda6ea33e80d0dafcc7 -F test/memdb1.test 58d92c2bf622cc5f0f41461e1b35cf64f3f787199544c2c1dada37d88753f9d4 -F test/memleak.test 10b9c6c57e19fc68c32941495e9ba1c50123f6e2 -F test/memsubsys1.test 9e7555a22173b8f1c96c281ce289b338fcba2abe8b157f8798ca195bbf1d347e -F test/memsubsys2.test 3e4a8d0c05fd3e5fa92017c64666730a520c7e08 -F test/minmax.test 6751e87b409fe11b02e70a306d846fa544e25a41 -F test/minmax2.test 1edf66901ddfab26ae1e04165e8da834c8d3284e2b20aefb26b80ef217962eab -F test/minmax3.test cc1e8b010136db0d01a6f2a29ba5a9f321034354 -F test/minmax4.test 272ca395257f05937dc96441c9dde4bc9fbf116a8d4fa02baeb0d13d50e36c87 -F test/misc1.test 7ce84b25df9872e7d7878613a96815d2ba5bc974ac4e15a50118dde8f3917599 -F test/misc2.test 00d7de54eda90e237fc9a38b9e5ccc769ebf6d4d -F test/misc3.test cf3dda47d5dda3e53fc5804a100d3c82be736c9d -F test/misc4.test 10cd6addb2fa9093df4751a1b92b50440175dd5468a6ec84d0386e78f087db0e -F test/misc5.test c4aeaa0fa28faa08f2485309c38db4719e6cd1364215d5687a5b96d340a3fa58 -F test/misc6.test 953cc693924d88e6117aeba16f46f0bf5abede91 -F test/misc7.test 4f21954012e4eb0a923c54a311f38c81bf6798ccdd7b51584db46d4007f63daa -F test/misc8.test 8782708f4c8a459591c3e8fe1215bd2048bffb4024b3df249e9b9ed407dc61ed -F test/misuse.test 9e7f78402005e833af71dcab32d048003869eca5abcaccc985d4f8dc1d86bcc7 -F test/mjournal.test 28a08d5cb5fb5b5702a46e19176e45e964e0800d1f894677169e79f34030e152 -F test/mmap1.test fb04e0c10492455007624ade884ca0c8852ff3e4e11d95408f9709ca2ef7f626 -F test/mmap2.test 9d6dd9ddb4ad2379f29cc78f38ce1e63ed418022 -F test/mmap3.test b3c297e78e6a8520aafcc1a8f140535594c9086e -F test/mmap4.test 2e2b4e32555b58da15176e6fe750f17c9dcf7f93 -F test/mmapfault.test d4c9eff9cd8c2dc14bc43e71e042f175b0a26fe3 -F test/mmapwarm.test 2272005969cd17a910077bd5082f70bc1fefad9a875afec7fc9af483898ecaf3 -F test/multiplex.test dc0d67b66f84b484a83cb8bbdf3f0a7f49562ccd -F test/multiplex2.test 580ca5817c7edbe4cc68fa150609c9473393003a -F test/multiplex3.test d228f59eac91839a977eac19f21d053f03e4d101 -F test/multiplex4.test e8ae4c4bd70606a5727743241f13b5701990abe4 -F test/mutex1.test ea2cc74d97f077b9e74c84cbd024f14d79a8126f -F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660 -F test/nan.test 437d40e6d0778b050d7750726c0cbd2c9936b81962926e8f8c48ca698f00f4d1 -F test/nockpt.test 8c43b25af63b0bd620cf1b003529e37b6f1dc53bd22690e96a1bd73f78dde53a -F test/nolock.test f196cf8b8fbea4e2ca345140a2b3f3b0da45c76e -F test/normalize.test f23b6c5926c59548635fcf39678ac613e726121e073dd902a3062fbb83903b72 -F test/notify1.test 669b2b743618efdc18ca4b02f45423d5d2304abf -F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 -F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 -F test/notnull.test a37b663d5bb728d66fc182016613fb8e4a0a4bbf3d75b8876a7527f7d4ed3f18 -F test/null.test 0dcce4f04284ec66108c503327ad6d224c0752b3 -F test/nulls1.test 82c5bc33148405f21205865abf13c786084438d573a4ac4e87e11b6091cde526 -F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1 -F test/numindex1.test 20a5450d4b056e48cd5db30e659f13347a099823 -F test/offset1.test f06b83657bcf26f9ce805e67450e189e282143b2 -F test/openv2.test 0d3040974bf402e19b7df4b783e447289d7ab394 -F test/optfuzz-db01.c a0c256905c8ac79f9a5de2f374a3d9f757bef0dca2a238dc7c10cc8a38031834 -F test/optfuzz-db01.txt 21f6bdeadc701cf11528276e2a55c70bfcb846ba42df327f979bd9e7b6ce7041 -F test/optfuzz.c 50e330304eb1992e15ddd11f3daaad9bcc0d9aaad09cb2bcc77f9515df2e88b1 -F test/orderby1.test 6bf0ce45cbfb1cf4779dd418ac5e8cf66abfa04de2c1d2edf1e0e85f1520d8f3 -F test/orderby2.test bc11009f7cd99d96b1b11e57b199b00633eb5b04 -F test/orderby3.test 8619d06a3debdcd80a27c0fdea5c40b468854b99 -F test/orderby4.test 4d39bfbaaa3ae64d026ca2ff166353d2edca4ba4 -F test/orderby5.test bd7d9e3380e87e5dcf6ea817ebaab6d15da213c7804b38767e1b3e695e85650b -F test/orderby6.test 8b38138ab0972588240b3fca0985d2e400432859 -F test/orderby7.test 3d1383d52ade5b9eb3a173b3147fdd296f0202da -F test/orderby8.test 23ef1a5d72bd3adcc2f65561c654295d1b8047bd -F test/orderby9.test 87fb9548debcc2cd141c5299002dd94672fa76a3 -F test/orderbyA.test df608e59efc2ef50c1eddf1a773b272de3252e9401bfec86d04b52fd973866d5 -F test/oserror.test 1fc9746b83d778e70d115049747ba19c7fba154afce7cc165b09feb6ca6abbc5 -F test/ossfuzz.c 9636dad2092a05a32110df0ca06713038dd0c43dd89a77dabe4b8b0d71096715 -F test/ossshell.c f125c5bd16e537a2549aa579b328dd1c59905e7ab1338dfc210e755bb7b69f17 -F test/ovfl.test 199c482696defceacee8c8e0e0ef36da62726b2f -F test/pager1.test 1e9ee778bdeaf4f7f09997d029cdaca6a42dfc2092edafe4f5e590acbf1eab13 -F test/pager2.test 67b8f40ae98112bcdba1f2b2d03ea83266418c71 -F test/pager3.test 4e9a83d6ca0838d7c602c9eb93d1357562d9059c1e02ffb138a8271020838370 -F test/pager4.test a122e9e6925d5b23b31e3dfef8c6a44bbf19590e -F test/pagerfault.test 63c5da625562c66345ab4528790327ca63db2f6f9cbae2aba8cb7c51de3d1628 -F test/pagerfault2.test caf4c7facb914fd3b03a17b31ae2b180c8d6ca1f -F test/pagerfault3.test 1003fcda009bf48a8e22a516e193b6ef0dd1bbd8 -F test/pageropt.test 84e4cc5cbca285357f7906e99b21be4f2bf5abc0 -F test/pagesize.test 5769fc62d8c890a83a503f67d47508dfdc543305 -F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b -F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 -F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff -F test/permutations.test c83339862d72b6272f957905205f874e6eefdbad2823380452c4f0128fd3d906 -F test/pg_common.tcl 222a1bad1c41c308fa366313cd7b51b3be7e9b21c8736a421b974ac941693b54 -F test/pragma.test 59becdfd720b80d463ab750f69f7118fde10dfd556aa5d554f3bf6b7e5ea7533 -F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f -F test/pragma3.test 92a46bbea12322dd94a404f49edcfbfc913a2c98115f0d030a7459bb4712ef31 -F test/pragma4.test 10c624e45a83c0096a82a7579a5ff658542391d3b77355192da6572c8c17c00b -F test/pragma5.test 7b33fc43e2e41abf17f35fb73f71b49671a380ea92a6c94b6ce530a25f8d9102 -F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8 -F test/prefixes.test b524a1c44bffec225b9aec98bd728480352aa8532ac4c15771fb85e8beef65d9 -F test/printf.test 1e0e469f5f8a09afa8a182f34647e3d9b8c01978cbbe2313a194ccc3a8471506 -F test/printf2.test 30b5dd0b4b992dc5626496846ecce17ff592cacbcb11c3e589f3ac4d7e129dae -F test/progress.test ebab27f670bd0d4eb9d20d49cef96e68141d92fb -F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc -F test/pushdown.test 5e72c51c5e33253ed639ccee1e01ce62d62b6eee5ca893cd82334e4ee7b1d7fc -F test/queryonly.test 5f653159e0f552f0552d43259890c1089391dcca -F test/quick.test 1681febc928d686362d50057c642f77a02c62e57 -F test/quota-glob.test 32901e9eed6705d68ca3faee2a06b73b57cb3c26 -F test/quota.test bfb269ce81ea52f593f9648316cd5013d766dd2a -F test/quota2.test 7dc12e08b11cbc4c16c9ba2aa2e040ea8d8ab4b8 -F test/quote.test 626149eda89ee64d81a3790de370f9f0211921b11568a49c28c861f394330508 -F test/randexpr1.tcl 40dec52119ed3a2b8b2a773bce24b63a3a746459 -F test/randexpr1.test eda062a97e60f9c38ae8d806b03b0ddf23d796df -F test/rbu.test 168573d353cd0fd10196b87b0caa322c144ef736 -F test/rdonly.test 64e2696c322e3538df0b1ed624e21f9a23ed9ff8 -F test/recover.test ccb8c2623902a92ebb76770edd075cb4f75a4760bb7afde38026572c6e79070d -F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 -F test/regexp2.test 40e894223b3d6672655481493f1be12012f2b33c -F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2118d -F test/releasetest.tcl fb76d8fcc95ac29d6356cd9e52b726ab9e43a24082897618dfbcb7c2b0049153 x -F test/releasetest_data.tcl 9919fc6ac5bc92f8878fecfd1840db15999f660a6c9f609240b41aa62b885c88 -F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b -F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb -F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa -F test/rollback2.test bc868d57899dc6972e2b4483faae0e03365a0556941474eec487ae21d8d38bb6 -F test/rollbackfault.test 0e646aeab8840c399cfbfa43daab46fd609cf04a -F test/round1.test 768018b04522ca420b1aba8a24bd76091d269f3bce3902af3ec6ebcee41ab21e -F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc -F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81 -F test/rowid.test bfbd7b97d9267660be3c8f28507c4ed7f205196b8877c0db42df347c2e8845e3 -F test/rowvalue.test 8964f95b253d3b5cc8dc1cfd0cdb7529bce3ecc6b6259e23c5f829f80f4d51cd -F test/rowvalue2.test 060d238b7e5639a7c5630cb5e63e311b44efef2b -F test/rowvalue3.test 3068f508753af69884b12125995f023da0dbb256 -F test/rowvalue4.test 02e35f7762371c2f57ebd856aa056eac56cb27ef7715a0bb31eac1895a745356 -F test/rowvalue5.test c81c7d8cf36711ab37675ad7376084ae2a359cb6 -F test/rowvalue6.test d19b54feb604d5601f8614b15e214e0774c01087 -F test/rowvalue7.test c1cbdbf407029db01f87764097c6ac02a1c5a37efd2776eff32a9cdfdf6f2dba -F test/rowvalue8.test 5900eddad9e2c3c2e26f1a95f74aafc1232ee5e0 -F test/rowvalue9.test d8dd2c6ecac432dadaa79e41dc2434f007be1b6b -F test/rowvaluefault.test 7cd9ccc6c2fbdd881672984087aad0491bb75504 -F test/rowvaluevtab.test cd9747bb3f308086944c07968f547ad6b05022e698d80b9ffbdfe09ce0b8da6f -F test/rtree.test 0c8d9dd458d6824e59683c19ab2ffa9ef946f798 -F test/run-wordcount.sh 891e89c4c2d16e629cd45951d4ed899ad12afc09 -F test/savepoint.test 1f8a6b1aea9a0d05837adc463d4bf47bd9d0f1c842f1c2a9caccd639baf34bf9 -F test/savepoint2.test 9b8543940572a2f01a18298c3135ad0c9f4f67d7 -F test/savepoint4.test c8f8159ade6d2acd9128be61e1230f1c1edc6cc0 -F test/savepoint5.test 0735db177e0ebbaedc39812c8d065075d563c4fd -F test/savepoint6.test f41279c5e137139fa5c21485773332c7adb98cd7 -F test/savepoint7.test cde525ea3075283eb950cdcdefe23ead4f700daa -F test/savepointfault.test f044eac64b59f09746c7020ee261734de82bf9b2 -F test/scanstatus.test 874e35011779b07725a47dbf1dd6282b0ca04af7e028fb0b534ee544b571be42 -F test/schema.test 5dd11c96ba64744de955315d2e4f8992e447533690153b93377dffb2a5ef5431 -F test/schema2.test 906408621ea881fdb496d878b1822572a34e32c5 -F test/schema3.test 1bc1008e1f8cb5654b248c55f27249366eb7ed38 -F test/schema4.test 3b26c9fa916abb6dadf894137adcf41b7796f7b9 -F test/schema5.test 29699b4421f183c8f0e88bd28ce7d75d13ea653e -F test/schema6.test e4bd1f23d368695eb9e7b51ef6e02ca0642ea2ab4a52579959826b5e7dce1f9b -F test/schemafault.test 1936bceca55ac82c5efbcc9fc91a1933e45c8d1e1d106b9a7e56c972a5a2a51e -F test/securedel.test 2f70b2449186a1921bd01ec9da407fbfa98c3a7a5521854c300c194b2ff09384 -F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5 -F test/select1.test 009a6d8eacd9684d046302b8d13b50846a87e39d6f08e92178aa13e95ea29a2d -F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56 -F test/select3.test ddd1bc6d0c8dece136321c11bd26d0d8ad17f2b27c72935fdd6574d8cb99d1d4 -F test/select4.test e8a2502e3623f3058871030599a48abb35789d2244d5b380ecf3696873fdd4a4 -F test/select5.test df9ec0d218cedceb4fe7b63262025b547b50a55e59148c6f40b60ca25f1d4546 -F test/select6.test 319d45e414cdd321bf17cfacedaf19e3935ad64dac357c53f1492338c6e9b801 -F test/select7.test f659f231489349e8c5734e610803d7654207318f -F test/select8.test 8c8f5ae43894c891efc5755ed905467d1d67ad5d -F test/select9.test aebc2bb0c3bc44606125033cbcaac2c8d1f33a95 -F test/selectA.test b8a590f6493cad5b0bb4dfe1709bf7dcda0b6c40bb4caf32d1e36a89eebc8fc5 -F test/selectB.test 954e4e49cf1f896d61794e440669e03a27ceea25 -F test/selectC.test e25243f8ca503e06f252eb0218976d07cfeceac3 -F test/selectD.test fc20452847a01775710090383cfb4423275d2f745fed61f34fbf37573ac0d214 -F test/selectE.test a8730ca330fcf40ace158f134f4fe0eb00c7edbf -F test/selectF.test 21c94e6438f76537b72532fa9fd4710cdd455fc3 -F test/selectG.test 089f7d3d7e6db91566f00b036cb353107a2cca6220eb1cb264085a836dae8840 -F test/server1.test c2b00864514a68a0e6fd518659dc95d0050307a357a08969872bef027d785dc4 -F test/session.test 78fa2365e93d3663a6e933f86e7afc395adf18be -F test/sessionfuzz-data1.db 1f8d5def831f19b1c74571037f0d53a588ea49a6c4ca2a028fc0c27ef896dbcb -F test/sessionfuzz.c be9c4d4afd359ce80024d8b541b9b8a880510aef5cf263df56fc0e9b947727f1 -F test/shared.test 1826673eb5eb745fb91a3bdac99a7737057742ae38dcb0fe076a384d6727578b -F test/shared2.test 03eb4a8d372e290107d34b6ce1809919a698e879 -F test/shared3.test ab693f9b6e156b8bfb2a0ad94f29fe69602a5d38 -F test/shared4.test c75f476804e76e26bf6fa0e7b421fb0ca7d07558 -F test/shared6.test 866bb4982c45ce216c61ded5e8fde4e7e2f3ffa9 -F test/shared7.test a81e99f83e6c51b02ac99c96fb3a2a7b5978c956 -F test/shared8.test 933ed7d71f598bb6c7a8c192a3cd30f2562fdccf514df383798599c34ffa672f -F test/shared9.test 5f2a8f79b4d6c7d107a01ffa1ed05ae7e6333e21 -F test/sharedA.test 49d87ec54ab640fbbc3786ee3c01de94aaa482a3a9f834ad3fe92770eb69e281 -F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e -F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939 -F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 -F test/shell1.test 5bd10014ec494744f5e966a1521334e9d612119a0afcfa5251684a4e1f2ffc66 -F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b -F test/shell3.test ac8c2b744014c3e9a0e26bfd829ab65f00923dc1a91ffd044863e9423cc91494 -F test/shell4.test 1c6aef11daaa2d6830acaba3ac9cbec93fbc1c3d5530743a637f39b3987d08ce -F test/shell5.test 84a30b55722a95a5b72989e691c469a999ca7591e7aa00b7fabc783ea5c9a6fe -F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 -F test/shell7.test 115132f66d0463417f408562cc2cf534f6bbc6d83a6d50f0072a9eb171bae97f -F test/shell8.test 96be02ea0c21f05b24c1883d7b711a1fa8525a68ab7b636aacf6057876941013 -F test/shmlock.test 3dbf017d34ab0c60abe6a44e447d3552154bd0c87b41eaf5ceacd408dd13fda5 -F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 -F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5 -F test/shrink.test 1b4330b1fd9e818c04726d45cb28db73087535ce -F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329 -F test/skipscan1.test ed524bc86f27646b3a297f45d6557b55db338977b6838f8064b196b35848b31b -F test/skipscan2.test 3eb703ce794f139e7b83567911046298bcde29606116727f9b700ce34f559d2d -F test/skipscan3.test ec5bab3f81c7038b43450e7b3062e04a198bdbb5 -F test/skipscan5.test 67817a4b6857c47e0e33ba3e506da6f23ef68de2 -F test/skipscan6.test 0b4cd1b4ac9f84d91454df513c99a4932fa07e8f27b8049bea605068b3e34ac7 -F test/snapshot.test a504f2e7009f512ef66c719f0ea1c55a556bdaf1e1312c80a04d46fc1a3e9632 -F test/snapshot2.test 8d6ff5dd9cc503f6e12d408a30409c3f9c653507b24408d9cd7195931c89bc54 -F test/snapshot3.test 8744313270c55f6e18574283553d3c5c5fe4c5970585663613a0e75c151e599b -F test/snapshot4.test d4e9347ef2fcabc491fc893506c7bbaf334da3be111d6eb4f3a97cc623b78322 -F test/snapshot_fault.test f6c5ef7cb93bf92fbb4e864ecc5c87df7d3a250064838822db5b4d3a5563ede4 -F test/snapshot_up.test a0a29c4cf33475fcef07c3f8e64af795e24ab91b4cc68295863402a393cdd41c -F test/soak.test 18944cf21b94a7fe0df02016a6ee1e9632bc4e8d095a0cb49d95e15d5cca2d5c -F test/softheap1.test 843cd84db9891b2d01b9ab64cef3e9020f98d087 -F test/sort.test c2adc635c2564241fefec0b3a68391ef6868fd3b -F test/sort2.test cc23b7c19d684657559e8a55b02f7fcee03851d0 -F test/sort3.test 1480ed7c4c157682542224e05e3b75faf4a149e5 -F test/sort4.test 5c34d9623a4ae5921d956dfa2b70e77ed0fc6e5c -F test/sort5.test 6b43ae0e2169b5ceed441844492e55ba7f1ae0790528395ddf7888ab3094525d -F test/sorterref.test a13ed207a0eea3c7898f308f979bfb518f68c598ec737d2c494dfd3deaa83506 -F test/sortfault.test d4ccf606a0c77498e2beb542764fd9394acb4d66 -F test/speed1.test f2974a91d79f58507ada01864c0e323093065452 -F test/speed1p.explain d841e650a04728b39e6740296b852dccdca9b2cb -F test/speed1p.test b180e98609c7677382cf618c0ec9b69f789033a8 -F test/speed2.test 53177056baf6556dcbdcf032bbdfc41c1aa74ded -F test/speed3.test 694affeb9100526007436334cf7d08f3d74b85ef -F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 -F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa -F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c -F test/speedtest1.c d564e7689a731f691adfe2cf3f3f735d3e11f100eebb065e2a0a267fdc39fb26 -F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e -F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 -F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 -F test/spellfix4.test 51c7c26514ade169855c66bcf130bd5acfb4d7fd090cc624645ab275ae6a41fb -F test/sqldiff1.test 28cd737cf1b0078b1ec1bbf425e674c47785835e -F test/sqllimits1.test 264f4b0f941800ba139d25e33ee919c5d95fea06dfbe8ac291d6811a30984ca5 -F test/sqllog.test 6af6cb0b09f4e44e1917e06ce85be7670302517a -F test/stat.test 423257dc36e5865fb9dd1d9051ac985763b6fba1daec134932f37772d5ed1e64 -F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 -F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 -F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 -F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49 -F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f -F test/subquery2.test 90cf944b9de8204569cf656028391e4af1ccc8c0cc02d4ef38ee3be8de1ffb12 -F test/subselect.test 0966aa8e720224dbd6a5e769a3ec2a723e332303 -F test/substr.test 18f57c4ca8a598805c4d64e304c418734d843c1a -F test/subtype1.test 7fe09496352f97053af1437150751be2d0a0cae8 -F test/superlock.test ec94f0556b6488d97f71c79f9061ae08d9ab8f12 -F test/swarmvtab.test 9a3fd5ab3e9b3c976ad1b3d7646aab725114f2ac26b59395d0778b33bab6cdaf -F test/swarmvtab2.test c948cb2fdfc5b01d85e8f6d6504854202dc1a0782ab2a0ed61538f27cbd0aa5c -F test/swarmvtab3.test 247aa38b6ebd2b99db2075847ae47e789ac34f1c2ab5c720dfcffd990004c544 -F test/swarmvtabfault.test 8a67a9f27c61073a47990829e92bc0c64420a807cb642b15a25f6c788210ed95 -F test/symlink.test 72b22238d4405ba34df8e60b335d290a3b1129fd5c260835c944c1e4e77288a9 -F test/symlink2.test 9531f475a53d8781c4f81373f87faf2e2aff4f5fb2102ec6386e0c827916a670 -F test/sync.test 89539f4973c010eda5638407e71ca7fddbcd8e0594f4c9980229f804d4333092 -F test/sync2.test 8f9f7d4f6d5be8ca8941a8dadcc4299e558cb6a1ff653a9469146c7a76ef2039 -F test/syscall.test a39d9a36f852ae6e4800f861bc2f2e83f68bbc2112d9399931ecfadeabd2d69d -F test/sysfault.test c9f2b0d8d677558f74de750c75e12a5454719d04 -F test/tabfunc01.test 5ca6d004157a3e886a55a9387b960cc0db41acd88753eb597ff409ec6cfb1be0 -F test/table.test eb3463b7add9f16a5bb836badf118cf391b809d09fdccd1f79684600d07ec132 -F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f177f4 -F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 -F test/tclsqlite.test 79a473f5797e317c08f2c4f8192edb3eea6a67329b1087453328b66a7cb31070 -F test/tempdb.test 4cdaa23ddd8acb4d79cbb1b68ccdfd09b0537aaba909ca69a876157c2a2cbd08 -F test/tempdb2.test 353864e96fd3ae2f70773d0ffbf8b1fe48589b02c2ec05013b540879410c3440 -F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900 -F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 -F test/temptable2.test d2940417496e2b9548e01d09990763fbe88c316504033256d51493e1f1a5ce6a -F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637 -F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc -F test/tester.tcl fd9d134a7cc4e31b307ad028a195f51cdcf556fc620d74b680515562f0137f25 -F test/thread001.test b61a29dd87cf669f5f6ac96124a7c97d71b0c80d9012746072055877055cf9ef -F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 -F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7 -F test/thread004.test f51dfc3936184aaf73ee85f315224baad272a87f -F test/thread005.test 50d10b5684399676174bd96c94ad4250b1a2c8b6 -F test/thread1.test df115faa10a4ba1d456e9d4d9ec165016903eae4 -F test/thread2.test f35d2106452b77523b3a2b7d1dcde2e5ee8f9e46 -F test/thread_common.tcl 334639cadcb9f912bf82aa73f49efd5282e6cadd -F test/threadtest1.c 6029d9c5567db28e6dc908a0c63099c3ba6c383b -F test/threadtest2.c a70a8e94bef23339d34226eb9521015ef99f4df8 -F test/threadtest3.c 4b413718ab3ef5e4f9f1ab0502b89707c5a9ccdc -F test/threadtest4.c c1e67136ceb6c7ec8184e56ac61db28f96bd2925 -F test/time-wordcount.sh 8e0b0f8109367827ad5d58f5cc849705731e4b90 -F test/tkt-02a8e81d44.test 6c80d9c7514e2a42d4918bf87bf6bc54f379110c -F test/tkt-18458b1a.test 6a62cb1ee50fa3c620da59e3a6f531eb38fceaf7e2166203816b724524e6f1d6 -F test/tkt-26ff0c2d1e.test c15bec890c4d226c0da2f35ff30f9e84c169cfef90e73a8cb5cec11d723dfa96 -F test/tkt-2a5629202f.test 0521bd25658428baa26665aa53ffed9367d33af2 -F test/tkt-2d1a5c67d.test be1326f3061caec85085f4c9ee4490561ca037c0 -F test/tkt-2ea2425d34.test 1cf13e6f75d149b3209a0cb32927a82d3d79fb28 -F test/tkt-31338dca7e.test 6fb8807851964da0d24e942f2e19c7c705b9fb58 -F test/tkt-313723c356.test 4b306ad45c736cedf2f5221f6155b92143244b6d -F test/tkt-385a5b56b9.test 5204a7cba0e28c99df0acbf95af5e1af4d32965a7a14de6eccebf949607618b1 -F test/tkt-38cb5df375.test f3cc8671f1eb604d4ae9cf886ed4366bec656678 -F test/tkt-3998683a16.test 6d1d04d551ed1704eb3396ca87bb9ccc8c5c1eb7 -F test/tkt-3a77c9714e.test 90e3e8455ee945a4076d4c44062b8845708af24a880355328fe7008f2047c9f0 -F test/tkt-3fe897352e.test 27e26eb0f1811aeba4d65aba43a4c52e99da5e70 -F test/tkt-4a03edc4c8.test 91c0e135888cdc3d4eea82406a44b05c8c1648d0 -F test/tkt-4c86b126f2.test cbcc611becd0396890169ab23102dd70048bbc9a -F test/tkt-4dd95f6943.test 3d0ce415d2ee15d3d564121960016b9c7be79407 -F test/tkt-4ef7e3cfca.test 3965ae11cc9cf6e334f9d7d3c1e20bf8d56254b1 -F test/tkt-54844eea3f.test a12b851128f46a695e4e378cca67409b9b8f5894 -F test/tkt-5d863f876e.test 726e76d725f6fe0eb2fc8a522b721b79807380ee -F test/tkt-5e10420e8d.test 904d1687b3c06d43e5b3555bbcf6802e7c0ffd84 -F test/tkt-5ee23731f.test 9db6e1d7209dc0794948b260d6f82b2b1de83a9f -F test/tkt-6bfb98dfc0.test 24780633627b5cfc0635a5500c2389ebfb563336 -F test/tkt-752e1646fc.test ea78d88d14fe9866bdd991c634483334639e13bf -F test/tkt-78e04e52ea.test cb44d0f5e7940223be740a39913a1b9b9b30d7e4a17ed3349141f893bae1b8f2 -F test/tkt-7a31705a7e6.test 9e9c057b6a9497c8f7ba7b16871029414ccf6550e7345d9085d6d71c9a56bb6f -F test/tkt-7bbfb7d442.test 7b2cd79c7a17ae6750e75ec1a7846712a69c9d18 -F test/tkt-80ba201079.test 105a721e6aad0ae3c5946d7615d1e4d03f6145b8 -F test/tkt-80e031a00f.test 9ee36348b761bf7c14261e002b75a4c0d5a04d4c -F test/tkt-8454a207b9.test c583a9f814a82a2b5ba95207f55001c9f0cd816c -F test/tkt-868145d012.test a5f941107ece6a64410ca4755c6329b7eb57a356 -F test/tkt-8c63ff0ec.test 258b7fc8d7e4e1cb5362c7d65c143528b9c4cbed -F test/tkt-91e2e8ba6f.test 08c4f94ae07696b05c9b822da0b4e5337a2f54c5 -F test/tkt-94c04eaadb.test f738c57c7f68ab8be1c054415af7774617cb6223 -F test/tkt-9a8b09f8e6.test b2ef151d0984b2ebf237760dbeaa50724e5a0667 -F test/tkt-9d68c883.test 16f7cb96781ba579bc2e19bb14b4ad609d9774b6 -F test/tkt-9f2eb3abac.test cb6123ac695a08b4454c3792fbe85108f67fabf8 -F test/tkt-a7b7803e.test 159ef554234fa1f9fb318c751b284bd1cf858da4 -F test/tkt-a7debbe0.test e295fa83cd4416a8ca37b354eb5fadefc5e81fb55253db538d35261fe9c95067 -F test/tkt-a8a0d2996a.test 002e1cde8fc30c39611b52cf981c88200b858765748556822da72e0d32fac73e -F test/tkt-b1d3a2e531.test 8f7576e41ca179289ee1a8fee28386fd8e4b0550 -F test/tkt-b351d95f9.test d14a503c414c5c58fdde3e80f9a3cfef986498c0 -F test/tkt-b72787b1.test a95e8cdad0b98af1853ac7f0afd4ab27b77bf5f3 -F test/tkt-b75a9ca6b0.test ade89229d853a67a21bbd5e6e1e787a8f9d21f19908d1b7fca6bf3d4d5aa0767 -F test/tkt-ba7cbfaedc.test b4c0deccc12aeb55cfdb57935b16b5d67c5a9877 -F test/tkt-bd484a090c.test 60460bf946f79a79712b71f202eda501ca99b898 -F test/tkt-bdc6bbbb38.test fc38bb09bdd440e3513a1f5f98fc60a075182d7d -F test/tkt-c48d99d690.test ba61977d62ab612fc515b3c488a6fbd6464a2447 -F test/tkt-c694113d5.test 82c461924ada5c14866c47e85535b0b0923ba16a2e907e370061a5ca77f65d77 -F test/tkt-cbd054fa6b.test 708475ef4d730a6853512c8ce363bcbd3becf0e26826e1f4cd46e2f52ff38edf -F test/tkt-d11f09d36e.test d999b548fef885d1d1afa49a0e8544ecf436869d -F test/tkt-d635236375.test 9d37e988b47d87505bc9445be0ca447002df5d09 -F test/tkt-d82e3f3721.test bcc0dfba658d15bab30fd4a9320c9e35d214ce30 -F test/tkt-f3e5abed55.test d5a0126118142d13e27f6ce9f4c47096e9321c00 -F test/tkt-f67b41381a.test a23bc124c981662db712167bacd0ed8ad11abac9 -F test/tkt-f777251dc7a.test d1a8fc3eefb7a9e64d19ff24d5c8c94c34a632fb -F test/tkt-f7b4edec.test d998a08ff2b18b7f62edce8e3044317c45efe6c7 -F test/tkt-f973c7ac31.test 28ef85c7f015477916795246d8286aeda39d4ead -F test/tkt-fa7bf5ec.test 9102dfea58aa371d78969da735f9392c57e2e035 -F test/tkt-fc62af4523.test 72825d3febdedcd5593a27989fc05accdbfc2bb4 -F test/tkt-fc7bd6358f.test 634bb4af7d661e82d6b61b80c86727bad698e08f -F test/tkt1435.test f8c52c41de6e5ca02f1845f3a46e18e25cadac00 -F test/tkt1443.test bacc311da5c96a227bf8c167e77a30c99f8e8368 -F test/tkt1444.test a9d72f9e942708bd82dde6c707da61c489e213e9 -F test/tkt1449.test 93584a449752d52b07d2cfc280a69842b6e16ed5 -F test/tkt1473.test 9d000af3e11a4450d4c596f5e58b4b0d24eb0f8b -F test/tkt1501.test 2064f98e00871848af4b2f517e46c1a7fb2e32db -F test/tkt1512.test a1df1f66caf0b9122d6220c15dcee230298c2c2f -F test/tkt1514.test ddef38e34fea72eb1ab935ded9f17a3fb71dd9df -F test/tkt1536.test 83ff7a7b6e248016f8d682d4f7a4ae114070d466 -F test/tkt1537.test e3a14332de9770be8ff14bd15c19a49cbec10808 -F test/tkt1567.test 52f329386ac77e59260d4af1c58490d61377db20 -F test/tkt1644.test 80b6a2bb17885f3cf1cb886d97cdad13232bb869 -F test/tkt1667.test 4700d931ed19ea3983e8e703becb28079250b460 -F test/tkt1873.test 0e1b8c023050a430c2525179ed4022ddc7c31264 -F test/tkt2141.test f543d96f50d5a5dc0bc744f7db74ea166720ce46 -F test/tkt2192.test ff40157e5f42e65f844255d220fc6b290470942f -F test/tkt2213.test a9702175601a57b61aba095a233b001d6f362474 -F test/tkt2251.test 5aab8c7898cd2df2a68fe19289cc29e8f5cf8c82 -F test/tkt2285.test cca17be61cf600b397188e77e7143844d2b977e9 -F test/tkt2332.test fc955609b958ca86dfa102832243370a0cc84070 -F test/tkt2339.test 73bd17818924cd2ac442e5fd9916b58565739450 -F test/tkt2391.test ab7a11be7402da8b51a5be603425367aa0684567 -F test/tkt2409.test be0d60e7d283f639dccea4b0b5e1cd3a4851fb5b -F test/tkt2450.test 77ed94863f2049c1420288ddfea2d41e5e0971d6 -F test/tkt2565.test 8be666e927cb207aae88188f31c331870878b650 -F test/tkt2640.test 28134f5d1e05658ef182520cf0b680fa3de5211b -F test/tkt2643.test 3f3ebb743da00d4fed4fcf6daed92a0e18e57813 -F test/tkt2686.test 6ee01c9b9e9c48f6d3a1fdd553b1cc4258f903d6 -F test/tkt2767.test 569000d842678f9cf2db7e0d1b27cbc9011381b0 -F test/tkt2817.test f31839e01f4243cff7399ef654d3af3558cb8d8d -F test/tkt2820.test 39940276b3436d125deb7d8ebeee053e4cf13213 -F test/tkt2822.test f391776423a7c0d0949edfce375708bfb0f3141e -F test/tkt2832.test a9b0b74a02dca166a04d9e37739c414b10929caa -F test/tkt2854.test e432965db29e27e16f539b2ba7f502eb2ccc49af -F test/tkt2920.test a8737380e4ae6424e00c0273dc12775704efbebf -F test/tkt2927.test 4752868b9eeeb07a217f7f19f4cbaac98d6d086d -F test/tkt2942.test c5c87d179799ca6d1fbe83c815510b87cd5ec7ce -F test/tkt3080.test 1bca7579260920a66b4dd7e196e807c0f25ff804 -F test/tkt3093.test fbdbc5b4969244ad11f540759003e361fcaf391f -F test/tkt3121.test 536df66a02838c26a12fe98639354ca1290ca68b -F test/tkt3201.test f1500ccecc0d578dc4cde7d3242008297c4d59b3 -F test/tkt3292.test 7bad4423cf5eb075dbb58511d66d46fe816744754c9f0050ae60157f71a4fca7 -F test/tkt3298.test 20fd8773b825cb602e033aa04f8602e1ebdcd93c -F test/tkt3334.test 9756631e3c4aa3c416362c279e3c0953a83b7ca8274cb81a13264bb56296d8b0 -F test/tkt3346.test 6f67c3ed7db94dfc5df4f5f0b63809a1f611e01a -F test/tkt3357.test 77c37c6482b526fe89941ce951c22d011f5922ed -F test/tkt3419.test 1bbf36d7ea03b638c15804251287c2391f5c1f6b -F test/tkt3424.test 61f831bd2b071bd128fa5d00fbda57e656ca5812 -F test/tkt3442.test a1fc47c669e651d16494de3ff349bcb53281456f2ca02c8bc14220b6044bbfe8 -F test/tkt3457.test 5651e2cbb94645b677ec663160b9e192b87b7d365aecdfb24e19f749575a6fc2 -F test/tkt3461.test 228ea328a5a21e8663f80ee3d212a6ad92549a19 -F test/tkt3493.test 1686cbde85f8721fc1bdc0ee72f2ef2f63139218 -F test/tkt3508.test d75704db9501625c7f7deec119fcaf1696aefb7d -F test/tkt3522.test 22ce2ebbcb04a6be56c0977d405c207967318fd6 -F test/tkt3527.test 1a6a48441b560bdc53aec581a868eb576234874d -F test/tkt3541.test 5dc257bde9bc833ab9cc6844bf170b998dbb950a -F test/tkt3554.test f599967f279077bace39220cbe76085c7b423725 -F test/tkt3581.test 1966b7193f1e3f14951cce8c66907ae69454e9a3 -F test/tkt35xx.test f38c1b03713179d414969187c941466e44945b35 -F test/tkt3630.test 9a934c58c259f89a0ae6bb6bb846c56285a6fd0f -F test/tkt3718.test 3b59dcb5c4e7754dacd91e7fd353a61492cc402a -F test/tkt3731.test 0c5f4cbffe102d43c3b2188af91a9e36348f974b -F test/tkt3757.test 10cd679a88675c880533083fc79ac04324525595 -F test/tkt3761.test b95ea9c98f21cf91325f18a984887e62caceab33 -F test/tkt3762.test 4d439ff7abdc8d9323150269d182c37c2d514576 -F test/tkt3773.test 7bca904d2a647a6a4a291bd86d7fd7c73855b789 -F test/tkt3791.test a6624b9a80b216a26cf473607f42f3e51898c267 -F test/tkt3793.test d90ffd75c52413908d15e1c44fc2ea9c80fcc449 -F test/tkt3810.test 09608d81c63a6ff3aaf7bc70717909c51f5f4048 -F test/tkt3824.test 150aa00bb6220672e5f0eb14dc8eaa36750425f0 -F test/tkt3832.test 2300d10d57562b89875b72148338ac3e14f8847d -F test/tkt3838.test 292e72489101cd1320d7278dc111c173ebf334d4 -F test/tkt3841.test 4659845bc53f809a5932c61c6ce8c5bb9d6b947f -F test/tkt3871.test d921703d07c68f4fd5312073215a17fa34b0401d -F test/tkt3879.test 2ad5bef2c87e9991ce941e054c31abe26ef7fb90 -F test/tkt3911.test 74cd324f3ba653040cc6d94cc4857b290d12d633 -F test/tkt3918.test ea78bf164e4d55cbde0d83c671ef6fbe930a0032 -F test/tkt3922.test f26be40ab4fe6c00795629bd2006d96e270d9b1a -F test/tkt3929.test cdf67acf5aa936ec4ffead81db87f8a71fe40e59 -F test/tkt3935.test e15261fedb9e30a4305a311da614a5d8e693c767 -F test/tkt3992.test f3e7d548ac26f763b47bc0f750da3d03c81071da -F test/tkt3997.test a335fa41ca3985660a139df7b734a26ef53284bd -F test/tkt4018.test 18dbc6617f7a4b90e938d1bd6d26ad18daafaf08 -F test/tokenize.test ce430a7aed48fc98301611429595883fdfcab5d7 -F test/tpch01.test 7c4eb8cdd79c568f46d344b3e789c9fdb8a766d112871352704861f3fca32a2a -F test/trace.test a659a9862957f4789e37a92b3bf6d2caf5c86b02cdeefc41e850ae53acf6992a -F test/trace2.test f5cb67ad3bc09e0c58e8cca78dfd0b5639259983 -F test/trace3.test 1dff966888773ff1bfea01c080caf15417892b3f998408fe920c4791f7337144 -F test/trans.test 6e1b4c6a42dba31bd65f8fa5e61a2708e08ddde6 -F test/trans2.test 62bd045bfc7a1c14c5ba83ba64d21ade31583f76 -F test/trans3.test 91a100e5412b488e22a655fe423a14c26403ab94 -F test/transitive1.test 293300f46916569f08875cdb2fe2134be2c27677 -F test/trigger1.test d30cd09ae8ac365a088f09daba583cc5c0b8fc7d4e1d70809d0b4be3bf6ae2ab -F test/trigger2.test d15da46f7012832faf3e0c536b47024409d5fb1722d2bb77e29c06d96d704bb1 -F test/trigger3.test aa640bb2bbb03edd5ff69c055117ea088f121945 -F test/trigger4.test 74700b76ebf3947b2f7a92405141eb2cf2a5d359 -F test/trigger5.test 619391a3e9fc194081d22cefd830d811e7badf83 -F test/trigger6.test 0e411654f122552da6590f0b4e6f781048a4a9b9 -F test/trigger7.test e7ce54bfda67a88d778aea42544e151c465547a7e617127b6914c2221a6d53c1 -F test/trigger8.test 30cb0530bd7c4728055420e3f739aa00412eafa4 -F test/trigger9.test 2226ec795a33b0460ab5cf8891e9054cc7edef41 -F test/triggerA.test 837be862d8721f903dba3f3ceff05b32e0bee5214cf6ea3da5fadf12d3650e9d -F test/triggerB.test 56780c031b454abac2340dbb3b71ac5c56c3d7fe -F test/triggerC.test 29f5a28d0fe39e6e2c01f6e1f53f08c0955170ae10a63ad023e33cb0a1682a51 -F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650 -F test/triggerE.test ede2e4bce4ba802337bd69d39447fa04a938e06d84a8bfc53c76850fc36ed86d -F test/triggerF.test 5d76f0a8c428ff87a4d5ed52da06f6096a2c787a1e21b846111dfac4123de3ad -F test/triggerG.test 2b816093c91ba73c733cfa8aedcc210ad819d72a98b1da30768a3c56505233e9 -F test/trustschema1.test 4e970aef0bfe0cee139703cc7209d0e0f07725d999b180ba50770f49edef1494 -F test/tt3_checkpoint.c 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1 -F test/tt3_core.c 8cd89ead95410f70e7fb02c79f1e040f9c5ad5cf -F test/tt3_index.c 39eec10a35f57672225be4d182862152896dee4a -F test/tt3_lookaside1.c 0377e202c3c2a50d688cb65ba203afeda6fafeb9 -F test/tt3_stress.c c57d804716165811d979d4a719e05baccd79277f -F test/tt3_vacuum.c 1753f45917699c9c1f66b64c717a717c9379f776 -F test/types.test bf816ce73c7dfcfe26b700c19f97ef4050d194ff -F test/types2.test 1aeb81976841a91eef292723649b5c4fe3bc3cac -F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a -F test/unionvtab.test e1704ab1b4c1bb3ffc9da4681f8e85a0b909fd80b937984fc94b27415ac8e5a4 -F test/unionvtabfault.test e8759f3d14fb938ce9657e2342db34aeac0fb9bc1692b0d1ebb0069630151d06 -F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 -F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2 -F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97 -F test/unordered.test ffeea7747d5ba962a8009a20b7e53d68cbae05b063604c68702c5998eb50c981 -F test/update.test e906ca7cb1dc6f52af1ea243e08f727edfa79f924c2691f2f9e72481f847310d -F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 -F test/upsert1.test 88f9e258c6a0eeeb85937b08831e8daad440ba41f125af48439e9d33f266fb18 -F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09 -F test/upsert3.test 88d7d590a1948a9cb6eac1b54b0642f67a9f35a1fc0f19b200e97d5d39e3179c -F test/upsert4.test 25d2a1da92f149331ae0c51ca6e3eee78189577585eab92de149900d62994fa5 -F test/upsertfault.test f21ca47740841fdb4d61acfa7b17646d773e67724fe8c185b71c018db8a94b35 -F test/uri.test 3481026f00ade6dfe8adb7acb6e1e47b04369568 -F test/uri2.test 9d3ba7a53ee167572d53a298ee4a5d38ec4a8fb7 -F test/userauth01.test e740a2697a7b40d7c5003a7d7edaee16acd349a9 -F test/utf16align.test 54cd35a27c005a9b6e7815d887718780b6a462ae -F test/vacuum-into.test 48f4cec354fb6f27c98ef58d2fe49a11b71ff131af0cd9140efacc9858b9f670 -F test/vacuum.test ce91c39f7f91a4273bf620efad21086b5aa6ef1d -F test/vacuum2.test aa048abee196c16c9ba308465494009057b79f9b -F test/vacuum3.test 77ecdd54592b45a0bcb133339f99f1ae0ae94d0d -F test/vacuum4.test 7ea76b769fffeb41f925303b04cbcf5a5bbeabe55e4c60ae754ff24eeeb7c010 -F test/vacuum5.test 263b144d537e92ad8e9ca8a73cc6e1583f41cfd0dda9432b87f7806174a2f48c -F test/vacuummem.test 7b42abb3208bd82dd23a7536588396f295a314f2 -F test/varint.test bbce22cda8fc4d135bcc2b589574be8410614e62 -F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 -F test/view.test 10ea54300a097d7c0337fd104abffe4a4786d1598b94017a37efe0e0d3e04dd5 -F test/vtab1.test c5d9e90ed02bcacd776dcbb7360199d290f7f53c26b484ddece543060c54319f -F test/vtab2.test 14d4ab26cee13ba6cf5c5601b158e4f57552d3b055cdd9406cf7f711e9c84082 -F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e -F test/vtab4.test 8e73ed268f3d596bc3590f45fc948fb40f28e9c3 -F test/vtab5.test 889f444970393c73f1e077e2bdc5d845e157a391 -F test/vtab6.test 8e789f526e6594cf7ae933d1adee0caa87dc9f78 -F test/vtab7.test 70c6f4a1d6177144a8236e4172d5fba92e683440374664ad1f04851fbb335d3c -F test/vtab8.test e19fa4a538fcd1bb66c22825fa8f71618fb13583 -F test/vtab9.test ea58d2b95d61955f87226381716b2d0b1d4e4f9b -F test/vtabA.test 1317f06a03597eee29f40a49b6c21e1aaba4285f -F test/vtabB.test 04df5dc531b9f44d9ca65b9c1b79f12b5922a796 -F test/vtabC.test 4528f459a13136f982e75614d120aef165f17292 -F test/vtabD.test 05b3f1d77117271671089e48719524b676842e96 -F test/vtabE.test 2a143fe75a11275781d1fd1988d86b66a3f69cb98f4add62e3da8fd0f637b45f -F test/vtabF.test 1918844c7c902f6a16c8dacf1ec8f84886d6e78b -F test/vtabH.test 2efb5a24b0bb50796b21eca23032cfb77abfa4b0c03938e38ce5897abac404ca -F test/vtabI.test 751b07636700dbdea328e4265b6077ccd6811a3f -F test/vtabJ.test d7b73675708cf63cfcb9d443bb451fc01a028347275b7311e51f9fdf3ca6757f -F test/vtab_alter.test 736e66fb5ec7b4fee58229aa3ada2f27ec58bc58c00edae4836890c3784c6783 -F test/vtab_err.test dcc8b7b9cb67522b3fe7a272c73856829dae4ab7fdb30399aea1b6981bda2b65 -F test/vtab_shared.test 5253bff2355a9a3f014c15337da7e177ab0ef8ad -F test/vtabdrop.test 65d4cf6722972e5499bdaf0c0d70ee3b8133944a4e4bc31862563f32a7edca12 -F test/wal.test 16180bc4becda176428ad02eaea437b4b8f5ae099314de443a4e12b2dcc007a2 -F test/wal2.test 6af203a0eb4be054661d9e0072cb22402c78dea4a89a10b77e9118ae3b91148a -F test/wal3.test 2a93004bc0fb2b5c29888964024695bade278ab2 -F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c -F test/wal5.test 9c11da7aeccd83a46d79a556ad11a18d3cb15aa9 -F test/wal6.test b602704e4b066199bc89d91ca9000f335dcf4572 -F test/wal64k.test 2a525c0f45d709bae3765c71045ccec5df7d100ccbd3a7860fdba46c9addb965 -F test/wal7.test 2ae8f427d240099cc4b2dfef63cff44e2a68a1bd -F test/wal8.test d9df3fba4caad5854ed69ed673c68482514203c8 -F test/wal9.test 378e76a9ad09cd9bee06c172ad3547b0129a6750 -F test/wal_common.tcl 37902864b63794e9bf59393b8887e21a9cbd4db8 -F test/walbak.test 018d4e5a3d45c6298d11b99f09a8ef6876527946 -F test/walbig.test f437473a16cfb314867c6b5d1dbcd519e73e3434 -F test/walblock.test be48f3a75eff0b4456209f26b3ce186c2015497d -F test/walcksum.test bb234a1bb42248b3515d992b719708015c384278 -F test/walcrash.test 21038858cc552077b0522f50b0fa87e38139306a -F test/walcrash2.test a0edab4e5390f03b99a790de89aad15d6ec70b36 -F test/walcrash3.test e426aa58122d20f2b9fbe9a507f9eb8cab85b8af -F test/walcrash4.test e7b6e7639a950a0cca8e210e248c8dad4d63bf20 -F test/walfault.test 09b8ad7e52d2f54bce50e31aa7ea51412bb9f70ac13c74e669ddcd8b48b0d98d -F test/walfault2.test e039ac66c78d5561683cacde04097213cdad3b58e2b3f3fe1112862217bfd915 -F test/walhook.test ed00a40ba7255da22d6b66433ab61fab16a63483 -F test/walmode.test cd6e7cff618eaaa5910ce57c3657aa50110397f86213886a2400afb9bfec7b7b -F test/walnoshm.test 84ca10c544632a756467336b7c3b864d493ee496 -F test/waloverwrite.test dad2f26567f1b45174e54fbf9a8dc1cb876a7f03 -F test/walpersist.test 8c6b7e3ec1ba91b5e4dc4e0921d6d3f87cd356a6 -F test/walprotocol.test a112aba0b79e3adeaa485fed09484b32c654e97df58e454aa8489ac2cd57bf84 -F test/walprotocol2.test 7d3b6b4bf0b12f8007121b1e6ef714bc99101fb3b48e46371df1db868eebc131 -F test/walro.test cb438d05ba0d191f10b688e39c4f0cd5b71569a1d1f4440e5bdf3c6880e08c20 -F test/walro2.test 0e79dd15cbdb4f482c01ea248373669c732414a726b357d04846a816afafb768 -F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cfd51af68 -F test/walsetlk.test 11f7fe792fdce54cf09874dab824e0627f2eedecfb9f7983e325606ec5184e0c -F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 -F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f -F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 -F test/walvfs.test ca81c9f427e0e5434076dfa948fd1d8e6d5ddd192b2fb6991635d81da5f3f5d4 -F test/wapp.tcl b440cd8cf57953d3a49e7ee81e6a18f18efdaf113b69f7d8482b0710a64566ec -F test/wapptest.tcl 3cca775aede0591756a1fc0da55bbb3715d8c363873fd2cfdd4d555b0a4af57d x -F test/where.test 19c709c9f0f6ed12c23f909f6592aa55fba34269d5a2898537aa27a22b9ce650 -F test/where2.test 478d2170637b9211f593120648858593bf2445a1 -F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c -F test/where4.test 4a371bfcc607f41d233701bdec33ac2972908ba8 -F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2 -F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b -F test/where7.test 75722434c486ac9e74718caa6cce234f45ba34c0b6c0f9555b29eb8bb5f6ade1 -F test/where8.test 461ca40265ed996a6305da99bb024b0e41602bb586acf544c08f95922358e49f -F test/where9.test 2c554b97bbdb2fdf26c57099f60db8a52bfcf7c147f2c256f9798fa0e267ca85 -F test/whereA.test 6c6a420ca7d313242f9b1bd471dc80e4d0f8323700ba9c78df0bb843d4daa3b4 -F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5 -F test/whereC.test cae295158703cb3fc23bf1a108a9ab730efff0f6 -F test/whereD.test c1c335e914e28b122e000e9310f02d2be83e1c9dbca2e29f46bd732703944d1b -F test/whereE.test b3a055eef928c992b0a33198a7b8dc10eea5ad2f -F test/whereF.test 3d9412b1199d3e2bed34fcb76b4c48d0bf4df95d27e3f8dd27b6f8b4716d0d89 -F test/whereG.test c9378b285828754377ef47fbece7264018c0a3743e7eb686e89917bb9df10885 -F test/whereH.test e4b07f7a3c2f5d31195cd33710054c78667573b2 -F test/whereI.test a2874062140ed4aba9ffae76e6190a3df6fc73d1373fdfa8fd632945082a5364 -F test/whereJ.test 88287550f6ee604422403b053455b1ad894eeaa5c35d348532dfa1439286cb9a -F test/whereK.test f8e3cf26a8513ecc7f514f54df9f0572c046c42b -F test/whereL.test e05cedc9389c6f09ad55bd5999a3fddccebec90672fb989433c145dcdaf26996 -F test/wherefault.test 1374c3aa198388925246475f84ad4cd5f9528864 -F test/wherelfault.test 9012e4ef5259058b771606616bd007af5d154e64cc25fa9fd4170f6411db44e3 -F test/wherelimit.test 592081800806d297dd7449b1030c863d2883d6d42901837ccd2e5a9bd962edb0 -F test/wherelimit2.test 9bf0aa56cca40ea0e4c5e2915341355a2bbc0859ec4ce1589197fe2a9d94635f -F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2aeee74 -F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 -F test/win32longpath.test 4baffc3acb2e5188a5e3a895b2b543ed09e62f7c72d713c1feebf76222fe9976 -F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 502a3e72fce895aaaa633bbe709f6de3c24eed3ecb8098ab9fb8b47584b4452c -F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 -F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c -F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 -F test/window3.test e9959a993c8a71e96433be8daaa1827d78b8921e4f12debd7bdbeb3c856ef3cb -F test/window4.tcl 6f85307eb67242b654d051f7da32a996a66aee039a09c5ae358541aa61720742 -F test/window4.test fbead87f681400ac07ef3555e0488b544a47d35491f8bf09a7474b6f76ce9b4e -F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652821e -F test/window6.test f8d674254b23289cc17c84d79dec7eda7caa1dfb7836c43122cfdf3640d1df32 -F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d76108f -F test/window7.test 1d31276961ae7801edc72173edaf7593e3cbc79c06d1f1f09e20d8418af403cd -F test/window8.tcl f2711aa3571e4e6b0dad98db8d95fd6cb8d9db0c92bbdf535f153b07606a1ce2 -F test/window8.test c4331b27a6f66d69fa8f8bab10cc731db1a81d293ae108a68f7c3487fa94e65b -F test/window9.test c22c25377c820613e1842fe7ad4af7c03df625f6a7caee99e6fdb4fcd52e0a8b -F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be -F test/windowB.test 7a983ea1cc1cf72be7f378e4b32f6cb2d73014c5cd8b25aaee825164cd4269e5 -F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 -F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b -F test/windowfault.test 72375ae71031eabf96bc88d0af128c8628a091ddc99b5a394e848b3df5fc17ad -F test/with1.test 584580a5ae79868a91873863f8cb2d00040006dc1e4c332ef1d8642f2815dc6e -F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab -F test/with3.test 13b3336739da648a9e4dfa11bb04e73a920c97620041007c5f75d5d14084c346 -F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 -F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 -F test/without_rowid1.test 9cfb83705c506e3849fa7efc88a3c9a15f9a50bf9b1516b41757a7cef9bba8c3 -F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 -F test/without_rowid3.test f8e6b9f7cb32a3570bab743dd4f28d2000e2107808d57585e776f5c3eb076241 -F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a -F test/without_rowid5.test 89b1c587bd92a0590e440da33e7666bf4891572a -F test/without_rowid6.test 8463b20098e9f75a501a9f17dfb42fffc79068eac0b2775fe56ef2281d2df45e -F test/without_rowid7.test d7c59a93d726b55812d620f8f284e01904a5b85f9ee9eea8f2f68571a5e8c40e -F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912adec66 -F test/writecrash.test f1da7f7adfe8d7f09ea79b42e5ca6dcc41102f27f8e334ad71539501ddd910cc -F test/zeroblob.test 07a5b11ab591d1f26c626945fb7f228f68b993533b2ada77273edf6ee29db174 -F test/zerodamage.test 9c41628db7e8d9e8a0181e59ea5f189df311a9f6ce99cc376dc461f66db6f8dc -F test/zipfile.test 429cb81c518487fa1b644b6b04b6e9af704a4fa767bd1a110204c5f03b2e8616 -F test/zipfile2.test 9903388a602a3834189857a985106ff95c3bba6a3969e0134127df991889db5d -F test/zipfilefault.test 44d4d7a7f7cca7521d569d7f71026b241d65a6b1757aa409c1a168827edbbc2c -F tool/GetFile.cs 47852aa0d806fe47ed1ac5138bdce7f000fe87aaa7f28107d0cb1e26682aeb44 -F tool/GetTclKit.bat 8995df40c4209808b31f24de0b58f90930239a234f7591e3675d45bfbb990c5d -F tool/Replace.cs 02c67258801c2fb5f63231e0ac0f220b4b36ba91 -F tool/build-all-msvc.bat c12328d06c45fec8baada5949e3d5af54bf8c887 x -F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367 -F tool/cg_anno.tcl c1f875f5a4c9caca3d59937b16aff716f8b1883935f1b4c9ae23124705bc8099 x -F tool/checkSpacing.c 810e51703529a204fc4e1eb060e9ab663e3c06d2 -F tool/dbhash.c 19560c9a2aa2b269b6a5108259b93d26d12f8f0877c31fe9f8f61dfbd219ba63 -F tool/dbtotxt.c b2221864a20fb391c46bd31bc1fbdc4a96f5c8a89bef58f421eb9b9c36b1702c -F tool/dbtotxt.md c9a57af8739957ef36d2cfad5c4b1443ff3688ed33e4901ee200c8b651f43f3c -F tool/extract-sqlite3h.tcl 069ceab0cee26cba99952bfa08c0b23e35941c837acabe143f0c355d96c9e2eb x -F tool/extract.c 054069d81b095fbdc189a6f5d4466e40380505e2 -F tool/fast_vacuum.c 5ba0d6f5963a0a63bdc42840f678bad75b2ebce1 -F tool/fragck.tcl 5265a95126abcf6ab357f7efa544787e5963f439 -F tool/fuzzershell.c e1d90a03ca790d7c331c2aae08ca46ff435f1ae1faa6cb9cc48f4687c18fdc6e -F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4 -F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a5a4f -F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce -F tool/index_usage.c 9ec344d29cbeb03fdc0fce668eedfb7495792170de933adf95cf8d6904a166ad -F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f -F tool/lemon.c a361b85fa230560b783006ac002a6a8bad214c3b9d7fa48980aecc2b691ddcad -F tool/lempar.c e8899b28488f060d0ff931539ea6311b16b22dce068c086c788a06d5e8d01ab7 -F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 -F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 -F tool/logest.c 11346aa019e2e77a00902aa7d0cabd27bd2e8cca -F tool/max-limits.c cbb635fbb37ae4d05f240bfb5b5270bb63c54439 -F tool/mkautoconfamal.sh 422fc365358a2e92876ffc62971a0ff28ed472fc8bcf9de0df921c736fdeca5e -F tool/mkccode.tcl 86463e68ce9c15d3041610fedd285ce32a5cf7a58fc88b3202b8b76837650dbe x -F tool/mkctimec.tcl dd183b73ae1c28249669741c250525f0407e579a70482371668fd5f130d9feb3 -F tool/mkkeywordhash.c 11a3f3af8e787d0c5ca459ed66fe80fd09e661876506e7b978ec08c19477bdc2 -F tool/mkmsvcmin.tcl 6ecab9fe22c2c8de4d82d4c46797bda3d2deac8e763885f5a38d0c44a895ab33 -F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c -F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 -F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa -F tool/mkpragmatab.tcl b4074a101791d034bd3a5b8a6c69e9c4c8b7c420914f647ae78419130938f6d1 -F tool/mkshellc.tcl 70a9978e363b0f3280ca9ce1c46d72563ff479c1930a12a7375e3881b7325712 -F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 -F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 -F tool/mksqlite3c-noext.tcl 4f7cfef5152b0c91920355cbfc1d608a4ad242cb819f1aea07f6d0274f584a7f -F tool/mksqlite3c.tcl 3ab95bcf7b765f9d6d99cbeb8c4f150b38b0bb1f001ffac688f2ad02ebce2123 -F tool/mksqlite3h.tcl 080873e3856eceb9d289a08a00c4b30f875ea3feadcbece796bd509b1532792c -F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b -F tool/mkvsix.tcl b9e0777a213c23156b6542842c238479e496ebf5 -F tool/offsets.c fe4262fdfa378e8f5499a42136d17bf3b98f6091 -F tool/omittest.tcl 6616fbf384f0f630113eab27d41d4530435dd94e2883307759988b45f0604a3b -F tool/opcodesum.tcl 740ed206ba8c5040018988129abbf3089a0ccf4a -F tool/pagesig.c ff0ca355fd3c2398e933da5e22439bbff89b803b -F tool/replace.tcl 60f91e8dd06ab81f74d213ecbd9c9945f32ac048 -F tool/restore_jrnl.tcl 6957a34f8f1f0f8285e07536225ec3b292a9024a -F tool/rollback-test.c 9fc98427d1e23e84429d7e6d07d9094fbdec65a5 -F tool/run-speed-test.sh f95d19fd669b68c4c38b6b475242841d47c66076 -F tool/showdb.c 9b2dbb4b7a00afaf8fc1719f0d775775effa5b135ac1a2c23f1c3f5d670c4e15 -F tool/showjournal.c 5bad7ae8784a43d2b270d953060423b8bd480818 -F tool/showlocks.c 9920bcc64f58378ff1118caead34147201f48c68 -F tool/showshm.c a0ab6ec32dd1f11218ca2a4018f8fb875b59414801ab8ceed8b2e69b7b45a809 -F tool/showstat4.c 0682ebea7abf4d3657f53c4a243f2e7eab48eab344ed36a94bb75dcd19a5c2a1 -F tool/showwal.c ad9d768f96ca6199ad3a8c9562d679680bd032dd01204ea3e5ea6fb931d81847 -F tool/soak1.tcl 8d407956e1a45b485a8e072470a3e629a27037fe -F tool/spaceanal.tcl c161d838825d0242317c7cc13b1eb2126f8cec031950ef31114d42732cb2674e -F tool/speed-check.sh 2b042d703a9472f08c3b13be27afac658426f8e4fc87cd2d575953fda86f08d1 -F tool/speedtest.tcl 06c76698485ccf597b9e7dbb1ac70706eb873355 -F tool/speedtest16.c ecb6542862151c3e6509bbc00509b234562ae81e -F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff -F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 -F tool/speedtest8inst1.c 7ce07da76b5e745783e703a834417d725b7d45fd -F tool/split-sqlite3c.tcl 3efcd4240b738f6bb2b5af0aea7e1e0ef9bc1c61654f645076cec883030b710c -F tool/sqldiff.c 7b9b7238284f02131dbb8f21a4e862409bff728045c5473139d28c67ac87580e -F tool/sqlite3_analyzer.c.in 7eeaae8b0d7577662acaabbb11107af0659d1b41bc1dfdd4d91422de27127968 -F tool/sqltclsh.c.in 1bcc2e9da58fadf17b0bf6a50e68c1159e602ce057210b655d50bad5aaaef898 -F tool/sqltclsh.tcl 862f4cf1418df5e1315b5db3b5ebe88969e2a784525af5fbf9596592f14ed848 -F tool/srcck1.c 371de5363b70154012955544f86fdee8f6e5326f -F tool/stack_usage.tcl f8e71b92cdb099a147dad572375595eae55eca43 -F tool/symbols-mingw.sh 4dbcea7e74768305384c9fd2ed2b41bbf9f0414d -F tool/symbols.sh 1612bd947750e21e7b47befad5f6b3825b06cce0705441f903bf35ced65ae9b9 -F tool/varint.c 5d94cb5003db9dbbcbcc5df08d66f16071aee003 -F tool/vdbe-compress.tcl 5926c71f9c12d2ab73ef35c29376e756eb68361c -F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f -F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 -F tool/warnings.sh 09311479bdc290e20ec8e35a3d1b14b096bbd96222277cfd6274c3a99b3d012f -F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -F vsixtest/App.xaml b76d3b48860e7454775c47ea38ffea9c4abe3e85 -F vsixtest/App.xaml.cpp c465147f50871165c60ca16955219f6c5812d6d8 -F vsixtest/App.xaml.h 4a9768e2983d05600ad1e1c2f1b00a132967da9f -F vsixtest/Assets/LockScreenLogo.scale-200.png e820c9a3deb909197081b0bf3216c06e13905f0a -F vsixtest/Assets/SplashScreen.scale-200.png cab70988ca71bebec7bfeb3b6dbafe17b9ab0b4a -F vsixtest/Assets/Square150x150Logo.scale-200.png e17b40817db7a239fc239d83efcc951fb824e3ff -F vsixtest/Assets/Square44x44Logo.scale-200.png 2f166237094dea94d952d10b9eeae81806844f1c -F vsixtest/Assets/Square44x44Logo.targetsize-24_altform-unplated.png 5f6a6d391b95a3061ccca6e6fdd6955ede63b4ed -F vsixtest/Assets/StoreLogo.png 0828b7257db74a4ecd5eeb6b7b4971f0fdc4d9d1 -F vsixtest/Assets/Wide310x150Logo.scale-200.png 04ddefe5bc5f43ae12a7433f6f236ddab101ac42 -F vsixtest/MainPage.xaml 34f49897e3ca533a7e74506ba0759b66eebce151 -F vsixtest/MainPage.xaml.cpp 7f31fc6de751b64676c0924c97a5485d950a91d7 -F vsixtest/MainPage.xaml.h cc05cca10d50a003f6c6e4448b701cdd07f52f29 -F vsixtest/Package.appxmanifest 6b6db1eb7df3a315c5d681059754d5f0e0c47a93 -F vsixtest/pch.cpp cb823cfac36f1a39a7eb0acbd7e9a0b0de8f23af -F vsixtest/pch.h 9cab7980f2ac4baa40807d8b5e52af32a21cf78c -F vsixtest/vsixtest.sln 77cadbe4e96c1fe1bf51cd77de9e9b0a12ada547 -F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 -F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc -F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e -F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 79663e66129f9522c4c2287d095129c7989f5bee41f2073f7c2c60ca5739f2f6 0c1fcf4711a2e66c813aed38cf41cd3e2123ee8eb6db98118086764c4ba83350 -R 287b204994b1ba0641a7bcaf8093ed5e -U drh -Z 4fa5d7ccad8ddfa41e7171499d14e537 +B e8d79d2bae50d7443ea6b7274ca36ded4f64e0f540494651d705612474f9aeb1 +C Allow\sBEGIN\sCONCURRENT\stransactions\sto\scontain\sschema\smodifications.\sHowever,\sthis\scauses\sthem\sto\sconflict\swith\sall\sother\stransactions. +D 2020-07-16T20:39:59.633 +F src/btree.c f420325b404e9c16b02b7cb3910da276c119a3184ad6f583e86842a996adbec4 +F src/sqliteInt.h 6cc1e3b893ad29f1d858044b1e9cbddfb4bca853ba712ce1de05b71bb7e51051 +F src/vacuum.c c32e7add30cd49b8a7e165036a076487f59383bfef7d8576c0c98beea6822d38 +F src/vdbe.c 03054bb2d9ee214415a43e624b9c382979f01b8eeef1b96188d5bf5e42deb950 +F src/vdbeaux.c 3353626ada59b81f318fb37d1894914f12022772c054ad619901bc8acc4f9f71 +F src/wal.c 85a5d4587b31e7e1d1f08914f3c05796626ed4267d0bd1e97e5370dd660ee533 +F test/concurrent.test a0248ec6e3e79a5948453649cf86b5b359175cba55ea636b15426d6f0fa6c3da +F test/concurrent8.test b93937e74a8efb8b84f2fea7595b53418c5f29777bbe9cbdb5dc219b3dd72a7d +P e8d79d2bae50d7443ea6b7274ca36ded4f64e0f540494651d705612474f9aeb1 +Q +9a4a02304e3f5dc1d567cf2a9eae4cdb575e02cb37f9ee25928f2325ab192e76 +R abc036e248ee0b1b53ae9fb5aafcfa0d +U dan +Z de4268f454210bb627006e4476b20c07 diff --git a/manifest.uuid b/manifest.uuid index 441da77955..23cc19d8a0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e8d79d2bae50d7443ea6b7274ca36ded4f64e0f540494651d705612474f9aeb1 \ No newline at end of file +e9393a18cb987d258fff56f80ad6b1525f124fb19e8e4a9c953b86a57ef9a7e6 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index e34584f9b2..ee5a73d4e0 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3624,7 +3624,7 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ BtShared *pBt = p->pBt; Pager *pPager = pBt->pPager; int rc = SQLITE_OK; - int bConcurrent = (p->db->bConcurrent && !ISAUTOVACUUM); + int bConcurrent = (p->db->eConcurrent && !ISAUTOVACUUM); sqlite3BtreeEnter(p); btreeIntegrity(p); @@ -4447,7 +4447,7 @@ int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zMaster){ sqlite3PagerTruncateImage(pBt->pPager, pBt->nPage); } #endif - if( rc==SQLITE_OK && ISCONCURRENT ){ + if( rc==SQLITE_OK && ISCONCURRENT && p->db->eConcurrent==CONCURRENT_OPEN ){ rc = btreeFixUnlocked(p); } if( rc==SQLITE_OK ){ @@ -11011,7 +11011,10 @@ int sqlite3BtreeExclusiveLock(Btree *p){ BtShared *pBt = p->pBt; assert( p->inTrans==TRANS_WRITE && pBt->pPage1 ); sqlite3BtreeEnter(p); - rc = sqlite3PagerExclusiveLock(pBt->pPager, pBt->pPage1->pDbPage, &pgno); + rc = sqlite3PagerExclusiveLock(pBt->pPager, + (p->db->eConcurrent==CONCURRENT_SCHEMA) ? 0 : pBt->pPage1->pDbPage, + &pgno + ); #ifdef SQLITE_OMIT_CONCURRENT assert( pgno==0 ); #else diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 144ba802f6..d37ced74b1 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1460,7 +1460,7 @@ struct sqlite3 { u16 dbOptFlags; /* Flags to enable/disable optimizations */ u8 enc; /* Text encoding */ u8 autoCommit; /* The auto-commit flag. */ - u8 bConcurrent; /* Current transaction is "CONCURRENT" */ + u8 eConcurrent; /* CONCURRENT_* value */ u8 temp_store; /* 1: file 2: memory 0: default */ u8 mallocFailed; /* True if we have seen a malloc failure */ u8 bBenignMalloc; /* Do not require OOMs if true */ @@ -1578,6 +1578,13 @@ struct sqlite3 { #endif }; +/* +** Candidate values for sqlite3.eConcurrent +*/ +#define CONCURRENT_NONE 0 +#define CONCURRENT_OPEN 1 +#define CONCURRENT_SCHEMA 2 + /* ** A macro to discover the encoding of a database. */ diff --git a/src/vacuum.c b/src/vacuum.c index 0211d8a18f..79e8d6efc0 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -387,7 +387,7 @@ SQLITE_NOINLINE int sqlite3RunVacuum( ** is closed by the DETACH. */ db->autoCommit = 1; - assert( db->bConcurrent==0 ); + assert( db->eConcurrent==0 ); if( pDb ){ sqlite3BtreeClose(pDb->pBt); diff --git a/src/vdbe.c b/src/vdbe.c index e3cda05bd5..73271a4756 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3318,7 +3318,7 @@ case OP_Savepoint: { ** is committed. */ int isTransaction = pSavepoint->pNext==0 && db->isTransactionSavepoint; - assert( db->bConcurrent==0 || db->isTransactionSavepoint==0 ); + assert( db->eConcurrent==0 || db->isTransactionSavepoint==0 ); if( isTransaction && p1==SAVEPOINT_RELEASE ){ if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ goto vdbe_return; @@ -3426,7 +3426,7 @@ case OP_AutoCommit: { assert( desiredAutoCommit==1 || desiredAutoCommit==0 ); assert( desiredAutoCommit==1 || iRollback==0 ); assert( desiredAutoCommit==0 || bConcurrent==0 ); - assert( db->autoCommit==0 || db->bConcurrent==0 ); + assert( db->autoCommit==0 || db->eConcurrent==CONCURRENT_NONE ); assert( db->nVdbeActive>0 ); /* At least this one VM is active */ assert( p->bIsReader ); @@ -3435,9 +3435,9 @@ case OP_AutoCommit: { assert( desiredAutoCommit==1 ); sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); db->autoCommit = 1; - db->bConcurrent = 0; + db->eConcurrent = CONCURRENT_NONE; }else if( desiredAutoCommit - && (db->nVdbeWrite>0 || (db->bConcurrent && db->nVdbeActive>1)) ){ + && (db->nVdbeWrite>0 || (db->eConcurrent && db->nVdbeActive>1)) ){ /* A transaction may only be committed if there are no other active ** writer VMs. If the transaction is CONCURRENT, then it may only be ** committed if there are no active VMs at all (readers or writers). @@ -3463,7 +3463,8 @@ case OP_AutoCommit: { rc = SQLITE_BUSY; goto vdbe_return; } - db->bConcurrent = (u8)bConcurrent; + assert( bConcurrent==CONCURRENT_NONE || bConcurrent==CONCURRENT_OPEN ); + db->eConcurrent = (u8)bConcurrent; sqlite3CloseSavepoints(db); if( p->rc==SQLITE_OK ){ rc = SQLITE_DONE; @@ -3655,7 +3656,7 @@ case OP_SetCookie: { assert( pDb->pBt!=0 ); assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) ); #ifndef SQLITE_OMIT_CONCURRENT - if( db->bConcurrent + if( db->eConcurrent && (pOp->p2==BTREE_USER_VERSION || pOp->p2==BTREE_APPLICATION_ID) ){ rc = SQLITE_ERROR; @@ -3669,7 +3670,6 @@ case OP_SetCookie: { rc = sqlite3BtreeUpdateMeta(pDb->pBt, pOp->p2, pOp->p3); if( pOp->p2==BTREE_SCHEMA_VERSION ){ /* When the schema cookie changes, record the new cookie internally */ - assert( pOp->p1==1 || db->bConcurrent==0 ); pDb->pSchema->schema_cookie = pOp->p3; db->mDbFlags |= DBFLAG_SchemaChange; }else if( pOp->p2==BTREE_FILE_FORMAT ){ @@ -3812,6 +3812,11 @@ case OP_OpenWrite: pX = pDb->pBt; assert( pX!=0 ); if( pOp->opcode==OP_OpenWrite ){ +#ifndef SQLITE_OMIT_CONCURRENT + if( db->eConcurrent==CONCURRENT_OPEN && p2==1 && iDb!=1 ){ + db->eConcurrent = CONCURRENT_SCHEMA; + } +#endif assert( OPFLAG_FORDELETE==BTREE_FORDELETE ); wrFlag = BTREE_WRCSR | (pOp->p5 & OPFLAG_FORDELETE); assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); @@ -7186,11 +7191,8 @@ case OP_CursorUnlock: { case OP_TableLock: { u8 isWriteLock = (u8)pOp->p3; #ifndef SQLITE_OMIT_CONCURRENT - if( isWriteLock && db->bConcurrent && pOp->p2==1 && pOp->p1!=1 ){ - rc = SQLITE_ERROR; - sqlite3VdbeError(p, - "cannot modify database schema within CONCURRENT transaction"); - goto abort_due_to_error; + if( isWriteLock && db->eConcurrent && pOp->p2==1 && pOp->p1!=1 ){ + db->eConcurrent = CONCURRENT_SCHEMA; } #endif if( isWriteLock || 0==(db->flags&SQLITE_ReadUncommit) ){ diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 27af7b7258..58cfaf8891 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2691,7 +2691,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ } #ifndef SQLITE_OMIT_CONCURRENT - if( db->bConcurrent && (rc & 0xFF)==SQLITE_BUSY ){ + if( db->eConcurrent && (rc & 0xFF)==SQLITE_BUSY ){ /* An SQLITE_BUSY or SQLITE_BUSY_SNAPSHOT was encountered while ** attempting to take the WRITER lock on a wal file. Release the ** WRITER locks on all wal files and return early. */ @@ -3102,7 +3102,7 @@ int sqlite3VdbeHalt(Vdbe *p){ sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); sqlite3CloseSavepoints(db); db->autoCommit = 1; - db->bConcurrent = 0; + db->eConcurrent = CONCURRENT_NONE; p->nChange = 0; } } @@ -3165,7 +3165,7 @@ int sqlite3VdbeHalt(Vdbe *p){ sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); sqlite3CloseSavepoints(db); db->autoCommit = 1; - db->bConcurrent = 0; + db->eConcurrent = CONCURRENT_NONE; p->nChange = 0; } } @@ -3187,7 +3187,7 @@ int sqlite3VdbeHalt(Vdbe *p){ sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); sqlite3CloseSavepoints(db); db->autoCommit = 1; - db->bConcurrent = 0; + db->eConcurrent = CONCURRENT_NONE; p->nChange = 0; } } diff --git a/src/wal.c b/src/wal.c index 7f5a92daf9..3a4042d5a4 100644 --- a/src/wal.c +++ b/src/wal.c @@ -3239,11 +3239,10 @@ static int walUpgradeReadlock(Wal *pWal){ */ int sqlite3WalLockForCommit( Wal *pWal, - PgHdr *pPage1, + PgHdr *pPg1, Bitvec *pAllRead, Pgno *piConflict ){ - Pager *pPager = pPage1->pPager; int rc = walWriteLock(pWal); /* If the database has been modified since this transaction was started, @@ -3267,13 +3266,19 @@ int sqlite3WalLockForCommit( rc = SQLITE_BUSY_SNAPSHOT; }else if( memcmp(&pWal->hdr, (void*)&head, sizeof(WalIndexHdr))!=0 ){ int iHash; - int iLastHash = walFramePage(head.mxFrame); + int iLast = walFramePage(head.mxFrame); u32 iFirst = pWal->hdr.mxFrame+1; /* First wal frame to check */ if( memcmp(pWal->hdr.aSalt, (u32*)head.aSalt, sizeof(u32)*2) ){ assert( pWal->readLock==0 ); iFirst = 1; } - for(iHash=walFramePage(iFirst); iHash<=iLastHash; iHash++){ + if( pPg1==0 ){ + /* If pPg1==0, then the current transaction modified the database + ** schema. This means it conflicts with all other transactions. */ + *piConflict = 1; + rc = SQLITE_BUSY_SNAPSHOT; + } + for(iHash=walFramePage(iFirst); rc==SQLITE_OK && iHash<=iLast; iHash++){ WalHashLoc sLoc; rc = walHashGet(pWal, iHash, &sLoc); @@ -3289,7 +3294,7 @@ int sqlite3WalLockForCommit( /* Check that the schema cookie has not been modified. If ** it has not, the commit can proceed. */ u8 aNew[4]; - u8 *aOld = &((u8*)pPage1->pData)[40]; + u8 *aOld = &((u8*)pPg1->pData)[40]; int sz; i64 iOffset; sz = pWal->hdr.szPage; @@ -3302,7 +3307,7 @@ int sqlite3WalLockForCommit( }else if( sqlite3BitvecTestNotNull(pAllRead, sLoc.aPgno[i]) ){ *piConflict = sLoc.aPgno[i]; rc = SQLITE_BUSY_SNAPSHOT; - }else if( (pPg = sqlite3PagerLookup(pPager, sLoc.aPgno[i])) ){ + }else if( (pPg = sqlite3PagerLookup(pPg1->pPager, sLoc.aPgno[i])) ){ /* Page aPgno[i], which is present in the pager cache, has been ** modified since the current CONCURRENT transaction was started. ** However it was not read by the current transaction, so is not @@ -3326,7 +3331,6 @@ int sqlite3WalLockForCommit( } } } - if( rc!=SQLITE_OK ) break; } } } diff --git a/test/concurrent.test b/test/concurrent.test index b94071a8f1..ad1e15d71c 100644 --- a/test/concurrent.test +++ b/test/concurrent.test @@ -107,6 +107,7 @@ foreach {tn trans commit_ok} { #------------------------------------------------------------------------- # CONCURRENT transactions may not modify the db schema. # +sqlite3 db2 test.db foreach {tn sql} { 1 { CREATE TABLE xx(a, b) } 2 { DROP TABLE t1 } @@ -116,14 +117,22 @@ foreach {tn sql} { do_catchsql_test 1.7.0.$tn.1 " BEGIN CONCURRENT; $sql - " {1 {cannot modify database schema within CONCURRENT transaction}} + " {0 {}} + + db2 eval {INSERT INTO t1 DEFAULT VALUES} + + do_catchsql_test 1.7.0.$tn.2 { + COMMIT + } {1 {database is locked}} + + do_execsql_test 1.7.0.$tn.2 ROLLBACK - do_execsql_test 1.7.0.$tn.2 { + do_execsql_test 1.7.0.$tn.3 { SELECT sql FROM sqlite_master; SELECT sql FROM sqlite_temp_master; } {{CREATE TABLE t1(a, b)}} - do_execsql_test 1.7.0.$tn.3 COMMIT + #do_execsql_test 1.7.0.$tn.3 COMMIT } # Except the temp db schema. diff --git a/test/concurrent8.test b/test/concurrent8.test new file mode 100644 index 0000000000..c27799764c --- /dev/null +++ b/test/concurrent8.test @@ -0,0 +1,109 @@ +# 2020 July 17 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# + + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set ::testprefix concurrent8 + +source $testdir/lock_common.tcl + +ifcapable !concurrent { + finish_test + return +} + +do_multiclient_test tn { + + do_test 1.$tn.0 { + sql1 { + CREATE TABLE t1(x, y); + PRAGMA journal_mode = wal; + } + } {wal} + + do_test 1.$tn.1 { + sql1 { + BEGIN CONCURRENT; + INSERT INTO t1 VALUES(1, 1); + } + } {} + + do_test 1.$tn.2 { + sql2 { + CREATE TABLE t2(a, b); + } + } {} + + do_test 1.$tn.3 { + list [catch { sql1 { COMMIT } } msg] $msg + } {1 {database is locked}} + + do_test 1.$tn.4 { + code1 { db errorcode } + } {517} ;# SQLITE_BUSY_SNAPSHOT + + do_test 1.$tn.5 { + sql1 { + ROLLBACK; + BEGIN CONCURRENT; + CREATE TABLE t3(a, b); + COMMIT; + } + } {} + + do_test 1.$tn.6 { + set nPg [sql1 {PRAGMA page_count}] + sql1 "BEGIN CONCURRENT" + for {set i 0} {$i<250} {incr i} { + sql1 "CREATE TABLE z$i (a, b, c)" + } + sql1 "COMMIT" + set nPg2 [sql1 {PRAGMA page_count}] + expr $nPg2>$nPg + } {1} + + do_test 1.$tn.7 { + sql2 { PRAGMA integrity_check } + } {ok} + + do_test 1.$tn.8 { + sql1 { + BEGIN CONCURRENT; + CREATE TABLE t4(a, b); + } + sql2 { + INSERT INTO t1 VALUES(2, 2); + } + list [catch { sql1 COMMIT } msg] $msg + } {1 {database is locked}} + sql1 ROLLBACK + + do_test 1.$tn.9 { + sql1 { + BEGIN CONCURRENT; + CREATE TEMP TABLE t5(a, b); + INSERT INTO t2 VALUES('x', 'x'); + } + sql2 { + INSERT INTO t1 VALUES(3, 3); + CREATE TEMP TABLE t1(x, y); + } + sql1 COMMIT + } {} +} + + + +finish_test + + From 94281e049f04597091c083576b42af9d4fdad4dd Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 31 Jul 2020 20:56:15 +0000 Subject: [PATCH 095/113] Improved non-locking PRNG. FossilOrigin-Name: eb7a9c04bdbb297938672526d8c86b5666fb0f9841b9ddc2d9002399301cf665 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/random.c | 9 +++++++-- src/sqliteInt.h | 2 +- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index d44d56837f..c50bf9f448 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\slatest\strunk\schanges\sinto\sthis\sbranch. -D 2020-07-30T19:19:12.505 +C Improved\snon-locking\sPRNG. +D 2020-07-31T20:56:15.190 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -537,7 +537,7 @@ F src/pragma.c bdb600be936f66b9fe69d26dfbba4528beaaf4f95c479c85b328a92484e0bf71 F src/pragma.h 8dc78ab7e9ec6ce3ded8332810a2066f1ef6267e2e03cd7356ee00276125c6cf F src/prepare.c 3d5a761d026052bc888d1b803a06dd2bfe245e8e836d4689f927003549148b0f F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 -F src/random.c f27af4099afaea7284ade5c206224dcfdb2334cfd119d018b470d46356b3f27d +F src/random.c c984d8426d76752dbd9ff7983e770731ae5e8f4ede84a203df9878d5e8798f11 F src/resolve.c 2dd6821aac2cd27de9fcf6aa6d1f8c41b4b5841c9bc58bf1c9109008009a3a2e F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 52f653249973454c4d65b715a628369e4bf754e6952d7c0192760201580de39a @@ -545,7 +545,7 @@ F src/shell.c.in 352a0a6399ccae40a30f72ea06f52f3791a062bde9b8929a97f345e1584ba31 F src/sqlite.h.in 48dcf94e19ff17024767f549b966f5889c6cc46060d0d5f386b67289c02ec522 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h 514c845d7fd813fa33896ff2e0528d78c9a0e7e67cab9350ae9fa35056a68e36 +F src/sqliteInt.h bdf744479fd7991e447ae31ab3c5718a832896c293c71654059cc17073c4dd2f F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1894,7 +1894,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9a4a02304e3f5dc1d567cf2a9eae4cdb575e02cb37f9ee25928f2325ab192e76 96e3dba2ed3ab0c5b2ecf65a3408633e0767c884d48c270e9ef10ab9fa3ec051 -R 484c7f1ed5b418cb7420cb16e18685de -U dan -Z bbb0995908fcfb0e7db17c8da3620f4c +P e8a6651539a1967185ef7a77f29475fc97c1b600dd050caa793777ed4b69aa94 +R 58cba06716d6b047fae4afd4bcd915cd +U drh +Z 71c89dae7e957e702759515f4e180a01 diff --git a/manifest.uuid b/manifest.uuid index e30a3d992f..ed05720f59 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e8a6651539a1967185ef7a77f29475fc97c1b600dd050caa793777ed4b69aa94 \ No newline at end of file +eb7a9c04bdbb297938672526d8c86b5666fb0f9841b9ddc2d9002399301cf665 \ No newline at end of file diff --git a/src/random.c b/src/random.c index dd971ab655..c90d2a8f3d 100644 --- a/src/random.c +++ b/src/random.c @@ -122,8 +122,13 @@ void sqlite3FastPrngInit(FastPrng *pPrng){ void sqlite3FastRandomness(FastPrng *pPrng, int N, void *P){ unsigned char *pOut = (unsigned char*)P; while( N-->0 ){ - pPrng->x = ((pPrng->x)>>1) ^ ((1+~((pPrng->x)&1)) & 0xd0000001); - pPrng->y = (pPrng->y)*1103515245 + 12345; + /* "x" is a variant of LFSR called "Xorshift" by George Marsaglia */ + pPrng->x ^= pPrng->x <<13; + pPrng->x ^= pPrng->x >>7; + pPrng->x ^= pPrng->x <<17; + /* "y" is a LCG using Don Kunth's constants from MMIX */ + pPrng->y = (pPrng->y)*6364136223846793005LL + 1442695040888963407LL; + /* XOR the two streams together to give the final result */ *(pOut++) = (pPrng->x ^ pPrng->y) & 0xff; } } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 767e427b89..029852d17d 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1230,7 +1230,7 @@ typedef int VList; ** pseudo-random number generators. */ struct FastPrng { - unsigned int x, y; + sqlite3_uint64 x, y; }; /* From 5e9d4c221dc0f6b89871505979b8f80b053cceaa Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 31 Aug 2020 20:27:44 +0000 Subject: [PATCH 096/113] Restore the "PRAGMA noop_update" feature that was broken by [2b3241cf67c8eea7]. FossilOrigin-Name: 5fa4cbcb785125e72c7fd5cc2050637f2a2e854ee22aee05e8f09f751cd36291 --- manifest | 15 ++++++++------- manifest.uuid | 2 +- src/update.c | 11 +++++++++++ test/noop_update.test | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 test/noop_update.test diff --git a/manifest b/manifest index 151aa2fbe0..5ceb0134bc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\srecent\strunk\sfixes\sinto\sthe\sbegin-concurrent-pnu\sbranch. -D 2020-08-10T21:30:17.367 +C Restore\sthe\s"PRAGMA\snoop_update"\sfeature\sthat\swas\sbroken\sby\s[2b3241cf67c8eea7]. +D 2020-08-31T20:27:44.093 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -607,7 +607,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 4dc01b267593537e2a0d0efe9f80dabe24c5b6f7627bc6971c487fa6a1dacbbf F src/treeview.c 4b92992176fb2caefbe06ba5bd06e0e0ebcde3d5564758da672631f17aa51cda F src/trigger.c ef67bde309a831515dc3c2173d792574309f2f42d45f8c078743fae9f7f98c75 -F src/update.c fb15bec5b54fd098f4b84f6abc83c7103b45ba8484011fff8edf5ae31656eab6 +F src/update.c 4fb5ffdc515da442a174a77e57e08e26554037899c40732bb25894426cad3266 F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c c8bf30c4356b091bcc3b624d0e24b2b4d11b8be4d6c90d8e0705971e15cc819b @@ -1217,6 +1217,7 @@ F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660 F test/nan.test 437d40e6d0778b050d7750726c0cbd2c9936b81962926e8f8c48ca698f00f4d1 F test/nockpt.test 8c43b25af63b0bd620cf1b003529e37b6f1dc53bd22690e96a1bd73f78dde53a F test/nolock.test f196cf8b8fbea4e2ca345140a2b3f3b0da45c76e +F test/noop_update.test 74d71bbe5d37f7861cc2402ed620eb165b8e6b00159cdcada7df716420336651 F test/normalize.test f23b6c5926c59548635fcf39678ac613e726121e073dd902a3062fbb83903b72 F test/notify1.test 669b2b743618efdc18ca4b02f45423d5d2304abf F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 @@ -1894,7 +1895,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2b3241cf67c8eea761760ac27df7a136bcca2dca10c152a36b216c5dc88cdb53 5bbd4bddd3b9fa64d134ed62bce3eb4a09456bf24dec2474b5d764a3a3775964 -R c8dcfa175893995b755e2f1edd77ea87 -U drh -Z 9eeb71a2a46d2b7d665af71201a55983 +P 2ae78c993e6a4ffd9ac1c8aaadf4976eacb5486e23c228988e9d3f379ed801c3 +R 4c523bcf44ece19aaae271e47de8b905 +U dan +Z 316bd1703f2b4fab795b763f691be936 diff --git a/manifest.uuid b/manifest.uuid index d171a6666b..9856e97a14 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2ae78c993e6a4ffd9ac1c8aaadf4976eacb5486e23c228988e9d3f379ed801c3 \ No newline at end of file +5fa4cbcb785125e72c7fd5cc2050637f2a2e854ee22aee05e8f09f751cd36291 \ No newline at end of file diff --git a/src/update.c b/src/update.c index a9c43d62eb..6fd12159b8 100644 --- a/src/update.c +++ b/src/update.c @@ -447,6 +447,17 @@ void sqlite3Update( */ chngRowid = chngPk = 0; for(i=0; inExpr; i++){ +#if defined(SQLITE_ENABLE_NOOP_UPDATE) && !defined(SQLITE_OMIT_FLAG_PRAGMAS) + if( db->flags & SQLITE_NoopUpdate ){ + Token x; + sqlite3ExprDelete(db, pChanges->a[i].pExpr); + x.z = pChanges->a[i].zEName; + x.n = sqlite3Strlen30(x.z); + pChanges->a[i].pExpr = + sqlite3PExpr(pParse, TK_UPLUS, sqlite3ExprAlloc(db, TK_ID, &x, 0), 0); + if( db->mallocFailed ) goto update_cleanup; + } +#endif /* If this is an UPDATE with a FROM clause, do not resolve expressions ** here. The call to sqlite3Select() below will do that. */ if( nChangeFrom==0 && sqlite3ResolveExprNames(&sNC, pChanges->a[i].pExpr) ){ diff --git a/test/noop_update.test b/test/noop_update.test new file mode 100644 index 0000000000..84e798e489 --- /dev/null +++ b/test/noop_update.test @@ -0,0 +1,36 @@ +# 2020 September 01 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix noop_update + +if {[db eval {PRAGMA noop_update}]==""} { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE TABLE t1(x, y); + INSERT INTO t1 VALUES('a', 111); +} +do_execsql_test 1.1 { + UPDATE t1 SET y=222 WHERE x='a'; + SELECT * FROM t1; +} {a 222} +do_execsql_test 1.2 { + PRAGMA noop_update = 1; + UPDATE t1 SET y=333 WHERE x='a'; + SELECT * FROM t1; +} {a 222} + +finish_test From d157dda00b7314da18584b786e73a33c68c00319 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 12 Jan 2023 15:30:02 +0000 Subject: [PATCH 097/113] Fix a startup race condition that could occur if a wal file grows from 0 bytes while a BEGIN CONCURRENT transaction is running. FossilOrigin-Name: c1feca4ddaa93fa1cf75e8df061967995a18d726a23f4006d239d3e03c8570df --- manifest | 27 +++++++++++---------- manifest.uuid | 2 +- src/wal.c | 4 ++++ test/concurrent3.test | 3 +++ test/concurrent9.test | 55 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 77 insertions(+), 14 deletions(-) create mode 100644 test/concurrent9.test diff --git a/manifest b/manifest index 4b8afd8bd7..f09a981696 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthe\sbegin-concurrent\sbranch\swith\sthe\slatest\senhancements\son\strunk. -D 2022-12-21T20:07:58.718 +C Fix\sa\sstartup\srace\scondition\sthat\scould\soccur\sif\sa\swal\sfile\sgrows\sfrom\s0\sbytes\swhile\sa\sBEGIN\sCONCURRENT\stransaction\sis\srunning. +D 2023-01-12T15:30:02.491 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -502,11 +502,11 @@ F ext/wasm/README.md ef39861aa21632fdbca0bdd469f78f0096f6449a720f3f39642594af503 F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api c5eaceabb9e759aaae7d3101a4a3e542f96ab2c99d89a80ce20ec18c23115f33 F ext/wasm/api/EXPORTED_RUNTIME_METHODS.sqlite3-api 1ec3c73e7d66e95529c3c64ac3de2470b0e9e7fbf7a5b41261c367cf4f1b7287 F ext/wasm/api/README.md 77a2f1f2fc60a35def7455dffc8d3f2c56385d6ac5c6cecc60fa938252ea2c54 -F ext/wasm/api/extern-post-js.c-pp.js 8923f76c3d2213159e12d641dc750523ead5c848185dc4996fae5cc12397f88d w ext/wasm/api/extern-post-js.js +F ext/wasm/api/extern-post-js.c-pp.js 8923f76c3d2213159e12d641dc750523ead5c848185dc4996fae5cc12397f88d F ext/wasm/api/extern-pre-js.js cc61c09c7a24a07dbecb4c352453c3985170cec12b4e7e7e7a4d11d43c5c8f41 F ext/wasm/api/post-js-footer.js cd0a8ec768501d9bd45d325ab0442037fb0e33d1f3b4f08902f15c34720ee4a1 F ext/wasm/api/post-js-header.js 47b6b281f39ad59fa6e8b658308cd98ea292c286a68407b35ff3ed9cfd281a62 -F ext/wasm/api/pre-js.c-pp.js b88499dc303c21fc3f55f2c364a0f814f587b60a95784303881169f9e91c1d5f w ext/wasm/api/pre-js.js +F ext/wasm/api/pre-js.c-pp.js b88499dc303c21fc3f55f2c364a0f814f587b60a95784303881169f9e91c1d5f F ext/wasm/api/sqlite3-api-cleanup.js 680d5ccfff54459db136a49b2199d9f879c8405d9c99af1dda0cc5e7c29056f4 F ext/wasm/api/sqlite3-api-glue.js 63daa4b9c36faa4c338a32a06eb142869b9ae4885a3e01aad473e1b45357089f F ext/wasm/api/sqlite3-api-oo1.js c0c4ccc269cccee657ffd03f094da7e270e1367b7928926b3730d543555a12a6 @@ -515,7 +515,7 @@ F ext/wasm/api/sqlite3-api-worker1.js e94ba98e44afccfa482874cd9acb325883ade50ed1 F ext/wasm/api/sqlite3-license-version-header.js a661182fc93fc2cf212dfd0b987f8e138a3ac98f850b1112e29b5fbdaecc87c3 F ext/wasm/api/sqlite3-opfs-async-proxy.js 7795b84b66a7a8dedc791340709b310bb497c3c72a80bef364fa2a58e2ddae3f F ext/wasm/api/sqlite3-v-helper.js 6f6c3e390a72e08b0a5b16a0d567d7af3c04d172831853a29d72a6f1dd40ff24 -F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 66daf6fb6843bea615fe193109e1542efbeca24f560ee9da63375a910bb48115 w ext/wasm/api/sqlite3-api-opfs.js +F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 66daf6fb6843bea615fe193109e1542efbeca24f560ee9da63375a910bb48115 F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9 F ext/wasm/api/sqlite3-wasm.c 44ce4cf12318b0577d8222cf59132617ab9925ca3cf5fbb8c7b30d1e947c13b5 F ext/wasm/api/sqlite3-worker1-promiser.js 0c7a9826dbf82a5ed4e4f7bf7816e825a52aff253afbf3350431f5773faf0e4b @@ -559,8 +559,8 @@ F ext/wasm/sql/001-sudoku.sql 35b7cb7239ba5d5f193bc05ec379bcf66891bce6f2a5b3879f F ext/wasm/test-opfs-vfs.html 1f2d672f3f3fce810dfd48a8d56914aba22e45c6834e262555e685bce3da8c3f F ext/wasm/test-opfs-vfs.js f09266873e1a34d9bdb6d3981ec8c9e382f31f215c9fd2f9016d2394b8ae9b7b F ext/wasm/tester1-worker.html d43f3c131d88f10d00aff3e328fed13c858d674ea2ff1ff90225506137f85aa9 -F ext/wasm/tester1.c-pp.html d34bef3d48e5cbc1c7c06882ad240fec49bf88f5f65696cc2c72c416933aa406 w ext/wasm/tester1.html -F ext/wasm/tester1.c-pp.js c45c46cdae1949d426ee12a736087ab180beacc2a20cd829f9052b957adf9ac9 w ext/wasm/tester1.js +F ext/wasm/tester1.c-pp.html d34bef3d48e5cbc1c7c06882ad240fec49bf88f5f65696cc2c72c416933aa406 +F ext/wasm/tester1.c-pp.js c45c46cdae1949d426ee12a736087ab180beacc2a20cd829f9052b957adf9ac9 F ext/wasm/tests/opfs/concurrency/index.html 86d8ac435074d1e7007b91105f4897f368c165e8cecb6a9aa3d81f5cf5dcbe70 F ext/wasm/tests/opfs/concurrency/test.js a98016113eaf71e81ddbf71655aa29b0fed9a8b79a3cdd3620d1658eb1cc9a5d F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 @@ -734,7 +734,7 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c F src/vtab.c b2f993aa954078985bc40317bb2140fe0880a08a7440f3a428b60fce74636808 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 419c0a98dd65b9419fd07bdd4f9facc61143c33d57b0dbeffd83cf38a2e0e33e +F src/wal.c 4da9e3c92adba31977cca5960cad1ef51ba1040626a662a8855b3c671b24c422 F src/wal.h 7ffe787437f20a098af347011967a6d3bb8e5c3dc645e6be59eff44d2b2c5297 F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c d0d8e3cb2c11e77ba0f8f9ed8eada9d84dbd377167cdcf387b8eeb824c35a3ad @@ -896,12 +896,13 @@ F test/columncount.test 6fe99c2f35738b0129357a1cf3fa483f76140f4cd8a89014c88c33c8 F test/concfault.test e5370cd686f601a01909377cac3bbf13dac56d39dd4ad6b04ccbec9eeeaccb18 F test/concurrent.test a0248ec6e3e79a5948453649cf86b5b359175cba55ea636b15426d6f0fa6c3da F test/concurrent2.test de748c7dd749c77e2af2c4b914b9b09a28ac09608042ca498c0251dc6f46aa1a -F test/concurrent3.test 530671ac706f6a1d0f4992dbdd33a86408330d03cd90fb9e82ecb1b27f5fd081 +F test/concurrent3.test 82923fc2ea7321144b4448f98ea38aa316ddceef9020a392c5f6dea536506434 F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44 F test/concurrent5.test 0c16cbf7446af162a14e6def30445e94016064eb994e5aa4ebb2bebc59554176 F test/concurrent6.test a7860e9ca13bb5fb76bcf41c5524fbfa9c37e6e258ecf84ffb5748a272488c67 F test/concurrent7.test b96fa5c4cfdf8d5c0bc66b6934214500bad0260884a736f054ccc76e81aae85d F test/concurrent8.test b93937e74a8efb8b84f2fea7595b53418c5f29777bbe9cbdb5dc219b3dd72a7d +F test/concurrent9.test 92a7315092e54c7377e58cfce1c158aa55f6915a026aff27da00db088676101b F test/conflict.test ac0667090f66130ac77d5fb764655558ca6600dd6d88f670ca9123b61c448337 F test/conflict2.test 5557909ce683b1073982f5d1b61dfb1d41e369533bfdaf003180c5bc87282dd1 F test/conflict3.test 81865d9599609aca394fb3b9cd5f561d4729ea5b176bece3644f6ecb540f88ac @@ -2083,8 +2084,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 a06d57ee9e2862b2c67dc97e3702c00339341ba308d6558b7694e5b9e47231ac 371f9b88387a44a5f820279d79733d1deb7eafc72f320ec47a11679bbdbb49ef -R 86b38a0acfb02a8499e4768a9a084653 -U drh -Z 41f88f8b005a3dfbf678e68c0eda1543 +P 0c198aee53d35cf0999f880c433140c3dfc6bd620c30920b08d7534c0f905e05 +R 6daffe13c1f42c5592d9f7a1cdc6ba09 +U dan +Z c253903e12da3dd9faf3b286cd9d5110 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d3e1ba33e6..6266e7fb06 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0c198aee53d35cf0999f880c433140c3dfc6bd620c30920b08d7534c0f905e05 \ No newline at end of file +c1feca4ddaa93fa1cf75e8df061967995a18d726a23f4006d239d3e03c8570df \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index ebfcc2e605..f269f6ec49 100644 --- a/src/wal.c +++ b/src/wal.c @@ -3521,7 +3521,11 @@ int sqlite3WalLockForCommit( int sqlite3WalUpgradeSnapshot(Wal *pWal){ int rc = SQLITE_OK; assert( pWal->writeLock ); + + assert( pWal->szPage==pWal->hdr.szPage ); memcpy(&pWal->hdr, (void*)walIndexHdr(pWal), sizeof(WalIndexHdr)); + assert( pWal->szPage==pWal->hdr.szPage || pWal->szPage==0 ); + pWal->szPage = pWal->hdr.szPage; /* If this client has its read-lock on slot aReadmark[0] and the entire ** wal has not been checkpointed, switch it to a different slot. Otherwise diff --git a/test/concurrent3.test b/test/concurrent3.test index cc80388902..8ca8a9887a 100644 --- a/test/concurrent3.test +++ b/test/concurrent3.test @@ -226,6 +226,9 @@ foreach {tn nRepeat oplist} { # } } +catch { db close } +sqlite3_shutdown +test_sqlite3_log finish_test diff --git a/test/concurrent9.test b/test/concurrent9.test new file mode 100644 index 0000000000..c514f55b7a --- /dev/null +++ b/test/concurrent9.test @@ -0,0 +1,55 @@ +# 2023 January 12 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#************************************************************************* +# This file implements regression tests for SQLite library. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix concurrent9 + +do_execsql_test 1.0 { + CREATE TABLE t1(x); + INSERT INTO t1 VALUES(1), (2); + CREATE TABLE t2(y); + INSERT INTO t2 VALUES('a'), ('b'); + PRAGMA journal_mode = wal; +} {wal} + +db close + +#------------------------------------------------------------------------- +# Fix a problem that may occur if a BEGIN CONCURRENT transaction is +# started when the wal file is completely empty and committed after +# it has been initialized by some other connection. +# +sqlite3 db test.db +sqlite3 db2 test.db + +do_execsql_test -db db 1.1 { + BEGIN CONCURRENT; + INSERT INTO t2 VALUES('c'); +} + +do_execsql_test -db db2 1.2 { + INSERT INTO t1 VALUES(3); +} + +do_execsql_test -db db 1.3 { + COMMIT; +} + +do_execsql_test -db db2 1.4 { + SELECT * FROM t1; + SELECT * FROM t2; +} {1 2 3 a b c} + +finish_test + From bd0adc63265cbf6eb6ca19e735564308caba825c Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 3 May 2023 10:56:21 +0000 Subject: [PATCH 098/113] Fix a problem in test script changebatch1.test. FossilOrigin-Name: 98ecffdfb62fbafcf3bc5b9b2f04dd10820023d61ddf3a4c2ca4b28c23876136 --- ext/session/changebatch1.test | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/session/changebatch1.test b/ext/session/changebatch1.test index 16053d26d2..c3b5a2460d 100644 --- a/ext/session/changebatch1.test +++ b/ext/session/changebatch1.test @@ -217,6 +217,6 @@ do_test 4.1 { list [catch { cb add $c1 } msg] $msg } {1 SQLITE_RANGE} - +cb delete finish_test diff --git a/manifest b/manifest index 05b4a960e2..715826dc65 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthis\sbranch\swith\slatest\schanges\sfrom\strunk. -D 2023-05-02T21:10:14.783 +C Fix\sa\sproblem\sin\stest\sscript\schangebatch1.test. +D 2023-05-03T10:56:21.194 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -438,7 +438,7 @@ F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de F ext/rtree/util/randomshape.tcl 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 F ext/rtree/visual01.txt e9c2564083bcd30ec51b07f881bffbf0e12b50a3f6fced0c222c5c1d2f94ac66 -F ext/session/changebatch1.test 7d920231e88582867c338f6e29cb7e07b7864289a7fd6d08ae4b514e9f6351e8 +F ext/session/changebatch1.test 2ac3b06cf86d6a5935eee8152d164d90030f29cf70218eaa856b235d4b6c18ab F ext/session/changebatchfault.test be49c793219bf387ad692a60856b921f0854ad6d F ext/session/changeset.c 7a1e6a14c7e92d36ca177e92e88b5281acd709f3b726298dc34ec0fb58869cb5 F ext/session/changesetfuzz.c 227076ab0ae4447d742c01ee88a564da6478bbf26b65108bf8fac9cd8b0b24aa @@ -2085,8 +2085,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 918aea50ed23191df4b2fa94c633bf76d11dcd7357a68090106c1cdc4a8ad669 92ade220dcf5c1b76a5db605b1467a01051271957cd26f790755904fd82772eb -R 8ea33aeab33ebf645d3b6e8ab712df0d +P 6f22c7679f235ffe22cd59bb780396b2285b352e3a1abc2c3fa7092bf54c69b6 +R e294ef5300249668de4bb783a49e6bbe U dan -Z 6c66a93c8858cc2d1e4a9b497370a552 +Z 1a4141f5b69486179ea202e10b3b649d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 6d6d9a3099..8e71da5395 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6f22c7679f235ffe22cd59bb780396b2285b352e3a1abc2c3fa7092bf54c69b6 \ No newline at end of file +98ecffdfb62fbafcf3bc5b9b2f04dd10820023d61ddf3a4c2ca4b28c23876136 \ No newline at end of file From fb5a69072b7525d5ed0abcf89350e984e7390d4f Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 11 Aug 2023 18:25:26 +0000 Subject: [PATCH 099/113] Fix a problem with handling savepoints in BEGIN CONCURRENT transactions. FossilOrigin-Name: 4a5c0439ae3ce6c98cea26f7e96c5bce543e76b9ad2a3a275601d6e5060899c8 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/btree.c | 9 +++++++++ 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index a10205cc25..a8f6418f2c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sthe\slatest\strunk\senhancements\sinto\sthe\sbegin-concurrent\sbranch. -D 2023-08-11T11:34:42.817 +C Fix\sa\sproblem\swith\shandling\ssavepoints\sin\sBEGIN\sCONCURRENT\stransactions. +D 2023-08-11T18:25:26.941 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -587,7 +587,7 @@ F src/auth.c 19b7ccacae3dfba23fc6f1d0af68134fa216e9040e53b0681b4715445ea030b4 F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523 F src/bitvec.c 501daeef838fa82a9fb53540d72f29e3d9172c8867f1e19f94f681e2e20b966e F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522 -F src/btree.c 3504c745ece8ffb5335a14f72b1c34484e66c14d5c3b56b3e1cbed7fa02dfc4c +F src/btree.c 2f07a8eefe1ecd19ddb380a82ad8b5751f5a8b35c47f7fbb1d64596aabbd7087 F src/btree.h d906e4d53f483c83d471d99479fa73fcdf20696305d578876f46ee283f3507cb F src/btreeInt.h e941b5c41efef760e6f8826f308ec9e9a480d26e615f565a1a4bdb07aff496b1 F src/build.c 84238806b9a9ca5373ccaea65a86129717d023bc582919f7f5a91d1b92e1a4c1 @@ -2042,7 +2042,7 @@ F tool/symbols.sh 1612bd947750e21e7b47befad5f6b3825b06cce0705441f903bf35ced65ae9 F tool/varint.c 5d94cb5003db9dbbcbcc5df08d66f16071aee003 F tool/vdbe-compress.tcl 1dcb7632e57cf57105248029e6e162fddaf6c0fccb3bb9e6215603752c5a2d4a F tool/vdbe_profile.tcl 3ac5a4a9449f4baf77059358ea050db3e34395ccf59c5464d29b91746d5b961e -F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd72273503ae7d5 w ext/wasm/version-info.c +F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd72273503ae7d5 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f @@ -2067,8 +2067,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 7407dda8b4c704cff665ba06108ea33c4099ff6446357020e5e8ecad0c86ed57 00bc9f1b573d683829bf5eb301606c38d6a60fba957d8edaf59116c02cc650bf -R 1636534034a06d66ed75d5cadb07c57b -U drh -Z 0f61128e1d81debffd98542da916c5e1 +P 7cb2b4e35ff901cd597e2bffbb50f25f0445beba0c994de775580876da74ed10 +R 12ceb5187842860667267b0a9c59254f +U dan +Z ec08def5a8e5821ae73191f46a5cfffb # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 31b1b0b85a..0139577be5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7cb2b4e35ff901cd597e2bffbb50f25f0445beba0c994de775580876da74ed10 \ No newline at end of file +4a5c0439ae3ce6c98cea26f7e96c5bce543e76b9ad2a3a275601d6e5060899c8 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 5d9cbd7f89..dc4d70e356 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3980,6 +3980,15 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ if( p->sharable || p->inTrans==TRANS_NONE || (p->inTrans==TRANS_READ && wrflag!=0) +#ifndef SQLITE_OMIT_CONCURRENT + /* Always use the full version for "BEGIN CONCURRENT" transactions. This + ** is to ensure that any required calls to btreePtrmapBegin() are made. + ** These calls are not present on trunk (they're part of the + ** begin-concurrent patch), and so they are not present in the fast path + ** below. And it's easier just to call the full version every time than + ** to complicate the code below by adding btreePtrmapBegin() calls. */ + || p->db->eConcurrent!=CONCURRENT_NONE +#endif ){ return btreeBeginTrans(p,wrflag,pSchemaVersion); } From 1da0e9fdec427ca49000ae347963a391b7bdd19e Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 21 Aug 2023 17:26:36 +0000 Subject: [PATCH 100/113] Fix MSVC testfixture.exe builds. FossilOrigin-Name: 7004c9027e3c318513e62320f2f40839bd5c6a4b7647f6a8977d6b67ecfe90e0 --- Makefile.msc | 3 ++- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wal.c | 2 +- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index 6fc4c83390..eef4d4e66b 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1540,7 +1540,8 @@ TESTSRC = \ $(TOP)\ext\fts3\fts3_term.c \ $(TOP)\ext\fts3\fts3_test.c \ $(TOP)\ext\rbu\test_rbu.c \ - $(TOP)\ext\session\test_session.c + $(TOP)\ext\session\test_session.c \ + $(TOP)\ext\session\sqlite3changebatch.c # Statically linked extensions. # diff --git a/manifest b/manifest index f9fd583dd7..975daf69c1 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Merge\slatest\strunk\schanges,\sincluding\ssupport\sfor\shandling\sof\sstructured-exceptions\sin\sMSVC\sbuilds,\swith\sthis\sbranch. -D 2023-08-11T19:38:35.227 +C Fix\sMSVC\stestfixture.exe\sbuilds. +D 2023-08-21T17:26:36.220 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F Makefile.in 85d32b973dc01fc0763ae2aea661a8b304364d319636071ab3485688e39d8989 F Makefile.linux-gcc f3842a0b1efbfbb74ac0ef60e56b301836d05b4d867d014f714fa750048f1ab6 -F Makefile.msc daad4a19e0b3c3c3b79b64d4ddbf75e3f506405e8d3f3f604d6f48b26043c51f +F Makefile.msc bae1e6a3b3902ca11af484a16e3d987bb0dcd3c6b242723cb0602965d1b2be92 F README.md c1c4218efcc4071a6e26db2b517fdbc1035696a29b370edd655faddbef02b224 F VERSION c6366dc72582d3144ce87b013cc35fe48d62f6d07d5be0c9716ea33c862144aa F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -730,7 +730,7 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8 F src/vdbevtab.c 57fa8f56478e5b5cb558cb425e7878515e0a105c54f96f1d1bbf4b9433529254 F src/vtab.c 1ecf8c3745d29275688d583e12822fa984d421e0286b5ef50c137bc3bf6d7a64 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 403ccb4a7c7ecc7903926468063ec20b2ef4905ff2df64f0b7c6bc78454e21fc +F src/wal.c 2b15d68f836e6bf4f15b5872642ee23c38b61fd0bc01dfa86762a51938c37aaa F src/wal.h bd964b88717cc604081d5496a076e8f0d10a40b3efccd8059a3d01815fc7a8ad F src/walker.c 7c7ea0115345851c3da4e04e2e239a29983b61fb5b038b94eede6aba462640e2 F src/where.c b8917792f1e0dbfa28fb29e6cd3d560060d69667be0ba4c491cbc772363264f5 @@ -2068,8 +2068,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 4a5c0439ae3ce6c98cea26f7e96c5bce543e76b9ad2a3a275601d6e5060899c8 8a6b0c24937e855b710f97b4aea973eff53e6d43e1182842731547aa4b37db2a -R 99cfcf873e3f4eea5a1d2e7a30e7020a +P cb3cf9bab0a75260c683454fb6c677f34b6c4b3555af2494678fd4811f586ac3 +R f6905675cb3ff4cc966b5b28569a5476 U dan -Z 4b488e51ed86e4e34326a2fa271daeb2 +Z 6fd8a726183c6b983cbfb4ef6113c52c # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 55bfe6f79c..2b25a81561 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cb3cf9bab0a75260c683454fb6c677f34b6c4b3555af2494678fd4811f586ac3 \ No newline at end of file +7004c9027e3c318513e62320f2f40839bd5c6a4b7647f6a8977d6b67ecfe90e0 \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index 6e20e732a6..b7c12bdc62 100644 --- a/src/wal.c +++ b/src/wal.c @@ -4470,7 +4470,7 @@ int sqlite3WalCheckpoint( /* If no error occurred, set the output variables. */ if( rc==SQLITE_OK || rc==SQLITE_BUSY ){ if( pnLog ) *pnLog = (int)pWal->hdr.mxFrame; - SEH_INJECT_FAULT + SEH_INJECT_FAULT; if( pnCkpt ) *pnCkpt = (int)(walCkptInfo(pWal)->nBackfill); } } From ef79b858111826203633a205a8816bde8c66af86 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 21 Aug 2023 17:49:54 +0000 Subject: [PATCH 101/113] Fix problems related to structured-exception-handling on this branch. FossilOrigin-Name: dd86c2729bdd0ed9646d4b1e2b90dcd40b8dce72dd33f4c1279c08b2a51675d3 --- manifest | 14 +++--- manifest.uuid | 2 +- src/wal.c | 100 ++++++++++++++++++++++++++----------------- test/concurrent.test | 1 + 4 files changed, 69 insertions(+), 48 deletions(-) diff --git a/manifest b/manifest index 975daf69c1..63beccf6e1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sMSVC\stestfixture.exe\sbuilds. -D 2023-08-21T17:26:36.220 +C Fix\sproblems\srelated\sto\sstructured-exception-handling\son\sthis\sbranch. +D 2023-08-21T17:49:54.662 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -730,7 +730,7 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8 F src/vdbevtab.c 57fa8f56478e5b5cb558cb425e7878515e0a105c54f96f1d1bbf4b9433529254 F src/vtab.c 1ecf8c3745d29275688d583e12822fa984d421e0286b5ef50c137bc3bf6d7a64 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 2b15d68f836e6bf4f15b5872642ee23c38b61fd0bc01dfa86762a51938c37aaa +F src/wal.c aab19a199465fcfd576a832649870247764097fad1091ee4499812f6aad165af F src/wal.h bd964b88717cc604081d5496a076e8f0d10a40b3efccd8059a3d01815fc7a8ad F src/walker.c 7c7ea0115345851c3da4e04e2e239a29983b61fb5b038b94eede6aba462640e2 F src/where.c b8917792f1e0dbfa28fb29e6cd3d560060d69667be0ba4c491cbc772363264f5 @@ -892,7 +892,7 @@ F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 87ad5458bb8709312dac0d6755fd30e8e4ca83298d0a9ef6e5c24277a3c3390e F test/columncount.test 6fe99c2f35738b0129357a1cf3fa483f76140f4cd8a89014c88c33c876d2638f F test/concfault.test e5370cd686f601a01909377cac3bbf13dac56d39dd4ad6b04ccbec9eeeaccb18 -F test/concurrent.test a0248ec6e3e79a5948453649cf86b5b359175cba55ea636b15426d6f0fa6c3da +F test/concurrent.test fb624ddac9b008f347685911f90b6b5a022fd0a3f884c0ffef8056bc440e5d76 F test/concurrent2.test de748c7dd749c77e2af2c4b914b9b09a28ac09608042ca498c0251dc6f46aa1a F test/concurrent3.test 82923fc2ea7321144b4448f98ea38aa316ddceef9020a392c5f6dea536506434 F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44 @@ -2068,8 +2068,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 cb3cf9bab0a75260c683454fb6c677f34b6c4b3555af2494678fd4811f586ac3 -R f6905675cb3ff4cc966b5b28569a5476 +P 7004c9027e3c318513e62320f2f40839bd5c6a4b7647f6a8977d6b67ecfe90e0 +R 6eb0f9d29f9a6aa7e12acab3ee7bf2b9 U dan -Z 6fd8a726183c6b983cbfb4ef6113c52c +Z 004137aebd0bce8a40f24260d5b70e74 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2b25a81561..12d3c8afbd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7004c9027e3c318513e62320f2f40839bd5c6a4b7647f6a8977d6b67ecfe90e0 \ No newline at end of file +dd86c2729bdd0ed9646d4b1e2b90dcd40b8dce72dd33f4c1279c08b2a51675d3 \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index b7c12bdc62..71bed19be5 100644 --- a/src/wal.c +++ b/src/wal.c @@ -3657,35 +3657,12 @@ static int walUpgradeReadlock(Wal *pWal){ #ifndef SQLITE_OMIT_CONCURRENT -/* -** This function is only ever called when committing a "BEGIN CONCURRENT" -** transaction. It may be assumed that no frames have been written to -** the wal file. The second parameter is a pointer to the in-memory -** representation of page 1 of the database (which may or may not be -** dirty). The third is a bitvec with a bit set for each page in the -** database file that was read by the current concurrent transaction. -** -** This function performs three tasks: -** -** 1) It obtains the WRITER lock on the wal file, -** -** 2) It checks that there are no conflicts between the current -** transaction and any transactions committed to the wal file since -** it was opened, and -** -** 3) It ejects any non-dirty pages from the page-cache that have been -** written by another client since the CONCURRENT transaction was started -** (so as to avoid ending up with an inconsistent cache after the -** current transaction is committed). -** -** If no error occurs and the caller may proceed with committing the -** transaction, SQLITE_OK is returned. SQLITE_BUSY is returned if the WRITER -** lock cannot be obtained. Or, if the WRITER lock can be obtained but there -** are conflicts with a committed transaction, SQLITE_BUSY_SNAPSHOT. Finally, -** if an error (i.e. an OOM condition or IO error), an SQLite error code -** is returned. +/* +** This function does the work of sqlite3WalLockForCommit(). The difference +** between this function and sqlite3WalLockForCommit() is that the latter +** encloses everything in a SEH_TRY {} block. */ -int sqlite3WalLockForCommit( +static int walLockForCommit( Wal *pWal, PgHdr *pPg1, Bitvec *pAllRead, @@ -3788,6 +3765,47 @@ int sqlite3WalLockForCommit( return rc; } +/* +** This function is only ever called when committing a "BEGIN CONCURRENT" +** transaction. It may be assumed that no frames have been written to +** the wal file. The second parameter is a pointer to the in-memory +** representation of page 1 of the database (which may or may not be +** dirty). The third is a bitvec with a bit set for each page in the +** database file that was read by the current concurrent transaction. +** +** This function performs three tasks: +** +** 1) It obtains the WRITER lock on the wal file, +** +** 2) It checks that there are no conflicts between the current +** transaction and any transactions committed to the wal file since +** it was opened, and +** +** 3) It ejects any non-dirty pages from the page-cache that have been +** written by another client since the CONCURRENT transaction was started +** (so as to avoid ending up with an inconsistent cache after the +** current transaction is committed). +** +** If no error occurs and the caller may proceed with committing the +** transaction, SQLITE_OK is returned. SQLITE_BUSY is returned if the WRITER +** lock cannot be obtained. Or, if the WRITER lock can be obtained but there +** are conflicts with a committed transaction, SQLITE_BUSY_SNAPSHOT. Finally, +** if an error (i.e. an OOM condition or IO error), an SQLite error code +** is returned. +*/ +int sqlite3WalLockForCommit( + Wal *pWal, + PgHdr *pPg1, + Bitvec *pAllRead, + Pgno *piConflict +){ + int rc = SQLITE_OK; + SEH_TRY { + rc = walLockForCommit(pWal, pPg1, pAllRead, piConflict); + } SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; ) + return rc; +} + /* !defined(SQLITE_OMIT_CONCURRENT) ** ** This function is called as part of committing an CONCURRENT transaction. @@ -3805,18 +3823,20 @@ int sqlite3WalUpgradeSnapshot(Wal *pWal){ int rc = SQLITE_OK; assert( pWal->writeLock ); - assert( pWal->szPage==pWal->hdr.szPage ); - memcpy(&pWal->hdr, (void*)walIndexHdr(pWal), sizeof(WalIndexHdr)); - assert( pWal->szPage==pWal->hdr.szPage || pWal->szPage==0 ); - pWal->szPage = pWal->hdr.szPage; - - /* If this client has its read-lock on slot aReadmark[0] and the entire - ** wal has not been checkpointed, switch it to a different slot. Otherwise - ** any reads performed between now and committing the transaction will - ** read from the old snapshot - not the one just upgraded to. */ - if( pWal->readLock==0 && pWal->hdr.mxFrame!=walCkptInfo(pWal)->nBackfill ){ - rc = walUpgradeReadlock(pWal); - } + SEH_TRY { + assert( pWal->szPage==pWal->hdr.szPage ); + memcpy(&pWal->hdr, (void*)walIndexHdr(pWal), sizeof(WalIndexHdr)); + assert( pWal->szPage==pWal->hdr.szPage || pWal->szPage==0 ); + pWal->szPage = pWal->hdr.szPage; + + /* If this client has its read-lock on slot aReadmark[0] and the entire + ** wal has not been checkpointed, switch it to a different slot. Otherwise + ** any reads performed between now and committing the transaction will + ** read from the old snapshot - not the one just upgraded to. */ + if( pWal->readLock==0 && pWal->hdr.mxFrame!=walCkptInfo(pWal)->nBackfill ){ + rc = walUpgradeReadlock(pWal); + } + } SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; ) return rc; } #endif /* SQLITE_OMIT_CONCURRENT */ diff --git a/test/concurrent.test b/test/concurrent.test index ad1e15d71c..ba01ee7753 100644 --- a/test/concurrent.test +++ b/test/concurrent.test @@ -163,6 +163,7 @@ do_execsql_test 1.7.1.x { {CREATE INDEX yyi1 ON yy(a)} {CREATE TABLE zz(a, b)} } +db2 close #------------------------------------------------------------------------- # If an auto-vacuum database is written within an CONCURRENT transaction, it From 9d23e88a992f37150d4bc7414c0ab06df2163270 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 16 Feb 2024 11:03:07 +0000 Subject: [PATCH 102/113] Fix a problem with the sqlite3_log() message identifying the table or index that a conflicting page belongs to. FossilOrigin-Name: d6c629f1655a207a511444680c3e89089b4e9ee30a699f396549324d5c4a238e --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/btree.c | 1 + test/concurrent5.test | 31 +++++++++++++++++++++++++++++++ 4 files changed, 41 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 80beb43123..48c9933f8f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\slatest\strunk\schanges\sinto\sthis\sbranch. -D 2024-01-13T19:57:37.125 +C Fix\sa\sproblem\swith\sthe\ssqlite3_log()\smessage\sidentifying\sthe\stable\sor\sindex\sthat\sa\sconflicting\spage\sbelongs\sto. +D 2024-02-16T11:03:07.832 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -681,7 +681,7 @@ F src/auth.c 19b7ccacae3dfba23fc6f1d0af68134fa216e9040e53b0681b4715445ea030b4 F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523 F src/bitvec.c 501daeef838fa82a9fb53540d72f29e3d9172c8867f1e19f94f681e2e20b966e F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522 -F src/btree.c 6a4a14ab7e1fa00ee08234c749aaef78eeb7baff2806f9f7c0352f83ad10dea2 +F src/btree.c d21f48258071dd96f854036a84a45ddef05985b0d11ae0e032dbb2667aea2f87 F src/btree.h d906e4d53f483c83d471d99479fa73fcdf20696305d578876f46ee283f3507cb F src/btreeInt.h 57551d7c9830dd7f2d2b3fb73e6ec90aefd98a18b15e565c86ff1a9bb1639273 F src/build.c 9c04ebb789ae19a7d94cd0a1ba8dcea041c2cd0d88157a2cd9cd8ecf40d3bf7f @@ -992,7 +992,7 @@ F test/concurrent.test fb624ddac9b008f347685911f90b6b5a022fd0a3f884c0ffef8056bc4 F test/concurrent2.test de748c7dd749c77e2af2c4b914b9b09a28ac09608042ca498c0251dc6f46aa1a F test/concurrent3.test 82923fc2ea7321144b4448f98ea38aa316ddceef9020a392c5f6dea536506434 F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44 -F test/concurrent5.test 0c16cbf7446af162a14e6def30445e94016064eb994e5aa4ebb2bebc59554176 +F test/concurrent5.test 6088092b0cebe6ff299d781b06c9b4d44c91d7c8f8023f6abb9bffdb436c01b3 F test/concurrent6.test a7860e9ca13bb5fb76bcf41c5524fbfa9c37e6e258ecf84ffb5748a272488c67 F test/concurrent7.test b96fa5c4cfdf8d5c0bc66b6934214500bad0260884a736f054ccc76e81aae85d F test/concurrent8.test b93937e74a8efb8b84f2fea7595b53418c5f29777bbe9cbdb5dc219b3dd72a7d @@ -1350,7 +1350,7 @@ F test/json/README.md de59d5ba0bd2796d797115688630a6405bbf43a2891bad445ac6b9f38b F test/json/json-generator.tcl dc0dd0f393800c98658fc4c47eaa6af29d4e17527380cd28656fb261bddc8a3f F test/json/json-q1.txt 65f9d1cdcc4cffa9823fb73ed936aae5658700cd001fde448f68bfb91c807307 F test/json/json-speed-check.sh 912ee03e700a65c827ee0c7b4752c21ec5ef69cf7679d2f482ca817042bead52 x -F test/json/jsonb-q1.txt 1e180fe6491efab307e318b22879e3a736ac9a96539bbde7911a13ee5b33abc7 w test/json/json-q1-b.txt +F test/json/jsonb-q1.txt 1e180fe6491efab307e318b22879e3a736ac9a96539bbde7911a13ee5b33abc7 F test/json101.test 70587d7d35ef9e2126364ba70f0c951f70827cfbd28649d779ff3df7e8f87547 F test/json102.test 557a46e16df1aa9bdbc4076a71a45814ea0e7503d6621d87d42a8c04cbc2b0ef F test/json103.test 53df87f83a4e5fa0c0a56eb29ff6c94055c6eb919f33316d62161a8880112dbe @@ -2174,8 +2174,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 c407d3bb9979933d7f5418ac2baa238b1f13c1aa769bf452c5c33088fdb1e959 f47a5f4e0ce078e6cc1183e6cbb3c4013af379b496efae94863a42e5c39928ed -R fe5d97e053c47e908fb628066364d0e3 +P 95bf4bc2e2cc1e7489d82c68deb68feefbdc34fec1baeb9bb8a92ff1063b806c +R 5622791fb87201582217f7c3311b2f02 U dan -Z 5ed26b44c3c06bbcd8306ad8e3790a13 +Z e700c0c0f07d1a444f26268ef99169ac # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index ba5c502509..152d8e9294 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -95bf4bc2e2cc1e7489d82c68deb68feefbdc34fec1baeb9bb8a92ff1063b806c \ No newline at end of file +d6c629f1655a207a511444680c3e89089b4e9ee30a699f396549324d5c4a238e \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 4644fcddaa..bbb5c7b52a 100644 --- a/src/btree.c +++ b/src/btree.c @@ -6557,6 +6557,7 @@ int sqlite3BtreeIndexMoveto( pCur->pPage = pCur->apPage[--pCur->iPage]; break; } + setMempageRoot(pCur->pPage, pCur->pgnoRoot); /* ***** End of in-lined moveToChild() call */ } diff --git a/test/concurrent5.test b/test/concurrent5.test index bc00232442..088e4fff38 100644 --- a/test/concurrent5.test +++ b/test/concurrent5.test @@ -124,6 +124,37 @@ do_test_conflict_msg 1.3.2 { conflict at page 211 (read/write page; part of db index t3.i3; content=0A0310006300D800...) } +db2 close +reset_db +do_execsql_test 1.5.0 { + PRAGMA auto_vacuum = 0; + PRAGMA journal_mode = wal; + CREATE TABLE t1(a, b); + CREATE INDEX i1 ON t1(a, b); + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1000 + ) + INSERT INTO t1 SELECT i, randomblob(200) FROM s; +} {wal} +do_test 1.5.1 { + set ::log [list] + + execsql { + BEGIN CONCURRENT; + INSERT INTO t1 VALUES(100000, ''); + } db + + sqlite3 db2 test.db + execsql { INSERT INTO t1(rowid, a, b) VALUES(-1, 100001, '') } db2 + catchsql COMMIT db +} {1 {database is locked}} + +do_test_conflict_msg 1.5.2 { + conflict at page 507 (read/write page; part of db index t1.i1; content=0A00000003025000...) +} + +sqlite3 db2 test.db + db close db2 close sqlite3_shutdown From cd57479c6b537e0831731b11be278911335a880e Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 29 Mar 2024 17:32:00 +0000 Subject: [PATCH 103/113] Improve the log message emitted when a BEGIN CONCURRENT transaction cannot be committed due to conflicts so that it identifies the conflicting table in a few more cases. FossilOrigin-Name: 5d30e362cf72da3e17663dcb4299047ebe797ab6054fb14b2150ba82c2e698e1 --- manifest | 16 ++++++------- manifest.uuid | 2 +- src/btree.c | 4 ++++ test/concurrent5.test | 56 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index a235238c6a..eb0fd0f59d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sall\srecent\strunk\senhancements\sinto\sthe\sbegin-concurrent\sbranch. -D 2024-03-26T10:42:28.054 +C Improve\sthe\slog\smessage\semitted\swhen\sa\sBEGIN\sCONCURRENT\stransaction\scannot\sbe\scommitted\sdue\sto\sconflicts\sso\sthat\sit\sidentifies\sthe\sconflicting\stable\sin\sa\sfew\smore\scases. +D 2024-03-29T17:32:00.462 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -694,7 +694,7 @@ F src/auth.c 19b7ccacae3dfba23fc6f1d0af68134fa216e9040e53b0681b4715445ea030b4 F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523 F src/bitvec.c 501daeef838fa82a9fb53540d72f29e3d9172c8867f1e19f94f681e2e20b966e F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522 -F src/btree.c ac70c1938c8abb1ae9e85f1fc92ba3e32ed88d99df9d752f63cebce6ec22b5bf +F src/btree.c 67683c7395cecc1c36397ce250e84822668d7affa88e590bdd52e7067843d790 F src/btree.h bdeeb35614caa33526b603138f04c8d07a3f90a1300b5ade76848b755edf2027 F src/btreeInt.h 8efd30e75e35a3c6a1c4dad7410d4ddfcd560f5f46401b208fa79eceef34525a F src/build.c c02fca1b600267120d1492f15a8301d48c59d37094c363eb5c12cca08d9133b8 @@ -1006,7 +1006,7 @@ F test/concurrent.test fb624ddac9b008f347685911f90b6b5a022fd0a3f884c0ffef8056bc4 F test/concurrent2.test de748c7dd749c77e2af2c4b914b9b09a28ac09608042ca498c0251dc6f46aa1a F test/concurrent3.test 82923fc2ea7321144b4448f98ea38aa316ddceef9020a392c5f6dea536506434 F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44 -F test/concurrent5.test 6088092b0cebe6ff299d781b06c9b4d44c91d7c8f8023f6abb9bffdb436c01b3 +F test/concurrent5.test f2064650d8a1558199fbca19ebd1f0fda5115109ab981b8fe3827ff56c76efa7 F test/concurrent6.test a7860e9ca13bb5fb76bcf41c5524fbfa9c37e6e258ecf84ffb5748a272488c67 F test/concurrent7.test b96fa5c4cfdf8d5c0bc66b6934214500bad0260884a736f054ccc76e81aae85d F test/concurrent8.test b93937e74a8efb8b84f2fea7595b53418c5f29777bbe9cbdb5dc219b3dd72a7d @@ -2200,8 +2200,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 50b43b02da3cabb136c7a11e0d36e93b270f07b05359f52c0b9d03ff54f021c1 6a06dc73847716c88d65651d1bf0e002002303881df1389beac884d0032eae08 -R 8b8f020ec8d1a12ee489e27274940ff7 -U drh -Z 0b234792aa651d099794b9a2f2e34400 +P 9b854e54b0d32542fd9b360319a784522c6a80190565094b74b2ab2c37efa14f +R 3e711a26f5137f03bc94133c7ebecd04 +U dan +Z 00fca70373aebb602684e384574f83d8 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 15ea3fc4bd..787967575d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9b854e54b0d32542fd9b360319a784522c6a80190565094b74b2ab2c37efa14f \ No newline at end of file +5d30e362cf72da3e17663dcb4299047ebe797ab6054fb14b2150ba82c2e698e1 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index b3a37518a2..b28787ffcd 100644 --- a/src/btree.c +++ b/src/btree.c @@ -5683,6 +5683,9 @@ static int accessPayload( (eOp==0 ? PAGER_GET_READONLY : 0) ); if( rc==SQLITE_OK ){ + setMempageRoot( + (MemPage*)sqlite3PagerGetExtra(pDbPage), pCur->pgnoRoot + ); aPayload = sqlite3PagerGetData(pDbPage); nextPage = get4byte(aPayload); rc = copyPayload(&aPayload[offset+4], pBuf, a, eOp, pDbPage); @@ -9679,6 +9682,7 @@ static SQLITE_NOINLINE int btreeOverwriteOverflowCell( do{ rc = btreeGetPage(pBt, ovflPgno, &pPage, 0); if( rc ) return rc; + setMempageRoot(pPage, pCur->pgnoRoot); if( sqlite3PagerPageRefcount(pPage->pDbPage)!=1 || pPage->isInit ){ rc = SQLITE_CORRUPT_PAGE(pPage); }else{ diff --git a/test/concurrent5.test b/test/concurrent5.test index 088e4fff38..a7ecf9ddd0 100644 --- a/test/concurrent5.test +++ b/test/concurrent5.test @@ -153,8 +153,64 @@ do_test_conflict_msg 1.5.2 { conflict at page 507 (read/write page; part of db index t1.i1; content=0A00000003025000...) } + +#------------------------------------------------------------------------- +reset_db sqlite3 db2 test.db +set big1 [string repeat ab 10000] +set big2 "[string repeat ab 9999]xy" + +catchsql { ROLLBACK } + +do_execsql_test 1.6.0 { + CREATE TABLE x1(x, y); + INSERT INTO x1 VALUES(1, $big1); + PRAGMA journal_mode = wal; +} {wal} + +do_execsql_test -db db2 1.6.1.1 { + BEGIN; + UPDATE x1 SET y=$big2; +} {} +do_execsql_test 1.6.1.2 { + BEGIN CONCURRENT; + UPDATE x1 SET y=$big2; +} +do_execsql_test -db db2 1.6.1.3 COMMIT +do_catchsql_test 1.6.1.4 { + COMMIT; +} {1 {database is locked}} +do_test_conflict_msg 1.6.1.5 { + conflict at page 21 (read/write page; part of db table x1; content=0000000061626162...) +} +catchsql ROLLBACK + +do_test 1.6.2.1 { + execsql { BEGIN } db2 + set fd [db2 incrblob main x1 y 1] + seek $fd 19998 + puts -nonewline $fd 00 + close $fd +} {} +do_test 1.6.2.2 { + execsql { BEGIN CONCURRENT } db + set fd [db incrblob main x1 y 1] + seek $fd 19998 + puts -nonewline $fd 12 + close $fd +} {} +do_execsql_test -db db2 1.6.2.3 COMMIT +do_catchsql_test 1.6.2.4 { + COMMIT; +} {1 {database is locked}} +do_test_conflict_msg 1.6.1.5 { + conflict at page 21 (read/write page; part of db table x1; content=0000000061626162...) +} +catchsql ROLLBACK + + + db close db2 close sqlite3_shutdown From ad7341c0f240f34b13101b2080dea12948945dce Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 29 Mar 2024 17:58:51 +0000 Subject: [PATCH 104/113] Fix a problem in SQLITE_DIRECT_OVERFLOW_READ builds that could allow a concurrent transaction to be committed even if it read from an overflow page that was modified concurrently, in cases where the overflow page was written without also writing the b-tree page to which it is linked. FossilOrigin-Name: 49263c9136c81638833aa71c9d590e318ead2ca60c4d7207ebf8884174df9c8f --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/btree.c | 2 ++ src/pager.c | 27 ++++++++++++++++++++------- src/pager.h | 2 ++ test/concurrent5.test | 31 +++++++++++++++++++++++++++++-- 6 files changed, 63 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index eb0fd0f59d..00643460f0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\sthe\slog\smessage\semitted\swhen\sa\sBEGIN\sCONCURRENT\stransaction\scannot\sbe\scommitted\sdue\sto\sconflicts\sso\sthat\sit\sidentifies\sthe\sconflicting\stable\sin\sa\sfew\smore\scases. -D 2024-03-29T17:32:00.462 +C Fix\sa\sproblem\sin\sSQLITE_DIRECT_OVERFLOW_READ\sbuilds\sthat\scould\sallow\sa\sconcurrent\stransaction\sto\sbe\scommitted\seven\sif\sit\sread\sfrom\san\soverflow\spage\sthat\swas\smodified\sconcurrently,\sin\scases\swhere\sthe\soverflow\spage\swas\swritten\swithout\salso\swriting\sthe\sb-tree\spage\sto\swhich\sit\sis\slinked. +D 2024-03-29T17:58:51.554 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -694,7 +694,7 @@ F src/auth.c 19b7ccacae3dfba23fc6f1d0af68134fa216e9040e53b0681b4715445ea030b4 F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523 F src/bitvec.c 501daeef838fa82a9fb53540d72f29e3d9172c8867f1e19f94f681e2e20b966e F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522 -F src/btree.c 67683c7395cecc1c36397ce250e84822668d7affa88e590bdd52e7067843d790 +F src/btree.c ea6f38398e28cc4ae70a0d55e94d14e61ddaa05705e40796c542aaf6e8ae0b6f F src/btree.h bdeeb35614caa33526b603138f04c8d07a3f90a1300b5ade76848b755edf2027 F src/btreeInt.h 8efd30e75e35a3c6a1c4dad7410d4ddfcd560f5f46401b208fa79eceef34525a F src/build.c c02fca1b600267120d1492f15a8301d48c59d37094c363eb5c12cca08d9133b8 @@ -742,8 +742,8 @@ F src/os_setup.h 6011ad7af5db4e05155f385eb3a9b4470688de6f65d6166b8956e58a3d87210 F src/os_unix.c a31c14ba25e87757809853f58d1573ff8cb422e3543093582e523809d96738e0 F src/os_win.c 6ff43bac175bd9ed79e7c0f96840b139f2f51d01689a638fd05128becf94908a F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 267f4ec1bc93559e7789c43cd3fa9ad0df8de6b609ec90dc74919d573e6bc7bb -F src/pager.h af722ebe5d7c34ce7c94237323578385e3822fcf94fde3e7824b73a2efa0081f +F src/pager.c 8618d789abb2e7d86e2e46800685126c72a9ee4ce1252ce0e93f47ecbaab697f +F src/pager.h e2df6b92e0402bc8d516016f361da82758b7d7769ef1a18e2abeadece18103e0 F src/parse.y 08247e876d6508e7bcf624d48f4993f4051899e1e73400fe7da9de34af755a90 F src/pcache.c 040b165f30622a21b7a9a77c6f2e4877a32fb7f22d4c7f0d2a6fa6833a156a75 F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5 @@ -1006,7 +1006,7 @@ F test/concurrent.test fb624ddac9b008f347685911f90b6b5a022fd0a3f884c0ffef8056bc4 F test/concurrent2.test de748c7dd749c77e2af2c4b914b9b09a28ac09608042ca498c0251dc6f46aa1a F test/concurrent3.test 82923fc2ea7321144b4448f98ea38aa316ddceef9020a392c5f6dea536506434 F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44 -F test/concurrent5.test f2064650d8a1558199fbca19ebd1f0fda5115109ab981b8fe3827ff56c76efa7 +F test/concurrent5.test aeb438ead1b9bb5204fa1066e8aed0bb27e5a08e4fa9b0ad42932f96eb0f97eb F test/concurrent6.test a7860e9ca13bb5fb76bcf41c5524fbfa9c37e6e258ecf84ffb5748a272488c67 F test/concurrent7.test b96fa5c4cfdf8d5c0bc66b6934214500bad0260884a736f054ccc76e81aae85d F test/concurrent8.test b93937e74a8efb8b84f2fea7595b53418c5f29777bbe9cbdb5dc219b3dd72a7d @@ -2200,8 +2200,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 9b854e54b0d32542fd9b360319a784522c6a80190565094b74b2ab2c37efa14f -R 3e711a26f5137f03bc94133c7ebecd04 +P 5d30e362cf72da3e17663dcb4299047ebe797ab6054fb14b2150ba82c2e698e1 +R ffb0ad0804e18372a484cadcc9d8fe60 U dan -Z 00fca70373aebb602684e384574f83d8 +Z 8f1f79457d009d7dc836ea34a5647b87 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 787967575d..f8bdb5b729 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5d30e362cf72da3e17663dcb4299047ebe797ab6054fb14b2150ba82c2e698e1 \ No newline at end of file +49263c9136c81638833aa71c9d590e318ead2ca60c4d7207ebf8884174df9c8f \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index b28787ffcd..57d3bd998a 100644 --- a/src/btree.c +++ b/src/btree.c @@ -5671,6 +5671,8 @@ static int accessPayload( u8 *aWrite = &pBuf[-4]; assert( aWrite>=pBufStart ); /* due to (6) */ memcpy(aSave, aWrite, 4); + rc = sqlite3PagerUsePage(pBt->pPager, nextPage); + if( rc!=SQLITE_OK ) break; rc = sqlite3OsRead(fd, aWrite, a+4, (i64)pBt->pageSize*(nextPage-1)); nextPage = get4byte(aWrite); memcpy(aWrite, aSave, 4); diff --git a/src/pager.c b/src/pager.c index f56b848970..ee0cec0a29 100644 --- a/src/pager.c +++ b/src/pager.c @@ -5521,6 +5521,23 @@ static void pagerUnlockIfUnused(Pager *pPager){ } } +#ifndef SQLITE_OMIT_CONCURRENT +/* +** If this pager is currently in a concurrent transaction (pAllRead!=0), +** then set the bit in the pAllRead vector to indicate that the transaction +** read from page pgno. Return SQLITE_OK if successful, or an SQLite error +** code (i.e. SQLITE_NOMEM) if an error occurs. +*/ +int sqlite3PagerUsePage(Pager *pPager, Pgno pgno){ + int rc = SQLITE_OK; + if( pPager->pAllRead && pgno<=pPager->dbOrigSize ){ + PAGERTRACE(("USING page %d\n", pgno)); + rc = sqlite3BitvecSet(pPager->pAllRead, pgno); + } + return rc; +} +#endif + /* ** The page getter methods each try to acquire a reference to a ** page with page number pgno. If the requested reference is @@ -5594,17 +5611,13 @@ static int getPageNormal( assert( assert_pager_state(pPager) ); assert( pPager->hasHeldSharedLock==1 ); -#ifndef SQLITE_OMIT_CONCURRENT /* If this is an CONCURRENT transaction and the page being read was ** present in the database file when the transaction was opened, ** mark it as read in the pAllRead vector. */ - pPg = 0; - if( pPager->pAllRead && pgno<=pPager->dbOrigSize ){ - PAGERTRACE(("USING page %d\n", pgno)); - rc = sqlite3BitvecSet(pPager->pAllRead, pgno); - if( rc!=SQLITE_OK ) goto pager_acquire_err; + if( sqlite3PagerUsePage(pPager, pgno)!=SQLITE_OK ){ + pPg = 0; + goto pager_acquire_err; } -#endif if( pgno==0 ) return SQLITE_CORRUPT_BKPT; pBase = sqlite3PcacheFetch(pPager->pPCache, pgno, 3); diff --git a/src/pager.h b/src/pager.h index 75d4ef2bc0..2cbe4545ae 100644 --- a/src/pager.h +++ b/src/pager.h @@ -227,6 +227,7 @@ void sqlite3PagerTruncateImage(Pager*,Pgno); void sqlite3PagerRekey(DbPage*, Pgno, u16); #ifndef SQLITE_OMIT_CONCURRENT +int sqlite3PagerUsePage(Pager*, Pgno); void sqlite3PagerEndConcurrent(Pager*); int sqlite3PagerBeginConcurrent(Pager*); void sqlite3PagerDropExclusiveLock(Pager*); @@ -235,6 +236,7 @@ void sqlite3PagerSetDbsize(Pager *pPager, Pgno); int sqlite3PagerIsWal(Pager*); #else # define sqlite3PagerEndConcurrent(x) +# define sqlite3PagerUsePage(x, y) SQLITE_OK #endif #if defined(SQLITE_DEBUG) || !defined(SQLITE_OMIT_CONCURRENT) diff --git a/test/concurrent5.test b/test/concurrent5.test index a7ecf9ddd0..4afd06bcaf 100644 --- a/test/concurrent5.test +++ b/test/concurrent5.test @@ -161,8 +161,6 @@ sqlite3 db2 test.db set big1 [string repeat ab 10000] set big2 "[string repeat ab 9999]xy" -catchsql { ROLLBACK } - do_execsql_test 1.6.0 { CREATE TABLE x1(x, y); INSERT INTO x1 VALUES(1, $big1); @@ -209,7 +207,36 @@ do_test_conflict_msg 1.6.1.5 { } catchsql ROLLBACK +#-------------------------------------------------------------------------- +reset_db +sqlite3 db2 test.db + +set big1 [string repeat ab 10000] +set big2 "[string repeat ab 9999]xy" + +do_execsql_test 1.7.0 { + CREATE TABLE ww(a); + CREATE TABLE y1(x, y); + INSERT INTO y1 VALUES(1, $big1); + PRAGMA journal_mode = wal; +} {wal} +do_execsql_test -db db2 1.7.1 { + BEGIN; + UPDATE y1 SET y=$big2; + SELECT * FROM ww; +} + +do_execsql_test 1.7.2 { + BEGIN CONCURRENT; + INSERT INTO ww SELECT y FROM y1; +} + +do_execsql_test -db db2 1.7.3 COMMIT + +do_catchsql_test 1.7.4 { + COMMIT; +} {1 {database is locked}} db close db2 close From d4dc4ac6da564069b98505998351e1af2a3c210f Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 29 Mar 2024 18:16:16 +0000 Subject: [PATCH 105/113] Fix handling of an OOM case broken by [49263c91]. FossilOrigin-Name: 9e6b64decb42dfebd3b882fd93f3bbfec11eca83b754514cc72c90616ca6f9dd --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pager.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 00643460f0..69d607af76 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sin\sSQLITE_DIRECT_OVERFLOW_READ\sbuilds\sthat\scould\sallow\sa\sconcurrent\stransaction\sto\sbe\scommitted\seven\sif\sit\sread\sfrom\san\soverflow\spage\sthat\swas\smodified\sconcurrently,\sin\scases\swhere\sthe\soverflow\spage\swas\swritten\swithout\salso\swriting\sthe\sb-tree\spage\sto\swhich\sit\sis\slinked. -D 2024-03-29T17:58:51.554 +C Fix\shandling\sof\san\sOOM\scase\sbroken\sby\s[49263c91]. +D 2024-03-29T18:16:16.147 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -742,7 +742,7 @@ F src/os_setup.h 6011ad7af5db4e05155f385eb3a9b4470688de6f65d6166b8956e58a3d87210 F src/os_unix.c a31c14ba25e87757809853f58d1573ff8cb422e3543093582e523809d96738e0 F src/os_win.c 6ff43bac175bd9ed79e7c0f96840b139f2f51d01689a638fd05128becf94908a F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 8618d789abb2e7d86e2e46800685126c72a9ee4ce1252ce0e93f47ecbaab697f +F src/pager.c f7db1a855ce8fea25365fa47f0917cee693259d8c8eb2c8b06cf9bae15d7a1b5 F src/pager.h e2df6b92e0402bc8d516016f361da82758b7d7769ef1a18e2abeadece18103e0 F src/parse.y 08247e876d6508e7bcf624d48f4993f4051899e1e73400fe7da9de34af755a90 F src/pcache.c 040b165f30622a21b7a9a77c6f2e4877a32fb7f22d4c7f0d2a6fa6833a156a75 @@ -2200,8 +2200,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 5d30e362cf72da3e17663dcb4299047ebe797ab6054fb14b2150ba82c2e698e1 -R ffb0ad0804e18372a484cadcc9d8fe60 +P 49263c9136c81638833aa71c9d590e318ead2ca60c4d7207ebf8884174df9c8f +R 3d13c708a5596ff88a252823ede658c8 U dan -Z 8f1f79457d009d7dc836ea34a5647b87 +Z 61de718e8a5e60bcb1dedd4121a2983d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f8bdb5b729..a25b948f8e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -49263c9136c81638833aa71c9d590e318ead2ca60c4d7207ebf8884174df9c8f \ No newline at end of file +9e6b64decb42dfebd3b882fd93f3bbfec11eca83b754514cc72c90616ca6f9dd \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index ee0cec0a29..89ba48a540 100644 --- a/src/pager.c +++ b/src/pager.c @@ -5614,7 +5614,7 @@ static int getPageNormal( /* If this is an CONCURRENT transaction and the page being read was ** present in the database file when the transaction was opened, ** mark it as read in the pAllRead vector. */ - if( sqlite3PagerUsePage(pPager, pgno)!=SQLITE_OK ){ + if( (rc = sqlite3PagerUsePage(pPager, pgno))!=SQLITE_OK ){ pPg = 0; goto pager_acquire_err; } From 357e2fee7c1cfba5c39e4a0c118b74b998d6f859 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 28 May 2024 18:35:12 +0000 Subject: [PATCH 106/113] Fix another problem with the sqlite3_log() message identifying the table or index that a conflicting page belongs to. FossilOrigin-Name: d033d9435007c7753d48f019626cf22c82569f93506a7e0158a09d5c4274baae --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/btree.c | 3 +++ test/concurrent5.test | 31 +++++++++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 15e9536c57..31c85f8069 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.46.0\sfor\sthe\sbegin-concurrent\sbranch -D 2024-05-23T14:04:16.818 +C Fix\sanother\sproblem\swith\sthe\ssqlite3_log()\smessage\sidentifying\sthe\stable\sor\sindex\sthat\sa\sconflicting\spage\sbelongs\sto. +D 2024-05-28T18:35:12.968 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -698,7 +698,7 @@ F src/auth.c 19b7ccacae3dfba23fc6f1d0af68134fa216e9040e53b0681b4715445ea030b4 F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523 F src/bitvec.c 501daeef838fa82a9fb53540d72f29e3d9172c8867f1e19f94f681e2e20b966e F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522 -F src/btree.c 0b8013548d5595aac3d51b8ac75c722c78b3e8c3feafb0f71a60c7379577b023 +F src/btree.c 04ccc011b8a26f121b5b756863698f3afa8a8851e668c5e14edd596bb09defc6 F src/btree.h bdeeb35614caa33526b603138f04c8d07a3f90a1300b5ade76848b755edf2027 F src/btreeInt.h 8efd30e75e35a3c6a1c4dad7410d4ddfcd560f5f46401b208fa79eceef34525a F src/build.c 85ef9135eb2477f010e515411ab251d560021d5318c5316929797f28a41b70c8 @@ -1011,7 +1011,7 @@ F test/concurrent.test fb624ddac9b008f347685911f90b6b5a022fd0a3f884c0ffef8056bc4 F test/concurrent2.test de748c7dd749c77e2af2c4b914b9b09a28ac09608042ca498c0251dc6f46aa1a F test/concurrent3.test 82923fc2ea7321144b4448f98ea38aa316ddceef9020a392c5f6dea536506434 F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44 -F test/concurrent5.test aeb438ead1b9bb5204fa1066e8aed0bb27e5a08e4fa9b0ad42932f96eb0f97eb +F test/concurrent5.test 5031c87134fee85352ac33ad33c81c6ec4f07d5547fe2429e1d38492a797f6bc F test/concurrent6.test a7860e9ca13bb5fb76bcf41c5524fbfa9c37e6e258ecf84ffb5748a272488c67 F test/concurrent7.test b96fa5c4cfdf8d5c0bc66b6934214500bad0260884a736f054ccc76e81aae85d F test/concurrent8.test b93937e74a8efb8b84f2fea7595b53418c5f29777bbe9cbdb5dc219b3dd72a7d @@ -2208,8 +2208,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 5c1c8651d122f811dfc3dd08007214c1b38e1229b13b3a8a50a8753ef3767988 96c92aba00c8375bc32fafcdf12429c58bd8aabfcadab6683e35bbb9cdebf19e -R f152d60ac37c304e2bd46e9eaa53f64c -U drh -Z 61453f6fd00e6956b8e3793ef1f1418c +P e3f8c70ef5a7349c0ebcb807b3ec4ad1f228f8afce1122889571fbf7471e68e4 +R 229670c901bbf6a4c3d75a925040c458 +U dan +Z f36f73d17448085f936001613ea9eba1 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index ea350f37d1..295c1733c9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e3f8c70ef5a7349c0ebcb807b3ec4ad1f228f8afce1122889571fbf7471e68e4 \ No newline at end of file +d033d9435007c7753d48f019626cf22c82569f93506a7e0158a09d5c4274baae \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 3bfccdc2e1..4a120ebb36 100644 --- a/src/btree.c +++ b/src/btree.c @@ -10153,6 +10153,9 @@ int sqlite3BtreeTransferRow(BtCursor *pDest, BtCursor *pSrc, i64 iKey){ pPageIn = 0; rc = sqlite3PagerGet(pSrcPager, ovflIn, &pPageIn, PAGER_GET_READONLY); if( rc==SQLITE_OK ){ + setMempageRoot( + (MemPage*)sqlite3PagerGetExtra(pPageIn), pSrc->pgnoRoot + ); aIn = (const u8*)sqlite3PagerGetData(pPageIn); ovflIn = get4byte(aIn); aIn += 4; diff --git a/test/concurrent5.test b/test/concurrent5.test index 4afd06bcaf..21dc0cc2dd 100644 --- a/test/concurrent5.test +++ b/test/concurrent5.test @@ -238,6 +238,36 @@ do_catchsql_test 1.7.4 { COMMIT; } {1 {database is locked}} +#------------------------------------------------------------------------- +reset_db +sqlite3 db2 test.db + +set big1 "[string repeat ab 10000]" +set big2 "[string repeat ab 9999]xy" +do_execsql_test 2.0 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT); + CREATE TABLE t2(a INTEGER PRIMARY KEY, b TEXT); + INSERT INTO t1 VALUES(100, $big1); +} {wal} + +do_execsql_test -db db2 2.1 { + BEGIN CONCURRENT; + INSERT INTO t2 SELECT * FROM t1; +} + +do_execsql_test 2.2 { + UPDATE t1 SET b=$big2 +} + +do_test 2.3 { + list [catch { db2 eval COMMIT } msg] $msg +} {1 {database is locked}} + +do_test_conflict_msg 2.4 { + conflict at page 22 (read-only page; part of db table t1; content=0000000061626162...) +} + db close db2 close sqlite3_shutdown @@ -245,3 +275,4 @@ test_sqlite3_log sqlite3_initialize finish_test + From d61eef9599d914e5af4f7ab12120f155346dae0d Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 9 Aug 2024 10:37:24 +0000 Subject: [PATCH 107/113] Remove two unnecessary int casts, as reported in [forum:84fe63b7b3|forum post 84fe63b7b3]. FossilOrigin-Name: 137cc3e9e8b080678868da34e61f65faf5feb19f146bb7789c659bcdb8f5e950 --- manifest | 21 +++++++++++---------- manifest.uuid | 2 +- src/btree.c | 4 ++-- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 9228f0d15e..bca42faaa6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sall\sthe\slatest\strunk\senhancements\sinto\sthe\sbegin-concurrent\sbranch. -D 2024-08-01T00:02:23.207 +C Remove\stwo\sunnecessary\sint\scasts,\sas\sreported\sin\s[forum:84fe63b7b3|forum\spost\s84fe63b7b3]. +D 2024-08-09T10:37:24.514 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -620,10 +620,10 @@ F ext/wasm/api/post-js-footer.js cd0a8ec768501d9bd45d325ab0442037fb0e33d1f3b4f08 F ext/wasm/api/post-js-header.js 04dc12c3edd666b64a1b4ef3b6690c88dcc653f26451fd4734472d8e29c1c122 F ext/wasm/api/pre-js.c-pp.js ad906703f7429590f2fbf5e6498513bf727a1a4f0ebfa057afb08161d7511219 F ext/wasm/api/sqlite3-api-cleanup.js d235ad237df6954145404305040991c72ef8b1881715d2a650dda7b3c2576d0e -F ext/wasm/api/sqlite3-api-glue.c-pp.js 54b32b5321105a72d6f3d3e8b77f28f162d0367b08c63184263d3f85f3d7dbed w ext/wasm/api/sqlite3-api-glue.js -F ext/wasm/api/sqlite3-api-oo1.c-pp.js f3a8e2004c6625d17946c11f2fb32008be78bc5207bf746fc77d59848813225f w ext/wasm/api/sqlite3-api-oo1.js +F ext/wasm/api/sqlite3-api-glue.c-pp.js 54b32b5321105a72d6f3d3e8b77f28f162d0367b08c63184263d3f85f3d7dbed +F ext/wasm/api/sqlite3-api-oo1.c-pp.js f3a8e2004c6625d17946c11f2fb32008be78bc5207bf746fc77d59848813225f F ext/wasm/api/sqlite3-api-prologue.js 6f1257e04885632ed9f44d43aba200b86e0bc16709ffdba29abbbeb1bc8e8b76 -F ext/wasm/api/sqlite3-api-worker1.c-pp.js 5cc22a3c0d52828cb32aad8691488719f47d27567e63e8bc8b832d74371c352d w ext/wasm/api/sqlite3-api-worker1.js +F ext/wasm/api/sqlite3-api-worker1.c-pp.js 5cc22a3c0d52828cb32aad8691488719f47d27567e63e8bc8b832d74371c352d F ext/wasm/api/sqlite3-license-version-header.js 0c807a421f0187e778dc1078f10d2994b915123c1223fe752b60afdcd1263f89 F ext/wasm/api/sqlite3-opfs-async-proxy.js e8f1df56e97a29004a95a2eddd26778f52c33b3e797d32d4b1b668a38e6493dd F ext/wasm/api/sqlite3-vfs-helper.c-pp.js 3f828cc66758acb40e9c5b4dcfd87fd478a14c8fb7f0630264e6c7fa0e57515d @@ -703,7 +703,7 @@ F src/auth.c 19b7ccacae3dfba23fc6f1d0af68134fa216e9040e53b0681b4715445ea030b4 F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523 F src/bitvec.c 501daeef838fa82a9fb53540d72f29e3d9172c8867f1e19f94f681e2e20b966e F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522 -F src/btree.c ff4f08bb55a31e29a36c4f65dbe69aab477b7266d309f6cec52d7a2dcd7b1730 +F src/btree.c 813f33fac1a87ecf4fb4ebfe650b5fd2f412cd37f676f6b1ca7834afed0e1d6b F src/btree.h bdeeb35614caa33526b603138f04c8d07a3f90a1300b5ade76848b755edf2027 F src/btreeInt.h 8efd30e75e35a3c6a1c4dad7410d4ddfcd560f5f46401b208fa79eceef34525a F src/build.c 16c64e2188f8515611063d2ddf15988025a6947117a64963f02cae852c832679 @@ -2217,8 +2217,9 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d033d9435007c7753d48f019626cf22c82569f93506a7e0158a09d5c4274baae ea9d88f9ca3399bca83bf03893689a927b73e481604b94527e42de43f103eb46 -R a12b52bffe95bd6ecfdaf987da9104d1 -U drh -Z 4bf425ebfa6b656fb8f55304562986f3 +P 3b131bd9aaca63f4b97d5b40a3b0d3e91b38a22c05efcb3aebf458ec494a2887 +Q +1de0c1b574d53c9bd2f2c6070b42e973d63d2a74f150836ed54c78614e286f92 +R 162e498513d4910fa8e89e99f05da809 +U dan +Z d9e2205b80b4d0d233e0e90d5cab4388 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f176210f6a..1d056d9bee 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3b131bd9aaca63f4b97d5b40a3b0d3e91b38a22c05efcb3aebf458ec494a2887 +137cc3e9e8b080678868da34e61f65faf5feb19f146bb7789c659bcdb8f5e950 diff --git a/src/btree.c b/src/btree.c index 57ad1211c7..dbf43c99d1 100644 --- a/src/btree.c +++ b/src/btree.c @@ -11993,13 +11993,13 @@ int sqlite3BtreeExclusiveLock(Btree *p){ if( pSchema ){ for(pE=sqliteHashFirst(&pSchema->tblHash); pE; pE=sqliteHashNext(pE)){ Table *pTab = (Table *)sqliteHashData(pE); - if( pTab->tnum==(int)pgnoRoot ){ + if( pTab->tnum==pgnoRoot ){ zObj = pTab->zName; zTab = 0; }else{ Index *pIdx; for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ - if( pIdx->tnum==(int)pgnoRoot ){ + if( pIdx->tnum==pgnoRoot ){ zObj = pIdx->zName; zTab = pTab->zName; } From ec23306ae108956e429fc2b4c6b922da5e7256a2 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 29 Aug 2024 23:26:21 +0000 Subject: [PATCH 108/113] Sync the amalgamation makefile for MSVC with the main makefile. FossilOrigin-Name: fcc4c3b4844c8f6babc0b97a4b7677d04a004b1ee8f319867f421c05e10d849f --- autoconf/Makefile.msc | 9 +++++++++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/autoconf/Makefile.msc b/autoconf/Makefile.msc index a4270fb2ae..f8a65e90cc 100644 --- a/autoconf/Makefile.msc +++ b/autoconf/Makefile.msc @@ -301,6 +301,7 @@ SQLITE3EXEPDB = /pdb:sqlite3sh.pdb # the Windows platform. # !IFNDEF OPT_FEATURE_FLAGS +OPT_FEATURE_FLAGS = $(OPT_XTRA) !IF $(MINIMAL_AMALGAMATION)==0 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_FTS3=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_FTS5=1 @@ -314,6 +315,14 @@ OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_BYTECODE_VTAB=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_COLUMN_METADATA=1 !ENDIF +# Additional feature-options above and beyond what are normally used can be +# be added using OPTIONS=.... on the command-line. These values are +# appended to the OPT_FEATURE_FLAGS variable. +# +!IFDEF OPTIONS +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) $(OPTIONS) +!ENDIF + # Should the session extension be enabled? If so, add compilation options # to enable it. # diff --git a/manifest b/manifest index 9e205d02f5..34f297447a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sall\sthe\slatest\strunk\senhancements\sinto\sthe\sbegin-concurrent\sbranch. -D 2024-08-29T23:24:32.050 +C Sync\sthe\samalgamation\smakefile\sfor\sMSVC\swith\sthe\smain\smakefile. +D 2024-08-29T23:26:21.094 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -17,7 +17,7 @@ F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 F autoconf/Makefile.am adedc1324b6a87fdd1265ddd336d2fb7d4f36a0e77b86ea553ae7cc4ea239347 F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.msc 7ac6c331fc3b8aa57b6782db995b8c0e49230352decd4e2662fd07c06a9ed623 +F autoconf/Makefile.msc 2aced6442addab13ed115696eba28d9ed29caa3dd604a31392c2c7a5da301492 F autoconf/README.first 6c4f34fe115ff55d4e8dbfa3cecf04a0188292f7 F autoconf/README.txt 42cfd21d0b19dc7d5d85fb5c405c5f3c6a4c923021c39128f6ba685355d8fd56 F autoconf/configure.ac ec7fa914c5e74ff212fe879f9bb6918e1234497e05facfb641f30c4d5893b277 @@ -2228,8 +2228,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 137cc3e9e8b080678868da34e61f65faf5feb19f146bb7789c659bcdb8f5e950 854b3776ee1fcaa5931e3a0ed104978ca350d218e553586d1c40c2420e1be498 -R 1cce3943839c33f0453e05fb83cf0e62 +P b05d30bec1c9dd51526fcf81bd9faed4e9531a82fe675e4aac9de113188a37eb +R f2863307ebd2c90a4f155e09c9964aa8 U drh -Z ac9c2afa6d9d9fd6856637638f11a6af +Z 63db90c711d296c07dc4a7d033467e76 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index b84de621de..668fc70c67 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b05d30bec1c9dd51526fcf81bd9faed4e9531a82fe675e4aac9de113188a37eb +fcc4c3b4844c8f6babc0b97a4b7677d04a004b1ee8f319867f421c05e10d849f From d9d80f59244325f5a34afe898d9ed51aa5d04949 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 11 Nov 2024 18:11:34 +0000 Subject: [PATCH 109/113] Optimize deferred allocation of pages on this branch by avoiding BTALLOC_LE. FossilOrigin-Name: 0812161025272851af6233f183a6abdee5c583decc688c4763965b50e7ab1b9d --- manifest | 16 +++++------ manifest.uuid | 2 +- src/btree.c | 18 ++++++++++-- test/concurrent9.test | 65 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 90 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 1051ac17bd..afb9e9f24f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthis\sbranch\swith\slatest\schanges\sand\sbuild\ssystem\supdates\sfrom\strunk. -D 2024-11-11T17:03:07.717 +C Optimize\sdeferred\sallocation\sof\spages\son\sthis\sbranch\sby\savoiding\sBTALLOC_LE. +D 2024-11-11T18:11:34.465 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -49,7 +49,7 @@ F autosetup/cc-shared.tcl 4f024e94a47f427ba61de1739f6381ef0080210f9fae89112d5c1d F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e45f F autosetup/jimsh0.c d40e381ea4526a067590e7b91bd4b2efa6d4980d286f908054c647b3df4aee14 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba -F autosetup/proj.tcl 9772d3f89634089add92e2238551a59a5c764d501327f6eb433dca7f98138802 w autosetup/hwaci-common.tcl +F autosetup/proj.tcl 9772d3f89634089add92e2238551a59a5c764d501327f6eb433dca7f98138802 F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad @@ -719,7 +719,7 @@ F src/auth.c 54ab9c6c5803b47c0d45b76ce27eff22a03b4b1f767c5945a3a4eb13aa4c78dc F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523 F src/bitvec.c 501daeef838fa82a9fb53540d72f29e3d9172c8867f1e19f94f681e2e20b966e F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522 -F src/btree.c ef31e2a2dacc4581b53ac679af2f3e9f8d40bf12999f7a2e62a9296059a77aef +F src/btree.c 9e32862e7369e8e5ee3f60f084cf40fb41cc1a8ba52a61093d08ecb3f941fd6c F src/btree.h df26089b055c4cffe243e5bc98edc729c4ad880bfeb8f229fd16248e4cec10ff F src/btreeInt.h 8efd30e75e35a3c6a1c4dad7410d4ddfcd560f5f46401b208fa79eceef34525a F src/build.c 196415a804a362dbae6d1939d6b8327d527fe08fb399834191e06d22a33a3aa4 @@ -1031,7 +1031,7 @@ F test/concurrent5.test 5031c87134fee85352ac33ad33c81c6ec4f07d5547fe2429e1d38492 F test/concurrent6.test a7860e9ca13bb5fb76bcf41c5524fbfa9c37e6e258ecf84ffb5748a272488c67 F test/concurrent7.test b96fa5c4cfdf8d5c0bc66b6934214500bad0260884a736f054ccc76e81aae85d F test/concurrent8.test b93937e74a8efb8b84f2fea7595b53418c5f29777bbe9cbdb5dc219b3dd72a7d -F test/concurrent9.test 92a7315092e54c7377e58cfce1c158aa55f6915a026aff27da00db088676101b +F test/concurrent9.test 25b6db3a56ee87208144a3793678d0dce5e10c5a600b1a13d4befb4ef19780c6 F test/conflict.test b705cddf025a675d3c13d62fa78ab1e2696fb8e07a3d7cccce1596ff8b301492 F test/conflict2.test 5557909ce683b1073982f5d1b61dfb1d41e369533bfdaf003180c5bc87282dd1 F test/conflict3.test 81865d9599609aca394fb3b9cd5f561d4729ea5b176bece3644f6ecb540f88ac @@ -2215,8 +2215,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P af43791d471c8d09df5cccb413ebcbfcaa234f0ab3d101b10facd32ef1f08a51 b81976c520fbad0bbdbbb877fe85691bcda25c12cf5597cfe224fb6306cd65b3 -R 77211ffd1f96f196f5f7446bb066afc4 +P 52bd7953f1ff26942e6e4227dd112d8454f60a98ef1c5f62ef123085c769069a +R 51355028405b6ebf515d12a5a6724571 U dan -Z 1b3b1af2e13d3cd199003d973ef91f6a +Z dee158dc87e41100c2ffca6b82aee077 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index fed2730f34..d9b063259c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -52bd7953f1ff26942e6e4227dd112d8454f60a98ef1c5f62ef123085c769069a +0812161025272851af6233f183a6abdee5c583decc688c4763965b50e7ab1b9d diff --git a/src/btree.c b/src/btree.c index 16f06db5b2..e4e28c1033 100644 --- a/src/btree.c +++ b/src/btree.c @@ -4569,8 +4569,22 @@ static int btreeRelocateRange( if( iNew==PENDING_BYTE_PAGE(pBt) ) iNew = ++(*pnCurrent); rc = relocatePage(pBt, pPg, pEntry->eType, pEntry->parent, iNew, 1); releasePageNotNull(pPg); - }else{ - rc = allocateBtreePage(pBt, &pFree, &iNew, iFirst-1, BTALLOC_LE); + }else if( pEntry->eType!=0 ){ + + /* Allocate a new page from the free-list to move page iPg to. + ** Except - if the page allocated is within the range being relocated + ** (i.e. pgno>=iFirst), then discard it and allocate another. */ + do { + rc = allocateBtreePage(pBt, &pFree, &iNew, 0, 0); + if( iNew>=iFirst ){ + assert( sqlite3PagerPageRefcount(pFree->pDbPage)==1 ); + assert( iNew>iPg ); + sqlite3PcacheDrop(pFree->pDbPage); + pMap->aPtr[iNew - pMap->iFirst].eType = 0; + pFree = 0; + } + }while( pFree==0 ); + assert( rc!=SQLITE_OK || iNew Date: Mon, 18 Nov 2024 16:44:45 +0000 Subject: [PATCH 110/113] Attempt to reduce divergence from trunk. FossilOrigin-Name: ae863439e88c0f1a8b605a15ab5115994b6556ebec3a41db38665d5e451e7293 --- ext/wasm/api/sqlite3-worker1-promiser.c-pp.js | 133 ++++++++++++++---- manifest | 14 +- manifest.uuid | 2 +- 3 files changed, 116 insertions(+), 33 deletions(-) diff --git a/ext/wasm/api/sqlite3-worker1-promiser.c-pp.js b/ext/wasm/api/sqlite3-worker1-promiser.c-pp.js index 0f1ae39eac..55e497ead5 100644 --- a/ext/wasm/api/sqlite3-worker1-promiser.c-pp.js +++ b/ext/wasm/api/sqlite3-worker1-promiser.c-pp.js @@ -1,3 +1,4 @@ +//#ifnot omit-oo1 /* 2022-08-24 @@ -41,9 +42,13 @@ - `onready` (optional, but...): this callback is called with no arguments when the worker fires its initial 'sqlite3-api'/'worker1-ready' message, which it does when - sqlite3.initWorker1API() completes its initialization. This is - the simplest way to tell the worker to kick off work at the - earliest opportunity. + sqlite3.initWorker1API() completes its initialization. This is the + simplest way to tell the worker to kick off work at the earliest + opportunity, and the only way to know when the worker module has + completed loading. The irony of using a callback for this, instead + of returning a promise from sqlite3Worker1Promiser() is not lost on + the developers: see sqlite3Worker1Promiser.v2() which uses a + Promise instead. - `onunhandled` (optional): a callback which gets passed the message event object for any worker.onmessage() events which @@ -114,7 +119,7 @@ by all client code except that which tests this API. The `row` property contains the row result in the form implied by the `rowMode` option (defaulting to `'array'`). The `rowNumber` is a - 1-based integer value incremented by 1 on each call into th + 1-based integer value incremented by 1 on each call into the callback. At the end of the result set, the same event is fired with @@ -122,8 +127,17 @@ the end of the result set has been reached. Note that the rows arrive via worker-posted messages, with all the implications of that. + + Notable shortcomings: + + - This API was not designed with ES6 modules in mind. Neither Firefox + nor Safari support, as of March 2023, the {type:"module"} flag to the + Worker constructor, so that particular usage is not something we're going + to target for the time being: + + https://developer.mozilla.org/en-US/docs/Web/API/Worker/Worker */ -self.sqlite3Worker1Promiser = function callee(config = callee.defaultConfig){ +globalThis.sqlite3Worker1Promiser = function callee(config = callee.defaultConfig){ // Inspired by: https://stackoverflow.com/a/52439530 if(1===arguments.length && 'function'===typeof arguments[0]){ const f = config; @@ -146,6 +160,7 @@ self.sqlite3Worker1Promiser = function callee(config = callee.defaultConfig){ if(!config.worker) config.worker = callee.defaultConfig.worker; if('function'===typeof config.worker) config.worker = config.worker(); let dbId; + let promiserFunc; config.worker.onmessage = function(ev){ ev = ev.data; debug('worker1.onmessage',ev); @@ -153,14 +168,14 @@ self.sqlite3Worker1Promiser = function callee(config = callee.defaultConfig){ if(!msgHandler){ if(ev && 'sqlite3-api'===ev.type && 'worker1-ready'===ev.result) { /*fired one time when the Worker1 API initializes*/ - if(config.onready) config.onready(); + if(config.onready) config.onready(promiserFunc); return; } msgHandler = handlerMap[ev.type] /* check for exec per-row callback */; if(msgHandler && msgHandler.onrow){ msgHandler.onrow(ev); return; - } + } if(config.onunhandled) config.onunhandled(arguments[0]); else err("sqlite3Worker1Promiser() unhandled worker message:",ev); return; @@ -182,19 +197,19 @@ self.sqlite3Worker1Promiser = function callee(config = callee.defaultConfig){ try {msgHandler.resolve(ev)} catch(e){msgHandler.reject(e)} }/*worker.onmessage()*/; - return function(/*(msgType, msgArgs) || (msgEnvelope)*/){ + return promiserFunc = function(/*(msgType, msgArgs) || (msgEnvelope)*/){ let msg; if(1===arguments.length){ msg = arguments[0]; }else if(2===arguments.length){ - msg = { - type: arguments[0], - args: arguments[1] - }; + msg = Object.create(null); + msg.type = arguments[0]; + msg.args = arguments[1]; + msg.dbId = msg.args.dbId; }else{ - toss("Invalid arugments for sqlite3Worker1Promiser()-created factory."); + toss("Invalid arguments for sqlite3Worker1Promiser()-created factory."); } - if(!msg.dbId) msg.dbId = dbId; + if(!msg.dbId && msg.type!=='open') msg.dbId = dbId; msg.messageId = genMsgId(msg); msg.departureTime = performance.now(); const proxy = Object.create(null); @@ -236,10 +251,13 @@ self.sqlite3Worker1Promiser = function callee(config = callee.defaultConfig){ return p; }; }/*sqlite3Worker1Promiser()*/; -self.sqlite3Worker1Promiser.defaultConfig = { + +globalThis.sqlite3Worker1Promiser.defaultConfig = { worker: function(){ -//#if target=es6-bundler-friendly - return new Worker("sqlite3-worker1.js"); +//#if target=es6-module + return new Worker(new URL("sqlite3-worker1-bundler-friendly.mjs", import.meta.url),{ + type: 'module' + }); //#else let theJs = "sqlite3-worker1.js"; if(this.currentScript){ @@ -247,17 +265,82 @@ self.sqlite3Worker1Promiser.defaultConfig = { src.pop(); theJs = src.join('/')+'/' + theJs; //sqlite3.config.warn("promiser currentScript, theJs =",this.currentScript,theJs); - }else{ - //sqlite3.config.warn("promiser self.location =",self.location); - const urlParams = new URL(self.location.href).searchParams; + }else if(globalThis.location){ + //sqlite3.config.warn("promiser globalThis.location =",globalThis.location); + const urlParams = new URL(globalThis.location.href).searchParams; if(urlParams.has('sqlite3.dir')){ theJs = urlParams.get('sqlite3.dir') + '/' + theJs; } } - return new Worker(theJs + self.location.search); + return new Worker(theJs + globalThis.location.search); +//#endif + } +//#ifnot target=es6-module + .bind({ + currentScript: globalThis?.document?.currentScript + }) //#endif - }.bind({ - currentScript: self?.document?.currentScript - }), + , onerror: (...args)=>console.error('worker1 promiser error',...args) -}; +}/*defaultConfig*/; + +/** + sqlite3Worker1Promiser.v2(), added in 3.46, works identically to + sqlite3Worker1Promiser() except that it returns a Promise instead + of relying an an onready callback in the config object. The Promise + resolves to the same factory function which + sqlite3Worker1Promiser() returns. + + If config is-a function or is an object which contains an onready + function, that function is replaced by a proxy which will resolve + after calling the original function and will reject if that + function throws. +*/ +sqlite3Worker1Promiser.v2 = function(config){ + let oldFunc; + if( 'function' == typeof config ){ + oldFunc = config; + config = {}; + }else if('function'===typeof config?.onready){ + oldFunc = config.onready; + delete config.onready; + } + const promiseProxy = Object.create(null); + config = Object.assign((config || Object.create(null)),{ + onready: async function(func){ + try { + if( oldFunc ) await oldFunc(func); + promiseProxy.resolve(func); + } + catch(e){promiseProxy.reject(e)} + } + }); + const p = new Promise(function(resolve,reject){ + promiseProxy.resolve = resolve; + promiseProxy.reject = reject; + }); + try{ + this.original(config); + }catch(e){ + promiseProxy.reject(e); + } + return p; +}.bind({ + /* We do this because clients are + recommended to delete globalThis.sqlite3Worker1Promiser. */ + original: sqlite3Worker1Promiser +}); + +//#if target=es6-module +/** + When built as a module, we export sqlite3Worker1Promiser.v2() + instead of sqlite3Worker1Promise() because (A) its interface is more + conventional for ESM usage and (B) the ESM option export option for + this API did not exist until v2 was created, so there's no backwards + incompatibility. +*/ +export default sqlite3Worker1Promiser.v2; +//#endif /* target=es6-module */ +//#else +/* Built with the omit-oo1 flag. */ +//#endif ifnot omit-oo1 diff --git a/manifest b/manifest index 8572ba1894..f7ae2083d1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sthe\slatest\strunk\senhancements\sinto\sthe\sbegin-concurrent\sbranch. -D 2024-11-18T15:18:45.241 +C Attempt\sto\sreduce\sdivergence\sfrom\strunk. +D 2024-11-18T16:44:45.315 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -649,7 +649,7 @@ F ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js bb5e96cd0fd6e1e54538256433f1c60a F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 9b86ca2d8276cf919fbc9ba2a10e9786033b64f92c2db844d951804dee6c4b4e F ext/wasm/api/sqlite3-vtab-helper.c-pp.js e809739d71e8b35dfe1b55d24d91f02d04239e6aef7ca1ea92a15a29e704f616 F ext/wasm/api/sqlite3-wasm.c 83f5e9f998e9fa4261eb84e9f092210e3ffe03895119f5ded0429eb34ab9d2be -F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js c5ac33e39f21a3481812d7333ca6e18853640d423a01960ca8dbc6e7c5c3c21c +F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js 46f303ba8ddd1b2f0a391798837beddfa72e8c897038c8047eda49ce7d5ed46b F ext/wasm/api/sqlite3-worker1.c-pp.js 5e8706c2c4af2a57fbcdc02f4e7ef79869971bc21bb8ede777687786ce1c92d5 F ext/wasm/batch-runner-sahpool.html e9a38fdeb36a13eac7b50241dfe7ae066fe3f51f5c0b0151e7baee5fce0d07a7 F ext/wasm/batch-runner-sahpool.js 54a3ac228e6c4703fe72fb65c897e19156263a51fe9b7e21d2834a45e876aabd @@ -2206,7 +2206,7 @@ F tool/stack_usage.tcl f8e71b92cdb099a147dad572375595eae55eca43 F tool/stripccomments.c 20b8aabc4694d0d4af5566e42da1f1a03aff057689370326e9269a9ddcffdc37 F tool/symbols-mingw.sh 4dbcea7e74768305384c9fd2ed2b41bbf9f0414d F tool/symbols.sh 1612bd947750e21e7b47befad5f6b3825b06cce0705441f903bf35ced65ae9b9 -F tool/tclConfigShToAutoDef.sh 44ec55046d86a3febb2cb3e099399b41794e80e9cd138eee7b9b016f819e882b x tool/tclConfigShToTcl.sh +F tool/tclConfigShToAutoDef.sh 44ec55046d86a3febb2cb3e099399b41794e80e9cd138eee7b9b016f819e882b x F tool/tclConfigShToMake.sh 7c065d81c2d178e15e45a77372c6e5a38b5a1b08755301cd6f20a3a862db7312 x F tool/varint.c 5d94cb5003db9dbbcbcc5df08d66f16071aee003 F tool/vdbe-compress.tcl fa2f37ab39b2a0087fafb6a7f3ce19503e25e624ffa8ed9951717ab72920c088 @@ -2215,8 +2215,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0812161025272851af6233f183a6abdee5c583decc688c4763965b50e7ab1b9d e1330ecf170436678c5c235557fb95b8acbf4fad62583edba4af03aff49afbc5 -R 9a4e43379d9c2fcaaa307e099edd9167 +P 680a2eaabb2a2fa5d52e89c99a37637aba2734ab782f63bd8cc1fb9802c3d9e0 +R 915c205e7d3ee7a75d7840f0cc912bd8 U drh -Z 5ad00ac21e27e2085f1e605551ac79a6 +Z ca371cf98e0e7f7c0063c8e9abafbf19 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 9b3e9f66c5..b30fb3564f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -680a2eaabb2a2fa5d52e89c99a37637aba2734ab782f63bd8cc1fb9802c3d9e0 +ae863439e88c0f1a8b605a15ab5115994b6556ebec3a41db38665d5e451e7293 From 91ceef8edecade2e60e54b00d2da47dd51cba764 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 18 Nov 2024 18:45:53 +0000 Subject: [PATCH 111/113] Reduce divergence from trunk. FossilOrigin-Name: c5d77671c4867f713ece13057b639da551e365c9de49728c401af50bffa420d7 --- ...NS.fiddle => EXPORTED_FUNCTIONS.fiddle.in} | 11 +- ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api | 72 -------- ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-core | 155 ++++++++++++++++++ ext/wasm/fiddle/{fiddle.html => index.html} | 31 +++- manifest | 16 +- manifest.uuid | 2 +- 6 files changed, 196 insertions(+), 91 deletions(-) rename ext/wasm/{EXPORTED_FUNCTIONS.fiddle => EXPORTED_FUNCTIONS.fiddle.in} (61%) delete mode 100644 ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api create mode 100644 ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-core rename ext/wasm/fiddle/{fiddle.html => index.html} (90%) diff --git a/ext/wasm/EXPORTED_FUNCTIONS.fiddle b/ext/wasm/EXPORTED_FUNCTIONS.fiddle.in similarity index 61% rename from ext/wasm/EXPORTED_FUNCTIONS.fiddle rename to ext/wasm/EXPORTED_FUNCTIONS.fiddle.in index b96ce4e67c..103704df10 100644 --- a/ext/wasm/EXPORTED_FUNCTIONS.fiddle +++ b/ext/wasm/EXPORTED_FUNCTIONS.fiddle.in @@ -1,7 +1,10 @@ -_fiddle_exec -_fiddle_interrupt -_fiddle_experiment -_fiddle_the_db _fiddle_db_arg _fiddle_db_filename +_fiddle_exec +_fiddle_experiment +_fiddle_interrupt +_fiddle_main _fiddle_reset_db +_fiddle_db_handle +_fiddle_db_vfs +_fiddle_export_db diff --git a/ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api b/ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api deleted file mode 100644 index 8f103c7c0b..0000000000 --- a/ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api +++ /dev/null @@ -1,72 +0,0 @@ -_sqlite3_bind_blob -_sqlite3_bind_double -_sqlite3_bind_int -_sqlite3_bind_int64 -_sqlite3_bind_null -_sqlite3_bind_parameter_count -_sqlite3_bind_parameter_index -_sqlite3_bind_text -_sqlite3_changes -_sqlite3_changes64 -_sqlite3_clear_bindings -_sqlite3_close_v2 -_sqlite3_column_blob -_sqlite3_column_bytes -_sqlite3_column_count -_sqlite3_column_count -_sqlite3_column_double -_sqlite3_column_int -_sqlite3_column_int64 -_sqlite3_column_name -_sqlite3_column_text -_sqlite3_column_type -_sqlite3_compileoption_get -_sqlite3_compileoption_used -_sqlite3_create_function_v2 -_sqlite3_data_count -_sqlite3_db_filename -_sqlite3_db_name -_sqlite3_errmsg -_sqlite3_error_offset -_sqlite3_errstr -_sqlite3_exec -_sqlite3_expanded_sql -_sqlite3_extended_errcode -_sqlite3_extended_result_codes -_sqlite3_finalize -_sqlite3_initialize -_sqlite3_interrupt -_sqlite3_libversion -_sqlite3_libversion_number -_sqlite3_open -_sqlite3_open_v2 -_sqlite3_prepare_v2 -_sqlite3_prepare_v3 -_sqlite3_reset -_sqlite3_result_blob -_sqlite3_result_double -_sqlite3_result_error -_sqlite3_result_error_code -_sqlite3_result_error_nomem -_sqlite3_result_error_toobig -_sqlite3_result_int -_sqlite3_result_null -_sqlite3_result_text -_sqlite3_sourceid -_sqlite3_sql -_sqlite3_step -_sqlite3_strglob -_sqlite3_strlike -_sqlite3_total_changes -_sqlite3_total_changes64 -_sqlite3_value_blob -_sqlite3_value_bytes -_sqlite3_value_double -_sqlite3_value_text -_sqlite3_value_type -_sqlite3_vfs_find -_sqlite3_vfs_register -_sqlite3_wasm_db_error -_sqlite3_wasm_enum_json -_malloc -_free diff --git a/ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-core b/ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-core new file mode 100644 index 0000000000..2578002ce4 --- /dev/null +++ b/ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-core @@ -0,0 +1,155 @@ +_malloc +_free +_realloc +_sqlite3_aggregate_context +_sqlite3_auto_extension +_sqlite3_bind_blob +_sqlite3_bind_double +_sqlite3_bind_int +_sqlite3_bind_int64 +_sqlite3_bind_null +_sqlite3_bind_parameter_count +_sqlite3_bind_parameter_index +_sqlite3_bind_parameter_name +_sqlite3_bind_pointer +_sqlite3_bind_text +_sqlite3_busy_handler +_sqlite3_busy_timeout +_sqlite3_cancel_auto_extension +_sqlite3_changes +_sqlite3_changes64 +_sqlite3_clear_bindings +_sqlite3_close_v2 +_sqlite3_collation_needed +_sqlite3_column_blob +_sqlite3_column_bytes +_sqlite3_column_count +_sqlite3_column_decltype +_sqlite3_column_double +_sqlite3_column_int +_sqlite3_column_int64 +_sqlite3_column_name +_sqlite3_column_text +_sqlite3_column_type +_sqlite3_column_value +_sqlite3_commit_hook +_sqlite3_compileoption_get +_sqlite3_compileoption_used +_sqlite3_complete +_sqlite3_context_db_handle +_sqlite3_create_collation +_sqlite3_create_collation_v2 +_sqlite3_create_function +_sqlite3_create_function_v2 +_sqlite3_data_count +_sqlite3_db_filename +_sqlite3_db_handle +_sqlite3_db_name +_sqlite3_db_readonly +_sqlite3_db_status +_sqlite3_deserialize +_sqlite3_errcode +_sqlite3_errmsg +_sqlite3_error_offset +_sqlite3_errstr +_sqlite3_exec +_sqlite3_expanded_sql +_sqlite3_extended_errcode +_sqlite3_extended_result_codes +_sqlite3_file_control +_sqlite3_finalize +_sqlite3_free +_sqlite3_get_auxdata +_sqlite3_get_autocommit +_sqlite3_initialize +_sqlite3_interrupt +_sqlite3_is_interrupted +_sqlite3_keyword_count +_sqlite3_keyword_name +_sqlite3_keyword_check +_sqlite3_last_insert_rowid +_sqlite3_libversion +_sqlite3_libversion_number +_sqlite3_limit +_sqlite3_malloc +_sqlite3_malloc64 +_sqlite3_msize +_sqlite3_open +_sqlite3_open_v2 +_sqlite3_overload_function +_sqlite3_prepare_v2 +_sqlite3_prepare_v3 +_sqlite3_randomness +_sqlite3_realloc +_sqlite3_realloc64 +_sqlite3_reset +_sqlite3_reset_auto_extension +_sqlite3_result_blob +_sqlite3_result_double +_sqlite3_result_error +_sqlite3_result_error_code +_sqlite3_result_error_nomem +_sqlite3_result_error_toobig +_sqlite3_result_int +_sqlite3_result_int64 +_sqlite3_result_null +_sqlite3_result_pointer +_sqlite3_result_subtype +_sqlite3_result_text +_sqlite3_result_zeroblob +_sqlite3_result_zeroblob64 +_sqlite3_rollback_hook +_sqlite3_serialize +_sqlite3_set_auxdata +_sqlite3_set_last_insert_rowid +_sqlite3_shutdown +_sqlite3_sourceid +_sqlite3_sql +_sqlite3_status +_sqlite3_status64 +_sqlite3_step +_sqlite3_stmt_busy +_sqlite3_stmt_explain +_sqlite3_stmt_isexplain +_sqlite3_stmt_readonly +_sqlite3_stmt_status +_sqlite3_strglob +_sqlite3_stricmp +_sqlite3_strlike +_sqlite3_strnicmp +_sqlite3_table_column_metadata +_sqlite3_total_changes +_sqlite3_total_changes64 +_sqlite3_trace_v2 +_sqlite3_txn_state +_sqlite3_update_hook +_sqlite3_uri_boolean +_sqlite3_uri_int64 +_sqlite3_uri_key +_sqlite3_uri_parameter +_sqlite3_user_data +_sqlite3_value_blob +_sqlite3_value_bytes +_sqlite3_value_double +_sqlite3_value_dup +_sqlite3_value_free +_sqlite3_value_frombind +_sqlite3_value_int +_sqlite3_value_int64 +_sqlite3_value_nochange +_sqlite3_value_numeric_type +_sqlite3_value_pointer +_sqlite3_value_subtype +_sqlite3_value_text +_sqlite3_value_type +_sqlite3_vfs_find +_sqlite3_vfs_register +_sqlite3_vfs_unregister +_sqlite3_vtab_collation +_sqlite3_vtab_distinct +_sqlite3_vtab_in +_sqlite3_vtab_in_first +_sqlite3_vtab_in_next +_sqlite3_vtab_nochange +_sqlite3_vtab_on_conflict +_sqlite3_vtab_rhs_value diff --git a/ext/wasm/fiddle/fiddle.html b/ext/wasm/fiddle/index.html similarity index 90% rename from ext/wasm/fiddle/fiddle.html rename to ext/wasm/fiddle/index.html index 3570b283e3..f779749319 100644 --- a/ext/wasm/fiddle/fiddle.html +++ b/ext/wasm/fiddle/index.html @@ -9,7 +9,6 @@ two lines and ensure that these files are on the web server. --> - @@ -273,11 +297,6 @@ - diff --git a/manifest b/manifest index bdfee1251e..b65c927fd8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Realign\sthe\sbegin-concurrent\sbranch\swith\strunk. -D 2024-11-18T16:52:05.400 +C Reduce\sdivergence\sfrom\strunk. +D 2024-11-18T18:45:53.682 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -618,7 +618,7 @@ F ext/session/sqlite3changebatch.h e72016998c9a22d439ddfd547b69e1ebac810c24 F ext/session/sqlite3session.c 6e8fcd7f83d765d17e3f58f528d298e5742759faf2207b8c3b44dcd43d1c6640 F ext/session/sqlite3session.h a1f5b299b2cd41ddb638c4b3b20cf00413aada7e6d897e9534490c3c74a8c873 F ext/session/test_session.c c17515ec28b17178b2c4ae97e3f9927bd22da585a205fae13a1b400a4abd0394 -F ext/wasm/EXPORTED_FUNCTIONS.fiddle 7fb73f7150ab79d83bb45a67d257553c905c78cd3d693101699243f36c5ae6c3 +F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c F ext/wasm/GNUmakefile 311aa0d5edc7006409962cc77cc26560d92f9be69c2c4302e8bbc68189fd02db F ext/wasm/README-dist.txt 6382cb9548076fca472fb3330bbdba3a55c1ea0b180ff9253f084f07ff383576 F ext/wasm/README.md a8a2962c3aebdf8d2104a9102e336c5554e78fc6072746e5daf9c61514e7d193 @@ -627,7 +627,7 @@ F ext/wasm/SQLTester/SQLTester.mjs 66e1adc3d79467b68e3e40614fd42c1a577c7e219ec09 F ext/wasm/SQLTester/SQLTester.run.mjs 57f2adb33f43f2784abbf8026c1bfd049d8013af1998e7dcb8b50c89ffc332e0 F ext/wasm/SQLTester/index.html 64f3435084c7d6139b08d1f2a713828a73f68de2ae6a3112cbb5980d991ba06f F ext/wasm/SQLTester/touint8array.c 2d5ece04ec1393a6a60c4bf96385bda5e1a10ad49f3038b96460fc5e5aa7e536 -F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api c5eaceabb9e759aaae7d3101a4a3e542f96ab2c99d89a80ce20ec18c23115f33 +F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-core 2bcbbfe3b95c043ed6037e2708a2ee078d212dd1612c364f93588d8dc97300fe F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-extras fe40d6d758646e38f8b15f709044951e10884214f5453d35502100179c388c13 F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-see fb29e62082a658f0d81102488414d422c393c4b20cc2f685b216bc566237957b F ext/wasm/api/EXPORTED_RUNTIME_METHODS.sqlite3-api 1ec3c73e7d66e95529c3c64ac3de2470b0e9e7fbf7a5b41261c367cf4f1b7287 @@ -673,8 +673,8 @@ F ext/wasm/dist.make 653e212c1e84aa3be168d62a10616ccea45ee9585b0192745d2706707a5 F ext/wasm/example_extra_init.c 2347cd69d19d839ef4e5e77b7855103a7fe3ef2af86f2e8c95839afd8b05862f F ext/wasm/fiddle.make d4969f0322a582c57a22ce3541f10a5b09a609d14eab32891f613f43b3c14d8b F ext/wasm/fiddle/fiddle-worker.js 850e66fce39b89d59e161d1abac43a181a4caa89ddeea162765d660277cd84ce -F ext/wasm/fiddle/fiddle.html 550c5aafce40bd218de9bf26192749f69f9b10bc379423ecd2e162bcef885c08 F ext/wasm/fiddle/fiddle.js b444a5646a9aac9f3fc06c53d78af5e1912eb235d69a8e6010723e4eb0e9d4a1 +F ext/wasm/fiddle/index.html c79b1741cbeba78f88af0a84cf5ec7de87a909a6a8d10a369b1f4824c66c2088 F ext/wasm/index-dist.html 564b5ec5669676482c5a25dea9e721d8eafed426ecb155f93d29aeff8507511f F ext/wasm/index.html e4bbffdb3d40eff12b3f9c7abedef91787e2935620b7f8d40f2c774b80ad8fa9 F ext/wasm/jaccwabyt/jaccwabyt.js 1264710db3cfbcb6887d95665b7aeba60c1126eaef789ca4cf1a4a17d5bc7f54 @@ -2215,8 +2215,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P ae863439e88c0f1a8b605a15ab5115994b6556ebec3a41db38665d5e451e7293 f783d90187fb326faa3d0244b30138b023c4a8483486f260b7a022a927c13f3a -R 57251d83a90e449d1e470f9cd1545c73 +P b92c9a66ba78d4c435aac74426904ba56dc5846306187686e2fd818b631178b8 +R d460e39b7c2053c66d076ba14a431bf1 U drh -Z 5b8e719b599c4f1dc64f08075b4872fd +Z 14ee37a1fd6dc207f1a1673dd0f85278 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 10d060def4..6ac5458916 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b92c9a66ba78d4c435aac74426904ba56dc5846306187686e2fd818b631178b8 +c5d77671c4867f713ece13057b639da551e365c9de49728c401af50bffa420d7 From 678531caf306ac606beefdd3f415e296569badf0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 16 Dec 2024 12:09:02 +0000 Subject: [PATCH 112/113] Remove unnecessary divergence from trunk. FossilOrigin-Name: 019b04342861589cd3bf64006f30b682d8c778b685cefd071327acefba8e55b1 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/btree.c | 3 +-- src/btree.h | 1 + src/pager.h | 1 - src/test1.c | 6 +++--- src/wal.c | 16 ++++++++-------- 7 files changed, 24 insertions(+), 25 deletions(-) diff --git a/manifest b/manifest index f3874e3873..03501604a8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sthe\slatest\strunk\senhancements\sinto\sthe\sbegin-concurrent\sbranch. -D 2024-12-16T11:19:00.567 +C Remove\sunnecessary\sdivergence\sfrom\strunk. +D 2024-12-16T12:09:02.980 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -721,8 +721,8 @@ F src/auth.c 54ab9c6c5803b47c0d45b76ce27eff22a03b4b1f767c5945a3a4eb13aa4c78dc F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523 F src/bitvec.c 501daeef838fa82a9fb53540d72f29e3d9172c8867f1e19f94f681e2e20b966e F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522 -F src/btree.c 9e32862e7369e8e5ee3f60f084cf40fb41cc1a8ba52a61093d08ecb3f941fd6c -F src/btree.h df26089b055c4cffe243e5bc98edc729c4ad880bfeb8f229fd16248e4cec10ff +F src/btree.c bf5db62990845b15fb98117418124de85bf1a664071278d958e8f27e5c516a50 +F src/btree.h 65b1b3e1d28c4e2f52a85aebdfb536508084cfe0f843fda3102cfdd4e23a209f F src/btreeInt.h 8efd30e75e35a3c6a1c4dad7410d4ddfcd560f5f46401b208fa79eceef34525a F src/build.c 196415a804a362dbae6d1939d6b8327d527fe08fb399834191e06d22a33a3aa4 F src/callback.c db3a45e376deff6a16c0058163fe0ae2b73a2945f3f408ca32cf74960b28d490 @@ -770,7 +770,7 @@ F src/os_unix.c 24a82109b67c1771500c1f398eda0278d95f9c3bedc71d2cb1a48db39a56a787 F src/os_win.c 49c7725b500f5867e8360e75eeb30f9d70b62fa1f05c8a101da627210578df32 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 4c8b569b6745efd0e2af57ac00b9a4c73451b8aa0ed51fedecbaa7523c1111bb -F src/pager.h e2df6b92e0402bc8d516016f361da82758b7d7769ef1a18e2abeadece18103e0 +F src/pager.h 597ed34563ffa2588e37e556e2f0f9326f62492a459330ed3aaf6739f1e6a665 F src/parse.y 5e6958ec69f538fe98f22dda2ace520eabcda314c651f48546ce72c8c0b4e221 F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484 F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5 @@ -793,7 +793,7 @@ F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 F src/tclsqlite.c 90441d3cc16f966a23499d9096a3d2d971e5e8fddb4d1413b096b79c2b2cff07 F src/tclsqlite.h 65e2c761446e1c9fa0342b7d2612a703483643c8b6a316d12a65b745a4727395 -F src/test1.c 9c64f39482d44bb82f610179256951140b6917e7a08712d3dd604d3a0757275a +F src/test1.c 6d9f60d9cc68787429de46a9ef62e10c1460112bb6366ab6ca003a3a509f6bd3 F src/test2.c 7ebc518e6735939d8979273a6f7b1d9b5702babf059f6ad62499f7f60a9eb9a3 F src/test3.c e7573aa0f78ee4e070a4bc8c3493941c1aa64d5c66d4825c74c0f055451f432b F src/test4.c 13e57ae7ec7a959ee180970aef09deed141252fe9bb07c61054f0dfa4f1dfd5d @@ -863,7 +863,7 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8 F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3 F src/vtab.c 316cd48e9320660db3047cd306cd056e4361180cebb4d0f10a39244e10c11422 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 3f6502c1e35aafcc972d1fbc085e7d92e12073fd9cec1f45c47aeefdb94b9755 +F src/wal.c c6add778fbb08ff7c5ec3663595e49140ec4472895c748b48766fa2db8ddc7b3 F src/wal.h e9aeb67102d9b9a0b089b80bd6136a16dd6360ac3daa731f2b71c6d4f8341717 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 F src/where.c 9ad3dea8003a8913da6a4ca8322e2fe30773f46e88a0d4fbf9db13bdb999efa2 @@ -2219,8 +2219,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 3823295299f7f834e0be1310083afd106ade84b87c27839e68c78676fc8982df ed5e912622839dce76dfb7352b56bb6fc698ecffde195f48db8d3339e9628cb5 -R e2daab5e54b7d69bb422accea922ede5 +P faef90eac3925341df958825d80466d737b478d4f0bdaead73f0e069770e923a +R 1f747555ec6d9ac4f6898cf3a2eeefc2 U drh -Z 00ce49d8912aca64275b86cfbabf0e7a +Z c36104dc4fc3746611f1b61b64c32712 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2622d37433..9115f393e9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -faef90eac3925341df958825d80466d737b478d4f0bdaead73f0e069770e923a +019b04342861589cd3bf64006f30b682d8c778b685cefd071327acefba8e55b1 diff --git a/src/btree.c b/src/btree.c index e4e28c1033..43c72b7fe5 100644 --- a/src/btree.c +++ b/src/btree.c @@ -761,7 +761,7 @@ static void btreePtrmapCheck(BtShared *pBt, Pgno nPage){ # define btreePtrmapCheck(y,z) #endif /* SQLITE_OMIT_CONCURRENT */ -static void releasePage(MemPage *pPage); /* Forward reference */ +static void releasePage(MemPage *pPage); /* Forward reference */ static void releasePageOne(MemPage *pPage); /* Forward reference */ static void releasePageNotNull(MemPage *pPage); /* Forward reference */ @@ -4727,7 +4727,6 @@ int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zSuperJrnl){ if( p->inTrans==TRANS_WRITE ){ BtShared *pBt = p->pBt; sqlite3BtreeEnter(p); - #ifndef SQLITE_OMIT_AUTOVACUUM if( pBt->autoVacuum ){ assert( ISCONCURRENT==0 ); diff --git a/src/btree.h b/src/btree.h index e685d981f7..7cd16a470c 100644 --- a/src/btree.h +++ b/src/btree.h @@ -422,4 +422,5 @@ void sqlite3BtreeClearCache(Btree*); # define sqlite3SchemaMutexHeld(X,Y,Z) 1 #endif + #endif /* SQLITE_BTREE_H */ diff --git a/src/pager.h b/src/pager.h index 2cbe4545ae..609a04a955 100644 --- a/src/pager.h +++ b/src/pager.h @@ -171,7 +171,6 @@ int sqlite3PagerOpenSavepoint(Pager *pPager, int n); int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint); int sqlite3PagerSharedLock(Pager *pPager); - #ifndef SQLITE_OMIT_WAL int sqlite3PagerCheckpoint(Pager *pPager, sqlite3*, int, int*, int*); int sqlite3PagerWalSupported(Pager *pPager); diff --git a/src/test1.c b/src/test1.c index a10230bc01..7057b2e481 100644 --- a/src/test1.c +++ b/src/test1.c @@ -9096,9 +9096,9 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ { "sqlite3_snapshot_open_blob", test_snapshot_open_blob, 0 }, { "sqlite3_snapshot_cmp_blob", test_snapshot_cmp_blob, 0 }, #endif - { "sqlite3_delete_database", test_delete_database, 0 }, - { "sqlite3_wal_info", test_wal_info, 0 }, - { "atomic_batch_write", test_atomic_batch_write, 0 }, + { "sqlite3_delete_database", test_delete_database, 0 }, + { "sqlite3_wal_info", test_wal_info, 0 }, + { "atomic_batch_write", test_atomic_batch_write, 0 }, { "sqlite3_mmap_warm", test_mmap_warm, 0 }, { "sqlite3_config_sorterref", test_config_sorterref, 0 }, { "sqlite3_autovacuum_pages", test_autovacuum_pages, 0 }, diff --git a/src/wal.c b/src/wal.c index ec57a8e8d6..be2d1991c0 100644 --- a/src/wal.c +++ b/src/wal.c @@ -3521,7 +3521,8 @@ static int walFindFrame( return SQLITE_OK; } - /* Each iteration of the following for() loop searches one + /* Search the hash table or tables for an entry matching page number + ** pgno. Each iteration of the following for() loop searches one ** hash table (each hash table indexes up to HASHTABLE_NPAGE frames). ** ** This code might run concurrently to the code in walIndexAppend() @@ -3977,10 +3978,10 @@ int sqlite3WalUndo( Pgno iMax = pWal->hdr.mxFrame; Pgno iFrame; - /* Restore the clients cache of the wal-index header to the state it - ** was in before the client began writing to the database. - */ SEH_TRY { + /* Restore the clients cache of the wal-index header to the state it + ** was in before the client began writing to the database. + */ memcpy(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr)); #ifndef SQLITE_OMIT_CONCURRENT if( bConcurrent ){ @@ -3989,7 +3990,6 @@ int sqlite3WalUndo( #else UNUSED_PARAMETER(bConcurrent); #endif - for(iFrame=pWal->hdr.mxFrame+1; ALWAYS(rc==SQLITE_OK) && iFrame<=iMax; iFrame++ @@ -4009,7 +4009,8 @@ int sqlite3WalUndo( rc = xUndo(pUndoCtx, walFramePgno(pWal, iFrame)); } if( iMax!=pWal->hdr.mxFrame ) walCleanupHash(pWal); - } SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; ) + } + SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; ) } return rc; } @@ -4372,7 +4373,6 @@ static int walFrames( p->flags |= PGHDR_WAL_APPEND; } - /* Recalculate checksums within the wal file if required. */ if( isCommit && pWal->iReCksum ){ rc = walRewriteChecksums(pWal, iFrame); @@ -4589,7 +4589,7 @@ int sqlite3WalCheckpoint( }else{ rc = walCheckpoint(pWal, db, eMode2, xBusy2, pBusyArg, sync_flags, zBuf); } - + /* If no error occurred, set the output variables. */ if( rc==SQLITE_OK || rc==SQLITE_BUSY ){ if( pnLog ) *pnLog = (int)pWal->hdr.mxFrame; From 3653b14ea2b320db50c01af469ca1fab21531bee Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 20 Sep 2025 10:34:44 +0000 Subject: [PATCH 113/113] Fix the build for testfixture. Fix the walckptnoop.test script. FossilOrigin-Name: 5d2766f8920b3146d46ee0bda550db4a6bb862a93d30c8e1afc6fb6abe7ea2cf --- main.mk | 1 - manifest | 14 +++++++------- manifest.uuid | 2 +- test/walckptnoop.test | 13 ++++++++----- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/main.mk b/main.mk index 53b54d5f39..f69832b0f5 100644 --- a/main.mk +++ b/main.mk @@ -878,7 +878,6 @@ TESTSRC2 = \ $(TOP)/ext/fts3/fts3_write.c \ $(TOP)/ext/session/sqlite3session.c \ $(TOP)/ext/misc/stmt.c \ - $(TOP)/ext/session/test_session.c \ fts5.c # Header files used by all library source files. diff --git a/manifest b/manifest index 64b226e37a..8bf7d58b36 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sall\sthe\slatest\strunk\senhancements\sinto\sthe\sbegin-concurrent\sbranch.\nAfter\sthis\smerge,\sthere\sare\ssome\serrors\sin\sthe\snew\swalckptnoop.test\smodule,\nwhich\sneed\sto\sbe\sfixed\sby\sa\sfollow-on\spatch. -D 2025-09-20T10:14:56.182 +C Fix\sthe\sbuild\sfor\stestfixture.\s\sFix\sthe\swalckptnoop.test\sscript. +D 2025-09-20T10:34:44.110 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -671,7 +671,7 @@ F ext/wasm/tests/opfs/sahpool/sahpool-pausing.js f264925cfc82155de38cecb3d204c36 F ext/wasm/tests/opfs/sahpool/sahpool-worker.js bd25a43fc2ab2d1bafd8f2854ad3943ef673f7c3be03e95ecf1612ff6e8e2a61 F ext/wasm/wasmfs.make 411dd94b40406572caddf88392a1ccc4deed0f88d260516e59ca6e0c887ee861 F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0 -F main.mk 36142d6c5f95e3faa5fa45d761203b98c5738a3606b7067e083e85fa4eb95421 +F main.mk df12eba3fcd95d574e4645781fa6d0ef6c34e6db8ea6687ba582c9b054481ef2 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421 @@ -1996,7 +1996,7 @@ F test/wal_common.tcl 204d1721ac13c5e0c7fae6380315b5ab7f4e8423f580d826c5e9df1995 F test/walbak.test 018d4e5a3d45c6298d11b99f09a8ef6876527946 F test/walbig.test f437473a16cfb314867c6b5d1dbcd519e73e3434 F test/walblock.test 6bb472e82730e7e4e81395e907a01d8cfc2bd9e1f01f8a9184ca572e2955a4bf -F test/walckptnoop.test a66e79e9afd5b4b46c65bfc77e57ed37259cedef91e4bd60ae7f64ff9f2e1962 +F test/walckptnoop.test be8f95eaabea34e45b09bd2bd378c17f974eaff6d2a3f67853bded473832128f F test/walcksum.test 50e204500eed9c691b6045e467bb2923f49aa93d8adf315e2be135fdb202c1c2 F test/walcrash.test 21038858cc552077b0522f50b0fa87e38139306a F test/walcrash2.test a0edab4e5390f03b99a790de89aad15d6ec70b36 @@ -2192,8 +2192,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0b2979f0c032859d8b080e58faf490d936dba08ecb67861537d7cd89e0d0ae25 0b14fd35ca37075bb65b2ab398f3324dc851347b1c042566eac23724013653f8 -R 841d5b6867bcf3ee5cc626a077f86488 +P 2d54e221b81e93e52243e6f60de8143efbb83df0631e72c3444f725181806409 +R d4b5f1bd2df831d62f13dc3965ca949d U drh -Z 17335537fbdb63a42d2e0b105b8b37b3 +Z 5b96f550c10deaa782adfa3db3fff4fc # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 1da49572c4..135121cfb3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2d54e221b81e93e52243e6f60de8143efbb83df0631e72c3444f725181806409 +5d2766f8920b3146d46ee0bda550db4a6bb862a93d30c8e1afc6fb6abe7ea2cf diff --git a/test/walckptnoop.test b/test/walckptnoop.test index f93c4c238f..5322bc5cfd 100644 --- a/test/walckptnoop.test +++ b/test/walckptnoop.test @@ -38,24 +38,27 @@ do_execsql_test 1.0 { INSERT INTO t1 SELECT NULL, hex(randomblob(64)) FROM s; } {0 wal} +unset -nocomplain N +set N [lindex [db eval {PRAGMA wal_checkpoint = noop}] 1] + do_execsql_test 1.1 { PRAGMA wal_checkpoint = noop; -} {0 320 0} +} [list 0 $N 0] do_execsql_test 1.2 { PRAGMA wal_checkpoint = noop; -} {0 320 0} +} [list 0 $N 0] do_execsql_test 1.3 { PRAGMA wal_checkpoint = passive; -} {0 320 320} +} [list 0 $N $N] do_execsql_test 1.4 { PRAGMA wal_checkpoint = noop; -} {0 320 320} +} [list 0 $N $N] db_save_and_close db_restore_and_reopen do_execsql_test 1.5 { PRAGMA wal_checkpoint = noop; -} {0 320 0} +} [list 0 $N 0] db close sqlite3 db test.db