From 9d33d9e7ac064aed9de16d25544c7f45dcb76465 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 10 Mar 2020 01:24:13 +0000 Subject: [PATCH 001/103] Background work for experiments trying to enhance ANALYZE so that it runs off of samples of the entire index and does not need to read the entire index. FossilOrigin-Name: 29d1cc5c3619a88229f18c3c8131228f8a2d151ac3d9203f0c7fc538a996ecec --- manifest | 15 +++++---- manifest.uuid | 2 +- src/analyze.c | 90 +++++++++++++++++++++++++++++---------------------- 3 files changed, 61 insertions(+), 46 deletions(-) diff --git a/manifest b/manifest index 9f3c8dd408..3cb4d4a724 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Cleaner\sseparation\sof\sthe\sSTAT4-specific\slogic\sin\sthe\simplementation\sof\nANALYZE. -D 2020-03-09T18:26:11.821 +C Background\swork\sfor\sexperiments\strying\sto\senhance\sANALYZE\sso\sthat\sit\sruns\noff\sof\ssamples\sof\sthe\sentire\sindex\sand\sdoes\snot\sneed\sto\sread\sthe\sentire\nindex. +D 2020-03-10T01:24:13.546 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -466,7 +466,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c f48a4423c8f198d7f1ae4940f74b606707d05384ac79fb219be8e3323af2a2de -F src/analyze.c 831bb090988477a00d3b4c000746e1b0454dcc93b10b793e6ebe1c47f25d193a +F src/analyze.c cc3401286f1ff97aba5f2d94a2e8f9108beeaa25fa67faee090c38e387db396f F src/attach.c fa5addce233a2bb2dfdefeee3b37000e154c47214d3269cab1bb331416e330db F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b @@ -1860,7 +1860,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 cab1834cfc71f71bfed3c5170a0ba40a39385c3b2c50b7c6b6f09cc830dd1b1e -R c62e646df7b5e5719c4a0602837bf1ef +P 3df07e5a9a3781a4cf866fc6ee0e5c6f9cd7ca35ce0a6eb3aa7f5f3502e0ffae +R e35bdeff6c928526c7218be9d4bb475b +T *branch * approximate-analyze +T *sym-approximate-analyze * +T -sym-trunk * U drh -Z 8147aa7ce1e35e16be35124cd1704d38 +Z 2efa3c6a2e23594b6e9a59be6c71be4b diff --git a/manifest.uuid b/manifest.uuid index e08451b6b2..a3157116f9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3df07e5a9a3781a4cf866fc6ee0e5c6f9cd7ca35ce0a6eb3aa7f5f3502e0ffae \ No newline at end of file +29d1cc5c3619a88229f18c3c8131228f8a2d151ac3d9203f0c7fc538a996ecec \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index eee71fbbde..7db62919bd 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -188,6 +188,11 @@ static void openStatTable( Vdbe *v = sqlite3GetVdbe(pParse); int aRoot[ArraySize(aTable)]; u8 aCreateTbl[ArraySize(aTable)]; +#ifdef SQLITE_ENABLE_STAT4 + const int nToOpen = OptimizationEnabled(db,SQLITE_Stat4) ? 2 : 1; +#else + const int nToOpen = 1; +#endif if( v==0 ) return; assert( sqlite3BtreeHoldsAllMutexes(db) ); @@ -200,8 +205,9 @@ static void openStatTable( for(i=0; izDbSName))==0 ){ - if( aTable[i].zCols ){ + if( iregRoot. This is important @@ -217,7 +223,6 @@ static void openStatTable( ** associated with the table zWhere. If zWhere is NULL, delete the ** entire contents of the table. */ aRoot[i] = pStat->tnum; - aCreateTbl[i] = 0; sqlite3TableLock(pParse, iDb, aRoot[i], 1, zTab); if( zWhere ){ sqlite3NestedParse(pParse, @@ -236,7 +241,7 @@ static void openStatTable( } /* Open the sqlite_stat[134] tables for writing. */ - for(i=0; aTable[i].zCols; i++){ + for(i=0; inCol; i++) sampleClear(p->db, p->aBest+i); - for(i=0; imxSample; i++) sampleClear(p->db, p->a+i); - sampleClear(p->db, &p->current); + if( p->mxSample ){ + int i; + for(i=0; inCol; i++) sampleClear(p->db, p->aBest+i); + for(i=0; imxSample; i++) sampleClear(p->db, p->a+i); + sampleClear(p->db, &p->current); + } #endif sqlite3DbFree(p->db, p); } @@ -400,7 +407,7 @@ static void statInit( int n; /* Bytes of space to allocate */ sqlite3 *db; /* Database connection */ #ifdef SQLITE_ENABLE_STAT4 - int mxSample = SQLITE_STAT4_SAMPLES; + int mxSample = sqlite3_value_int(argv[2]) ? SQLITE_STAT4_SAMPLES : 0; #endif /* Decode the three function arguments */ @@ -437,7 +444,7 @@ static void statInit( p->current.anEq = &p->current.anDLt[nColUp]; #ifdef SQLITE_ENABLE_STAT4 - { + if( mxSample ){ u8 *pSpace; /* Allocated space not yet assigned */ int i; /* Used to iterate through p->aSample[] */ @@ -704,7 +711,7 @@ static void statPush( }else{ /* Second and subsequent calls get processed here */ #ifdef SQLITE_ENABLE_STAT4 - samplePushPrevious(p, iChng); + if( p->mxSample ) samplePushPrevious(p, iChng); #endif /* Update anDLt[], anLt[] and anEq[] to reflect the values that apply @@ -715,26 +722,24 @@ static void statPush( for(i=iChng; inCol; i++){ p->current.anDLt[i]++; #ifdef SQLITE_ENABLE_STAT4 - p->current.anLt[i] += p->current.anEq[i]; + if( p->mxSample ) p->current.anLt[i] += p->current.anEq[i]; #endif p->current.anEq[i] = 1; } } p->nRow++; #ifdef SQLITE_ENABLE_STAT4 - if( sqlite3_value_type(argv[2])==SQLITE_INTEGER ){ - sampleSetRowidInt64(p->db, &p->current, sqlite3_value_int64(argv[2])); - }else{ - sampleSetRowid(p->db, &p->current, sqlite3_value_bytes(argv[2]), - sqlite3_value_blob(argv[2])); - } - p->current.iHash = p->iPrn = p->iPrn*1103515245 + 12345; -#endif - -#ifdef SQLITE_ENABLE_STAT4 - { - tRowcnt nLt = p->current.anLt[p->nCol-1]; + if( p->mxSample ){ + tRowcnt nLt; + if( sqlite3_value_type(argv[2])==SQLITE_INTEGER ){ + sampleSetRowidInt64(p->db, &p->current, sqlite3_value_int64(argv[2])); + }else{ + sampleSetRowid(p->db, &p->current, sqlite3_value_bytes(argv[2]), + sqlite3_value_blob(argv[2])); + } + p->current.iHash = p->iPrn = p->iPrn*1103515245 + 12345; + nLt = p->current.anLt[p->nCol-1]; /* Check if this is to be a periodic sample. If so, add it. */ if( (nLt/p->nPSample)!=(nLt+1)/p->nPSample ){ p->current.isPSample = 1; @@ -804,6 +809,7 @@ static void statGet( || eCall==STAT_GET_ROWID || eCall==STAT_GET_NLT || eCall==STAT_GET_NDLT ); + assert( eCall==STAT_GET_STAT1 || p->mxSample ); if( eCall==STAT_GET_STAT1 ) #else assert( argc==1 ); @@ -1089,7 +1095,11 @@ static void analyzeOneTable( ** The third argument is only used for STAT4 */ #ifdef SQLITE_ENABLE_STAT4 - sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regStat4+3); + if( OptimizationEnabled(db, SQLITE_Stat4) ){ + sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regStat4+3); + }else{ + sqlite3VdbeAddOp2(v, OP_Integer, 0, regStat4+3); + } #endif sqlite3VdbeAddOp2(v, OP_Integer, nCol, regStat4+1); sqlite3VdbeAddOp2(v, OP_Integer, pIdx->nKeyCol, regStat4+2); @@ -1171,21 +1181,23 @@ static void analyzeOneTable( ** if !eof(csr) goto next_row; */ #ifdef SQLITE_ENABLE_STAT4 - assert( regRowid==(regStat4+2) ); - if( HasRowid(pTab) ){ - sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, regRowid); - }else{ - Index *pPk = sqlite3PrimaryKeyIndex(pIdx->pTable); - int j, k, regKey; - regKey = sqlite3GetTempRange(pParse, pPk->nKeyCol); - for(j=0; jnKeyCol; j++){ - k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[j]); - assert( k>=0 && knColumn ); - sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, regKey+j); - VdbeComment((v, "%s", pTab->aCol[pPk->aiColumn[j]].zName)); + if( OptimizationEnabled(db, SQLITE_Stat4) ){ + assert( regRowid==(regStat4+2) ); + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, regRowid); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pIdx->pTable); + int j, k, regKey; + regKey = sqlite3GetTempRange(pParse, pPk->nKeyCol); + for(j=0; jnKeyCol; j++){ + k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[j]); + assert( k>=0 && knColumn ); + sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, regKey+j); + VdbeComment((v, "%s", pTab->aCol[pPk->aiColumn[j]].zName)); + } + sqlite3VdbeAddOp3(v, OP_MakeRecord, regKey, pPk->nKeyCol, regRowid); + sqlite3ReleaseTempRange(pParse, regKey, pPk->nKeyCol); } - sqlite3VdbeAddOp3(v, OP_MakeRecord, regKey, pPk->nKeyCol, regRowid); - sqlite3ReleaseTempRange(pParse, regKey, pPk->nKeyCol); } #endif assert( regChng==(regStat4+1) ); @@ -1206,7 +1218,7 @@ static void analyzeOneTable( /* Add the entries to the stat4 table. */ #ifdef SQLITE_ENABLE_STAT4 - { + if( OptimizationEnabled(db, SQLITE_Stat4) ){ int regEq = regStat1; int regLt = regStat1+1; int regDLt = regStat1+2; From dc4a1687b8b53a4464bbffaf351e25305b6a525e Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 17 Mar 2020 13:07:04 +0000 Subject: [PATCH 002/103] Improved bytecode comments for the ANALYZE command. FossilOrigin-Name: c38ea4139d87535b789f43eb1e38b2dc4b8312352a721035283e67cf0f3d5067 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/analyze.c | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 994c385818..bc5ec92aad 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\schanges\sfrom\strunk. -D 2020-03-17T12:37:27.533 +C Improved\sbytecode\scomments\sfor\sthe\sANALYZE\scommand. +D 2020-03-17T13:07:04.943 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -466,7 +466,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c f48a4423c8f198d7f1ae4940f74b606707d05384ac79fb219be8e3323af2a2de -F src/analyze.c cc3401286f1ff97aba5f2d94a2e8f9108beeaa25fa67faee090c38e387db396f +F src/analyze.c 5f09eb4e93a67653317de64823bda68220d4422efd2a3842baf831d084c9ce13 F src/attach.c fa5addce233a2bb2dfdefeee3b37000e154c47214d3269cab1bb331416e330db F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b @@ -1860,7 +1860,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 4945a66237fa3861bc691d5fbef0d40286b596a0902b4f4c032d1d6528bb1a1b 38e3dd389d142e520c71139ec84aa3c7722992af28a5f93a7f16e0ea176b74bb -R eadca1c0864a77f7553dbd5cd11ef9e9 +P 93d710262eb046e2370660b1096ac634373755f92a2e9b1220df3b2bda5f9eeb +R daf5019076e9194243fd0d1204db1bb8 U drh -Z b90799a92dde3b33fc19c32a21522ba6 +Z 540c7862b6fb73b8ea6fa0b5312caee4 diff --git a/manifest.uuid b/manifest.uuid index fe5bcb97ea..0fa8b9df71 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -93d710262eb046e2370660b1096ac634373755f92a2e9b1220df3b2bda5f9eeb \ No newline at end of file +c38ea4139d87535b789f43eb1e38b2dc4b8312352a721035283e67cf0f3d5067 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index 7db62919bd..d74687fec1 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -1148,6 +1148,7 @@ static void analyzeOneTable( char *pColl = (char*)sqlite3LocateCollSeq(pParse, pIdx->azColl[i]); sqlite3VdbeAddOp2(v, OP_Integer, i, regChng); sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, i, regTemp); + VdbeComment((v, "%s.column(%d)", pIdx->zName, i)); aGotoChng[i] = sqlite3VdbeAddOp4(v, OP_Ne, regTemp, 0, regPrev+i, pColl, P4_COLLSEQ); sqlite3VdbeChangeP5(v, SQLITE_NULLEQ); @@ -1168,6 +1169,7 @@ static void analyzeOneTable( for(i=0; izName, i)); } sqlite3VdbeResolveLabel(v, endDistinctTest); sqlite3DbFree(db, aGotoChng); @@ -1193,7 +1195,7 @@ static void analyzeOneTable( k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[j]); assert( k>=0 && knColumn ); sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, regKey+j); - VdbeComment((v, "%s", pTab->aCol[pPk->aiColumn[j]].zName)); + VdbeComment((v, "%s.column(%d)", pIdx->zName, i)); } sqlite3VdbeAddOp3(v, OP_MakeRecord, regKey, pPk->nKeyCol, regRowid); sqlite3ReleaseTempRange(pParse, regKey, pPk->nKeyCol); From e50478d7279b72a9df4836729c9974abfbce08ff Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 17 Mar 2020 13:41:51 +0000 Subject: [PATCH 003/103] Remove the SQLITE_OMIT_BTREECOUNT option. Btree count is required. FossilOrigin-Name: a9bfa47aeea27e91611ba913d33e6635d2016e2c2ab78f9b0657f1bd8933e1a8 --- manifest | 24 ++++++++++++------------ manifest.uuid | 2 +- src/analyze.c | 14 ++++++++------ src/btree.c | 2 -- src/btree.h | 2 -- src/ctime.c | 3 --- src/pragma.c | 2 -- src/select.c | 5 +---- src/vdbe.c | 2 -- 9 files changed, 22 insertions(+), 34 deletions(-) diff --git a/manifest b/manifest index bc5ec92aad..d9bcf9d7e4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sbytecode\scomments\sfor\sthe\sANALYZE\scommand. -D 2020-03-17T13:07:04.943 +C Remove\sthe\sSQLITE_OMIT_BTREECOUNT\soption.\s\sBtree\scount\sis\srequired. +D 2020-03-17T13:41:51.882 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -466,19 +466,19 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c f48a4423c8f198d7f1ae4940f74b606707d05384ac79fb219be8e3323af2a2de -F src/analyze.c 5f09eb4e93a67653317de64823bda68220d4422efd2a3842baf831d084c9ce13 +F src/analyze.c aaeb41ef74002ffef24363891f3205aa0d544dfc0eb56a859d142fe08f9bc608 F src/attach.c fa5addce233a2bb2dfdefeee3b37000e154c47214d3269cab1bb331416e330db F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 7271a120a66dfd12edcee942443fcd7b3860514a5621cb26a374781af1462117 -F src/btree.h 6111552f19ed7a40f029cf4b33badc6fef9880314fffd80a945f0b7f43ab7471 +F src/btree.c f2e0c75c8321bb4279dcfa6daaf4ac9e15c73ad887f24f7d28f4f2d5f78c02a7 +F src/btree.h 7c0a1c67a378254a6e3cfe29a9d6d2f09fdf58e8f69944076b6dbf517a810887 F src/btreeInt.h dee1a1d0c621524e006bb260bd6b66d5d1867da6fe38cba9ad7b6a9bb9c0c175 F src/build.c 406645db37154920075d90a4ea3c47f33d5f5b6e0769010a54ea8247ee433c1a F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e -F src/ctime.c 6a77ec9e0eb87aea929e002c816298907e337094a7b556898ae2d1e6be209f90 +F src/ctime.c 060c9bc1c8a848a942326c6e73fff449e54e8e98487f555e49e7b897639db270 F src/date.c 6c408fdd2e9ddf6e8431aba76315a2d061bea2cec8fbb75e25d7c1ba08274712 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 0f55297469d4244ab7df395849e1af98eb5e95816af7c661e7d2d8402dea23da @@ -524,14 +524,14 @@ F src/parse.y 8575183809cf30f8c9d1fbea65ca34d1de78b659792bc7c42681e01fc596b520 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a -F src/pragma.c 5fd004b89c77319008ddff6d65dcc83ccca9584d3048f4f66b108b5906a20dba +F src/pragma.c aff7b91cb36e58cee67d5dfc1c3a4b3c02aed104ce3ea1d6082aad2d61b445d7 F src/pragma.h 9473160d220416456b40f27323bb4b316d4e4e08ffbf8bf88c5f7045d49c38e5 F src/prepare.c 8d4d6c8aa6afefc48027c54b41cdf134b4d6bc2fc4badbe483ad7fd9e1728a28 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 38e3a5636f5bdc92e3683e4cafbba6418c0aa15e0d89ca5b28bd0b621dbb80bf F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 49d46acea0e69311aa891e18253973d63e81da2a9c135924bc827856d33872ad +F src/select.c 04a4138c646b0ecf2ca89142ce5756d2bebed30da15d47e86a69ac59ebbcaafa F src/shell.c.in f76590931c0cbbfef347f44f81ade6b335f80c46bc6e59b8b6114383a8df30e0 F src/sqlite.h.in 802957feeb249ede54f8dfe99b72aa19e70a0b7737969c46e625dc2f9f2d42b0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -603,7 +603,7 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7 F src/util.c a285c1e026907b69fa2592bd05047a565a1d8a1aef2b73c924b6a8ffe772871a F src/vacuum.c 813b510ba887fee6492bcb11f2bf77d7eb58b232b83649136372e0a2fc17f4b9 -F src/vdbe.c c1c123c6248fa88940b932a00bcc75056921b6d046d45a82566cb97415d2299c +F src/vdbe.c 1f5e82e73bc8fa158c643ed289a3ae15c0b7cf3c5f75ab96cef5b5f0798fdfee F src/vdbe.h 51282fbe819ee0e8eeeaab176240860d334c20a12b14f3b363e7f1a4e05d60b9 F src/vdbeInt.h a17146053a1aa438474012998fe07e314f3df274a61491ad838ad85d848ac051 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -1860,7 +1860,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 93d710262eb046e2370660b1096ac634373755f92a2e9b1220df3b2bda5f9eeb -R daf5019076e9194243fd0d1204db1bb8 +P c38ea4139d87535b789f43eb1e38b2dc4b8312352a721035283e67cf0f3d5067 +R 10acd344478148ed927d0774ca99ede6 U drh -Z 540c7862b6fb73b8ea6fa0b5312caee4 +Z 526c8dc722a58bf8fb8a844ac4513f2a diff --git a/manifest.uuid b/manifest.uuid index 0fa8b9df71..229109d8f9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c38ea4139d87535b789f43eb1e38b2dc4b8312352a721035283e67cf0f3d5067 \ No newline at end of file +a9bfa47aeea27e91611ba913d33e6635d2016e2c2ab78f9b0657f1bd8933e1a8 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index d74687fec1..0df9297b7f 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -407,7 +407,8 @@ static void statInit( int n; /* Bytes of space to allocate */ sqlite3 *db; /* Database connection */ #ifdef SQLITE_ENABLE_STAT4 - int mxSample = sqlite3_value_int(argv[2]) ? SQLITE_STAT4_SAMPLES : 0; + /* Maximum number of samples. 0 if STAT4 data is not collected */ + int mxSample = sqlite3_value_int64(argv[2]) ? SQLITE_STAT4_SAMPLES : 0; #endif /* Decode the three function arguments */ @@ -422,13 +423,14 @@ static void statInit( /* Allocate the space required for the StatAccum object */ n = sizeof(*p) + sizeof(tRowcnt)*nColUp /* StatAccum.anEq */ - + sizeof(tRowcnt)*nColUp /* StatAccum.anDLt */ + + sizeof(tRowcnt)*nColUp; /* StatAccum.anDLt */ #ifdef SQLITE_ENABLE_STAT4 - + sizeof(tRowcnt)*nColUp /* StatAccum.anLt */ - + sizeof(StatSample)*(nCol+mxSample) /* StatAccum.aBest[], a[] */ - + sizeof(tRowcnt)*3*nColUp*(nCol+mxSample) + if( mxSample ){ + n += sizeof(tRowcnt)*nColUp /* StatAccum.anLt */ + + sizeof(StatSample)*(nCol+mxSample) /* StatAccum.aBest[], a[] */ + + sizeof(tRowcnt)*3*nColUp*(nCol+mxSample); + } #endif - ; db = sqlite3_context_db_handle(context); p = sqlite3DbMallocZero(db, n); if( p==0 ){ diff --git a/src/btree.c b/src/btree.c index 0839683919..c2103819cc 100644 --- a/src/btree.c +++ b/src/btree.c @@ -9508,7 +9508,6 @@ int sqlite3BtreeUpdateMeta(Btree *p, int idx, u32 iMeta){ return rc; } -#ifndef SQLITE_OMIT_BTREECOUNT /* ** The first argument, pCur, is a cursor opened on some b-tree. Count the ** number of entries in the b-tree and write the result to *pnEntry. @@ -9581,7 +9580,6 @@ int sqlite3BtreeCount(sqlite3 *db, BtCursor *pCur, i64 *pnEntry){ /* An error has occurred. Return an error code. */ return rc; } -#endif /* ** Return the pager associated with a BTree. This routine is used for diff --git a/src/btree.h b/src/btree.h index 4bd41f7f37..2085c07677 100644 --- a/src/btree.h +++ b/src/btree.h @@ -336,9 +336,7 @@ int sqlite3BtreeCursorIsValid(BtCursor*); #endif int sqlite3BtreeCursorIsValidNN(BtCursor*); -#ifndef SQLITE_OMIT_BTREECOUNT int sqlite3BtreeCount(sqlite3*, BtCursor*, i64*); -#endif #ifdef SQLITE_TEST int sqlite3BtreeCursorInfo(BtCursor*, int*, int); diff --git a/src/ctime.c b/src/ctime.c index 7a2ace9317..336b912e9e 100644 --- a/src/ctime.c +++ b/src/ctime.c @@ -511,9 +511,6 @@ static const char * const sqlite3azCompileOpt[] = { #if SQLITE_OMIT_BLOB_LITERAL "OMIT_BLOB_LITERAL", #endif -#if SQLITE_OMIT_BTREECOUNT - "OMIT_BTREECOUNT", -#endif #if SQLITE_OMIT_CAST "OMIT_CAST", #endif diff --git a/src/pragma.c b/src/pragma.c index c5b5bb6670..e2c625549e 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1729,7 +1729,6 @@ void sqlite3Pragma( } sqlite3VdbeAddOp2(v, OP_Next, iDataCur, loopTop); VdbeCoverage(v); sqlite3VdbeJumpHere(v, loopTop-1); -#ifndef SQLITE_OMIT_BTREECOUNT if( !isQuick ){ sqlite3VdbeLoadString(v, 2, "wrong # of entries in index "); for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ @@ -1743,7 +1742,6 @@ void sqlite3Pragma( sqlite3VdbeJumpHere(v, addr); } } -#endif /* SQLITE_OMIT_BTREECOUNT */ } } { diff --git a/src/select.c b/src/select.c index 3128d482a9..fcd2a35eb3 100644 --- a/src/select.c +++ b/src/select.c @@ -6619,7 +6619,6 @@ int sqlite3Select( } /* endif pGroupBy. Begin aggregate queries without GROUP BY: */ else { -#ifndef SQLITE_OMIT_BTREECOUNT Table *pTab; if( (pTab = isSimpleCount(p, &sAggInfo))!=0 ){ /* If isSimpleCount() returns a pointer to a Table structure, then @@ -6677,9 +6676,7 @@ int sqlite3Select( sqlite3VdbeAddOp2(v, OP_Count, iCsr, sAggInfo.aFunc[0].iMem); sqlite3VdbeAddOp1(v, OP_Close, iCsr); explainSimpleCount(pParse, pTab, pBest); - }else -#endif /* SQLITE_OMIT_BTREECOUNT */ - { + }else{ int regAcc = 0; /* "populate accumulators" flag */ /* If there are accumulator registers but no min() or max() functions diff --git a/src/vdbe.c b/src/vdbe.c index 7f05328660..246442b479 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3193,7 +3193,6 @@ case OP_MakeRecord: { ** Store the number of entries (an integer value) in the table or index ** opened by cursor P1 in register P2 */ -#ifndef SQLITE_OMIT_BTREECOUNT case OP_Count: { /* out2 */ i64 nEntry; BtCursor *pCrsr; @@ -3208,7 +3207,6 @@ case OP_Count: { /* out2 */ pOut->u.i = nEntry; goto check_for_interrupt; } -#endif /* Opcode: Savepoint P1 * * P4 * ** From 9f27463684be9e40072ba7a07b769d15e578a571 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 17 Mar 2020 17:11:23 +0000 Subject: [PATCH 004/103] Provide an estimated row count to stat_init() for STAT1 analysis. FossilOrigin-Name: 714419fe85cfdad22979183a94e4569c87740652758ab76b646753cf2b013b54 --- manifest | 14 +++++------ manifest.uuid | 2 +- src/analyze.c | 65 +++++++++++++++++++++++++-------------------------- src/vdbe.c | 18 ++++++++++---- 4 files changed, 53 insertions(+), 46 deletions(-) diff --git a/manifest b/manifest index d9bcf9d7e4..0d201b4bd7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sthe\sSQLITE_OMIT_BTREECOUNT\soption.\s\sBtree\scount\sis\srequired. -D 2020-03-17T13:41:51.882 +C Provide\san\sestimated\srow\scount\sto\sstat_init()\sfor\sSTAT1\sanalysis. +D 2020-03-17T17:11:23.756 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -466,7 +466,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c f48a4423c8f198d7f1ae4940f74b606707d05384ac79fb219be8e3323af2a2de -F src/analyze.c aaeb41ef74002ffef24363891f3205aa0d544dfc0eb56a859d142fe08f9bc608 +F src/analyze.c 0df49eed25e472ef00bfe12184548a5a51890e7cd650c40fe2681430bdcae9d1 F src/attach.c fa5addce233a2bb2dfdefeee3b37000e154c47214d3269cab1bb331416e330db F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b @@ -603,7 +603,7 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7 F src/util.c a285c1e026907b69fa2592bd05047a565a1d8a1aef2b73c924b6a8ffe772871a F src/vacuum.c 813b510ba887fee6492bcb11f2bf77d7eb58b232b83649136372e0a2fc17f4b9 -F src/vdbe.c 1f5e82e73bc8fa158c643ed289a3ae15c0b7cf3c5f75ab96cef5b5f0798fdfee +F src/vdbe.c 45896ffb6241d1b001a73a84a480af25036de89bab4a74ed1814d9020384d420 F src/vdbe.h 51282fbe819ee0e8eeeaab176240860d334c20a12b14f3b363e7f1a4e05d60b9 F src/vdbeInt.h a17146053a1aa438474012998fe07e314f3df274a61491ad838ad85d848ac051 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -1860,7 +1860,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 c38ea4139d87535b789f43eb1e38b2dc4b8312352a721035283e67cf0f3d5067 -R 10acd344478148ed927d0774ca99ede6 +P a9bfa47aeea27e91611ba913d33e6635d2016e2c2ab78f9b0657f1bd8933e1a8 +R 83170381358df6124fa4b6f4f7b0bc2e U drh -Z 526c8dc722a58bf8fb8a844ac4513f2a +Z b22aba55e2c8d6bfe6ccc85eac867e5f diff --git a/manifest.uuid b/manifest.uuid index 229109d8f9..73b2e21252 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a9bfa47aeea27e91611ba913d33e6635d2016e2c2ab78f9b0657f1bd8933e1a8 \ No newline at end of file +714419fe85cfdad22979183a94e4569c87740652758ab76b646753cf2b013b54 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index 0df9297b7f..a7f70102b1 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -280,7 +280,8 @@ struct StatSample { }; struct StatAccum { sqlite3 *db; /* Database connection, for malloc() */ - tRowcnt nRow; /* Number of rows in the entire table */ + tRowcnt nEst; /* Estimated number of rows */ + tRowcnt nRow; /* Number of rows visited so far */ int nCol; /* Number of columns in index + pk/rowid */ int nKeyCol; /* Number of index columns w/o the pk/rowid */ StatSample current; /* Current row as a StatSample */ @@ -377,14 +378,12 @@ static void statAccumDestructor(void *pOld){ ** are: ** N: The number of columns in the index including the rowid/pk (note 1) ** K: The number of columns in the index excluding the rowid/pk. -** C: The number of rows in the index (note 2) +** C: Estimated number of rows in the index ** ** Note 1: In the special case of the covering index that implements a ** WITHOUT ROWID table, N is the number of PRIMARY KEY columns, not the ** total number of columns in the table. ** -** Note 2: C is only used for STAT4. -** ** For indexes on ordinary rowid tables, N==K+1. But for indexes on ** WITHOUT ROWID tables, N=K+P where P is the number of columns in the ** PRIMARY KEY of the table. The covering index that implements the @@ -439,6 +438,7 @@ static void statInit( } p->db = db; + p->nEst = sqlite3_value_int64(argv[2]); p->nRow = 0; p->nCol = nCol; p->nKeyCol = nKeyCol; @@ -452,7 +452,7 @@ static void statInit( p->iGet = -1; p->mxSample = mxSample; - p->nPSample = (tRowcnt)(sqlite3_value_int64(argv[2])/(mxSample/3+1) + 1); + p->nPSample = (tRowcnt)(p->nEst/(mxSample/3+1) + 1); p->current.anLt = &p->current.anEq[nColUp]; p->iPrn = 0x689e962d*(u32)nCol ^ 0xd0944565*(u32)sqlite3_value_int(argv[2]); @@ -923,16 +923,16 @@ static const FuncDef statGetFuncdef = { {0} }; -static void callStatGet(Parse *pParse, int regStat4, int iParam, int regOut){ +static void callStatGet(Parse *pParse, int regStat, int iParam, int regOut){ #ifdef SQLITE_ENABLE_STAT4 - sqlite3VdbeAddOp2(pParse->pVdbe, OP_Integer, iParam, regStat4+1); + sqlite3VdbeAddOp2(pParse->pVdbe, OP_Integer, iParam, regStat+1); #elif SQLITE_DEBUG assert( iParam==STAT_GET_STAT1 ); #else UNUSED_PARAMETER( iParam ); #endif - assert( regOut!=regStat4 && regOut!=regStat4+1 ); - sqlite3VdbeAddFunctionCall(pParse, 0, regStat4, regOut, 1+IsStat4, + assert( regOut!=regStat && regOut!=regStat+1 ); + sqlite3VdbeAddFunctionCall(pParse, 0, regStat, regOut, 1+IsStat4, &statGetFuncdef, 0); } @@ -958,11 +958,9 @@ static void analyzeOneTable( int iDb; /* Index of database containing pTab */ u8 needTableCnt = 1; /* True to count the table */ int regNewRowid = iMem++; /* Rowid for the inserted record */ - int regStat4 = iMem++; /* Register to hold StatAccum object */ + int regStat = iMem++; /* Register to hold StatAccum object */ int regChng = iMem++; /* Index of changed index field */ -#ifdef SQLITE_ENABLE_STAT4 int regRowid = iMem++; /* Rowid argument passed to stat_push() */ -#endif int regTemp = iMem++; /* Temporary use register */ int regTabname = iMem++; /* Register containing table name */ int regIdxname = iMem++; /* Register containing index name */ @@ -1091,21 +1089,24 @@ static void analyzeOneTable( ** (1) the number of columns in the index including the rowid ** (or for a WITHOUT ROWID table, the number of PK columns), ** (2) the number of columns in the key without the rowid/pk - ** (3) the number of rows in the index, - ** - ** - ** The third argument is only used for STAT4 + ** (3) estimated number of rows in the index, */ + sqlite3VdbeAddOp2(v, OP_Integer, nCol, regStat+1); + assert( regRowid==regStat+2 ); + sqlite3VdbeAddOp2(v, OP_Integer, pIdx->nKeyCol, regRowid); #ifdef SQLITE_ENABLE_STAT4 if( OptimizationEnabled(db, SQLITE_Stat4) ){ - sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regStat4+3); - }else{ - sqlite3VdbeAddOp2(v, OP_Integer, 0, regStat4+3); - } + sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regTemp); + addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, iIdxCur); + VdbeCoverage(v); + }else #endif - sqlite3VdbeAddOp2(v, OP_Integer, nCol, regStat4+1); - sqlite3VdbeAddOp2(v, OP_Integer, pIdx->nKeyCol, regStat4+2); - sqlite3VdbeAddFunctionCall(pParse, 0, regStat4+1, regStat4, 2+IsStat4, + { + addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, iIdxCur); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_Count, iIdxCur, regTemp, 1); + } + sqlite3VdbeAddFunctionCall(pParse, 0, regStat+1, regStat, 3, &statInitFuncdef, 0); /* Implementation of the following: @@ -1116,8 +1117,6 @@ static void analyzeOneTable( ** goto next_push_0; ** */ - addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, iIdxCur); - VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Integer, 0, regChng); addrNextRow = sqlite3VdbeCurrentAddr(v); @@ -1186,7 +1185,7 @@ static void analyzeOneTable( */ #ifdef SQLITE_ENABLE_STAT4 if( OptimizationEnabled(db, SQLITE_Stat4) ){ - assert( regRowid==(regStat4+2) ); + assert( regRowid==(regStat+2) ); if( HasRowid(pTab) ){ sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, regRowid); }else{ @@ -1204,13 +1203,13 @@ static void analyzeOneTable( } } #endif - assert( regChng==(regStat4+1) ); - sqlite3VdbeAddFunctionCall(pParse, 1, regStat4, regTemp, 2+IsStat4, + assert( regChng==(regStat+1) ); + sqlite3VdbeAddFunctionCall(pParse, 1, regStat, regTemp, 2+IsStat4, &statPushFuncdef, 0); sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); /* Add the entry to the stat1 table. */ - callStatGet(pParse, regStat4, STAT_GET_STAT1, regStat1); + callStatGet(pParse, regStat, STAT_GET_STAT1, regStat1); assert( "BBB"[0]==SQLITE_AFF_TEXT ); sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regTemp, "BBB", 0); sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid); @@ -1236,12 +1235,12 @@ static void analyzeOneTable( pParse->nMem = MAX(pParse->nMem, regCol+nCol); addrNext = sqlite3VdbeCurrentAddr(v); - callStatGet(pParse, regStat4, STAT_GET_ROWID, regSampleRowid); + callStatGet(pParse, regStat, STAT_GET_ROWID, regSampleRowid); addrIsNull = sqlite3VdbeAddOp1(v, OP_IsNull, regSampleRowid); VdbeCoverage(v); - callStatGet(pParse, regStat4, STAT_GET_NEQ, regEq); - callStatGet(pParse, regStat4, STAT_GET_NLT, regLt); - callStatGet(pParse, regStat4, STAT_GET_NDLT, regDLt); + callStatGet(pParse, regStat, STAT_GET_NEQ, regEq); + callStatGet(pParse, regStat, STAT_GET_NLT, regLt); + callStatGet(pParse, regStat, STAT_GET_NDLT, regDLt); sqlite3VdbeAddOp4Int(v, seekOp, iTabCur, addrNext, regSampleRowid, 0); VdbeCoverage(v); for(i=0; iapCsr[pOp->p1]->eCurType==CURTYPE_BTREE ); pCrsr = p->apCsr[pOp->p1]->uc.pCursor; assert( pCrsr ); - nEntry = 0; /* Not needed. Only used to silence a warning. */ - rc = sqlite3BtreeCount(db, pCrsr, &nEntry); - if( rc ) goto abort_due_to_error; + if( pOp->p3 ){ + nEntry = sqlite3BtreeRowCountEst(pCrsr); + }else{ + nEntry = 0; /* Not needed. Only used to silence a warning. */ + rc = sqlite3BtreeCount(db, pCrsr, &nEntry); + if( rc ) goto abort_due_to_error; + } pOut = out2Prerelease(p, pOp); pOut->u.i = nEntry; goto check_for_interrupt; From 59a8cb79316815f4eeb48e17252723df39589dda Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 18 Mar 2020 14:43:05 +0000 Subject: [PATCH 005/103] Add the SQLITE_ANALYZE_LIMIT compile-time option (expected to be temporary) that sets a threshold at which ANALYZE starts to use approximations during the analysis process. FossilOrigin-Name: a773fd4698d474fda5e57bc77ed66a79cf74efee2706f43f6def6f450bfd1fc0 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/analyze.c | 54 ++++++++++++++++++++++++++++++++++++++++----------- 3 files changed, 50 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index 0d201b4bd7..411043d48a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Provide\san\sestimated\srow\scount\sto\sstat_init()\sfor\sSTAT1\sanalysis. -D 2020-03-17T17:11:23.756 +C Add\sthe\sSQLITE_ANALYZE_LIMIT\scompile-time\soption\s(expected\sto\sbe\stemporary)\nthat\ssets\sa\sthreshold\sat\swhich\sANALYZE\sstarts\sto\suse\sapproximations\sduring\nthe\sanalysis\sprocess. +D 2020-03-18T14:43:05.229 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -466,7 +466,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c f48a4423c8f198d7f1ae4940f74b606707d05384ac79fb219be8e3323af2a2de -F src/analyze.c 0df49eed25e472ef00bfe12184548a5a51890e7cd650c40fe2681430bdcae9d1 +F src/analyze.c 2ae3d2e13387eac29ffb4f94279e00ec1f96145f56a06a8aa57533bd0c64bd99 F src/attach.c fa5addce233a2bb2dfdefeee3b37000e154c47214d3269cab1bb331416e330db F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b @@ -1860,7 +1860,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 a9bfa47aeea27e91611ba913d33e6635d2016e2c2ab78f9b0657f1bd8933e1a8 -R 83170381358df6124fa4b6f4f7b0bc2e +P 714419fe85cfdad22979183a94e4569c87740652758ab76b646753cf2b013b54 +R 9e076c207b1e065d9ce5cb1bfdf9885a U drh -Z b22aba55e2c8d6bfe6ccc85eac867e5f +Z 74d44bcaa72564678d221e098ce4dbd2 diff --git a/manifest.uuid b/manifest.uuid index 73b2e21252..df0df117b5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -714419fe85cfdad22979183a94e4569c87740652758ab76b646753cf2b013b54 \ No newline at end of file +a773fd4698d474fda5e57bc77ed66a79cf74efee2706f43f6def6f450bfd1fc0 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index a7f70102b1..7290deae19 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -284,6 +284,7 @@ struct StatAccum { tRowcnt nRow; /* Number of rows visited so far */ int nCol; /* Number of columns in index + pk/rowid */ int nKeyCol; /* Number of index columns w/o the pk/rowid */ + u8 nSkipAhead; /* Number of times of skip-ahead */ StatSample current; /* Current row as a StatSample */ #ifdef SQLITE_ENABLE_STAT4 tRowcnt nPSample; /* How often to do a periodic sample */ @@ -404,10 +405,10 @@ static void statInit( int nKeyCol; /* Number of key columns */ int nColUp; /* nCol rounded up for alignment */ int n; /* Bytes of space to allocate */ - sqlite3 *db; /* Database connection */ + sqlite3 *db = sqlite3_context_db_handle(context); /* Database connection */ #ifdef SQLITE_ENABLE_STAT4 /* Maximum number of samples. 0 if STAT4 data is not collected */ - int mxSample = sqlite3_value_int64(argv[2]) ? SQLITE_STAT4_SAMPLES : 0; + int mxSample = OptimizationEnabled(db,SQLITE_Stat4) ?SQLITE_STAT4_SAMPLES :0; #endif /* Decode the three function arguments */ @@ -442,16 +443,17 @@ static void statInit( p->nRow = 0; p->nCol = nCol; p->nKeyCol = nKeyCol; + p->nSkipAhead = 0; p->current.anDLt = (tRowcnt*)&p[1]; p->current.anEq = &p->current.anDLt[nColUp]; #ifdef SQLITE_ENABLE_STAT4 + p->mxSample = mxSample; if( mxSample ){ u8 *pSpace; /* Allocated space not yet assigned */ int i; /* Used to iterate through p->aSample[] */ p->iGet = -1; - p->mxSample = mxSample; p->nPSample = (tRowcnt)(p->nEst/(mxSample/3+1) + 1); p->current.anLt = &p->current.anEq[nColUp]; p->iPrn = 0x689e962d*(u32)nCol ^ 0xd0944565*(u32)sqlite3_value_int(argv[2]); @@ -675,6 +677,15 @@ static void samplePushPrevious(StatAccum *p, int iChng){ } #endif /* SQLITE_ENABLE_STAT4 */ +/* +** A limit on the number of rows of an index that will be examined +** by ANALYZE before it starts going with approximations. Zero means +** "no limit". +*/ +#ifndef SQLITE_ANALYZE_LIMIT +# define SQLITE_ANALYZE_LIMIT 0 +#endif + /* ** Implementation of the stat_push SQL function: stat_push(P,C,R) ** Arguments: @@ -684,10 +695,13 @@ static void samplePushPrevious(StatAccum *p, int iChng){ ** R Rowid for the current row. Might be a key record for ** WITHOUT ROWID tables. ** -** This SQL function always returns NULL. It's purpose it to accumulate -** statistical data and/or samples in the StatAccum object about the -** index being analyzed. The stat_get() SQL function will later be used to -** extract relevant information for constructing the sqlite_statN tables. +** The purpose of this routine is to collect statistical data and/or +** samples from the index being analyzed into the StatAccum object. +** The stat_get() SQL function will be used afterwards to +** retrieve the information gathered. +** +** This SQL function usually returns NULL, but might return an integer +** if it wants the byte-code to do special processing. ** ** The R parameter is only used for STAT4 */ @@ -729,6 +743,7 @@ static void statPush( p->current.anEq[i] = 1; } } + p->nRow++; #ifdef SQLITE_ENABLE_STAT4 if( p->mxSample ){ @@ -757,9 +772,16 @@ static void statPush( sampleCopy(p, &p->aBest[i], &p->current); } } + }else +#endif +#if SQLITE_ANALYZE_LIMIT + if( p->nRow>SQLITE_ANALYZE_LIMIT*(p->nSkipAhead+1) ){ + p->nSkipAhead++; + sqlite3_result_int(context, p->current.anDLt[0]>0); } #endif } + static const FuncDef statPushFuncdef = { 2+IsStat4, /* nArg */ SQLITE_UTF8, /* funcFlags */ @@ -847,7 +869,8 @@ static void statGet( return; } - sqlite3_snprintf(24, zRet, "%llu", (u64)p->nRow); + sqlite3_snprintf(24, zRet, "%llu", + p->nSkipAhead ? (u64)p->nEst : (u64)p->nRow); z = zRet + sqlite3Strlen30(zRet); for(i=0; inKeyCol; i++){ u64 nDistinct = p->current.anDLt[i] + 1; @@ -1204,9 +1227,18 @@ static void analyzeOneTable( } #endif assert( regChng==(regStat+1) ); - sqlite3VdbeAddFunctionCall(pParse, 1, regStat, regTemp, 2+IsStat4, - &statPushFuncdef, 0); - sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); + { + int j1, j2, j3; + sqlite3VdbeAddFunctionCall(pParse, 1, regStat, regTemp, 2+IsStat4, + &statPushFuncdef, 0); + j1 = sqlite3VdbeAddOp1(v, OP_IsNull, regTemp); + j2 = sqlite3VdbeAddOp1(v, OP_If, regTemp); + j3 = sqlite3VdbeAddOp4Int(v, OP_SeekGT, iIdxCur, 0, regPrev, 1); + sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, j2); + sqlite3VdbeJumpHere(v, j3); + } /* Add the entry to the stat1 table. */ callStatGet(pParse, regStat, STAT_GET_STAT1, regStat1); From 78a50d728093c4f5d28ffeb308d0e366ba3ffb40 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 18 Mar 2020 15:58:13 +0000 Subject: [PATCH 006/103] Fix the build for when SQLITE_ENABLE_STAT4 is defined. FossilOrigin-Name: 8f0a8c2aa45f7cf7339094d83893aeb046b010b5b97bb4dae99ac07a8ebf2fa6 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/analyze.c | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 411043d48a..0ae75e6bd2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sSQLITE_ANALYZE_LIMIT\scompile-time\soption\s(expected\sto\sbe\stemporary)\nthat\ssets\sa\sthreshold\sat\swhich\sANALYZE\sstarts\sto\suse\sapproximations\sduring\nthe\sanalysis\sprocess. -D 2020-03-18T14:43:05.229 +C Fix\sthe\sbuild\sfor\swhen\sSQLITE_ENABLE_STAT4\sis\sdefined. +D 2020-03-18T15:58:13.804 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -466,7 +466,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c f48a4423c8f198d7f1ae4940f74b606707d05384ac79fb219be8e3323af2a2de -F src/analyze.c 2ae3d2e13387eac29ffb4f94279e00ec1f96145f56a06a8aa57533bd0c64bd99 +F src/analyze.c 3d90f56656f5c6e7f835659b46ccf517c156df5222be86b4ff279eb476e8e373 F src/attach.c fa5addce233a2bb2dfdefeee3b37000e154c47214d3269cab1bb331416e330db F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b @@ -1860,7 +1860,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 714419fe85cfdad22979183a94e4569c87740652758ab76b646753cf2b013b54 -R 9e076c207b1e065d9ce5cb1bfdf9885a +P a773fd4698d474fda5e57bc77ed66a79cf74efee2706f43f6def6f450bfd1fc0 +R 6430bd4bd4bb467e3eec7a041f966c13 U drh -Z 74d44bcaa72564678d221e098ce4dbd2 +Z 544d5db127f99a945af7a33bac1ef578 diff --git a/manifest.uuid b/manifest.uuid index df0df117b5..a8f4744c32 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a773fd4698d474fda5e57bc77ed66a79cf74efee2706f43f6def6f450bfd1fc0 \ No newline at end of file +8f0a8c2aa45f7cf7339094d83893aeb046b010b5b97bb4dae99ac07a8ebf2fa6 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index 7290deae19..4414c50807 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -779,6 +779,8 @@ static void statPush( p->nSkipAhead++; sqlite3_result_int(context, p->current.anDLt[0]>0); } +#else + {} #endif } From 691b5c54b80c4861906d8791623a09af6db2d966 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 23 Mar 2020 15:49:22 +0000 Subject: [PATCH 007/103] Infrastructure for the bytecode() table-valued function. The function itself is not yet implemented. FossilOrigin-Name: 2795f0d633577e0de66b389d9e8e44c55e85975bdc62f1a0b8f93959d19b22bf --- Makefile.in | 12 ++- Makefile.msc | 7 ++ main.mk | 8 +- manifest | 28 +++--- manifest.uuid | 2 +- src/ctime.c | 3 + src/main.c | 6 ++ src/vdbe.h | 3 + src/vdbevtab.c | 223 ++++++++++++++++++++++++++++++++++++++++++++ tool/mksqlite3c.tcl | 1 + 10 files changed, 278 insertions(+), 15 deletions(-) create mode 100644 src/vdbevtab.c diff --git a/Makefile.in b/Makefile.in index e4b824365d..66eb903ba4 100644 --- a/Makefile.in +++ b/Makefile.in @@ -190,7 +190,8 @@ LIBOBJS0 = alter.lo analyze.lo attach.lo auth.lo \ table.lo threads.lo tokenize.lo treeview.lo trigger.lo \ update.lo userauth.lo upsert.lo util.lo vacuum.lo \ vdbe.lo vdbeapi.lo vdbeaux.lo vdbeblob.lo vdbemem.lo vdbesort.lo \ - vdbetrace.lo wal.lo walker.lo where.lo wherecode.lo whereexpr.lo \ + vdbetrace.lo vdbetrace.lo \ + wal.lo walker.lo where.lo wherecode.lo whereexpr.lo \ window.lo utf.lo vtab.lo # Object files for the amalgamation. @@ -296,6 +297,7 @@ SRC = \ $(TOP)/src/vdbemem.c \ $(TOP)/src/vdbesort.c \ $(TOP)/src/vdbetrace.c \ + $(TOP)/src/vdbevtab.c \ $(TOP)/src/vdbeInt.h \ $(TOP)/src/vtab.c \ $(TOP)/src/vxworks.h \ @@ -502,6 +504,7 @@ TESTSRC2 = \ $(TOP)/src/vdbe.c \ $(TOP)/src/vdbemem.c \ $(TOP)/src/vdbetrace.c \ + $(TOP)/src/vdbevtab.c \ $(TOP)/src/where.c \ $(TOP)/src/wherecode.c \ $(TOP)/src/whereexpr.c \ @@ -607,6 +610,7 @@ SHELL_OPT += -DSQLITE_ENABLE_UNKNOWN_SQL_FUNCTION SHELL_OPT += -DSQLITE_ENABLE_STMTVTAB SHELL_OPT += -DSQLITE_ENABLE_DBPAGE_VTAB SHELL_OPT += -DSQLITE_ENABLE_DBSTAT_VTAB +SHELL_OPT += -DSQLITE_ENABLE_BYTECODE_VTAB SHELL_OPT += -DSQLITE_ENABLE_OFFSET_SQL_FUNC SHELL_OPT += -DSQLITE_ENABLE_DESERIALIZE FUZZERSHELL_OPT = -DSQLITE_ENABLE_JSON1 @@ -619,6 +623,7 @@ FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS4 FUZZCHECK_OPT += -DSQLITE_ENABLE_RTREE FUZZCHECK_OPT += -DSQLITE_ENABLE_GEOPOLY FUZZCHECK_OPT += -DSQLITE_ENABLE_DBSTAT_VTAB +FUZZCHECK_OPT += -DSQLITE_ENABLE_BYTECODE_VTAB FUZZCHECK_SRC = $(TOP)/test/fuzzcheck.c $(TOP)/test/ossfuzz.c DBFUZZ_OPT = @@ -688,6 +693,7 @@ DBFUZZ2_OPTS = \ -DSQLITE_ENABLE_DESERIALIZE \ -DSQLITE_DEBUG \ -DSQLITE_ENABLE_DBSTAT_VTAB \ + -DSQLITE_ENABLE_BYTECODE_VTAB \ -DSQLITE_ENABLE_RTREE \ -DSQLITE_ENABLE_FTS4 \ -DSQLITE_ENABLE_FTS5 @@ -1004,6 +1010,9 @@ vdbesort.lo: $(TOP)/src/vdbesort.c $(HDR) vdbetrace.lo: $(TOP)/src/vdbetrace.c $(HDR) $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/vdbetrace.c +vdbevtab.lo: $(TOP)/src/vdbevtab.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/vdbevtab.c + vtab.lo: $(TOP)/src/vtab.c $(HDR) $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/vtab.c @@ -1210,6 +1219,7 @@ TESTFIXTURE_FLAGS += -DSQLITE_SERIES_CONSTRAINT_VERIFY=1 TESTFIXTURE_FLAGS += -DSQLITE_DEFAULT_PAGE_SIZE=1024 TESTFIXTURE_FLAGS += -DSQLITE_ENABLE_STMTVTAB TESTFIXTURE_FLAGS += -DSQLITE_ENABLE_DBPAGE_VTAB +TESTFIXTURE_FLAGS += -DSQLITE_ENABLE_BYTECODE_VTAB TESTFIXTURE_FLAGS += -DSQLITE_ENABLE_DESERIALIZE TESTFIXTURE_SRC0 = $(TESTSRC2) libsqlite3.la diff --git a/Makefile.msc b/Makefile.msc index d0b7860d90..7ffdad1acb 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -357,6 +357,7 @@ OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_JSON1=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_STMTVTAB=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DBPAGE_VTAB=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DBSTAT_VTAB=1 +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_BYTECODE_VTAB=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DESERIALIZE=1 !ENDIF OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_COLUMN_METADATA=1 @@ -1353,6 +1354,7 @@ SRC01 = \ $(TOP)\src\vdbemem.c \ $(TOP)\src\vdbesort.c \ $(TOP)\src\vdbetrace.c \ + $(TOP)\src\vdbevtab.c \ $(TOP)\src\vtab.c \ $(TOP)\src\wal.c \ $(TOP)\src\walker.c \ @@ -1684,6 +1686,7 @@ FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_FTS4 FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_RTREE FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_GEOPOLY FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_DBSTAT_VTAB +FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_BYTECODE_VTAB FUZZCHECK_SRC = $(TOP)\test\fuzzcheck.c $(TOP)\test\ossfuzz.c OSSSHELL_SRC = $(TOP)\test\ossshell.c $(TOP)\test\ossfuzz.c @@ -2109,6 +2112,9 @@ vdbesort.lo: $(TOP)\src\vdbesort.c $(HDR) vdbetrace.lo: $(TOP)\src\vdbetrace.c $(HDR) $(LTCOMPILE) $(CORE_COMPILE_OPTS) -c $(TOP)\src\vdbetrace.c +vdbevtab.lo: $(TOP)\src\vdbevtab.c $(HDR) + $(LTCOMPILE) $(CORE_COMPILE_OPTS) -c $(TOP)\src\vdbevtab.c + vtab.lo: $(TOP)\src\vtab.c $(HDR) $(LTCOMPILE) $(CORE_COMPILE_OPTS) -c $(TOP)\src\vtab.c @@ -2352,6 +2358,7 @@ TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_SERIES_CONSTRAINT_VERIFY=1 TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_DEFAULT_PAGE_SIZE=1024 TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_ENABLE_STMTVTAB=1 TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_ENABLE_DBPAGE_VTAB=1 +TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_ENABLE_BYTECODE_VTAB=1 TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_ENABLE_JSON1=1 TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_ENABLE_DESERIALIZE=1 TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) $(TEST_CCONV_OPTS) diff --git a/main.mk b/main.mk index cbf14f065c..75a2bbbd18 100644 --- a/main.mk +++ b/main.mk @@ -74,7 +74,8 @@ LIBOBJ+= vdbe.o parse.o \ table.o threads.o tokenize.o treeview.o trigger.o \ update.o upsert.o userauth.o util.o vacuum.o \ vdbeapi.o vdbeaux.o vdbeblob.o vdbemem.o vdbesort.o \ - vdbetrace.o wal.o walker.o where.o wherecode.o whereexpr.o \ + vdbetrace.o vdbevtab.o \ + wal.o walker.o where.o wherecode.o whereexpr.o \ utf.o vtab.o window.o LIBOBJ += sqlite3session.o @@ -173,6 +174,7 @@ SRC = \ $(TOP)/src/vdbemem.c \ $(TOP)/src/vdbesort.c \ $(TOP)/src/vdbetrace.c \ + $(TOP)/src/vdbevtab.c \ $(TOP)/src/vdbeInt.h \ $(TOP)/src/vtab.c \ $(TOP)/src/vxworks.h \ @@ -526,6 +528,7 @@ SHELL_OPT += -DSQLITE_ENABLE_UNKNOWN_SQL_FUNCTION SHELL_OPT += -DSQLITE_ENABLE_STMTVTAB SHELL_OPT += -DSQLITE_ENABLE_DBPAGE_VTAB SHELL_OPT += -DSQLITE_ENABLE_DBSTAT_VTAB +SHELL_OPT += -DSQLITE_ENABLE_BYTECODE_VTAB SHELL_OPT += -DSQLITE_ENABLE_OFFSET_SQL_FUNC FUZZERSHELL_OPT = -DSQLITE_ENABLE_JSON1 FUZZCHECK_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 @@ -536,6 +539,7 @@ FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS4 FUZZCHECK_OPT += -DSQLITE_ENABLE_RTREE FUZZCHECK_OPT += -DSQLITE_ENABLE_GEOPOLY FUZZCHECK_OPT += -DSQLITE_ENABLE_DBSTAT_VTAB +FUZZCHECK_OPT += -DSQLITE_ENABLE_BYTECODE_VTAB DBFUZZ_OPT = KV_OPT = -DSQLITE_THREADSAFE=0 -DSQLITE_DIRECT_OVERFLOW_READ ST_OPT = -DSQLITE_THREADSAFE=0 @@ -586,6 +590,7 @@ DBFUZZ2_OPTS = \ -DSQLITE_ENABLE_DESERIALIZE \ -DSQLITE_DEBUG \ -DSQLITE_ENABLE_DBSTAT_VTAB \ + -DSQLITE_ENABLE_BYTECODE_VTAB \ -DSQLITE_ENABLE_RTREE \ -DSQLITE_ENABLE_FTS4 \ -DSQLITE_ENABLE_FTS5 @@ -894,6 +899,7 @@ TESTFIXTURE_FLAGS += -DSQLITE_SERIES_CONSTRAINT_VERIFY=1 TESTFIXTURE_FLAGS += -DSQLITE_DEFAULT_PAGE_SIZE=1024 TESTFIXTURE_FLAGS += -DSQLITE_ENABLE_STMTVTAB TESTFIXTURE_FLAGS += -DSQLITE_ENABLE_DBPAGE_VTAB +TESTFIXTURE_FLAGS += -DSQLITE_ENABLE_BYTECODE_VTAB TESTFIXTURE_FLAGS += -DTCLSH_INIT_PROC=sqlite3TestInit testfixture$(EXE): $(TESTSRC2) libsqlite3.a $(TESTSRC) $(TOP)/src/tclsqlite.c diff --git a/manifest b/manifest index ef3e2aac8c..974ed5692d 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Fix\sto\sthe\srecomputation\sof\sthe\scolUsed\sfield\sadded\sby\scheck-in\n[a9bb71ba708ba722].\s\sThis\sfixes\sticket\s[5829597ac43811e3]. -D 2020-03-21T23:10:38.823 +C Infrastructure\sfor\sthe\sbytecode()\stable-valued\sfunction.\s\sThe\sfunction\sitself\nis\snot\syet\simplemented. +D 2020-03-23T15:49:22.754 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in 9dfc7936f675785309b74d09202bb656732325e65df889e5aaa18cc8932e5b0c +F Makefile.in 016dc963c45b84bd4826b2a36da4d61077d55580011567af2c545cdf99bd82ea F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc fab23c6b10cb6f06a7e9c407fc2e35cb184a6d653f1b793bda87fcee2eafa4f6 +F Makefile.msc 9bbfd86c376c295915e36c21dee1be88cdb46c2f2acf44df58940b69fb25c11c F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a F VERSION 980d78a2ce04a1fd0ebefbaabd665f7f9186563820629ee29c6e350e96f19b52 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -453,7 +453,7 @@ F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 7ce055f3df31a4f7d21e38f493f907c21db1f673863a573e231f55e2ab005023 +F main.mk 87e0c76bbcfcf32d115c01eb8430b39d679ddadb5e8cb65f717b672b6ac5a4e0 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -478,7 +478,7 @@ F src/btreeInt.h dee1a1d0c621524e006bb260bd6b66d5d1867da6fe38cba9ad7b6a9bb9c0c17 F src/build.c 3d22f21c4701f62c1a191c6b6d17552fb1b593fe9a97c0613cca05ab104a9a51 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e -F src/ctime.c 6a77ec9e0eb87aea929e002c816298907e337094a7b556898ae2d1e6be209f90 +F src/ctime.c 6892999ee100bd72b64f84dd7a8f737817d72872648705fbf8ed9575e1f1dd1a F src/date.c 6c408fdd2e9ddf6e8431aba76315a2d061bea2cec8fbb75e25d7c1ba08274712 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f @@ -495,7 +495,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 8e4211d04eb460c0694d486c6ba1c068d468c6f653c3f237869a802ad82854de F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c b179df50e6e8bb0c36c149e95d958d49bd8c6c7469e59c01b53d164360bc6c32 -F src/main.c b11eec03807a038b4075d310936dc33ce597078ab78c35dacdf5f05446ed53de +F src/main.c ed15d7e6b73ac081cf354b3544e7792a775492b19b2abf95e9f8be06e8c1c5e5 F src/malloc.c eaa4dc9602ce28b077f7de2eb275db2be270c5cc56d7fec5466301bd9b80e2f5 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -604,7 +604,7 @@ F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7 F src/util.c a285c1e026907b69fa2592bd05047a565a1d8a1aef2b73c924b6a8ffe772871a F src/vacuum.c 813b510ba887fee6492bcb11f2bf77d7eb58b232b83649136372e0a2fc17f4b9 F src/vdbe.c c1c123c6248fa88940b932a00bcc75056921b6d046d45a82566cb97415d2299c -F src/vdbe.h 51282fbe819ee0e8eeeaab176240860d334c20a12b14f3b363e7f1a4e05d60b9 +F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 F src/vdbeInt.h 0b728ee662862a38b1912af741e2ac64f524de3c77aa86cf4306c42bdcd9de59 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 F src/vdbeaux.c b78b4b71e04643f63820f074ece069834ffa658580546e9f248d5d85966daed2 @@ -612,6 +612,7 @@ F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 +F src/vdbevtab.c dfe1e9b661e3de27f49fc160a04fc0275ab08bb46cdf20943bf2bf418db398a5 F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 697424314e40d99f93f548c7bfa526c10e87f4bdf64d5a76a96b999dd7133ebc @@ -1798,7 +1799,7 @@ F tool/mkshellc.tcl 70a9978e363b0f3280ca9ce1c46d72563ff479c1930a12a7375e3881b732 F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl 4f7cfef5152b0c91920355cbfc1d608a4ad242cb819f1aea07f6d0274f584a7f -F tool/mksqlite3c.tcl 5fed3d75069d8f66f202d3b5200b0cea4aa7108481acd06732a06fdd42eb83a2 +F tool/mksqlite3c.tcl 3ab95bcf7b765f9d6d99cbeb8c4f150b38b0bb1f001ffac688f2ad02ebce2123 F tool/mksqlite3h.tcl 080873e3856eceb9d289a08a00c4b30f875ea3feadcbece796bd509b1532792c F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b F tool/mkvsix.tcl b9e0777a213c23156b6542842c238479e496ebf5 @@ -1860,7 +1861,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 8a5c539b77aa174c048a504d211c56902075f9b42b654e1f8cc5767739e5fcc9 -R 480ea7ba1b66f997fe626bc516b1544b +P 5d14a1c4f2fc17de98ad685ad1422cdfda89dfccb00afcaf32ee416b6f84f525 +R 3485af640bb73943f778dcc7ece65b48 +T *branch * bytecode-function +T *sym-bytecode-function * +T -sym-trunk * U drh -Z 1f463b1edcb75b2ef80d4761df1603b9 +Z c3d3bb21394129afccd09dd7aadc133f diff --git a/manifest.uuid b/manifest.uuid index 9559b864a1..289745682d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5d14a1c4f2fc17de98ad685ad1422cdfda89dfccb00afcaf32ee416b6f84f525 \ No newline at end of file +2795f0d633577e0de66b389d9e8e44c55e85975bdc62f1a0b8f93959d19b22bf \ No newline at end of file diff --git a/src/ctime.c b/src/ctime.c index 7a2ace9317..b104b35db0 100644 --- a/src/ctime.c +++ b/src/ctime.c @@ -193,6 +193,9 @@ static const char * const sqlite3azCompileOpt[] = { #if SQLITE_ENABLE_BATCH_ATOMIC_WRITE "ENABLE_BATCH_ATOMIC_WRITE", #endif +#if SQLITE_ENABLE_BYTECODE_VTAB + "ENABLE_BYTECODE_VTAB", +#endif #if SQLITE_ENABLE_CEROD "ENABLE_CEROD=" CTIMEOPT_VAL(SQLITE_ENABLE_CEROD), #endif diff --git a/src/main.c b/src/main.c index 98e030fad1..24cbe8bdbd 100644 --- a/src/main.c +++ b/src/main.c @@ -3346,6 +3346,12 @@ static int openDatabase( } #endif +#ifdef SQLITE_ENABLE_BYTECODE_VTAB + if( !db->mallocFailed && rc==SQLITE_OK){ + rc = sqlite3VdbeBytecodeVtabInit(db); + } +#endif + #ifdef SQLITE_ENABLE_INTERNAL_FUNCTIONS /* Testing use only!!! The -DSQLITE_ENABLE_INTERNAL_FUNCTIONS=1 compile-time ** option gives access to internal functions by default. diff --git a/src/vdbe.h b/src/vdbe.h index 482331effa..38b43eb713 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -290,6 +290,9 @@ void sqlite3VdbeLinkSubProgram(Vdbe *, SubProgram *); int sqlite3VdbeHasSubProgram(Vdbe*); int sqlite3NotPureFunc(sqlite3_context*); +#ifdef SQLITE_ENABLE_BYTECODE_VTAB +int sqlite3VdbeBytecodeVtabInit(sqlite3*); +#endif /* Use SQLITE_ENABLE_COMMENTS to enable generation of extra comments on ** each VDBE opcode. diff --git a/src/vdbevtab.c b/src/vdbevtab.c new file mode 100644 index 0000000000..b2994cb256 --- /dev/null +++ b/src/vdbevtab.c @@ -0,0 +1,223 @@ +/* +** 2020-03-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 virtual-tables for examining the bytecode content +** of a prepared statement. +*/ +#ifdef SQLITE_ENABLE_BYTECODE_VTAB +#include "sqliteInt.h" +#include "vdbeInt.h" + +/* An instance of the bytecode() table-valued function. +*/ +typedef struct bytecodevtab_vtab bytecodevtab_vtab; +struct bytecodevtab_vtab { + sqlite3_vtab base; /* Base class - must be first */ + sqlite3_stmt *pStmt; /* The statement whose bytecode is to be displayed */ +}; + +/* A cursor for scanning through the bytecode +*/ +typedef struct bytecodevtab_cursor bytecodevtab_cursor; +struct bytecodevtab_cursor { + sqlite3_vtab_cursor base; /* Base class - must be first */ + sqlite3_int64 iRowid; /* The rowid */ +}; + +/* +** Create a new bytecode() table-valued function. +*/ +static int bytecodevtabConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + bytecodevtab_vtab *pNew; + int rc; + + rc = sqlite3_declare_vtab(db, + "CREATE TABLE x(" + "addr INT," + "opcode TEXT," + "p1 INT," + "p2 INT," + "p3 INT," + "p4 TEXT," + "p5 INT," + "comment TEXT," + "subprog TEXT," + "stmt HIDDEN" + ");" + ); + if( rc==SQLITE_OK ){ + pNew = sqlite3_malloc( sizeof(*pNew) ); + *ppVtab = (sqlite3_vtab*)pNew; + if( pNew==0 ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + } + return rc; +} + +/* +** This method is the destructor for bytecodevtab_vtab objects. +*/ +static int bytecodevtabDisconnect(sqlite3_vtab *pVtab){ + bytecodevtab_vtab *p = (bytecodevtab_vtab*)pVtab; + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Constructor for a new bytecodevtab_cursor object. +*/ +static int bytecodevtabOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + bytecodevtab_cursor *pCur; + pCur = sqlite3_malloc( sizeof(*pCur) ); + if( pCur==0 ) return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +/* +** Destructor for a bytecodevtab_cursor. +*/ +static int bytecodevtabClose(sqlite3_vtab_cursor *cur){ + bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; + sqlite3_free(pCur); + return SQLITE_OK; +} + + +/* +** Advance a bytecodevtab_cursor to its next row of output. +*/ +static int bytecodevtabNext(sqlite3_vtab_cursor *cur){ + bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; + pCur->iRowid++; + return SQLITE_OK; +} + +/* +** Return values of columns for the row at which the bytecodevtab_cursor +** is currently pointing. +*/ +static int bytecodevtabColumn( + sqlite3_vtab_cursor *cur, /* The cursor */ + sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ + int i /* Which column to return */ +){ + bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; +#if 0 + switch( i ){ + case TEMPLATEVTAB_A: + sqlite3_result_int(ctx, 1000 + pCur->iRowid); + break; + default: + assert( i==TEMPLATEVTAB_B ); + sqlite3_result_int(ctx, 2000 + pCur->iRowid); + break; + } +#endif + return SQLITE_OK; +} + +/* +** Return the rowid for the current row. In this implementation, the +** rowid is the same as the output value. +*/ +static int bytecodevtabRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ + bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; + *pRowid = pCur->iRowid; + return SQLITE_OK; +} + +/* +** Return TRUE if the cursor has been moved off of the last +** row of output. +*/ +static int bytecodevtabEof(sqlite3_vtab_cursor *cur){ + bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; + return pCur->iRowid>=10; +} + +/* +** This method is called to "rewind" the bytecodevtab_cursor object back +** to the first row of output. This method is always called at least +** once prior to any call to bytecodevtabColumn() or bytecodevtabRowid() or +** bytecodevtabEof(). +*/ +static int bytecodevtabFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + bytecodevtab_cursor *pCur = (bytecodevtab_cursor *)pVtabCursor; + pCur->iRowid = 1; + return SQLITE_OK; +} + +/* +** SQLite will invoke this method one or more times while planning a query +** that uses the virtual table. This routine needs to create +** a query plan for each invocation and compute an estimated cost for that +** plan. +*/ +static int bytecodevtabBestIndex( + sqlite3_vtab *tab, + sqlite3_index_info *pIdxInfo +){ + pIdxInfo->estimatedCost = (double)10; + pIdxInfo->estimatedRows = 10; + return SQLITE_OK; +} + +/* +** This following structure defines all the methods for the +** virtual table. +*/ +static sqlite3_module bytecodevtabModule = { + /* iVersion */ 0, + /* xCreate */ 0, + /* xConnect */ bytecodevtabConnect, + /* xBestIndex */ bytecodevtabBestIndex, + /* xDisconnect */ bytecodevtabDisconnect, + /* xDestroy */ 0, + /* xOpen */ bytecodevtabOpen, + /* xClose */ bytecodevtabClose, + /* xFilter */ bytecodevtabFilter, + /* xNext */ bytecodevtabNext, + /* xEof */ bytecodevtabEof, + /* xColumn */ bytecodevtabColumn, + /* xRowid */ bytecodevtabRowid, + /* xUpdate */ 0, + /* xBegin */ 0, + /* xSync */ 0, + /* xCommit */ 0, + /* xRollback */ 0, + /* xFindMethod */ 0, + /* xRename */ 0, + /* xSavepoint */ 0, + /* xRelease */ 0, + /* xRollbackTo */ 0, + /* xShadowName */ 0 +}; + + +int sqlite3VdbeBytecodeVtabInit(sqlite3 *db){ + int rc; + rc = sqlite3_create_module(db, "bytecodevtab", &bytecodevtabModule, 0); + return rc; +} +#endif /* SQLITE_ENABLE_BYTECODE_VTAB */ diff --git a/tool/mksqlite3c.tcl b/tool/mksqlite3c.tcl index 2f9bd866b9..55ad89d086 100644 --- a/tool/mksqlite3c.tcl +++ b/tool/mksqlite3c.tcl @@ -341,6 +341,7 @@ foreach file { vdbe.c vdbeblob.c vdbesort.c + vdbevtab.c memjournal.c walker.c From 356cd76aa8bf20f3cc471da18b0ccb0370541565 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 23 Mar 2020 17:24:46 +0000 Subject: [PATCH 008/103] Begin breaking appear the sqlite3VdbeList() routine into subroutines that can be reused by the bytecode() table. FossilOrigin-Name: 2c4dd79fbd4b9f72634a732abb9ed833cd8c9b05fe1e10af8f23e6d6ec023c7c --- manifest | 17 ++--- manifest.uuid | 2 +- src/vdbeInt.h | 1 + src/vdbeaux.c | 183 ++++++++++++++++++++++++++++++-------------------- 4 files changed, 118 insertions(+), 85 deletions(-) diff --git a/manifest b/manifest index 974ed5692d..c0d019b2af 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Infrastructure\sfor\sthe\sbytecode()\stable-valued\sfunction.\s\sThe\sfunction\sitself\nis\snot\syet\simplemented. -D 2020-03-23T15:49:22.754 +C Begin\sbreaking\sappear\sthe\ssqlite3VdbeList()\sroutine\sinto\ssubroutines\sthat\ncan\sbe\sreused\sby\sthe\sbytecode()\stable. +D 2020-03-23T17:24:46.014 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -605,9 +605,9 @@ F src/util.c a285c1e026907b69fa2592bd05047a565a1d8a1aef2b73c924b6a8ffe772871a F src/vacuum.c 813b510ba887fee6492bcb11f2bf77d7eb58b232b83649136372e0a2fc17f4b9 F src/vdbe.c c1c123c6248fa88940b932a00bcc75056921b6d046d45a82566cb97415d2299c F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 -F src/vdbeInt.h 0b728ee662862a38b1912af741e2ac64f524de3c77aa86cf4306c42bdcd9de59 +F src/vdbeInt.h 198e552a1a8945061c7576d3d7f8c8603300bbbb9ba0a337184bf13a7cdda65d F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 -F src/vdbeaux.c b78b4b71e04643f63820f074ece069834ffa658580546e9f248d5d85966daed2 +F src/vdbeaux.c 46991da5699ff4986c15264c46d6300a56c008b758adade974dcebb5b9dba74e F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df @@ -1861,10 +1861,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 5d14a1c4f2fc17de98ad685ad1422cdfda89dfccb00afcaf32ee416b6f84f525 -R 3485af640bb73943f778dcc7ece65b48 -T *branch * bytecode-function -T *sym-bytecode-function * -T -sym-trunk * +P 2795f0d633577e0de66b389d9e8e44c55e85975bdc62f1a0b8f93959d19b22bf +R d0c0c7fad919870cffac31ef6d1a6170 U drh -Z c3d3bb21394129afccd09dd7aadc133f +Z bedd18e23757a54ddb7ae33ec04cb1e6 diff --git a/manifest.uuid b/manifest.uuid index 289745682d..b14f5c4877 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2795f0d633577e0de66b389d9e8e44c55e85975bdc62f1a0b8f93959d19b22bf \ No newline at end of file +2c4dd79fbd4b9f72634a732abb9ed833cd8c9b05fe1e10af8f23e6d6ec023c7c \ No newline at end of file diff --git a/src/vdbeInt.h b/src/vdbeInt.h index a256ed5bd1..9aa10d89bf 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -497,6 +497,7 @@ int sqlite3VdbeIdxKeyCompare(sqlite3*,VdbeCursor*,UnpackedRecord*,int*); int sqlite3VdbeIdxRowid(sqlite3*, BtCursor*, i64*); int sqlite3VdbeExec(Vdbe*); #ifndef SQLITE_OMIT_EXPLAIN +int sqlite3VdbeNextOpcode(Vdbe*,Mem*,int,int*,int*,Op**); int sqlite3VdbeList(Vdbe*); #endif int sqlite3VdbeHalt(Vdbe*); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index e18a811b69..d57c4821df 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1943,6 +1943,108 @@ void sqlite3VdbeFrameMemDel(void *pArg){ pFrame->v->pDelFrame = pFrame; } +/* +** Locate the next opcode to be displayed in EXPLAIN or EXPLAIN +** QUERY PLAN output. +** +** Return SQLITE_ROW on success. Return SQLITE_DONE if there are no +** more opcodes to be displayed. +*/ +int sqlite3VdbeNextOpcode( + Vdbe *p, /* The statement being explained */ + Mem *pSub, /* Storage for keeping track of subprogram nesting */ + int bEqp, /* True to return only OP_Explain opcodes */ + int *piPc, /* IN/OUT: Current rowid. Overwritten with next rowid */ + int *piAddr, /* OUT: Write index into (*paOp)[] here */ + Op **paOp /* OUT: Write the opcode array here */ +){ + int nRow; /* Stop when row count reaches this */ + int nSub = 0; /* Number of sub-vdbes seen so far */ + SubProgram **apSub = 0; /* Array of sub-vdbes */ + int i; /* Next instruction address */ + int rc = SQLITE_OK; /* Result code */ + Op *aOp; /* Opcode array */ + int iPc; /* Rowid. Copy of value in *piPc */ + + /* When the number of output rows reaches nRow, that means the + ** listing has finished and sqlite3_step() should return SQLITE_DONE. + ** nRow is the sum of the number of rows in the main program, plus + ** the sum of the number of rows in all trigger subprograms encountered + ** so far. The nRow value will increase as new trigger subprograms are + ** encountered, but p->pc will eventually catch up to nRow. + */ + nRow = p->nOp; + if( pSub!=0 ){ + if( pSub->flags&MEM_Blob ){ + /* pSub is initiallly NULL. It is initialized to a BLOB by + ** the P4_SUBPROGRAM processing logic below */ + nSub = pSub->n/sizeof(Vdbe*); + apSub = (SubProgram **)pSub->z; + } + for(i=0; inOp; + } + } + iPc = *piPc; + while(1){ /* Loop exits via break */ + i = iPc++; + if( i>=nRow ){ + p->rc = SQLITE_OK; + rc = SQLITE_DONE; + break; + } + if( inOp ){ + /* The rowid is small enough that we are still in the + ** main program. */ + aOp = p->aOp; + }else{ + /* We are currently listing subprograms. Figure out which one and + ** pick up the appropriate opcode. */ + int j; + i -= p->nOp; + assert( apSub!=0 ); + assert( nSub>0 ); + for(j=0; i>=apSub[j]->nOp; j++){ + i -= apSub[j]->nOp; + assert( inOp || j+1aOp; + } + + /* When an OP_Program opcode is encounter (the only opcode that has + ** a P4_SUBPROGRAM argument), expand the size of the array of subprograms + ** kept in p->aMem[9].z to hold the new program - assuming this subprogram + ** has not already been seen. + */ + if( pSub!=0 && aOp[i].p4type==P4_SUBPROGRAM ){ + int nByte = (nSub+1)*sizeof(SubProgram*); + int j; + for(j=0; jrc = sqlite3VdbeMemGrow(pSub, nByte, nSub!=0); + if( p->rc!=SQLITE_OK ){ + rc = SQLITE_ERROR; + break; + } + apSub = (SubProgram **)pSub->z; + apSub[nSub++] = aOp[i].p4.pProgram; + pSub->flags |= MEM_Blob; + pSub->n = nSub*sizeof(SubProgram*); + nRow += aOp[i].p4.pProgram->nOp; + } + } + if( !bEqp ) break; + if( aOp[i].opcode==OP_Explain ) break; + if( aOp[i].opcode==OP_Init && p->pc>1 ) break; + } + *piPc = iPc; + *piAddr = i; + *paOp = aOp; + return rc; +} + /* ** Delete a VdbeFrame object and its contents. VdbeFrame objects are @@ -1983,16 +2085,14 @@ void sqlite3VdbeFrameDelete(VdbeFrame *p){ int sqlite3VdbeList( Vdbe *p /* The VDBE */ ){ - int nRow; /* Stop when row count reaches this */ - int nSub = 0; /* Number of sub-vdbes seen so far */ - SubProgram **apSub = 0; /* Array of sub-vdbes */ Mem *pSub = 0; /* Memory cell hold array of subprogs */ sqlite3 *db = p->db; /* The database connection */ int i; /* Loop counter */ int rc = SQLITE_OK; /* Return code */ Mem *pMem = &p->aMem[1]; /* First Mem of result set */ int bListSubprogs = (p->explain==1 || (db->flags & SQLITE_TriggerEQP)!=0); - Op *pOp = 0; + Op *aOp; /* Array of opcodes */ + Op *pOp; /* Current opcode */ assert( p->explain ); assert( p->magic==VDBE_MAGIC_RUN ); @@ -2012,14 +2112,6 @@ int sqlite3VdbeList( return SQLITE_ERROR; } - /* When the number of output rows reaches nRow, that means the - ** listing has finished and sqlite3_step() should return SQLITE_DONE. - ** nRow is the sum of the number of rows in the main program, plus - ** the sum of the number of rows in all trigger subprograms encountered - ** so far. The nRow value will increase as new trigger subprograms are - ** encountered, but p->pc will eventually catch up to nRow. - */ - nRow = p->nOp; if( bListSubprogs ){ /* The first 8 memory cells are used for the result set. So we will ** commandeer the 9th cell to use as storage for an array of pointers @@ -2027,72 +2119,15 @@ int sqlite3VdbeList( ** cells. */ assert( p->nMem>9 ); pSub = &p->aMem[9]; - if( pSub->flags&MEM_Blob ){ - /* On the first call to sqlite3_step(), pSub will hold a NULL. It is - ** initialized to a BLOB by the P4_SUBPROGRAM processing logic below */ - nSub = pSub->n/sizeof(Vdbe*); - apSub = (SubProgram **)pSub->z; - } - for(i=0; inOp; - } + }else{ + pSub = 0; } - while(1){ /* Loop exits via break */ - i = p->pc++; - if( i>=nRow ){ - p->rc = SQLITE_OK; - rc = SQLITE_DONE; - break; - } - if( inOp ){ - /* The output line number is small enough that we are still in the - ** main program. */ - pOp = &p->aOp[i]; - }else{ - /* We are currently listing subprograms. Figure out which one and - ** pick up the appropriate opcode. */ - int j; - i -= p->nOp; - assert( apSub!=0 ); - assert( nSub>0 ); - for(j=0; i>=apSub[j]->nOp; j++){ - i -= apSub[j]->nOp; - assert( inOp || j+1aOp[i]; - } - - /* When an OP_Program opcode is encounter (the only opcode that has - ** a P4_SUBPROGRAM argument), expand the size of the array of subprograms - ** kept in p->aMem[9].z to hold the new program - assuming this subprogram - ** has not already been seen. - */ - if( bListSubprogs && pOp->p4type==P4_SUBPROGRAM ){ - int nByte = (nSub+1)*sizeof(SubProgram*); - int j; - for(j=0; jp4.pProgram ) break; - } - if( j==nSub ){ - p->rc = sqlite3VdbeMemGrow(pSub, nByte, nSub!=0); - if( p->rc!=SQLITE_OK ){ - rc = SQLITE_ERROR; - break; - } - apSub = (SubProgram **)pSub->z; - apSub[nSub++] = pOp->p4.pProgram; - pSub->flags |= MEM_Blob; - pSub->n = nSub*sizeof(SubProgram*); - nRow += pOp->p4.pProgram->nOp; - } - } - if( p->explain<2 ) break; - if( pOp->opcode==OP_Explain ) break; - if( pOp->opcode==OP_Init && p->pc>1 ) break; - } + /* Figure out which opcode is next to display */ + rc = sqlite3VdbeNextOpcode(p, pSub, p->explain==2, &p->pc, &i, &aOp); if( rc==SQLITE_OK ){ + pOp = aOp + i; if( db->u1.isInterrupted ){ p->rc = SQLITE_INTERRUPT; rc = SQLITE_ERROR; From cb49f5468ef8629e5d3aeb96619ce25b9fd361e0 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 23 Mar 2020 19:14:11 +0000 Subject: [PATCH 009/103] Further simplification and modularization of the EXPLAIN logic. FossilOrigin-Name: aee1c12f4227cea9e8c6295cee3ec11797422c31b48c9468f176eb52f8261fe8 --- manifest | 14 ++--- manifest.uuid | 2 +- src/vdbeaux.c | 148 +++++++++++++++++---------------------------- test/distinct.test | 4 +- 4 files changed, 66 insertions(+), 102 deletions(-) diff --git a/manifest b/manifest index c0d019b2af..6e2287c698 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Begin\sbreaking\sappear\sthe\ssqlite3VdbeList()\sroutine\sinto\ssubroutines\sthat\ncan\sbe\sreused\sby\sthe\sbytecode()\stable. -D 2020-03-23T17:24:46.014 +C Further\ssimplification\sand\smodularization\sof\sthe\sEXPLAIN\slogic. +D 2020-03-23T19:14:11.433 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -607,7 +607,7 @@ F src/vdbe.c c1c123c6248fa88940b932a00bcc75056921b6d046d45a82566cb97415d2299c F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 F src/vdbeInt.h 198e552a1a8945061c7576d3d7f8c8603300bbbb9ba0a337184bf13a7cdda65d F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 -F src/vdbeaux.c 46991da5699ff4986c15264c46d6300a56c008b758adade974dcebb5b9dba74e +F src/vdbeaux.c a041e907fed078029e6d7608f62acf9d69ea262d515b00254f8736eff5f4d363 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df @@ -821,7 +821,7 @@ F test/descidx1.test edc8adee58d491b06c7157c50364eaf1c3605c9c19f8093cb1ea2b6184f F test/descidx2.test a0ba347037ff3b811f4c6ceca5fd0f9d5d72e74e59f2d9de346a9d2f6ad78298 F test/descidx3.test 953c831df7ea219c73826dfbf2f6ee02d95040725aa88ccb4fa43d1a1999b926 F test/diskfull.test 106391384780753ea6896b7b4f005d10e9866b6e -F test/distinct.test 8b6c652f0b2d477f0830884736f2a1cd2e8f7fc10a04aa6d571a401fa13ed88b +F test/distinct.test e7d0cf371944dd0cbedff86420744e2f1ea2b528156451c97eb6ff41a99b9236 F test/distinct2.test 11b0594c932098e969d084ba45ab81d5040f4d4e766db65d49146705a305ed98 F test/distinctagg.test 1a6ef9c87a58669438fc771450d7a72577417376 F test/e_blobbytes.test 439a945953b35cb6948a552edaec4dc31fd70a05 @@ -1861,7 +1861,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 2795f0d633577e0de66b389d9e8e44c55e85975bdc62f1a0b8f93959d19b22bf -R d0c0c7fad919870cffac31ef6d1a6170 +P 2c4dd79fbd4b9f72634a732abb9ed833cd8c9b05fe1e10af8f23e6d6ec023c7c +R 4748d2ea6081821a30c83e5089756745 U drh -Z bedd18e23757a54ddb7ae33ec04cb1e6 +Z 573498e339f1a839323caa9c87282f78 diff --git a/manifest.uuid b/manifest.uuid index b14f5c4877..1432c3fd8f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2c4dd79fbd4b9f72634a732abb9ed833cd8c9b05fe1e10af8f23e6d6ec023c7c \ No newline at end of file +aee1c12f4227cea9e8c6295cee3ec11797422c31b48c9468f176eb52f8261fe8 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index d57c4821df..37ec1aabbd 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1464,11 +1464,10 @@ static int translateP(char c, const Op *pOp){ ** "PX@PY+1" -> "r[X..X+Y]" or "r[x]" if y is 0 ** "PY..PY" -> "r[X..Y]" or "r[x]" if y<=x */ -static int displayComment( +static char *displayComment( + sqlite3 *db, /* Optional - Oom error reporting only */ const Op *pOp, /* The opcode to be commented */ - const char *zP4, /* Previously obtained value for P4 */ - char *zTemp, /* Write result here */ - int nTemp /* Space available in zTemp[] */ + const char *zP4 /* Previously obtained value for P4 */ ){ const char *zOpName; const char *zSynopsis; @@ -1476,8 +1475,8 @@ static int displayComment( int ii; char zAlt[50]; StrAccum x; - sqlite3StrAccumInit(&x, 0, zTemp, nTemp, 0); + sqlite3StrAccumInit(&x, 0, 0, 0, SQLITE_MAX_LENGTH); zOpName = sqlite3OpcodeName(pOp->opcode); nOpName = sqlite3Strlen30(zOpName); if( zOpName[nOpName+1] ){ @@ -1544,8 +1543,10 @@ static int displayComment( }else if( pOp->zComment ){ sqlite3_str_appendall(&x, pOp->zComment); } - sqlite3StrAccumFinish(&x); - return x.nChar; + if( (x.accError & SQLITE_NOMEM)!=0 && db!=0 ){ + sqlite3OomFault(db); + } + return sqlite3StrAccumFinish(&x); } #endif /* SQLITE_DEBUG */ @@ -1628,11 +1629,11 @@ static void displayP4Expr(StrAccum *p, Expr *pExpr){ ** Compute a string that describes the P4 parameter for an opcode. ** Use zTemp for any required temporary buffer space. */ -static char *displayP4(Op *pOp, char *zTemp, int nTemp){ - char *zP4 = zTemp; +static char *displayP4(sqlite3 *db, Op *pOp){ + char *zP4 = 0; StrAccum x; - assert( nTemp>=20 ); - sqlite3StrAccumInit(&x, 0, zTemp, nTemp, 0); + + sqlite3StrAccumInit(&x, 0, 0, 0, SQLITE_MAX_LENGTH); switch( pOp->p4type ){ case P4_KEYINFO: { int j; @@ -1718,34 +1719,31 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){ for(i=1; i<=n; i++){ sqlite3_str_appendf(&x, ",%d", ai[i]); } - zTemp[0] = '['; + if( !x.accError ) x.zText[0] = '['; sqlite3_str_append(&x, "]", 1); break; } case P4_SUBPROGRAM: { - sqlite3_str_appendf(&x, "program"); + zP4 = "program"; break; } case P4_DYNBLOB: case P4_ADVANCE: { - zTemp[0] = 0; break; } case P4_TABLE: { - sqlite3_str_appendf(&x, "%s", pOp->p4.pTab->zName); + zP4 = pOp->p4.pTab->zName; break; } default: { zP4 = pOp->p4.z; - if( zP4==0 ){ - zP4 = zTemp; - zTemp[0] = 0; - } } } - sqlite3StrAccumFinish(&x); - assert( zP4!=0 ); - return zP4; + if( zP4 ) sqlite3_str_appendall(&x, zP4); + if( (x.accError & SQLITE_NOMEM)!=0 && db!=0 ){ + sqlite3OomFault(db); + } + return sqlite3StrAccumFinish(&x); } #endif /* VDBE_DISPLAY_P4 */ @@ -1835,24 +1833,25 @@ void sqlite3VdbeLeave(Vdbe *p){ */ void sqlite3VdbePrintOp(FILE *pOut, int pc, VdbeOp *pOp){ char *zP4; - char zPtr[50]; - char zCom[100]; + char *zCom; static const char *zFormat1 = "%4d %-13s %4d %4d %4d %-13s %.2X %s\n"; if( pOut==0 ) pOut = stdout; - zP4 = displayP4(pOp, zPtr, sizeof(zPtr)); + zP4 = displayP4(0, pOp); #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS - displayComment(pOp, zP4, zCom, sizeof(zCom)); + zCom = displayComment(0, pOp, zP4); #else - zCom[0] = 0; + zCom = 0; #endif /* NB: The sqlite3OpcodeName() function is implemented by code created ** by the mkopcodeh.awk and mkopcodec.awk scripts which extract the ** information from the vdbe.c source text */ fprintf(pOut, zFormat1, pc, sqlite3OpcodeName(pOp->opcode), pOp->p1, pOp->p2, pOp->p3, zP4, pOp->p5, - zCom + zCom ? zCom : "" ); fflush(pOut); + sqlite3_free(zP4); + sqlite3_free(zCom); } #endif @@ -2133,76 +2132,41 @@ int sqlite3VdbeList( rc = SQLITE_ERROR; sqlite3VdbeError(p, sqlite3ErrStr(p->rc)); }else{ - char *zP4; - if( p->explain==1 ){ - pMem->flags = MEM_Int; - pMem->u.i = i; /* Program counter */ - pMem++; - - pMem->flags = MEM_Static|MEM_Str|MEM_Term; - pMem->z = (char*)sqlite3OpcodeName(pOp->opcode); /* Opcode */ - assert( pMem->z!=0 ); - pMem->n = sqlite3Strlen30(pMem->z); - pMem->enc = SQLITE_UTF8; - pMem++; - } - - pMem->flags = MEM_Int; - pMem->u.i = pOp->p1; /* P1 */ - pMem++; - - pMem->flags = MEM_Int; - pMem->u.i = pOp->p2; /* P2 */ - pMem++; - - pMem->flags = MEM_Int; - pMem->u.i = pOp->p3; /* P3 */ - pMem++; - - if( sqlite3VdbeMemClearAndResize(pMem, 100) ){ /* P4 */ - assert( p->db->mallocFailed ); - return SQLITE_ERROR; - } - pMem->flags = MEM_Str|MEM_Term; - zP4 = displayP4(pOp, pMem->z, pMem->szMalloc); - if( zP4!=pMem->z ){ - pMem->n = 0; - sqlite3VdbeMemSetStr(pMem, zP4, -1, SQLITE_UTF8, 0); + char *zP4 = displayP4(db, pOp); + if( p->explain==2 ){ + sqlite3VdbeMemSetInt64(pMem, pOp->p1); + sqlite3VdbeMemSetInt64(pMem+1, pOp->p2); + sqlite3VdbeMemSetInt64(pMem+2, pOp->p3); + sqlite3VdbeMemSetStr(pMem+3, zP4, -1, SQLITE_UTF8, sqlite3_free); + p->nResColumn = 4; }else{ - assert( pMem->z!=0 ); - pMem->n = sqlite3Strlen30(pMem->z); - pMem->enc = SQLITE_UTF8; - } - pMem++; - - if( p->explain==1 ){ - if( sqlite3VdbeMemClearAndResize(pMem, 4) ){ - assert( p->db->mallocFailed ); - return SQLITE_ERROR; - } - pMem->flags = MEM_Str|MEM_Term; - pMem->n = 2; - sqlite3_snprintf(3, pMem->z, "%.2x", pOp->p5); /* P5 */ - pMem->enc = SQLITE_UTF8; - pMem++; - + sqlite3VdbeMemSetInt64(pMem+0, i); + sqlite3VdbeMemSetStr(pMem+1, (char*)sqlite3OpcodeName(pOp->opcode), + -1, SQLITE_UTF8, SQLITE_STATIC); + sqlite3VdbeMemSetInt64(pMem+2, pOp->p1); + sqlite3VdbeMemSetInt64(pMem+3, pOp->p2); + sqlite3VdbeMemSetInt64(pMem+4, pOp->p3); + /* pMem+5 for p4 is done last */ + sqlite3VdbeMemSetInt64(pMem+6, pOp->p5); #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS - if( sqlite3VdbeMemClearAndResize(pMem, 500) ){ - assert( p->db->mallocFailed ); - return SQLITE_ERROR; + { + char *zCom = displayComment(db, pOp, zP4); + sqlite3VdbeMemSetStr(pMem+7, zCom, -1, SQLITE_UTF8, sqlite3_free); } - pMem->flags = MEM_Str|MEM_Term; - pMem->n = displayComment(pOp, zP4, pMem->z, 500); - pMem->enc = SQLITE_UTF8; #else - pMem->flags = MEM_Null; /* Comment */ + sqlite3VdbeMemSetNull(pMem+7); #endif + sqlite3VdbeMemSetStr(pMem+5, zP4, -1, SQLITE_UTF8, sqlite3_free); + p->nResColumn = 8; + } + p->pResultSet = pMem; + if( db->mallocFailed ){ + p->rc = SQLITE_NOMEM; + rc = SQLITE_ERROR; + }else{ + p->rc = SQLITE_OK; + rc = SQLITE_ROW; } - - p->nResColumn = 8 - 4*(p->explain-1); - p->pResultSet = &p->aMem[1]; - p->rc = SQLITE_OK; - rc = SQLITE_ROW; } } return rc; diff --git a/test/distinct.test b/test/distinct.test index 9957ac3881..f6f3c6cdce 100644 --- a/test/distinct.test +++ b/test/distinct.test @@ -51,8 +51,8 @@ proc do_temptables_test {tn sql temptables} { set ret "" db eval "EXPLAIN [set sql]" { if {$opcode == "OpenEphemeral" || $opcode == "SorterOpen"} { - if {$p5 != "08" && $p5!="00"} { error "p5 = $p5" } - if {$p5 == "08"} { + if {$p5!=8 && $p5!=0} { error "p5 = $p5" } + if {$p5==8} { lappend ret hash } else { lappend ret btree From 8c5163a697789879f46d6b5db9a99d08d6ccb343 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 23 Mar 2020 20:58:55 +0000 Subject: [PATCH 010/103] The bytecode() function now runs and sometimes works, but it untested and there are known problems. FossilOrigin-Name: 6819b86eb2de516c445655a83f9b2ba5ae0bff660cffaf84f1345d9be79b051e --- manifest | 16 ++--- manifest.uuid | 2 +- src/vdbeInt.h | 11 +++- src/vdbeaux.c | 14 +++-- src/vdbevtab.c | 164 ++++++++++++++++++++++++++++++++++++++----------- 5 files changed, 154 insertions(+), 53 deletions(-) diff --git a/manifest b/manifest index 6e2287c698..1dc7d4ebec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\ssimplification\sand\smodularization\sof\sthe\sEXPLAIN\slogic. -D 2020-03-23T19:14:11.433 +C The\sbytecode()\sfunction\snow\sruns\sand\ssometimes\sworks,\sbut\sit\suntested\sand\nthere\sare\sknown\sproblems. +D 2020-03-23T20:58:55.887 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -605,14 +605,14 @@ F src/util.c a285c1e026907b69fa2592bd05047a565a1d8a1aef2b73c924b6a8ffe772871a F src/vacuum.c 813b510ba887fee6492bcb11f2bf77d7eb58b232b83649136372e0a2fc17f4b9 F src/vdbe.c c1c123c6248fa88940b932a00bcc75056921b6d046d45a82566cb97415d2299c F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 -F src/vdbeInt.h 198e552a1a8945061c7576d3d7f8c8603300bbbb9ba0a337184bf13a7cdda65d +F src/vdbeInt.h 5f36e2261731e6a39c66c6902634e474d4a98ed14ca10be6dea5c3776ece4342 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 -F src/vdbeaux.c a041e907fed078029e6d7608f62acf9d69ea262d515b00254f8736eff5f4d363 +F src/vdbeaux.c c99bdd953b93d74bfc22c11a47a9fb79e6e498017a4d2c7eb4a0320d54df60fd F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vdbevtab.c dfe1e9b661e3de27f49fc160a04fc0275ab08bb46cdf20943bf2bf418db398a5 +F src/vdbevtab.c c2dad21236249e745f99e6c4c175ab3c8c1430d84483bea30d3388b8c82bf945 F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 697424314e40d99f93f548c7bfa526c10e87f4bdf64d5a76a96b999dd7133ebc @@ -1861,7 +1861,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 2c4dd79fbd4b9f72634a732abb9ed833cd8c9b05fe1e10af8f23e6d6ec023c7c -R 4748d2ea6081821a30c83e5089756745 +P aee1c12f4227cea9e8c6295cee3ec11797422c31b48c9468f176eb52f8261fe8 +R 4e495b787689ae8a4210faab4d40d67a U drh -Z 573498e339f1a839323caa9c87282f78 +Z 0475543e1eec2402a1a0d93a49295452 diff --git a/manifest.uuid b/manifest.uuid index 1432c3fd8f..6544abac45 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aee1c12f4227cea9e8c6295cee3ec11797422c31b48c9468f176eb52f8261fe8 \ No newline at end of file +6819b86eb2de516c445655a83f9b2ba5ae0bff660cffaf84f1345d9be79b051e \ No newline at end of file diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 9aa10d89bf..a9465cc0ac 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -31,7 +31,8 @@ ** "explain" P4 display logic is enabled. */ #if !defined(SQLITE_OMIT_EXPLAIN) || !defined(NDEBUG) \ - || defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) + || defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) \ + || defined(SQLITE_ENABLE_BYTECODE_VTAB) # define VDBE_DISPLAY_P4 1 #else # define VDBE_DISPLAY_P4 0 @@ -496,8 +497,12 @@ int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *); int sqlite3VdbeIdxKeyCompare(sqlite3*,VdbeCursor*,UnpackedRecord*,int*); int sqlite3VdbeIdxRowid(sqlite3*, BtCursor*, i64*); int sqlite3VdbeExec(Vdbe*); -#ifndef SQLITE_OMIT_EXPLAIN +#if !defined(SQLITE_OMIT_EXPLAIN) || defined(SQLITE_ENABLE_BYTECODE_VTAB) int sqlite3VdbeNextOpcode(Vdbe*,Mem*,int,int*,int*,Op**); +char *sqlite3VdbeDisplayP4(sqlite3*,Op*); +char *sqlite3VdbeDisplayComment(sqlite3*,const Op*,const char*); +#endif +#if !defined(SQLITE_OMIT_EXPLAIN) int sqlite3VdbeList(Vdbe*); #endif int sqlite3VdbeHalt(Vdbe*); @@ -539,7 +544,7 @@ int sqlite3VdbeMemFinalize(Mem*, FuncDef*); #ifndef SQLITE_OMIT_WINDOWFUNC int sqlite3VdbeMemAggValue(Mem*, Mem*, FuncDef*); #endif -#ifndef SQLITE_OMIT_EXPLAIN +#if !defined(SQLITE_OMIT_EXPLAIN) || defined(SQLITE_ENABLE_BYTECODE_VTAB) const char *sqlite3OpcodeName(int); #endif int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 37ec1aabbd..6c6eb8ec5f 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1464,7 +1464,7 @@ static int translateP(char c, const Op *pOp){ ** "PX@PY+1" -> "r[X..X+Y]" or "r[x]" if y is 0 ** "PY..PY" -> "r[X..Y]" or "r[x]" if y<=x */ -static char *displayComment( +char *sqlite3VdbeDisplayComment( sqlite3 *db, /* Optional - Oom error reporting only */ const Op *pOp, /* The opcode to be commented */ const char *zP4 /* Previously obtained value for P4 */ @@ -1629,7 +1629,7 @@ static void displayP4Expr(StrAccum *p, Expr *pExpr){ ** Compute a string that describes the P4 parameter for an opcode. ** Use zTemp for any required temporary buffer space. */ -static char *displayP4(sqlite3 *db, Op *pOp){ +char *sqlite3VdbeDisplayP4(sqlite3 *db, Op *pOp){ char *zP4 = 0; StrAccum x; @@ -1836,9 +1836,9 @@ void sqlite3VdbePrintOp(FILE *pOut, int pc, VdbeOp *pOp){ char *zCom; static const char *zFormat1 = "%4d %-13s %4d %4d %4d %-13s %.2X %s\n"; if( pOut==0 ) pOut = stdout; - zP4 = displayP4(0, pOp); + zP4 = sqlite3VdbeDisplayP4(0, pOp); #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS - zCom = displayComment(0, pOp, zP4); + zCom = sqlite3VdbeDisplayComment(0, pOp, zP4); #else zCom = 0; #endif @@ -1942,6 +1942,7 @@ void sqlite3VdbeFrameMemDel(void *pArg){ pFrame->v->pDelFrame = pFrame; } +#if defined(SQLITE_ENABLE_BYTECODE_VTAB) || !defined(SQLITE_OMIT_EXPLAIN) /* ** Locate the next opcode to be displayed in EXPLAIN or EXPLAIN ** QUERY PLAN output. @@ -2043,6 +2044,7 @@ int sqlite3VdbeNextOpcode( *paOp = aOp; return rc; } +#endif /* SQLITE_ENABLE_BYTECODE_VTAB || !SQLITE_OMIT_EXPLAIN */ /* @@ -2132,7 +2134,7 @@ int sqlite3VdbeList( rc = SQLITE_ERROR; sqlite3VdbeError(p, sqlite3ErrStr(p->rc)); }else{ - char *zP4 = displayP4(db, pOp); + char *zP4 = sqlite3VdbeDisplayP4(db, pOp); if( p->explain==2 ){ sqlite3VdbeMemSetInt64(pMem, pOp->p1); sqlite3VdbeMemSetInt64(pMem+1, pOp->p2); @@ -2150,7 +2152,7 @@ int sqlite3VdbeList( sqlite3VdbeMemSetInt64(pMem+6, pOp->p5); #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS { - char *zCom = displayComment(db, pOp, zP4); + char *zCom = sqlite3VdbeDisplayComment(db, pOp, zP4); sqlite3VdbeMemSetStr(pMem+7, zCom, -1, SQLITE_UTF8, sqlite3_free); } #else diff --git a/src/vdbevtab.c b/src/vdbevtab.c index b2994cb256..a886d56787 100644 --- a/src/vdbevtab.c +++ b/src/vdbevtab.c @@ -19,10 +19,10 @@ /* An instance of the bytecode() table-valued function. */ -typedef struct bytecodevtab_vtab bytecodevtab_vtab; -struct bytecodevtab_vtab { +typedef struct bytecodevtab bytecodevtab; +struct bytecodevtab { sqlite3_vtab base; /* Base class - must be first */ - sqlite3_stmt *pStmt; /* The statement whose bytecode is to be displayed */ + sqlite3 *db; /* Database connection */ }; /* A cursor for scanning through the bytecode @@ -30,7 +30,13 @@ struct bytecodevtab_vtab { typedef struct bytecodevtab_cursor bytecodevtab_cursor; struct bytecodevtab_cursor { sqlite3_vtab_cursor base; /* Base class - must be first */ - sqlite3_int64 iRowid; /* The rowid */ + sqlite3_stmt *pStmt; /* The statement whose bytecode is displayed */ + int iRowid; /* The rowid of the output table */ + int iAddr; /* Address */ + int needFinalize; /* Cursors owns pStmt and must finalize it */ + Op *aOp; /* Operand array */ + char *zP4; /* Rendered P4 value */ + Mem sub; /* Subprograms */ }; /* @@ -43,7 +49,7 @@ static int bytecodevtabConnect( sqlite3_vtab **ppVtab, char **pzErr ){ - bytecodevtab_vtab *pNew; + bytecodevtab *pNew; int rc; rc = sqlite3_declare_vtab(db, @@ -65,15 +71,16 @@ static int bytecodevtabConnect( *ppVtab = (sqlite3_vtab*)pNew; if( pNew==0 ) return SQLITE_NOMEM; memset(pNew, 0, sizeof(*pNew)); + pNew->db = db; } return rc; } /* -** This method is the destructor for bytecodevtab_vtab objects. +** This method is the destructor for bytecodevtab objects. */ static int bytecodevtabDisconnect(sqlite3_vtab *pVtab){ - bytecodevtab_vtab *p = (bytecodevtab_vtab*)pVtab; + bytecodevtab *p = (bytecodevtab*)pVtab; sqlite3_free(p); return SQLITE_OK; } @@ -82,19 +89,36 @@ static int bytecodevtabDisconnect(sqlite3_vtab *pVtab){ ** Constructor for a new bytecodevtab_cursor object. */ static int bytecodevtabOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + bytecodevtab *pVTab = (bytecodevtab*)p; bytecodevtab_cursor *pCur; pCur = sqlite3_malloc( sizeof(*pCur) ); if( pCur==0 ) return SQLITE_NOMEM; memset(pCur, 0, sizeof(*pCur)); + sqlite3VdbeMemInit(&pCur->sub, pVTab->db, 1); *ppCursor = &pCur->base; return SQLITE_OK; } +/* +** Clear all internal content from a bytecodevtab cursor. +*/ +static void bytecodevtabCursorClear(bytecodevtab_cursor *pCur){ + sqlite3_free(pCur->zP4); + pCur->zP4 = 0; + sqlite3VdbeMemSetNull(&pCur->sub); + if( pCur->needFinalize ){ + sqlite3_finalize(pCur->pStmt); + } + pCur->pStmt = 0; + pCur->needFinalize = 0; +} + /* ** Destructor for a bytecodevtab_cursor. */ static int bytecodevtabClose(sqlite3_vtab_cursor *cur){ bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; + bytecodevtabCursorClear(pCur); sqlite3_free(pCur); return SQLITE_OK; } @@ -105,10 +129,29 @@ static int bytecodevtabClose(sqlite3_vtab_cursor *cur){ */ static int bytecodevtabNext(sqlite3_vtab_cursor *cur){ bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; - pCur->iRowid++; + int rc; + if( pCur->zP4 ){ + sqlite3_free(pCur->zP4); + pCur->zP4 = 0; + } + rc = sqlite3VdbeNextOpcode((Vdbe*)pCur->pStmt, &pCur->sub, 0, + &pCur->iRowid, &pCur->iAddr, &pCur->aOp); + if( rc!=SQLITE_OK ){ + sqlite3VdbeMemSetNull(&pCur->sub); + pCur->aOp = 0; + } return SQLITE_OK; } +/* +** Return TRUE if the cursor has been moved off of the last +** row of output. +*/ +static int bytecodevtabEof(sqlite3_vtab_cursor *cur){ + bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; + return pCur->aOp==0; +} + /* ** Return values of columns for the row at which the bytecodevtab_cursor ** is currently pointing. @@ -119,17 +162,42 @@ static int bytecodevtabColumn( int i /* Which column to return */ ){ bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; -#if 0 + bytecodevtab *pVTab; + Op *pOp = pCur->aOp + pCur->iAddr; switch( i ){ - case TEMPLATEVTAB_A: - sqlite3_result_int(ctx, 1000 + pCur->iRowid); + case 0: + sqlite3_result_int(ctx, pCur->iAddr); break; - default: - assert( i==TEMPLATEVTAB_B ); - sqlite3_result_int(ctx, 2000 + pCur->iRowid); + case 1: + sqlite3_result_text(ctx, (char*)sqlite3OpcodeName(pOp->opcode), + -1, SQLITE_STATIC); + break; + case 2: + sqlite3_result_int(ctx, pOp->p1); + break; + case 3: + sqlite3_result_int(ctx, pOp->p2); + break; + case 4: + sqlite3_result_int(ctx, pOp->p3); + break; + case 5: + case 7: + pVTab = (bytecodevtab*)cur->pVtab; + if( pCur->zP4==0 ){ + pCur->zP4 = sqlite3VdbeDisplayP4(pVTab->db, pOp); + } + if( i==5 ){ + sqlite3_result_text(ctx, pCur->zP4, -1, SQLITE_STATIC); + }else{ + char *zCom = sqlite3VdbeDisplayComment(pVTab->db, pOp, pCur->zP4); + sqlite3_result_text(ctx, zCom, -1, sqlite3_free); + } + break; + case 6: + sqlite3_result_int(ctx, pOp->p5); break; } -#endif return SQLITE_OK; } @@ -144,16 +212,7 @@ static int bytecodevtabRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ } /* -** Return TRUE if the cursor has been moved off of the last -** row of output. -*/ -static int bytecodevtabEof(sqlite3_vtab_cursor *cur){ - bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; - return pCur->iRowid>=10; -} - -/* -** This method is called to "rewind" the bytecodevtab_cursor object back +** Initialize a cursor to use a new ** to the first row of output. This method is always called at least ** once prior to any call to bytecodevtabColumn() or bytecodevtabRowid() or ** bytecodevtabEof(). @@ -164,23 +223,58 @@ static int bytecodevtabFilter( int argc, sqlite3_value **argv ){ bytecodevtab_cursor *pCur = (bytecodevtab_cursor *)pVtabCursor; - pCur->iRowid = 1; - return SQLITE_OK; + bytecodevtab *pVTab = (bytecodevtab *)pVtabCursor->pVtab; + int rc = SQLITE_OK; + + bytecodevtabCursorClear(pCur); + pCur->iRowid = 0; + pCur->iAddr = 0; + assert( argc==1 ); + if( sqlite3_value_type(argv[0])==SQLITE_TEXT ){ + const char *zSql = (const char*)sqlite3_value_text(argv[0]); + if( zSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v2(pVTab->db, zSql, -1, &pCur->pStmt, 0); + pCur->needFinalize = 1; + } + }else{ + pCur->pStmt = (sqlite3_stmt*)sqlite3_value_pointer(argv[0],"stmt-pointer"); + } + if( pCur->pStmt==0 ){ + pVTab->base.zErrMsg = sqlite3_mprintf( + "argument to bytecode() is not a valid SQL statement" + ); + rc = SQLITE_ERROR; + }else{ + bytecodevtabNext(pVtabCursor); + } + return rc; } /* -** SQLite will invoke this method one or more times while planning a query -** that uses the virtual table. This routine needs to create -** a query plan for each invocation and compute an estimated cost for that -** plan. +** We must have a single stmt=? constraint that will be passed through +** into the xFilter method. If there is no valid stmt=? constraint, +** then return an SQLITE_CONSTRAINT error. */ static int bytecodevtabBestIndex( sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo ){ - pIdxInfo->estimatedCost = (double)10; - pIdxInfo->estimatedRows = 10; - return SQLITE_OK; + int i; + int rc = SQLITE_CONSTRAINT; + pIdxInfo->estimatedCost = (double)100; + pIdxInfo->estimatedRows = 100; + for(i=0; inConstraint; i++){ + if( pIdxInfo->aConstraint[i].usable==0 ) continue; + if( pIdxInfo->aConstraint[i].op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; + if( pIdxInfo->aConstraint[i].iColumn!=9 ) continue; + rc = SQLITE_OK; + pIdxInfo->aConstraintUsage[i].omit = 1; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + break; + } + return rc; } /* @@ -217,7 +311,7 @@ static sqlite3_module bytecodevtabModule = { int sqlite3VdbeBytecodeVtabInit(sqlite3 *db){ int rc; - rc = sqlite3_create_module(db, "bytecodevtab", &bytecodevtabModule, 0); + rc = sqlite3_create_module(db, "bytecode", &bytecodevtabModule, 0); return rc; } #endif /* SQLITE_ENABLE_BYTECODE_VTAB */ From eeb55d869467799b3c5df01fedc212c0c3ed486f Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 23 Mar 2020 23:17:38 +0000 Subject: [PATCH 011/103] Fix the build so that it works even without SQLITE_ENABLE_EXPLAIN_COMMENTS. FossilOrigin-Name: 5896cbf4d0c7854c29c96d2ea2cea4adaedaa027a0fe4a3f0ac4dfbeaabb8dec --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbevtab.c | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 1dc7d4ebec..ad8a6848b4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sbytecode()\sfunction\snow\sruns\sand\ssometimes\sworks,\sbut\sit\suntested\sand\nthere\sare\sknown\sproblems. -D 2020-03-23T20:58:55.887 +C Fix\sthe\sbuild\sso\sthat\sit\sworks\seven\swithout\sSQLITE_ENABLE_EXPLAIN_COMMENTS. +D 2020-03-23T23:17:38.750 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -612,7 +612,7 @@ F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vdbevtab.c c2dad21236249e745f99e6c4c175ab3c8c1430d84483bea30d3388b8c82bf945 +F src/vdbevtab.c 412a9a432dae219a34ca9ee321b3536cd6c55f1dc1f80290d6b7795f3f8647db F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 697424314e40d99f93f548c7bfa526c10e87f4bdf64d5a76a96b999dd7133ebc @@ -1861,7 +1861,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 aee1c12f4227cea9e8c6295cee3ec11797422c31b48c9468f176eb52f8261fe8 -R 4e495b787689ae8a4210faab4d40d67a +P 6819b86eb2de516c445655a83f9b2ba5ae0bff660cffaf84f1345d9be79b051e +R b791763565a600914b8ed358ac45d71f U drh -Z 0475543e1eec2402a1a0d93a49295452 +Z f67cc20bd0e690a5ab7aa0e742134572 diff --git a/manifest.uuid b/manifest.uuid index 6544abac45..baae3fe007 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6819b86eb2de516c445655a83f9b2ba5ae0bff660cffaf84f1345d9be79b051e \ No newline at end of file +5896cbf4d0c7854c29c96d2ea2cea4adaedaa027a0fe4a3f0ac4dfbeaabb8dec \ No newline at end of file diff --git a/src/vdbevtab.c b/src/vdbevtab.c index a886d56787..a6c1a0526a 100644 --- a/src/vdbevtab.c +++ b/src/vdbevtab.c @@ -190,8 +190,10 @@ static int bytecodevtabColumn( if( i==5 ){ sqlite3_result_text(ctx, pCur->zP4, -1, SQLITE_STATIC); }else{ +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS char *zCom = sqlite3VdbeDisplayComment(pVTab->db, pOp, pCur->zP4); sqlite3_result_text(ctx, zCom, -1, sqlite3_free); +#endif } break; case 6: From 0518d061175e6b70197d2f8ad9e54d3e2062d5d7 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 24 Mar 2020 13:27:53 +0000 Subject: [PATCH 012/103] Provide content for the bytecode.subprog column. FossilOrigin-Name: df893364b7cea07ff2b15b80cb294dccaffe701d51452264599b55304a36fa7c --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbeaux.c | 2 +- src/vdbevtab.c | 29 +++++++++++++++++++++-------- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index ad8a6848b4..d5a3f7938f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sbuild\sso\sthat\sit\sworks\seven\swithout\sSQLITE_ENABLE_EXPLAIN_COMMENTS. -D 2020-03-23T23:17:38.750 +C Provide\scontent\sfor\sthe\sbytecode.subprog\scolumn. +D 2020-03-24T13:27:53.953 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -607,12 +607,12 @@ F src/vdbe.c c1c123c6248fa88940b932a00bcc75056921b6d046d45a82566cb97415d2299c F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 F src/vdbeInt.h 5f36e2261731e6a39c66c6902634e474d4a98ed14ca10be6dea5c3776ece4342 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 -F src/vdbeaux.c c99bdd953b93d74bfc22c11a47a9fb79e6e498017a4d2c7eb4a0320d54df60fd +F src/vdbeaux.c 9aceb1802cda5f0ce45951afc4b99d5b352d68f95acca7e731bbdc61cd585702 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vdbevtab.c 412a9a432dae219a34ca9ee321b3536cd6c55f1dc1f80290d6b7795f3f8647db +F src/vdbevtab.c 1051181ff9d3e038a6e6be53202a63866974274d27d6e6e1a756b217114264bf F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 697424314e40d99f93f548c7bfa526c10e87f4bdf64d5a76a96b999dd7133ebc @@ -1861,7 +1861,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 6819b86eb2de516c445655a83f9b2ba5ae0bff660cffaf84f1345d9be79b051e -R b791763565a600914b8ed358ac45d71f +P 5896cbf4d0c7854c29c96d2ea2cea4adaedaa027a0fe4a3f0ac4dfbeaabb8dec +R 3f50b91586b8e76cd041dd011af7c276 U drh -Z f67cc20bd0e690a5ab7aa0e742134572 +Z 2fb9a1a76e4065ceed4eb9eb209fdb3a diff --git a/manifest.uuid b/manifest.uuid index baae3fe007..0000c89bf9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5896cbf4d0c7854c29c96d2ea2cea4adaedaa027a0fe4a3f0ac4dfbeaabb8dec \ No newline at end of file +df893364b7cea07ff2b15b80cb294dccaffe701d51452264599b55304a36fa7c \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 6c6eb8ec5f..418cc57d33 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2030,7 +2030,7 @@ int sqlite3VdbeNextOpcode( } apSub = (SubProgram **)pSub->z; apSub[nSub++] = aOp[i].p4.pProgram; - pSub->flags |= MEM_Blob; + MemSetTypeFlag(pSub, MEM_Blob); pSub->n = nSub*sizeof(SubProgram*); nRow += aOp[i].p4.pProgram->nOp; } diff --git a/src/vdbevtab.c b/src/vdbevtab.c index a6c1a0526a..b5ec3d3c55 100644 --- a/src/vdbevtab.c +++ b/src/vdbevtab.c @@ -165,24 +165,24 @@ static int bytecodevtabColumn( bytecodevtab *pVTab; Op *pOp = pCur->aOp + pCur->iAddr; switch( i ){ - case 0: + case 0: /* addr */ sqlite3_result_int(ctx, pCur->iAddr); break; - case 1: + case 1: /* opcode */ sqlite3_result_text(ctx, (char*)sqlite3OpcodeName(pOp->opcode), -1, SQLITE_STATIC); break; - case 2: + case 2: /* p1 */ sqlite3_result_int(ctx, pOp->p1); break; - case 3: + case 3: /* p2 */ sqlite3_result_int(ctx, pOp->p2); break; - case 4: + case 4: /* p3 */ sqlite3_result_int(ctx, pOp->p3); break; - case 5: - case 7: + case 5: /* p4 */ + case 7: /* comment */ pVTab = (bytecodevtab*)cur->pVtab; if( pCur->zP4==0 ){ pCur->zP4 = sqlite3VdbeDisplayP4(pVTab->db, pOp); @@ -196,9 +196,22 @@ static int bytecodevtabColumn( #endif } break; - case 6: + case 6: /* p5 */ sqlite3_result_int(ctx, pOp->p5); break; + case 8: { /* subprog */ + Op *aOp = pCur->aOp; + if( pCur->iRowid==pCur->iAddr+1 ){ + break; /* Result is NULL for the main program */ + }else if( aOp[0].p4type==P4_DYNAMIC + && aOp[0].p4.z!=0 + && strncmp(aOp[0].p4.z,"-- ", 3)==0 ){ + sqlite3_result_text(ctx, aOp[0].p4.z+3, -1, SQLITE_STATIC); + }else{ + sqlite3_result_text(ctx, "(FK)", 4, SQLITE_STATIC); + } + break; + } } return SQLITE_OK; } From cf08f08d2c3f2cd5486444224bd67309a46705b7 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 24 Mar 2020 17:52:31 +0000 Subject: [PATCH 013/103] Fix a memory leak. FossilOrigin-Name: c9f3405eeac8aff171b5d76bae954f3b51b353d16286a3d2af43ef942c212abc --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbevtab.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index d5a3f7938f..88dd1f5dcb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Provide\scontent\sfor\sthe\sbytecode.subprog\scolumn. -D 2020-03-24T13:27:53.953 +C Fix\sa\smemory\sleak. +D 2020-03-24T17:52:31.944 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -612,7 +612,7 @@ F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vdbevtab.c 1051181ff9d3e038a6e6be53202a63866974274d27d6e6e1a756b217114264bf +F src/vdbevtab.c 936aceaea948131aad90f159cb95ae81a0c48525b4fa1b177881e2dedfe2510b F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 697424314e40d99f93f548c7bfa526c10e87f4bdf64d5a76a96b999dd7133ebc @@ -1861,7 +1861,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 5896cbf4d0c7854c29c96d2ea2cea4adaedaa027a0fe4a3f0ac4dfbeaabb8dec -R 3f50b91586b8e76cd041dd011af7c276 +P df893364b7cea07ff2b15b80cb294dccaffe701d51452264599b55304a36fa7c +R d325ffd7fee85af0b3d5e5cd91a71c1c U drh -Z 2fb9a1a76e4065ceed4eb9eb209fdb3a +Z f3524124f47701eec8f159f575451b7c diff --git a/manifest.uuid b/manifest.uuid index 0000c89bf9..dd7249ae11 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -df893364b7cea07ff2b15b80cb294dccaffe701d51452264599b55304a36fa7c \ No newline at end of file +c9f3405eeac8aff171b5d76bae954f3b51b353d16286a3d2af43ef942c212abc \ No newline at end of file diff --git a/src/vdbevtab.c b/src/vdbevtab.c index b5ec3d3c55..ffe246b8f4 100644 --- a/src/vdbevtab.c +++ b/src/vdbevtab.c @@ -105,6 +105,7 @@ static int bytecodevtabOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ static void bytecodevtabCursorClear(bytecodevtab_cursor *pCur){ sqlite3_free(pCur->zP4); pCur->zP4 = 0; + sqlite3VdbeMemRelease(&pCur->sub); sqlite3VdbeMemSetNull(&pCur->sub); if( pCur->needFinalize ){ sqlite3_finalize(pCur->pStmt); From 779720755412c162f1863a48af94ace135dd1b18 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 24 Mar 2020 18:41:58 +0000 Subject: [PATCH 014/103] Optimize the "subprog IS NULL" constraint. FossilOrigin-Name: ca8c5f028b9f6f32639c8bc9df5dc02537e21385fcbe7e1ae600c640977ea0d5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbevtab.c | 40 ++++++++++++++++++++++++++-------------- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index 88dd1f5dcb..046be95fb4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\smemory\sleak. -D 2020-03-24T17:52:31.944 +C Optimize\sthe\s"subprog\sIS\sNULL"\sconstraint. +D 2020-03-24T18:41:58.712 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -612,7 +612,7 @@ F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vdbevtab.c 936aceaea948131aad90f159cb95ae81a0c48525b4fa1b177881e2dedfe2510b +F src/vdbevtab.c 7239b3469ab67f4698889780ab6808a6fc2ba49ceaaaf477053acc9501d77403 F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 697424314e40d99f93f548c7bfa526c10e87f4bdf64d5a76a96b999dd7133ebc @@ -1861,7 +1861,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 df893364b7cea07ff2b15b80cb294dccaffe701d51452264599b55304a36fa7c -R d325ffd7fee85af0b3d5e5cd91a71c1c +P c9f3405eeac8aff171b5d76bae954f3b51b353d16286a3d2af43ef942c212abc +R 48f17b54ce03a2f2b95d1ae2b04e26b9 U drh -Z f3524124f47701eec8f159f575451b7c +Z 2b8dc1bd4e5b101494ebc4134b3976ef diff --git a/manifest.uuid b/manifest.uuid index dd7249ae11..8fae101c8f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c9f3405eeac8aff171b5d76bae954f3b51b353d16286a3d2af43ef942c212abc \ No newline at end of file +ca8c5f028b9f6f32639c8bc9df5dc02537e21385fcbe7e1ae600c640977ea0d5 \ No newline at end of file diff --git a/src/vdbevtab.c b/src/vdbevtab.c index ffe246b8f4..7b3c066573 100644 --- a/src/vdbevtab.c +++ b/src/vdbevtab.c @@ -34,6 +34,7 @@ struct bytecodevtab_cursor { int iRowid; /* The rowid of the output table */ int iAddr; /* Address */ int needFinalize; /* Cursors owns pStmt and must finalize it */ + int showSubprograms; /* Provide a listing of subprograms */ Op *aOp; /* Operand array */ char *zP4; /* Rendered P4 value */ Mem sub; /* Subprograms */ @@ -135,8 +136,13 @@ static int bytecodevtabNext(sqlite3_vtab_cursor *cur){ sqlite3_free(pCur->zP4); pCur->zP4 = 0; } - rc = sqlite3VdbeNextOpcode((Vdbe*)pCur->pStmt, &pCur->sub, 0, - &pCur->iRowid, &pCur->iAddr, &pCur->aOp); + rc = sqlite3VdbeNextOpcode( + (Vdbe*)pCur->pStmt, + pCur->showSubprograms ? &pCur->sub : 0, + 0, + &pCur->iRowid, + &pCur->iAddr, + &pCur->aOp); if( rc!=SQLITE_OK ){ sqlite3VdbeMemSetNull(&pCur->sub); pCur->aOp = 0; @@ -228,10 +234,10 @@ static int bytecodevtabRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ } /* -** Initialize a cursor to use a new -** to the first row of output. This method is always called at least -** once prior to any call to bytecodevtabColumn() or bytecodevtabRowid() or -** bytecodevtabEof(). +** Initialize a cursor. +** +** idxNum==0 means show all subprograms +** idxNum==1 means show only the main bytecode and omit subprograms. */ static int bytecodevtabFilter( sqlite3_vtab_cursor *pVtabCursor, @@ -245,6 +251,7 @@ static int bytecodevtabFilter( bytecodevtabCursorClear(pCur); pCur->iRowid = 0; pCur->iAddr = 0; + pCur->showSubprograms = idxNum==0; assert( argc==1 ); if( sqlite3_value_type(argv[0])==SQLITE_TEXT ){ const char *zSql = (const char*)sqlite3_value_text(argv[0]); @@ -279,16 +286,21 @@ static int bytecodevtabBestIndex( ){ int i; int rc = SQLITE_CONSTRAINT; + struct sqlite3_index_constraint *p; pIdxInfo->estimatedCost = (double)100; pIdxInfo->estimatedRows = 100; - for(i=0; inConstraint; i++){ - if( pIdxInfo->aConstraint[i].usable==0 ) continue; - if( pIdxInfo->aConstraint[i].op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; - if( pIdxInfo->aConstraint[i].iColumn!=9 ) continue; - rc = SQLITE_OK; - pIdxInfo->aConstraintUsage[i].omit = 1; - pIdxInfo->aConstraintUsage[i].argvIndex = 1; - break; + pIdxInfo->idxNum = 0; + for(i=0, p=pIdxInfo->aConstraint; inConstraint; i++, p++){ + if( p->usable==0 ) continue; + if( p->op==SQLITE_INDEX_CONSTRAINT_EQ && p->iColumn==9 ){ + rc = SQLITE_OK; + pIdxInfo->aConstraintUsage[i].omit = 1; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + } + if( p->op==SQLITE_INDEX_CONSTRAINT_ISNULL && p->iColumn==8 ){ + pIdxInfo->aConstraintUsage[i].omit = 1; + pIdxInfo->idxNum = 1; + } } return rc; } From 8f78a528d551d53ce53ce2ccdd26263066ed4150 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 26 Mar 2020 16:48:18 +0000 Subject: [PATCH 015/103] Add the tables_used() table-valued function as a variation on bytecode(). FossilOrigin-Name: 6283c677d57220e54375a6463f453c6d068e042263558df16cff1055d1b0d3f5 --- manifest | 14 +++--- manifest.uuid | 2 +- src/vdbeaux.c | 19 ++++++-- src/vdbevtab.c | 118 ++++++++++++++++++++++++++++++++++++++++--------- 4 files changed, 121 insertions(+), 32 deletions(-) diff --git a/manifest b/manifest index 5616287d0b..262df6de9d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\supdates\sfrom\strunk. -D 2020-03-26T15:28:46.653 +C Add\sthe\stables_used()\stable-valued\sfunction\sas\sa\svariation\son\sbytecode(). +D 2020-03-26T16:48:18.810 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -607,12 +607,12 @@ F src/vdbe.c c1c123c6248fa88940b932a00bcc75056921b6d046d45a82566cb97415d2299c F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 F src/vdbeInt.h 5f36e2261731e6a39c66c6902634e474d4a98ed14ca10be6dea5c3776ece4342 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 -F src/vdbeaux.c 9aceb1802cda5f0ce45951afc4b99d5b352d68f95acca7e731bbdc61cd585702 +F src/vdbeaux.c 2b81b42788e718786817fe339eb728e81401542fb221c7f95b24ce39a735eff8 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vdbevtab.c 7239b3469ab67f4698889780ab6808a6fc2ba49ceaaaf477053acc9501d77403 +F src/vdbevtab.c 3f7fd339425729f6cef36ef0bc576bf42641d2a664c746b54a6e2c045ae1a248 F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 697424314e40d99f93f548c7bfa526c10e87f4bdf64d5a76a96b999dd7133ebc @@ -1861,7 +1861,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 ca8c5f028b9f6f32639c8bc9df5dc02537e21385fcbe7e1ae600c640977ea0d5 27936e6884e77093533719c7955a17f051cfb359872e51a6d1481152e6256443 -R 3e64a9cf6d09bafc409422474d49e6cf +P d7db09101878102e192ee7a81437e8f6f2e317ddf110852673a2e81d1f80ae0e +R 97037e53b3358656d7c80bf175451cab U drh -Z 7c5407f80f4f891ef89724feeeb5e566 +Z 77036c852e70ef7951f1cc73bc25be37 diff --git a/manifest.uuid b/manifest.uuid index 1771788b9e..27ef553c8e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d7db09101878102e192ee7a81437e8f6f2e317ddf110852673a2e81d1f80ae0e \ No newline at end of file +6283c677d57220e54375a6463f453c6d068e042263558df16cff1055d1b0d3f5 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 418cc57d33..c0bb9c77f8 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1953,7 +1953,7 @@ void sqlite3VdbeFrameMemDel(void *pArg){ int sqlite3VdbeNextOpcode( Vdbe *p, /* The statement being explained */ Mem *pSub, /* Storage for keeping track of subprogram nesting */ - int bEqp, /* True to return only OP_Explain opcodes */ + int eMode, /* 0: normal. 1: EQP. 2: TablesUsed */ int *piPc, /* IN/OUT: Current rowid. Overwritten with next rowid */ int *piAddr, /* OUT: Write index into (*paOp)[] here */ Op **paOp /* OUT: Write the opcode array here */ @@ -2035,9 +2035,20 @@ int sqlite3VdbeNextOpcode( nRow += aOp[i].p4.pProgram->nOp; } } - if( !bEqp ) break; - if( aOp[i].opcode==OP_Explain ) break; - if( aOp[i].opcode==OP_Init && p->pc>1 ) break; + if( eMode==0 ) break; +#ifdef SQLITE_ENABLE_BYTECODE_VTAB + if( eMode==2 ){ + Op *pOp = aOp + i; + if( pOp->opcode==OP_OpenRead ) break; + if( pOp->opcode==OP_OpenWrite && (pOp->p5 & OPFLAG_P2ISREG)==0 ) break; + if( pOp->opcode==OP_ReopenIdx ) break; + }else +#endif + { + assert( eMode==1 ); + if( aOp[i].opcode==OP_Explain ) break; + if( aOp[i].opcode==OP_Init && p->pc>1 ) break; + } } *piPc = iPc; *piAddr = i; diff --git a/src/vdbevtab.c b/src/vdbevtab.c index 7b3c066573..d97db1c156 100644 --- a/src/vdbevtab.c +++ b/src/vdbevtab.c @@ -23,6 +23,7 @@ typedef struct bytecodevtab bytecodevtab; struct bytecodevtab { sqlite3_vtab base; /* Base class - must be first */ sqlite3 *db; /* Database connection */ + int bTablesUsed; /* 2 for tables_used(). 0 for bytecode(). */ }; /* A cursor for scanning through the bytecode @@ -37,6 +38,9 @@ struct bytecodevtab_cursor { int showSubprograms; /* Provide a listing of subprograms */ Op *aOp; /* Operand array */ char *zP4; /* Rendered P4 value */ + const char *zType; /* tables_used.type */ + const char *zSchema; /* tables_used.schema */ + const char *zName; /* tables_used.name */ Mem sub; /* Subprograms */ }; @@ -52,27 +56,41 @@ static int bytecodevtabConnect( ){ bytecodevtab *pNew; int rc; + int isTabUsed = pAux!=0; + const char *azSchema[2] = { + /* bytecode() schema */ + "CREATE TABLE x(" + "addr INT," + "opcode TEXT," + "p1 INT," + "p2 INT," + "p3 INT," + "p4 TEXT," + "p5 INT," + "comment TEXT," + "subprog TEXT," + "stmt HIDDEN" + ");", - rc = sqlite3_declare_vtab(db, - "CREATE TABLE x(" - "addr INT," - "opcode TEXT," - "p1 INT," - "p2 INT," - "p3 INT," - "p4 TEXT," - "p5 INT," - "comment TEXT," - "subprog TEXT," - "stmt HIDDEN" - ");" - ); + /* Tables_used() schema */ + "CREATE TABLE x(" + "type TEXT," + "schema TEXT," + "name TEXT," + "wr INT," + "subprog TEXT," + "stmt HIDDEN" + ");" + }; + + rc = sqlite3_declare_vtab(db, azSchema[isTabUsed]); if( rc==SQLITE_OK ){ pNew = sqlite3_malloc( sizeof(*pNew) ); *ppVtab = (sqlite3_vtab*)pNew; if( pNew==0 ) return SQLITE_NOMEM; memset(pNew, 0, sizeof(*pNew)); pNew->db = db; + pNew->bTablesUsed = isTabUsed*2; } return rc; } @@ -113,6 +131,9 @@ static void bytecodevtabCursorClear(bytecodevtab_cursor *pCur){ } pCur->pStmt = 0; pCur->needFinalize = 0; + pCur->zType = 0; + pCur->zSchema = 0; + pCur->zName = 0; } /* @@ -131,15 +152,21 @@ static int bytecodevtabClose(sqlite3_vtab_cursor *cur){ */ static int bytecodevtabNext(sqlite3_vtab_cursor *cur){ bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; + bytecodevtab *pTab = (bytecodevtab*)cur->pVtab; int rc; if( pCur->zP4 ){ sqlite3_free(pCur->zP4); pCur->zP4 = 0; } + if( pCur->zName ){ + pCur->zName = 0; + pCur->zType = 0; + pCur->zSchema = 0; + } rc = sqlite3VdbeNextOpcode( (Vdbe*)pCur->pStmt, pCur->showSubprograms ? &pCur->sub : 0, - 0, + pTab->bTablesUsed, &pCur->iRowid, &pCur->iAddr, &pCur->aOp); @@ -169,8 +196,42 @@ static int bytecodevtabColumn( int i /* Which column to return */ ){ bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; - bytecodevtab *pVTab; + bytecodevtab *pVTab = (bytecodevtab*)cur->pVtab; Op *pOp = pCur->aOp + pCur->iAddr; + if( pVTab->bTablesUsed ){ + if( i==4 ){ + i = 8; + }else{ + if( i<=2 && pCur->zType==0 ){ + Schema *pSchema; + HashElem *k; + int iDb = pOp->p3; + int iRoot = pOp->p2; + sqlite3 *db = pVTab->db; + pSchema = db->aDb[iDb].pSchema; + pCur->zSchema = db->aDb[iDb].zDbSName; + for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){ + Table *pTab = (Table*)sqliteHashData(k); + if( !IsVirtual(pTab) && pTab->tnum==iRoot ){ + pCur->zName = pTab->zName; + pCur->zType = "table"; + break; + } + } + if( pCur->zName==0 ){ + for(k=sqliteHashFirst(&pSchema->idxHash); k; k=sqliteHashNext(k)){ + Index *pIdx = (Index*)sqliteHashData(k); + if( pIdx->tnum==iRoot ){ + pCur->zName = pIdx->zName; + pCur->zType = "index"; + break; + } + } + } + } + i += 10; + } + } switch( i ){ case 0: /* addr */ sqlite3_result_int(ctx, pCur->iAddr); @@ -190,7 +251,6 @@ static int bytecodevtabColumn( break; case 5: /* p4 */ case 7: /* comment */ - pVTab = (bytecodevtab*)cur->pVtab; if( pCur->zP4==0 ){ pCur->zP4 = sqlite3VdbeDisplayP4(pVTab->db, pOp); } @@ -219,6 +279,18 @@ static int bytecodevtabColumn( } break; } + case 10: /* tables_used.type */ + sqlite3_result_text(ctx, pCur->zType, -1, SQLITE_STATIC); + break; + case 11: /* tables_used.schema */ + sqlite3_result_text(ctx, pCur->zSchema, -1, SQLITE_STATIC); + break; + case 12: /* tables_used.name */ + sqlite3_result_text(ctx, pCur->zName, -1, SQLITE_STATIC); + break; + case 13: /* tables_used.wr */ + sqlite3_result_int(ctx, pOp->opcode==OP_OpenWrite); + break; } return SQLITE_OK; } @@ -266,7 +338,8 @@ static int bytecodevtabFilter( } if( pCur->pStmt==0 ){ pVTab->base.zErrMsg = sqlite3_mprintf( - "argument to bytecode() is not a valid SQL statement" + "argument to %s() is not a valid SQL statement", + pVTab->bTablesUsed ? "tables_used" : "bytecode" ); rc = SQLITE_ERROR; }else{ @@ -287,17 +360,19 @@ static int bytecodevtabBestIndex( int i; int rc = SQLITE_CONSTRAINT; struct sqlite3_index_constraint *p; + bytecodevtab *pVTab = (bytecodevtab*)tab; + int iBaseCol = pVTab->bTablesUsed ? 4 : 8; pIdxInfo->estimatedCost = (double)100; pIdxInfo->estimatedRows = 100; pIdxInfo->idxNum = 0; for(i=0, p=pIdxInfo->aConstraint; inConstraint; i++, p++){ if( p->usable==0 ) continue; - if( p->op==SQLITE_INDEX_CONSTRAINT_EQ && p->iColumn==9 ){ + if( p->op==SQLITE_INDEX_CONSTRAINT_EQ && p->iColumn==iBaseCol+1 ){ rc = SQLITE_OK; pIdxInfo->aConstraintUsage[i].omit = 1; pIdxInfo->aConstraintUsage[i].argvIndex = 1; } - if( p->op==SQLITE_INDEX_CONSTRAINT_ISNULL && p->iColumn==8 ){ + if( p->op==SQLITE_INDEX_CONSTRAINT_ISNULL && p->iColumn==iBaseCol ){ pIdxInfo->aConstraintUsage[i].omit = 1; pIdxInfo->idxNum = 1; } @@ -340,6 +415,9 @@ static sqlite3_module bytecodevtabModule = { int sqlite3VdbeBytecodeVtabInit(sqlite3 *db){ int rc; rc = sqlite3_create_module(db, "bytecode", &bytecodevtabModule, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3_create_module(db, "tables_used", &bytecodevtabModule, &db); + } return rc; } #endif /* SQLITE_ENABLE_BYTECODE_VTAB */ From 49a76a8fe5272426fee553d10111e5cf0babd571 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 31 Mar 2020 20:57:06 +0000 Subject: [PATCH 016/103] Add "PRAGMA analysis_limit=N;" to limit the number of rows visited by ANALYZE when N is positive. Positive N also disables collecting stat4. FossilOrigin-Name: a279b151c1623807774daf4975175c62ea252eefb71f9820ced6773769b392c5 --- manifest | 20 +++++----- manifest.uuid | 2 +- src/analyze.c | 49 ++++++++++++----------- src/pragma.c | 19 +++++++++ src/pragma.h | 94 +++++++++++++++++++++++--------------------- src/sqliteInt.h | 1 + tool/mkpragmatab.tcl | 3 ++ 7 files changed, 109 insertions(+), 79 deletions(-) diff --git a/manifest b/manifest index d4b41459ae..b3aa1c4102 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\srecent\senhancements\sfrom\strunk. -D 2020-03-31T18:41:21.038 +C Add\s"PRAGMA\sanalysis_limit=N;"\sto\slimit\sthe\snumber\sof\srows\svisited\sby\nANALYZE\swhen\sN\sis\spositive.\s\sPositive\sN\salso\sdisables\scollecting\sstat4. +D 2020-03-31T20:57:06.787 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -466,7 +466,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c f48a4423c8f198d7f1ae4940f74b606707d05384ac79fb219be8e3323af2a2de -F src/analyze.c 3d90f56656f5c6e7f835659b46ccf517c156df5222be86b4ff279eb476e8e373 +F src/analyze.c 4b139fa045d17192ba11ee97e6123cc011efbae690ec302f5d1eb53fd52d5ded F src/attach.c ff2daea0fe62080192e3f262670e4f61f5a86c1e7bea9cec34e960fe79852aa1 F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b @@ -524,8 +524,8 @@ F src/parse.y c8eff38606f443d5ba245263fa7abc05e4116d95656e050c4b78e9bfbf931add F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a -F src/pragma.c aff7b91cb36e58cee67d5dfc1c3a4b3c02aed104ce3ea1d6082aad2d61b445d7 -F src/pragma.h 9473160d220416456b40f27323bb4b316d4e4e08ffbf8bf88c5f7045d49c38e5 +F src/pragma.c 85f763714b192cc26a236e3ec020a9155fe8da248af21eae86c0d1f0f49a0753 +F src/pragma.h 8168e588536bffd95319451f34e9a754dc37d205ebe433031a7813c5b286beae F src/prepare.c 8d4d6c8aa6afefc48027c54b41cdf134b4d6bc2fc4badbe483ad7fd9e1728a28 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 @@ -536,7 +536,7 @@ F src/shell.c.in 7bb9005bf876c4e1210257a63fa49b556f4eddf59f94b6eb310fcb5096bec0e F src/sqlite.h.in cc7d0949ac32bb68ed97acdb3e7ae91cd413a24d32d6ff049ef8308d620a4367 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9c5269260409eb3275324ccace6a13a96f4ad330c708415f70ca6097901ff4ee -F src/sqliteInt.h b0165686885990e29622f56b2f95b93c12c6f84be4cf1ee60797d80a0dcd7f15 +F src/sqliteInt.h 7bab5c24cd05f8173e1a30917857f42d8e1fbb834e9ea9c02ca23b50383e209d F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1793,7 +1793,7 @@ F tool/mkmsvcmin.tcl 6ecab9fe22c2c8de4d82d4c46797bda3d2deac8e763885f5a38d0c44a89 F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa -F tool/mkpragmatab.tcl 62663c65d9191aada624a787e1ee3420f268a3c27999ad0ffb77a6918ddc1e52 +F tool/mkpragmatab.tcl d348a4bf71ac068bddf89326562071cbbd962273d88f9b5e5d622f3e73b78bdf F tool/mkshellc.tcl 70a9978e363b0f3280ca9ce1c46d72563ff479c1930a12a7375e3881b7325712 F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 @@ -1860,7 +1860,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 8f0a8c2aa45f7cf7339094d83893aeb046b010b5b97bb4dae99ac07a8ebf2fa6 a49f8ec552bede7da731e0571ccf49de1a30e7be3a5673150436c8b411ba6ffc -R f330422722a52c77c50a3e7d8a9da878 +P c705ce266ad25af71791035590875f0ea9f2c72826b3eda17f065d2bf091de92 +R 89edd918806457e430236657da896c8f U drh -Z 2ae26fc9e4b49bbb8102a35ce551a2aa +Z bd47b9db8446ad6b70c7b3bf3d82180a diff --git a/manifest.uuid b/manifest.uuid index c079a7d71d..788d4b8710 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c705ce266ad25af71791035590875f0ea9f2c72826b3eda17f065d2bf091de92 \ No newline at end of file +a279b151c1623807774daf4975175c62ea252eefb71f9820ced6773769b392c5 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index 4414c50807..2cad81817b 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -282,6 +282,7 @@ struct StatAccum { sqlite3 *db; /* Database connection, for malloc() */ tRowcnt nEst; /* Estimated number of rows */ tRowcnt nRow; /* Number of rows visited so far */ + int nLimit; /* Analysis row-scan limit */ int nCol; /* Number of columns in index + pk/rowid */ int nKeyCol; /* Number of index columns w/o the pk/rowid */ u8 nSkipAhead; /* Number of times of skip-ahead */ @@ -375,11 +376,12 @@ static void statAccumDestructor(void *pOld){ } /* -** Implementation of the stat_init(N,K,C) SQL function. The three parameters +** Implementation of the stat_init(N,K,C,L) SQL function. The four parameters ** are: ** N: The number of columns in the index including the rowid/pk (note 1) ** K: The number of columns in the index excluding the rowid/pk. ** C: Estimated number of rows in the index +** L: A limit on the number of rows to scan, or 0 for no-limit ** ** Note 1: In the special case of the covering index that implements a ** WITHOUT ROWID table, N is the number of PRIMARY KEY columns, not the @@ -441,6 +443,11 @@ static void statInit( p->db = db; p->nEst = sqlite3_value_int64(argv[2]); p->nRow = 0; + p->nLimit = sqlite3_value_int64(argv[3]); +#ifdef SQLITE_ENABLE_STAT4 + /* Disable STAT4 statistics gathering if there is a analysis_limit set */ + if( p->nLimit>0 ) p->mxSample = 0; +#endif p->nCol = nCol; p->nKeyCol = nKeyCol; p->nSkipAhead = 0; @@ -677,15 +684,6 @@ static void samplePushPrevious(StatAccum *p, int iChng){ } #endif /* SQLITE_ENABLE_STAT4 */ -/* -** A limit on the number of rows of an index that will be examined -** by ANALYZE before it starts going with approximations. Zero means -** "no limit". -*/ -#ifndef SQLITE_ANALYZE_LIMIT -# define SQLITE_ANALYZE_LIMIT 0 -#endif - /* ** Implementation of the stat_push SQL function: stat_push(P,C,R) ** Arguments: @@ -774,14 +772,10 @@ static void statPush( } }else #endif -#if SQLITE_ANALYZE_LIMIT - if( p->nRow>SQLITE_ANALYZE_LIMIT*(p->nSkipAhead+1) ){ + if( p->nLimit && p->nRow>p->nLimit*(p->nSkipAhead+1) ){ p->nSkipAhead++; sqlite3_result_int(context, p->current.anDLt[0]>0); } -#else - {} -#endif } static const FuncDef statPushFuncdef = { @@ -987,6 +981,7 @@ static void analyzeOneTable( int regChng = iMem++; /* Index of changed index field */ int regRowid = iMem++; /* Rowid argument passed to stat_push() */ int regTemp = iMem++; /* Temporary use register */ + int regTemp2 = iMem++; /* Second temporary use register */ int regTabname = iMem++; /* Register containing table name */ int regIdxname = iMem++; /* Register containing index name */ int regStat1 = iMem++; /* Value for the stat column of sqlite_stat1 */ @@ -1131,7 +1126,9 @@ static void analyzeOneTable( VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_Count, iIdxCur, regTemp, 1); } - sqlite3VdbeAddFunctionCall(pParse, 0, regStat+1, regStat, 3, + assert( regTemp2==regStat+4 ); + sqlite3VdbeAddOp2(v, OP_Integer, db->nAnalysisLimit, regTemp2); + sqlite3VdbeAddFunctionCall(pParse, 0, regStat+1, regStat, 4, &statInitFuncdef, 0); /* Implementation of the following: @@ -1230,16 +1227,20 @@ static void analyzeOneTable( #endif assert( regChng==(regStat+1) ); { - int j1, j2, j3; sqlite3VdbeAddFunctionCall(pParse, 1, regStat, regTemp, 2+IsStat4, &statPushFuncdef, 0); - j1 = sqlite3VdbeAddOp1(v, OP_IsNull, regTemp); - j2 = sqlite3VdbeAddOp1(v, OP_If, regTemp); - j3 = sqlite3VdbeAddOp4Int(v, OP_SeekGT, iIdxCur, 0, regPrev, 1); - sqlite3VdbeJumpHere(v, j1); - sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); - sqlite3VdbeJumpHere(v, j2); - sqlite3VdbeJumpHere(v, j3); + if( db->nAnalysisLimit ){ + int j1, j2, j3; + j1 = sqlite3VdbeAddOp1(v, OP_IsNull, regTemp); VdbeCoverage(v); + j2 = sqlite3VdbeAddOp1(v, OP_If, regTemp); VdbeCoverage(v); + j3 = sqlite3VdbeAddOp4Int(v, OP_SeekGT, iIdxCur, 0, regPrev, 1); + sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, j2); + sqlite3VdbeJumpHere(v, j3); + }else{ + sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); + } } /* Add the entry to the stat1 table. */ diff --git a/src/pragma.c b/src/pragma.c index e2c625549e..7105f75a97 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -2176,6 +2176,25 @@ void sqlite3Pragma( break; } + /* + ** PRAGMA analysis_limit + ** PRAGMA analysis_limit = N + ** + ** Configure the maximum number of rows that ANALYZE will examine + ** in each index that it looks at. Return the new limit. + */ + case PragTyp_ANALYSIS_LIMIT: { + sqlite3_int64 N; + if( zRight + && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK + && N>=0 + ){ + db->nAnalysisLimit = (int)(N&0x7fffffff); + } + returnSingleInt(v, db->nAnalysisLimit); + break; + } + #if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) /* ** Report the current state of file logs for all databases diff --git a/src/pragma.h b/src/pragma.h index 7046695a5b..0d7cae0e1d 100644 --- a/src/pragma.h +++ b/src/pragma.h @@ -6,49 +6,50 @@ /* The various pragma types */ #define PragTyp_ACTIVATE_EXTENSIONS 0 -#define PragTyp_HEADER_VALUE 1 -#define PragTyp_AUTO_VACUUM 2 -#define PragTyp_FLAG 3 -#define PragTyp_BUSY_TIMEOUT 4 -#define PragTyp_CACHE_SIZE 5 -#define PragTyp_CACHE_SPILL 6 -#define PragTyp_CASE_SENSITIVE_LIKE 7 -#define PragTyp_COLLATION_LIST 8 -#define PragTyp_COMPILE_OPTIONS 9 -#define PragTyp_DATA_STORE_DIRECTORY 10 -#define PragTyp_DATABASE_LIST 11 -#define PragTyp_DEFAULT_CACHE_SIZE 12 -#define PragTyp_ENCODING 13 -#define PragTyp_FOREIGN_KEY_CHECK 14 -#define PragTyp_FOREIGN_KEY_LIST 15 -#define PragTyp_FUNCTION_LIST 16 -#define PragTyp_HARD_HEAP_LIMIT 17 -#define PragTyp_INCREMENTAL_VACUUM 18 -#define PragTyp_INDEX_INFO 19 -#define PragTyp_INDEX_LIST 20 -#define PragTyp_INTEGRITY_CHECK 21 -#define PragTyp_JOURNAL_MODE 22 -#define PragTyp_JOURNAL_SIZE_LIMIT 23 -#define PragTyp_LOCK_PROXY_FILE 24 -#define PragTyp_LOCKING_MODE 25 -#define PragTyp_PAGE_COUNT 26 -#define PragTyp_MMAP_SIZE 27 -#define PragTyp_MODULE_LIST 28 -#define PragTyp_OPTIMIZE 29 -#define PragTyp_PAGE_SIZE 30 -#define PragTyp_PRAGMA_LIST 31 -#define PragTyp_SECURE_DELETE 32 -#define PragTyp_SHRINK_MEMORY 33 -#define PragTyp_SOFT_HEAP_LIMIT 34 -#define PragTyp_SYNCHRONOUS 35 -#define PragTyp_TABLE_INFO 36 -#define PragTyp_TEMP_STORE 37 -#define PragTyp_TEMP_STORE_DIRECTORY 38 -#define PragTyp_THREADS 39 -#define PragTyp_WAL_AUTOCHECKPOINT 40 -#define PragTyp_WAL_CHECKPOINT 41 -#define PragTyp_LOCK_STATUS 42 -#define PragTyp_STATS 43 +#define PragTyp_ANALYSIS_LIMIT 1 +#define PragTyp_HEADER_VALUE 2 +#define PragTyp_AUTO_VACUUM 3 +#define PragTyp_FLAG 4 +#define PragTyp_BUSY_TIMEOUT 5 +#define PragTyp_CACHE_SIZE 6 +#define PragTyp_CACHE_SPILL 7 +#define PragTyp_CASE_SENSITIVE_LIKE 8 +#define PragTyp_COLLATION_LIST 9 +#define PragTyp_COMPILE_OPTIONS 10 +#define PragTyp_DATA_STORE_DIRECTORY 11 +#define PragTyp_DATABASE_LIST 12 +#define PragTyp_DEFAULT_CACHE_SIZE 13 +#define PragTyp_ENCODING 14 +#define PragTyp_FOREIGN_KEY_CHECK 15 +#define PragTyp_FOREIGN_KEY_LIST 16 +#define PragTyp_FUNCTION_LIST 17 +#define PragTyp_HARD_HEAP_LIMIT 18 +#define PragTyp_INCREMENTAL_VACUUM 19 +#define PragTyp_INDEX_INFO 20 +#define PragTyp_INDEX_LIST 21 +#define PragTyp_INTEGRITY_CHECK 22 +#define PragTyp_JOURNAL_MODE 23 +#define PragTyp_JOURNAL_SIZE_LIMIT 24 +#define PragTyp_LOCK_PROXY_FILE 25 +#define PragTyp_LOCKING_MODE 26 +#define PragTyp_PAGE_COUNT 27 +#define PragTyp_MMAP_SIZE 28 +#define PragTyp_MODULE_LIST 29 +#define PragTyp_OPTIMIZE 30 +#define PragTyp_PAGE_SIZE 31 +#define PragTyp_PRAGMA_LIST 32 +#define PragTyp_SECURE_DELETE 33 +#define PragTyp_SHRINK_MEMORY 34 +#define PragTyp_SOFT_HEAP_LIMIT 35 +#define PragTyp_SYNCHRONOUS 36 +#define PragTyp_TABLE_INFO 37 +#define PragTyp_TEMP_STORE 38 +#define PragTyp_TEMP_STORE_DIRECTORY 39 +#define PragTyp_THREADS 40 +#define PragTyp_WAL_AUTOCHECKPOINT 41 +#define PragTyp_WAL_CHECKPOINT 42 +#define PragTyp_LOCK_STATUS 43 +#define PragTyp_STATS 44 /* Property flags associated with various pragma. */ #define PragFlg_NeedSchema 0x01 /* Force schema load before running */ @@ -139,6 +140,11 @@ static const PragmaName aPragmaName[] = { /* ColNames: */ 0, 0, /* iArg: */ 0 }, #endif + {/* zName: */ "analysis_limit", + /* ePragTyp: */ PragTyp_ANALYSIS_LIMIT, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) {/* zName: */ "application_id", /* ePragTyp: */ PragTyp_HEADER_VALUE, @@ -639,4 +645,4 @@ static const PragmaName aPragmaName[] = { /* iArg: */ SQLITE_WriteSchema|SQLITE_NoSchemaError }, #endif }; -/* Number of pragmas: 66 on by default, 76 total. */ +/* Number of pragmas: 67 on by default, 77 total. */ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d08c7ce1e7..464ab91175 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1539,6 +1539,7 @@ struct sqlite3 { BusyHandler busyHandler; /* Busy callback */ Db aDbStatic[2]; /* Static space for the 2 default backends */ Savepoint *pSavepoint; /* List of active savepoints */ + int nAnalysisLimit; /* Number of index rows to ANALYZE */ int busyTimeout; /* Busy handler timeout, in msec */ int nSavepoint; /* Number of non-transaction savepoints */ int nStatement; /* Number of nested statement-transactions */ diff --git a/tool/mkpragmatab.tcl b/tool/mkpragmatab.tcl index 7c8ffd3530..c33f20fd98 100644 --- a/tool/mkpragmatab.tcl +++ b/tool/mkpragmatab.tcl @@ -382,6 +382,9 @@ set pragma_def { NAME: threads FLAG: Result0 + NAME: analysis_limit + FLAG: Result0 + NAME: optimize FLAG: Result1 NeedSchema From 31e3744ecb0b679ffbdf3b9b5ac32c360877571c Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 1 Apr 2020 01:15:16 +0000 Subject: [PATCH 017/103] Simple fixes to PRAGMA analysis_limit. FossilOrigin-Name: c20d4fdee21409ebc9c65c9540af8ac48d1f4425499a6674ef9319655c192612 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/analyze.c | 10 +++------- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index b3aa1c4102..2f08512a89 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\s"PRAGMA\sanalysis_limit=N;"\sto\slimit\sthe\snumber\sof\srows\svisited\sby\nANALYZE\swhen\sN\sis\spositive.\s\sPositive\sN\salso\sdisables\scollecting\sstat4. -D 2020-03-31T20:57:06.787 +C Simple\sfixes\sto\sPRAGMA\sanalysis_limit. +D 2020-04-01T01:15:16.332 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -466,7 +466,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c f48a4423c8f198d7f1ae4940f74b606707d05384ac79fb219be8e3323af2a2de -F src/analyze.c 4b139fa045d17192ba11ee97e6123cc011efbae690ec302f5d1eb53fd52d5ded +F src/analyze.c 05c99006dfc373a056b05a96539d86482684715b8840c097a6bbc83616c7cb50 F src/attach.c ff2daea0fe62080192e3f262670e4f61f5a86c1e7bea9cec34e960fe79852aa1 F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b @@ -1860,7 +1860,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 c705ce266ad25af71791035590875f0ea9f2c72826b3eda17f065d2bf091de92 -R 89edd918806457e430236657da896c8f +P a279b151c1623807774daf4975175c62ea252eefb71f9820ced6773769b392c5 +R 29bf358993a7c679676ef1389a2bc787 U drh -Z bd47b9db8446ad6b70c7b3bf3d82180a +Z 5cabae488dd95fb06d50ea84062f02c6 diff --git a/manifest.uuid b/manifest.uuid index 788d4b8710..a36af84637 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a279b151c1623807774daf4975175c62ea252eefb71f9820ced6773769b392c5 \ No newline at end of file +c20d4fdee21409ebc9c65c9540af8ac48d1f4425499a6674ef9319655c192612 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index 2cad81817b..baca0efad0 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -444,10 +444,6 @@ static void statInit( p->nEst = sqlite3_value_int64(argv[2]); p->nRow = 0; p->nLimit = sqlite3_value_int64(argv[3]); -#ifdef SQLITE_ENABLE_STAT4 - /* Disable STAT4 statistics gathering if there is a analysis_limit set */ - if( p->nLimit>0 ) p->mxSample = 0; -#endif p->nCol = nCol; p->nKeyCol = nKeyCol; p->nSkipAhead = 0; @@ -455,7 +451,7 @@ static void statInit( p->current.anEq = &p->current.anDLt[nColUp]; #ifdef SQLITE_ENABLE_STAT4 - p->mxSample = mxSample; + p->mxSample = p->nLimit==0 ? mxSample : 0; if( mxSample ){ u8 *pSpace; /* Allocated space not yet assigned */ int i; /* Used to iterate through p->aSample[] */ @@ -489,7 +485,7 @@ static void statInit( sqlite3_result_blob(context, p, sizeof(*p), statAccumDestructor); } static const FuncDef statInitFuncdef = { - 2+IsStat4, /* nArg */ + 4, /* nArg */ SQLITE_UTF8, /* funcFlags */ 0, /* pUserData */ 0, /* pNext */ @@ -1256,7 +1252,7 @@ static void analyzeOneTable( /* Add the entries to the stat4 table. */ #ifdef SQLITE_ENABLE_STAT4 - if( OptimizationEnabled(db, SQLITE_Stat4) ){ + if( OptimizationEnabled(db, SQLITE_Stat4) && db->nAnalysisLimit==0 ){ int regEq = regStat1; int regLt = regStat1+1; int regDLt = regStat1+2; From e0ef4e2b47c27c19320ab81f983173bd86709174 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Apr 2020 12:53:17 +0000 Subject: [PATCH 018/103] Add a missing #ifdef to avoid a harmless compiler warning. FossilOrigin-Name: cc54de354317ebc080d4d1ee25427b31a49c4a75e01cb5d9966f1aaeb2ad098d --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbeInt.h | 2 ++ src/vdbeaux.c | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 6ecfce648f..0af47f4e5f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\senhancements\sfrom\strunk. -D 2020-04-02T12:24:08.483 +C Add\sa\smissing\s#ifdef\sto\savoid\sa\sharmless\scompiler\swarning. +D 2020-04-02T12:53:17.013 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -605,9 +605,9 @@ F src/util.c a285c1e026907b69fa2592bd05047a565a1d8a1aef2b73c924b6a8ffe772871a F src/vacuum.c 813b510ba887fee6492bcb11f2bf77d7eb58b232b83649136372e0a2fc17f4b9 F src/vdbe.c 972999395eee88702091fb5d50cf4effd07889c371807d222a7f517388e6378e F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 -F src/vdbeInt.h 5f36e2261731e6a39c66c6902634e474d4a98ed14ca10be6dea5c3776ece4342 +F src/vdbeInt.h 01250089f9a90e9342de1c4cc79cbfa86133c251fe94ecb09564fabe122d00b7 F src/vdbeapi.c d176ee7251d5344de7bb2a0d2dd0fe536834e5843d9bc2389e0f5cdcd5374141 -F src/vdbeaux.c 07b697900b22bd2717cee24ff4cfc3c7433a7e1c62979e687a0d23f2668b9904 +F src/vdbeaux.c 892673818ed28961238907540021cb7035eca2757095aab160f866473201a84f F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df @@ -1861,7 +1861,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 6283c677d57220e54375a6463f453c6d068e042263558df16cff1055d1b0d3f5 a49f8ec552bede7da731e0571ccf49de1a30e7be3a5673150436c8b411ba6ffc -R 3169d95f383859bfa6626ea7d2fa0b6d +P d1731385c077f298b0cf654d6183ed40f7e5c07e4e2ab7f69109cf951ce99d9e +R 7dc28ba8a275eed6b89f173889480939 U drh -Z 88bed112404a5cfaec60f425ff57b550 +Z ff4e168336800c29cfb3e03082888acf diff --git a/manifest.uuid b/manifest.uuid index cd1792d40d..3b1237664a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d1731385c077f298b0cf654d6183ed40f7e5c07e4e2ab7f69109cf951ce99d9e \ No newline at end of file +cc54de354317ebc080d4d1ee25427b31a49c4a75e01cb5d9966f1aaeb2ad098d \ No newline at end of file diff --git a/src/vdbeInt.h b/src/vdbeInt.h index a9465cc0ac..2d5cfeff2a 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -500,6 +500,8 @@ int sqlite3VdbeExec(Vdbe*); #if !defined(SQLITE_OMIT_EXPLAIN) || defined(SQLITE_ENABLE_BYTECODE_VTAB) int sqlite3VdbeNextOpcode(Vdbe*,Mem*,int,int*,int*,Op**); char *sqlite3VdbeDisplayP4(sqlite3*,Op*); +#endif +#if defined(SQLITE_ENABLE_EXPLAIN_COMMENT) char *sqlite3VdbeDisplayComment(sqlite3*,const Op*,const char*); #endif #if !defined(SQLITE_OMIT_EXPLAIN) diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 7be4601833..4a3bf07311 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1548,7 +1548,7 @@ char *sqlite3VdbeDisplayComment( } return sqlite3StrAccumFinish(&x); } -#endif /* SQLITE_DEBUG */ +#endif /* SQLITE_ENABLE_EXPLAIN_COMMENTS */ #if VDBE_DISPLAY_P4 && defined(SQLITE_ENABLE_CURSOR_HINTS) /* From c004bd54e33213499cdd3e8c974598fb1eef7764 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Apr 2020 13:08:54 +0000 Subject: [PATCH 019/103] Fix another harmless compiler warning. FossilOrigin-Name: 949eec2530bbe7f48daddfb3022d60ea5d7a43f0f5d120e71c682054feb721db --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbeInt.h | 2 +- src/vdbeaux.c | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 0af47f4e5f..691abd35eb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\smissing\s#ifdef\sto\savoid\sa\sharmless\scompiler\swarning. -D 2020-04-02T12:53:17.013 +C Fix\sanother\sharmless\scompiler\swarning. +D 2020-04-02T13:08:54.300 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -605,9 +605,9 @@ F src/util.c a285c1e026907b69fa2592bd05047a565a1d8a1aef2b73c924b6a8ffe772871a F src/vacuum.c 813b510ba887fee6492bcb11f2bf77d7eb58b232b83649136372e0a2fc17f4b9 F src/vdbe.c 972999395eee88702091fb5d50cf4effd07889c371807d222a7f517388e6378e F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 -F src/vdbeInt.h 01250089f9a90e9342de1c4cc79cbfa86133c251fe94ecb09564fabe122d00b7 +F src/vdbeInt.h 571413068b5ac07e2ed8ca7a02fa529622fd5455ae6981498376e5e492d2e5ef F src/vdbeapi.c d176ee7251d5344de7bb2a0d2dd0fe536834e5843d9bc2389e0f5cdcd5374141 -F src/vdbeaux.c 892673818ed28961238907540021cb7035eca2757095aab160f866473201a84f +F src/vdbeaux.c 2b47d2443f2bf6a26cac0872b39d0642a8b7ff86c207eea0aed37d39a7d379d7 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df @@ -1861,7 +1861,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 d1731385c077f298b0cf654d6183ed40f7e5c07e4e2ab7f69109cf951ce99d9e -R 7dc28ba8a275eed6b89f173889480939 +P cc54de354317ebc080d4d1ee25427b31a49c4a75e01cb5d9966f1aaeb2ad098d +R 8fe319a58a23143f83b349fa4edfbc9a U drh -Z ff4e168336800c29cfb3e03082888acf +Z 7487d39d42c11bfb0d43c4ac88cff31d diff --git a/manifest.uuid b/manifest.uuid index 3b1237664a..bd924a15f5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cc54de354317ebc080d4d1ee25427b31a49c4a75e01cb5d9966f1aaeb2ad098d \ No newline at end of file +949eec2530bbe7f48daddfb3022d60ea5d7a43f0f5d120e71c682054feb721db \ No newline at end of file diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 2d5cfeff2a..e461983122 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -501,7 +501,7 @@ int sqlite3VdbeExec(Vdbe*); int sqlite3VdbeNextOpcode(Vdbe*,Mem*,int,int*,int*,Op**); char *sqlite3VdbeDisplayP4(sqlite3*,Op*); #endif -#if defined(SQLITE_ENABLE_EXPLAIN_COMMENT) +#if defined(SQLITE_ENABLE_EXPLAIN_COMMENTS) char *sqlite3VdbeDisplayComment(sqlite3*,const Op*,const char*); #endif #if !defined(SQLITE_OMIT_EXPLAIN) diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 4a3bf07311..7806b2ad66 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1963,7 +1963,7 @@ int sqlite3VdbeNextOpcode( SubProgram **apSub = 0; /* Array of sub-vdbes */ int i; /* Next instruction address */ int rc = SQLITE_OK; /* Result code */ - Op *aOp; /* Opcode array */ + Op *aOp = 0; /* Opcode array */ int iPc; /* Rowid. Copy of value in *piPc */ /* When the number of output rows reaches nRow, that means the From e1cd73f671d55d3f59f93e4949aba54de7f9bf66 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Apr 2020 17:21:51 +0000 Subject: [PATCH 020/103] Minor changes for better test coverage. FossilOrigin-Name: ae3ac297d2deee2a687ae2e9cf98aaf3e1b41196363238101a19d38092aebec6 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeaux.c | 9 +++++---- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 691abd35eb..d1c569a624 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\sharmless\scompiler\swarning. -D 2020-04-02T13:08:54.300 +C Minor\schanges\sfor\sbetter\stest\scoverage. +D 2020-04-02T17:21:51.663 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -607,7 +607,7 @@ F src/vdbe.c 972999395eee88702091fb5d50cf4effd07889c371807d222a7f517388e6378e F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 F src/vdbeInt.h 571413068b5ac07e2ed8ca7a02fa529622fd5455ae6981498376e5e492d2e5ef F src/vdbeapi.c d176ee7251d5344de7bb2a0d2dd0fe536834e5843d9bc2389e0f5cdcd5374141 -F src/vdbeaux.c 2b47d2443f2bf6a26cac0872b39d0642a8b7ff86c207eea0aed37d39a7d379d7 +F src/vdbeaux.c 5ed714712eed5cba379ec6d0fd26069565d57f4970722bfd9537b10845dc8091 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df @@ -1861,7 +1861,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 cc54de354317ebc080d4d1ee25427b31a49c4a75e01cb5d9966f1aaeb2ad098d -R 8fe319a58a23143f83b349fa4edfbc9a +P 949eec2530bbe7f48daddfb3022d60ea5d7a43f0f5d120e71c682054feb721db +R f1c38c95159bd2ae4b930179bb0c81bb U drh -Z 7487d39d42c11bfb0d43c4ac88cff31d +Z 7c6fe0eb276ad7b15d9155e78411c897 diff --git a/manifest.uuid b/manifest.uuid index bd924a15f5..1e412e5c71 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -949eec2530bbe7f48daddfb3022d60ea5d7a43f0f5d120e71c682054feb721db \ No newline at end of file +ae3ac297d2deee2a687ae2e9cf98aaf3e1b41196363238101a19d38092aebec6 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 7806b2ad66..2642c59b81 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1717,9 +1717,8 @@ char *sqlite3VdbeDisplayP4(sqlite3 *db, Op *pOp){ int n = ai[0]; /* The first element of an INTARRAY is always the ** count of the number of elements to follow */ for(i=1; i<=n; i++){ - sqlite3_str_appendf(&x, ",%d", ai[i]); + sqlite3_str_appendf(&x, "%c%d", (i==1 ? '[' : ','), ai[i]); } - if( !x.accError ) x.zText[0] = '['; sqlite3_str_append(&x, "]", 1); break; } @@ -1740,7 +1739,7 @@ char *sqlite3VdbeDisplayP4(sqlite3 *db, Op *pOp){ } } if( zP4 ) sqlite3_str_appendall(&x, zP4); - if( (x.accError & SQLITE_NOMEM)!=0 && db!=0 ){ + if( (x.accError & SQLITE_NOMEM)!=0 ){ sqlite3OomFault(db); } return sqlite3StrAccumFinish(&x); @@ -1834,9 +1833,11 @@ void sqlite3VdbeLeave(Vdbe *p){ void sqlite3VdbePrintOp(FILE *pOut, int pc, VdbeOp *pOp){ char *zP4; char *zCom; + sqlite3 dummyDb; static const char *zFormat1 = "%4d %-13s %4d %4d %4d %-13s %.2X %s\n"; if( pOut==0 ) pOut = stdout; - zP4 = sqlite3VdbeDisplayP4(0, pOp); + dummyDb.mallocFailed = 1; + zP4 = sqlite3VdbeDisplayP4(&dummyDb, pOp); #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS zCom = sqlite3VdbeDisplayComment(0, pOp, zP4); #else From 49d01abaac729f09a6babe1cb1a0f83d3ba462e3 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Apr 2020 19:58:31 +0000 Subject: [PATCH 021/103] Fix a minor problem with EXPLAIN QUERY PLAN for triggers. FossilOrigin-Name: 6e11c03f84efa93b218b07e39b6b56b1d872639f39c18498ee54d8cd8364d4f5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeaux.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index d1c569a624..12e376017b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\schanges\sfor\sbetter\stest\scoverage. -D 2020-04-02T17:21:51.663 +C Fix\sa\sminor\sproblem\swith\sEXPLAIN\sQUERY\sPLAN\sfor\striggers. +D 2020-04-02T19:58:31.722 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -607,7 +607,7 @@ F src/vdbe.c 972999395eee88702091fb5d50cf4effd07889c371807d222a7f517388e6378e F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 F src/vdbeInt.h 571413068b5ac07e2ed8ca7a02fa529622fd5455ae6981498376e5e492d2e5ef F src/vdbeapi.c d176ee7251d5344de7bb2a0d2dd0fe536834e5843d9bc2389e0f5cdcd5374141 -F src/vdbeaux.c 5ed714712eed5cba379ec6d0fd26069565d57f4970722bfd9537b10845dc8091 +F src/vdbeaux.c d191d07906d284acb458c8ba3e24a5ea0ab7610c2800f97d683d0917bda0e66d F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df @@ -1861,7 +1861,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 949eec2530bbe7f48daddfb3022d60ea5d7a43f0f5d120e71c682054feb721db -R f1c38c95159bd2ae4b930179bb0c81bb +P ae3ac297d2deee2a687ae2e9cf98aaf3e1b41196363238101a19d38092aebec6 +R 5ec3a6e097b97c43d39dad4e19b96595 U drh -Z 7c6fe0eb276ad7b15d9155e78411c897 +Z 9687d6d8f7e5c9ecbb821bb029981be4 diff --git a/manifest.uuid b/manifest.uuid index 1e412e5c71..8e012436ba 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ae3ac297d2deee2a687ae2e9cf98aaf3e1b41196363238101a19d38092aebec6 \ No newline at end of file +6e11c03f84efa93b218b07e39b6b56b1d872639f39c18498ee54d8cd8364d4f5 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 2642c59b81..da8108a593 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2048,7 +2048,7 @@ int sqlite3VdbeNextOpcode( { assert( eMode==1 ); if( aOp[i].opcode==OP_Explain ) break; - if( aOp[i].opcode==OP_Init && p->pc>1 ) break; + if( aOp[i].opcode==OP_Init && iPc>1 ) break; } } *piPc = iPc; From e6a85962e754fded78939a826093baaf7869af4d Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 14 Apr 2020 15:48:55 +0000 Subject: [PATCH 022/103] Add the UINT collating sequence extension. The implementation is copied out of the "natsort" branch. FossilOrigin-Name: 6f46c6e3e3c471ca864d7596e0211ee90316b784c8fe22c7ae177c9d29731dc7 --- ext/misc/uint.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++ manifest | 13 +++---- manifest.uuid | 2 +- 3 files changed, 99 insertions(+), 7 deletions(-) create mode 100644 ext/misc/uint.c diff --git a/ext/misc/uint.c b/ext/misc/uint.c new file mode 100644 index 0000000000..12982c2a20 --- /dev/null +++ b/ext/misc/uint.c @@ -0,0 +1,91 @@ +/* +** 2020-04-14 +** +** 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 SQLite extension implements the UINT collating sequence. +** +** UINT works like BINARY for text, except that embedded strings +** of digits compare in numeric order. +** +** * Leading zeros are handled properly, in the sense that +** they do not mess of the maginitude comparison of embedded +** strings of digits. "x00123y" is equal to "x123y". +** +** * Only unsigned integers are recognized. Plus and minus +** signs are ignored. Decimal points and exponential notation +** are ignored. +** +** * Embedded integers can be of arbitrary length. Comparison +** is *not* limited integers that can be expressed as a +** 64-bit machine integer. +*/ +#include "sqlite3ext.h" +SQLITE_EXTENSION_INIT1 +#include +#include +#include + +/* +** Compare text in lexicographic order, except strings of digits +** compare in numeric order. +*/ +static int uintCollFunc( + void *notUsed, + int nKey1, const void *pKey1, + int nKey2, const void *pKey2 +){ + const unsigned char *zA = (const unsigned char*)pKey1; + const unsigned char *zB = (const unsigned char*)pKey2; + int i=0, j=0, x; + while( i Date: Tue, 14 Apr 2020 15:53:58 +0000 Subject: [PATCH 023/103] Build the UINT collating sequence extension into the CLI. FossilOrigin-Name: 2b8c6b035a276029850de02651712a5fd69f4dfee45083d24b9d1f998004829b --- Makefile.in | 1 + Makefile.msc | 1 + main.mk | 1 + manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/shell.c.in | 2 ++ 6 files changed, 15 insertions(+), 10 deletions(-) diff --git a/Makefile.in b/Makefile.in index e4b824365d..01e3bed6e5 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1069,6 +1069,7 @@ SHELL_SRC = \ $(TOP)/ext/misc/fileio.c \ $(TOP)/ext/misc/completion.c \ $(TOP)/ext/misc/sqlar.c \ + $(TOP)/ext/misc/uint.c \ $(TOP)/ext/expert/sqlite3expert.c \ $(TOP)/ext/expert/sqlite3expert.h \ $(TOP)/ext/misc/zipfile.c \ diff --git a/Makefile.msc b/Makefile.msc index d0b7860d90..90944e845c 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -2182,6 +2182,7 @@ SHELL_SRC = \ $(TOP)\ext\misc\shathree.c \ $(TOP)\ext\misc\fileio.c \ $(TOP)\ext\misc\completion.c \ + $(TOP)\ext\misc\uint.c \ $(TOP)\ext\expert\sqlite3expert.c \ $(TOP)\ext\expert\sqlite3expert.h \ $(TOP)\ext\misc\memtrace.c \ diff --git a/main.mk b/main.mk index cbf14f065c..bb51b44575 100644 --- a/main.mk +++ b/main.mk @@ -733,6 +733,7 @@ SHELL_SRC = \ $(TOP)/ext/misc/fileio.c \ $(TOP)/ext/misc/completion.c \ $(TOP)/ext/misc/sqlar.c \ + $(TOP)/ext/misc/uint.c \ $(TOP)/ext/expert/sqlite3expert.c \ $(TOP)/ext/expert/sqlite3expert.h \ $(TOP)/ext/misc/zipfile.c \ diff --git a/manifest b/manifest index 07721fa1c5..3f838de2fc 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Add\sthe\sUINT\scollating\ssequence\sextension.\s\sThe\simplementation\sis\scopied\sout\nof\sthe\s"natsort"\sbranch. -D 2020-04-14T15:48:55.103 +C Build\sthe\sUINT\scollating\ssequence\sextension\sinto\sthe\sCLI. +D 2020-04-14T15:53:58.512 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in 9dfc7936f675785309b74d09202bb656732325e65df889e5aaa18cc8932e5b0c +F Makefile.in f6ab6e307d31e09d82aa4eca87ccb21ce66f486279e204b54b3149ff0d71616f F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc fab23c6b10cb6f06a7e9c407fc2e35cb184a6d653f1b793bda87fcee2eafa4f6 +F Makefile.msc 46c338b1151fbeed42c82416c6bc4da7ff9a10f851bf379f8592280fd53d6efa F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a F VERSION 980d78a2ce04a1fd0ebefbaabd665f7f9186563820629ee29c6e350e96f19b52 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -454,7 +454,7 @@ F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 7ce055f3df31a4f7d21e38f493f907c21db1f673863a573e231f55e2ab005023 +F main.mk f3a972451ed68fa1101d81606a2a1b0a2600b85547059fe89ccb2380b983e50c F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -533,7 +533,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c ab4eb1aee1bd066feea5b6eff264220ae54459019654264e9f688368a7d0c0b5 -F src/shell.c.in cf7d6140c33859a86188aa52093dfa5d4e4d9ce32ecf1d588a127cb0a8f6f96f +F src/shell.c.in 792b901ae19c7cf8cbac06b3c58ef860328d0ca6d20149bdc469e5c4fc550a1d F src/sqlite.h.in cc7d0949ac32bb68ed97acdb3e7ae91cd413a24d32d6ff049ef8308d620a4367 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9c5269260409eb3275324ccace6a13a96f4ad330c708415f70ca6097901ff4ee @@ -1861,7 +1861,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 85d3dc8c50d8dbb8eac1956e8976e861d3b671e03355ca9257060fa3dca51cc4 -R 90abc1adacfe98d7a7e36bcfbb02dfec +P 6f46c6e3e3c471ca864d7596e0211ee90316b784c8fe22c7ae177c9d29731dc7 +R 55c0a7e7e6364ecba4d144377c4424a0 U drh -Z 3c9766781f32af8c6294daca79b779f0 +Z 63a1ce21bf796da3b1d1d32831983a3d diff --git a/manifest.uuid b/manifest.uuid index d6a630a3aa..52c41554f5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6f46c6e3e3c471ca864d7596e0211ee90316b784c8fe22c7ae177c9d29731dc7 \ No newline at end of file +2b8c6b035a276029850de02651712a5fd69f4dfee45083d24b9d1f998004829b \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 2bc6b35b36..b589cb4238 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1010,6 +1010,7 @@ INCLUDE ../ext/misc/fileio.c INCLUDE ../ext/misc/completion.c INCLUDE ../ext/misc/appendvfs.c INCLUDE ../ext/misc/memtrace.c +INCLUDE ../ext/misc/uint.c #ifdef SQLITE_HAVE_ZLIB INCLUDE ../ext/misc/zipfile.c INCLUDE ../ext/misc/sqlar.c @@ -4252,6 +4253,7 @@ static void open_db(ShellState *p, int openFlags){ sqlite3_fileio_init(p->db, 0, 0); sqlite3_shathree_init(p->db, 0, 0); sqlite3_completion_init(p->db, 0, 0); + sqlite3_uint_init(p->db, 0, 0); #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) sqlite3_dbdata_init(p->db, 0, 0); #endif From c39b121a95c10b4ba36cbde89606037aab8dfc9f Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 15 Apr 2020 17:39:39 +0000 Subject: [PATCH 024/103] Clarification of the byte-order determination for UTF16 inputs to routines like sqlite3_bind_text16() and sqlite3_result_text16() and others that accept UTF16 input strings. FossilOrigin-Name: a42fdcf54bcbd72a301dad4a040346dc48e67cacab43479ec618f5c32108c55f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 44 +++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 3f838de2fc..4f7d83de2d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Build\sthe\sUINT\scollating\ssequence\sextension\sinto\sthe\sCLI. -D 2020-04-14T15:53:58.512 +C Clarification\sof\sthe\sbyte-order\sdetermination\sfor\sUTF16\sinputs\sto\sroutines\nlike\ssqlite3_bind_text16()\sand\ssqlite3_result_text16()\sand\sothers\sthat\naccept\sUTF16\sinput\sstrings. +D 2020-04-15T17:39:39.862 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -534,7 +534,7 @@ F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c ab4eb1aee1bd066feea5b6eff264220ae54459019654264e9f688368a7d0c0b5 F src/shell.c.in 792b901ae19c7cf8cbac06b3c58ef860328d0ca6d20149bdc469e5c4fc550a1d -F src/sqlite.h.in cc7d0949ac32bb68ed97acdb3e7ae91cd413a24d32d6ff049ef8308d620a4367 +F src/sqlite.h.in 4276f461ed8405630e3089b682dad77ae7a65c345d8daebcee52a13be8cd880c F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9c5269260409eb3275324ccace6a13a96f4ad330c708415f70ca6097901ff4ee F src/sqliteInt.h 0f3848c46310d197246003f052985b72d1cdbfc0b31e069db76cb5231062fa1d @@ -1861,7 +1861,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 6f46c6e3e3c471ca864d7596e0211ee90316b784c8fe22c7ae177c9d29731dc7 -R 55c0a7e7e6364ecba4d144377c4424a0 +P 2b8c6b035a276029850de02651712a5fd69f4dfee45083d24b9d1f998004829b +R 7af907123cde70d72ab14d313300d9ef U drh -Z 63a1ce21bf796da3b1d1d32831983a3d +Z e055c082ef6d50bf436bbdcfa90b28f7 diff --git a/manifest.uuid b/manifest.uuid index 52c41554f5..eebee4beb8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2b8c6b035a276029850de02651712a5fd69f4dfee45083d24b9d1f998004829b \ No newline at end of file +a42fdcf54bcbd72a301dad4a040346dc48e67cacab43479ec618f5c32108c55f \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 86c3223801..f93fab1c59 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -4260,6 +4260,24 @@ typedef struct sqlite3_context sqlite3_context; ** ^If the third parameter to sqlite3_bind_text() or sqlite3_bind_text16() ** or sqlite3_bind_blob() is a NULL pointer then the fourth parameter ** is ignored and the end result is the same as sqlite3_bind_null(). +** ^If the third parameter to sqlite3_bind_text() is not NULL, then +** it should be a pointer to well-formed UTF8 text. +** ^If the third parameter to sqlite3_bind_text16() is not NULL, then +** it should be a pointer to well-formed UTF16 text. +** ^If the third parameter to sqlite3_bind_text64() is not NULL, then +** it should be a pointer to a well-formed unicode string that is +** either UTF8 if the sixth parameter is SQLITE_UTF8, or UTF16 +** otherwise. +** +** [[byte-order determination rules]] ^The byte-order of +** UTF16 input text is determined by the byte-order mark (BOM, U+FEFF) +** found in first character, which is removed, or in the absence of a BOM +** the byte order is the native byte order of the host +** machine for sqlite3_bind_text16() or the byte order specified in +** the 6th parameter for sqlite3_bind_text64().)^ +** ^If UTF16 input text contains invalid unicode +** characters, then SQLite might change those invalid characters +** into the unicode replacement character: U+FFFD. ** ** ^(In those routines that have a fourth argument, its value is the ** number of bytes in the parameter. To be clear: the value is the @@ -4273,7 +4291,7 @@ typedef struct sqlite3_context sqlite3_context; ** or sqlite3_bind_text16() or sqlite3_bind_text64() then ** that parameter must be the byte offset ** where the NUL terminator would occur assuming the string were NUL -** terminated. If any NUL characters occur at byte offsets less than +** terminated. If any NUL characters occurs at byte offsets less than ** the value of the fourth parameter then the resulting string value will ** contain embedded NULs. The result of expressions involving strings ** with embedded NULs is undefined. @@ -5598,8 +5616,9 @@ typedef void (*sqlite3_destructor_type)(void*); ** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16() ** as the text of an error message. ^SQLite interprets the error ** message string from sqlite3_result_error() as UTF-8. ^SQLite -** interprets the string from sqlite3_result_error16() as UTF-16 in native -** byte order. ^If the third parameter to sqlite3_result_error() +** interprets the string from sqlite3_result_error16() as UTF-16 using +** the same [byte-order determination rules] as [sqlite3_bind_text16()]. +** ^If the third parameter to sqlite3_result_error() ** or sqlite3_result_error16() is negative then SQLite takes as the error ** message all text up through the first zero character. ** ^If the third parameter to sqlite3_result_error() or @@ -5667,6 +5686,25 @@ typedef void (*sqlite3_destructor_type)(void*); ** then SQLite makes a copy of the result into space obtained ** from [sqlite3_malloc()] before it returns. ** +** ^For the sqlite3_result_text16(), sqlite3_result_text16le(), and +** sqlite3_result_text16be() routines, and for sqlite3_result_text64() +** when the encoding is not UTF8, if the input UTF16 begins with a +** byte-order mark (BOM, U+FEFF) then the BOM is removed from the +** string and the rest of the string is interpreted according to the +** byte-order specified by the BOM. ^The byte-order specified by +** the BOM at the beginning of the text overrides the byte-order +** specified by the interface procedure. ^So, for example, if +** sqlite3_result_text16le() is invoked with text that begins +** with bytes 0xfe, 0xff (a big-endian byte-order mark) then the +** first two bytes of input are skipped and the remaining input +** is interpreted as UTF16BE text. +** +** ^For UTF16 input text to the sqlite3_result_text16(), +** sqlite3_result_text16be(), sqlite3_result_text16le(), and +** sqlite3_result_text64() routines, if the text contains invalid +** UTF16 characters, the invalid characters might be converted +** into the unicode replacement character, U+FFFD. +** ** ^The sqlite3_result_value() interface sets the result of ** the application-defined function to be a copy of the ** [unprotected sqlite3_value] object specified by the 2nd parameter. ^The From 7576a68c8c9281288ab6ddc25f202d0f3c0ee05e Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 16 Apr 2020 11:35:27 +0000 Subject: [PATCH 025/103] Improve corruption detection in fts3 shadow tables earlier in order to prevent an assert() from failing. FossilOrigin-Name: a9ec8c8f80a59badabb0afdb4189f0fd2934f936530d4151de395b3a7e7c1f1f --- ext/fts3/fts3_write.c | 1 + manifest | 18 +++++++++--------- manifest.uuid | 2 +- test/fts3corrupt4.test | 13 +++++++++++++ test/fts4aa.test | 4 ++-- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index f5114eca42..9a052a8f26 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -1415,6 +1415,7 @@ static int fts3SegReaderNext( */ if( pReader->nDoclist > pReader->nNode-(pReader->aDoclist-pReader->aNode) || (pReader->nPopulate==0 && pReader->aDoclist[pReader->nDoclist-1]) + || pReader->nDoclist==0 ){ return FTS_CORRUPT_VTAB; } diff --git a/manifest b/manifest index ce27245686..03e7a37f31 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\scompiling\sthe\sshell\sfor\sWinRT,\savoid\susing\sWin32\sAPIs\sthat\sare\sunavailable. -D 2020-04-09T15:31:22.553 +C Improve\scorruption\sdetection\sin\sfts3\sshadow\stables\searlier\sin\sorder\sto\sprevent\san\sassert()\sfrom\sfailing. +D 2020-04-16T11:35:27.558 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -100,7 +100,7 @@ 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 eb5c0184762a310003762db4ebd5ddcce097d9bb08804279ba33a42907f847a6 +F ext/fts3/fts3_write.c d5da5f010b2e2c1523f0e359ec43858bb724f608d3805d0e2a82ca2b466eb22e F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -945,7 +945,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 79a32ffdcd5254e2f7fa121d9656e61949ad049c3c6554229911b7ceac37c9c6 F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test e8ad49403179cbf714b6b669d2e0f9234ae95f4ca258a253b0f29ce28c1b027c +F test/fts3corrupt4.test 6a1331bb51dc27acc063d26e0f1b610863b56a833ee54fa32767d17cf96bda4a F test/fts3corrupt5.test 0549f85ec4bd22e992f645f13c59b99d652f2f5e643dac75568bfd23a6db7ed5 F test/fts3cov.test 7eacdbefd756cfa4dc2241974e3db2834e9b372ca215880e00032222f32194cf F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f @@ -980,7 +980,7 @@ 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 9857f939f5aeb6cc4c143e74cf1cfe07ac87972240ac26d3a0100e36d02f4359 +F test/fts4aa.test 0e6bfd6a81695a39b23e448dda25d864e63dda75bde6949c45ddc95426c6c3f5 F test/fts4check.test 6259f856604445d7b684c9b306b2efb6346834c3f50e8fc4a59a2ca6d5319ad0 F test/fts4content.test 73bbb123420d2c46ef2fb3b24761e9acdb78b0877179d3a5d7d57aada08066f6 F test/fts4docid.test e33c383cfbdff0284685604d256f347a18fdbf01 @@ -1860,7 +1860,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 10306118e8591e727af477a1a15d136852d21170e645bd0e75f7c88346b037d7 -R 979d0103f7b3acef2369409e370d6fa7 -U mistachkin -Z 484824f16820465db78cbfdb9a5d496b +P 85d3dc8c50d8dbb8eac1956e8976e861d3b671e03355ca9257060fa3dca51cc4 +R 6df0bde47e9f675523e9d30a8887c1df +U dan +Z 4f76143b71cc5a7c4e3cc701b84eb415 diff --git a/manifest.uuid b/manifest.uuid index fb32b5bfff..84d9dbc14d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -85d3dc8c50d8dbb8eac1956e8976e861d3b671e03355ca9257060fa3dca51cc4 \ No newline at end of file +a9ec8c8f80a59badabb0afdb4189f0fd2934f936530d4151de395b3a7e7c1f1f \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index b11d19c7f1..89853833cb 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -5834,4 +5834,17 @@ do_catchsql_test 36.1 { INSERT INTO f(f) VALUES ('merge=59,59'); } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 37.0 { + CREATE VIRTUAL TABLE f USING fts3(a,b); + INSERT INTO f_segdir VALUES (28,0,0,0,'0 0',x'00'); + INSERT INTO f_segdir VALUES (0,241,0,0,'0 0',x'0001000030310000f1'); +} + +do_catchsql_test 37.1 { + INSERT INTO f VALUES (0,x'00'); +} {1 {database disk image is malformed}} + finish_test diff --git a/test/fts4aa.test b/test/fts4aa.test index 112d60ab4b..0c6c0b972f 100644 --- a/test/fts4aa.test +++ b/test/fts4aa.test @@ -234,13 +234,13 @@ if {$tcl_platform(byteOrder)=="littleEndian"} { } else { set res {X'0000000200000000000000000000000E0000000E00000001000000010000000100000001'} } -do_execsql_test fts4aa-6.10 { +do_catchsql_test fts4aa-6.10 { CREATE VIRTUAL TABLE f USING fts4(); INSERT INTO f_segdir VALUES (77,91,0,0,'255 77',x'0001308000004d5c4ddddddd4d4d7b4d4d4d614d8019ff4d05000001204d4d2e4d6e4d4d4d4b4d6c4d004d4d4d4d4d4d3d000000004d5d4d4d645d4d004d4d4d4d4d4d4d4d4d454d6910004d05ffff054d646c4d004d5d4d4d4d4d3d000000004d4d4d4d4d4d4d4d4d4d4d69624d4d4d04004d4d4d4d4d604d4ce1404d554d45'); INSERT INTO f_segdir VALUES (77,108,0,0,'255 77',x'0001310000fa64004d4d4d3c5d4d654d4d4d614d8000ff4d05000001204d4d2e4d6e4d4d4dff4d4d4d4d4d4d00104d4d4d4d000000004d4d4d0400311d4d4d4d4d4d4d4d4d4d684d6910004d05ffff054d4d6c4d004d4d4d4d4d4d3d000000004d4d4d4d644d4d4d4d4d4d69624d4d4d03ed4d4d4d4d4d604d4ce1404d550080'); INSERT INTO f_stat VALUES (0,x'80808080100000000064004d4d4d3c4d4d654d4d4d614d8000ff4df6ff1a00204d4d2e4d6e4d4d4d104d4d4d4d4d4d00104d4d4d4d4d4d69574d4d4d000031044d4d4d3e4d4d4c4d05004d6910'); SELECT quote(matchinfo(f,'pnax')) from f where f match '0 1'; -} $res +} {1 {database disk image is malformed}} # 2019-11-18 Detect infinite loop in fts3SelectLeaf() db close From 1d9ea27f7e7e053d99745b58b9109e063b4c03ad Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 17 Apr 2020 23:46:54 +0000 Subject: [PATCH 026/103] Fix the ".excel" command and the ".open -x" and ".open -e" command so that they work better when running from an in-memory database and on Windows and when running from a script. FossilOrigin-Name: 07752164c2bf00b6885808533bbdb2cefbf1bf281a887b0b4f6316649a6cb810 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 20 ++++++++++++++++++-- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 32654b3149..d7bcffe5bc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\saccidentally\screated\sfork. -D 2020-04-16T15:56:03.261 +C Fix\sthe\s".excel"\scommand\sand\sthe\s".open\s-x"\sand\s".open\s-e"\scommand\sso\sthat\nthey\swork\sbetter\swhen\srunning\sfrom\san\sin-memory\sdatabase\sand\son\sWindows\nand\swhen\srunning\sfrom\sa\sscript. +D 2020-04-17T23:46:54.073 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c ab4eb1aee1bd066feea5b6eff264220ae54459019654264e9f688368a7d0c0b5 -F src/shell.c.in 792b901ae19c7cf8cbac06b3c58ef860328d0ca6d20149bdc469e5c4fc550a1d +F src/shell.c.in d615184e9a5e24da419db6bb9e60905306f45a6ceed760bdbbe656c4a684a18b F src/sqlite.h.in 4276f461ed8405630e3089b682dad77ae7a65c345d8daebcee52a13be8cd880c F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9c5269260409eb3275324ccace6a13a96f4ad330c708415f70ca6097901ff4ee @@ -1861,7 +1861,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 a42fdcf54bcbd72a301dad4a040346dc48e67cacab43479ec618f5c32108c55f a9ec8c8f80a59badabb0afdb4189f0fd2934f936530d4151de395b3a7e7c1f1f -R f504f25559e67d24d7bac4ba4fbb1261 -U dan -Z bb44f1eb19ef7e1708ecd20763bc065a +P cb772b7a8fb53694cb267e74c11f49d2b9fd6920821c4e232f90ec35739c8904 +R e921db661ca4e205b542b92ef8a31312 +U drh +Z 880b12b2b5c0e130871dd9c9bbfa0760 diff --git a/manifest.uuid b/manifest.uuid index 587bd3fd29..226a3f3ebc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cb772b7a8fb53694cb267e74c11f49d2b9fd6920821c4e232f90ec35739c8904 \ No newline at end of file +07752164c2bf00b6885808533bbdb2cefbf1bf281a887b0b4f6316649a6cb810 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index b589cb4238..f492285139 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -4973,11 +4973,15 @@ static void output_reset(ShellState *p){ zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile); if( system(zCmd) ){ utf8_printf(stderr, "Failed: [%s]\n", zCmd); + }else{ + /* Give the start/open/xdg-open command some time to get + ** going before we continue, and potential delete the + ** p->zTempFile data file out from under it */ + sqlite3_sleep(2000); } sqlite3_free(zCmd); outputModePop(p); p->doXdgOpen = 0; - sqlite3_sleep(100); } #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */ } @@ -5267,9 +5271,21 @@ static void newTempFile(ShellState *p, const char *zSuffix){ sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile); } if( p->zTempFile==0 ){ + /* If p->db is an in-memory database then the TEMPFILENAME file-control + ** will not work and we will need to fallback to guessing */ + char *zTemp; sqlite3_uint64 r; sqlite3_randomness(sizeof(r), &r); - p->zTempFile = sqlite3_mprintf("temp%llx.%s", r, zSuffix); + zTemp = getenv("TEMP"); + if( zTemp==0 ) zTemp = getenv("TMP"); + if( zTemp==0 ){ +#ifdef _WIN32 + zTemp = "\\tmp"; +#else + zTemp = "/tmp"; +#endif + } + p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix); }else{ p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix); } From 7a43100afbdb0abd50ccf5b1e8fdb552616f7b2b Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 18 Apr 2020 14:12:00 +0000 Subject: [PATCH 027/103] Add the --bom option to the ".excel", ".once", and ".output" commands of the CLI. Also fix the "--all" option on ".help" so that it works with two dashes in addition to just one. FossilOrigin-Name: d5b0def96ba6d90f47bc96fab1ccf9c501d84885d086744035b16fd96f3e248c --- manifest | 12 ++++---- manifest.uuid | 2 +- src/shell.c.in | 81 ++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 65 insertions(+), 30 deletions(-) diff --git a/manifest b/manifest index d7bcffe5bc..74a0e6e8a3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\s".excel"\scommand\sand\sthe\s".open\s-x"\sand\s".open\s-e"\scommand\sso\sthat\nthey\swork\sbetter\swhen\srunning\sfrom\san\sin-memory\sdatabase\sand\son\sWindows\nand\swhen\srunning\sfrom\sa\sscript. -D 2020-04-17T23:46:54.073 +C Add\sthe\s--bom\soption\sto\sthe\s".excel",\s".once",\sand\s".output"\scommands\nof\sthe\sCLI.\s\sAlso\sfix\sthe\s"--all"\soption\son\s".help"\sso\sthat\sit\sworks\swith\ntwo\sdashes\sin\saddition\sto\sjust\sone. +D 2020-04-18T14:12:00.030 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c ab4eb1aee1bd066feea5b6eff264220ae54459019654264e9f688368a7d0c0b5 -F src/shell.c.in d615184e9a5e24da419db6bb9e60905306f45a6ceed760bdbbe656c4a684a18b +F src/shell.c.in d48577e0282bc71f0692c3585dfeb59acacf28f721520814b0229cb7ef8972cb F src/sqlite.h.in 4276f461ed8405630e3089b682dad77ae7a65c345d8daebcee52a13be8cd880c F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9c5269260409eb3275324ccace6a13a96f4ad330c708415f70ca6097901ff4ee @@ -1861,7 +1861,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 cb772b7a8fb53694cb267e74c11f49d2b9fd6920821c4e232f90ec35739c8904 -R e921db661ca4e205b542b92ef8a31312 +P 07752164c2bf00b6885808533bbdb2cefbf1bf281a887b0b4f6316649a6cb810 +R f789048a883ae9edd5940e9d7edbaa7f U drh -Z 880b12b2b5c0e130871dd9c9bbfa0760 +Z 993c0c14d705afacb01cbe8f69aff20c diff --git a/manifest.uuid b/manifest.uuid index 226a3f3ebc..72cf879c71 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -07752164c2bf00b6885808533bbdb2cefbf1bf281a887b0b4f6316649a6cb810 \ No newline at end of file +d5b0def96ba6d90f47bc96fab1ccf9c501d84885d086744035b16fd96f3e248c \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index f492285139..e8517fb7ec 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1107,6 +1107,7 @@ struct ShellState { unsigned mxProgress; /* Maximum progress callbacks before failing */ unsigned flgProgress; /* Flags for the progress callback */ unsigned shellFlgs; /* Various flags */ + unsigned priorShFlgs; /* Saved copy of flags */ sqlite3_int64 szMax; /* --maxsize argument to .open */ char *zDestTable; /* Name of destination table when MODE_Insert */ char *zTempFile; /* Temporary file that might need deleting */ @@ -1407,11 +1408,13 @@ edit_func_end: */ static void outputModePush(ShellState *p){ p->modePrior = p->mode; + p->priorShFlgs = p->shellFlgs; memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator)); memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator)); } static void outputModePop(ShellState *p){ p->mode = p->modePrior; + p->shellFlgs = p->priorShFlgs; memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator)); memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator)); } @@ -3580,6 +3583,7 @@ static const char *(azHelp[]) = { #endif " trigger Like \"full\" but also show trigger bytecode", ".excel Display the output of next command in spreadsheet", + " --bom Put a UTF8 byte-order mark on intermediate file", ".exit ?CODE? Exit this program with return-code CODE", ".expert EXPERIMENTAL. Suggest indexes for queries", ".explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto", @@ -3631,11 +3635,11 @@ static const char *(azHelp[]) = { " tabs Tab-separated values", " tcl TCL list elements", ".nullvalue STRING Use STRING in place of NULL values", - ".once (-e|-x|FILE) Output for the next SQL command only to FILE", + ".once ?OPTIONS? ?FILE? Output for the next SQL command only to FILE", " If FILE begins with '|' then open as a pipe", - " Other options:", - " -e Invoke system text editor", - " -x Open in a spreadsheet", + " --bom Put a UTF8 byte-order mark at the beginning", + " -e Send output to the system text editor", + " -x Send output as CSV to a spreadsheet (same as \".excel\")", #ifdef SQLITE_DEBUG ".oom [--repeat M] [N] Simulate an OOM error on the N-th allocation", #endif @@ -3652,7 +3656,11 @@ static const char *(azHelp[]) = { " --readonly Open FILE readonly", " --zip FILE is a ZIP archive", ".output ?FILE? Send output to FILE or stdout if FILE is omitted", - " If FILE begins with '|' then open it as a pipe.", + " If FILE begins with '|' then open it as a pipe.", + " Options:", + " --bom Prefix output with a UTF8 byte-order mark", + " -e Send output to the system text editor", + " -x Send output as CSV to a spreadsheet", ".parameter CMD ... Manage SQL parameter bindings", " clear Erase all bindings", " init Initialize the TEMP table that holds bindings", @@ -3772,6 +3780,7 @@ static int showHelp(FILE *out, const char *zPattern){ || zPattern[0]=='0' || strcmp(zPattern,"-a")==0 || strcmp(zPattern,"-all")==0 + || strcmp(zPattern,"--all")==0 ){ /* Show all commands, but only one line per command */ if( zPattern==0 ) zPattern = ""; @@ -8307,42 +8316,66 @@ static int do_meta_command(char *zLine, ShellState *p){ && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0)) || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0) ){ - const char *zFile = nArg>=2 ? azArg[1] : "stdout"; + const char *zFile = 0; int bTxtMode = 0; - if( azArg[0][0]=='e' ){ - /* Transform the ".excel" command into ".once -x" */ - nArg = 2; - azArg[0] = "once"; - zFile = azArg[1] = "-x"; - n = 4; + int i; + int eMode = 0; + int bBOM = 0; + int bOnce; + + if( c=='e' ){ + eMode = 'x'; + bOnce = 2; + }else if( strncmp(azArg[0],"once",n)==0 ){ + bOnce = 1; } - if( nArg>2 ){ - utf8_printf(stderr, "Usage: .%s [-e|-x|FILE]\n", azArg[0]); - rc = 1; - goto meta_command_exit; - } - if( n>1 && strncmp(azArg[0], "once", n)==0 ){ - if( nArg<2 ){ - raw_printf(stderr, "Usage: .once (-e|-x|FILE)\n"); + for(i=1; iout, "ERROR: unknown option: \"%s\". Usage:\n", + azArg[i]); + showHelp(p->out, azArg[0]); + rc = 1; + goto meta_command_exit; + } + }else if( zFile==0 ){ + zFile = z; + }else{ + utf8_printf(p->out,"ERROR: extra parameter: \"%s\". Usage:\n", + azArg[i]); + showHelp(p->out, azArg[0]); rc = 1; goto meta_command_exit; } + } + if( zFile==0 ) zFile = "stdout"; + if( bOnce ){ p->outCount = 2; }else{ p->outCount = 0; } output_reset(p); - if( zFile[0]=='-' && zFile[1]=='-' ) zFile++; #ifndef SQLITE_NOHAVE_SYSTEM - if( strcmp(zFile, "-e")==0 || strcmp(zFile, "-x")==0 ){ + if( eMode=='e' || eMode=='x' ){ p->doXdgOpen = 1; outputModePush(p); - if( zFile[1]=='x' ){ + if( eMode=='x' ){ + /* spreadsheet mode. Output as CSV. */ newTempFile(p, "csv"); + ShellClearFlag(p, SHFLG_Echo); p->mode = MODE_Csv; sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); }else{ + /* text editor mode */ newTempFile(p, "txt"); bTxtMode = 1; } @@ -8361,6 +8394,7 @@ static int do_meta_command(char *zLine, ShellState *p){ p->out = stdout; rc = 1; }else{ + if( bBOM ) fprintf(p->out,"\357\273\277"); sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); } #endif @@ -8373,6 +8407,7 @@ static int do_meta_command(char *zLine, ShellState *p){ p->out = stdout; rc = 1; } else { + if( bBOM ) fprintf(p->out,"\357\273\277"); sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); } } From 871f45441cd99398b2daec14bc141649db21a06f Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 20 Apr 2020 14:05:54 +0000 Subject: [PATCH 028/103] Remove an obsolete comment. No changes to code. FossilOrigin-Name: 4135cb024456288d9c85aef5fb572dbb591527dd33d9a60ca5946b712c269941 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 4 ---- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 74a0e6e8a3..856ee8ceea 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s--bom\soption\sto\sthe\s".excel",\s".once",\sand\s".output"\scommands\nof\sthe\sCLI.\s\sAlso\sfix\sthe\s"--all"\soption\son\s".help"\sso\sthat\sit\sworks\swith\ntwo\sdashes\sin\saddition\sto\sjust\sone. -D 2020-04-18T14:12:00.030 +C Remove\san\sobsolete\scomment.\s\sNo\schanges\sto\scode. +D 2020-04-20T14:05:54.955 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -473,7 +473,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 79ce96ab39fd2fc21ff00d03913587d5a08280a9eb081a08d0ffa9fa26f4f6fb +F src/btree.c 671be07873797f106cf59a81471196523bb88dacc4fcd6030d1d415fff3f7b2e F src/btree.h 6111552f19ed7a40f029cf4b33badc6fef9880314fffd80a945f0b7f43ab7471 F src/btreeInt.h dee1a1d0c621524e006bb260bd6b66d5d1867da6fe38cba9ad7b6a9bb9c0c175 F src/build.c ec6c0bda1e43ef55e5f5121a77ba19fac51fc6585f95ce2da795bcedcf6e8f36 @@ -1861,7 +1861,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 07752164c2bf00b6885808533bbdb2cefbf1bf281a887b0b4f6316649a6cb810 -R f789048a883ae9edd5940e9d7edbaa7f +P d5b0def96ba6d90f47bc96fab1ccf9c501d84885d086744035b16fd96f3e248c +R 4a09aaf85f0fed3dd0723d494ffedd7d U drh -Z 993c0c14d705afacb01cbe8f69aff20c +Z 504e3b736c67f90426ab20d53647f809 diff --git a/manifest.uuid b/manifest.uuid index 72cf879c71..7a60b45cea 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d5b0def96ba6d90f47bc96fab1ccf9c501d84885d086744035b16fd96f3e248c \ No newline at end of file +4135cb024456288d9c85aef5fb572dbb591527dd33d9a60ca5946b712c269941 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 20bb7c7d9b..f325ee8699 100644 --- a/src/btree.c +++ b/src/btree.c @@ -2910,10 +2910,6 @@ int sqlite3BtreeGetReserveNoMutex(Btree *p){ ** Return the number of bytes of space at the end of every page that ** are intentually left unused. This is the "reserved" space that is ** sometimes used by extensions. -** -** If SQLITE_HAS_MUTEX is defined then the number returned is the -** greater of the current reserved space and the maximum requested -** reserve space. */ int sqlite3BtreeGetOptimalReserve(Btree *p){ int n; From 45248de39acbf885d5580bf53f23a4e769374957 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 20 Apr 2020 15:18:43 +0000 Subject: [PATCH 029/103] The SQLITE_TESTCTRL_RESERVE operator is removed. In its place is the more generate SQLITE_FCNTL_RESERVE_BYTES which is an API and which can operator on more than just the main schema. FossilOrigin-Name: abc1aad74f7b6a1e72fb09936239f2224aa942d16296c6a3de0b8daef4bc8471 --- manifest | 24 ++++++++++++------------ manifest.uuid | 2 +- src/btree.c | 10 +++++++--- src/btree.h | 2 +- src/btreeInt.h | 1 + src/main.c | 21 +++++++-------------- src/shell.c.in | 2 -- src/sqlite.h.in | 3 ++- src/vacuum.c | 2 +- 9 files changed, 32 insertions(+), 35 deletions(-) diff --git a/manifest b/manifest index 856ee8ceea..ac9b8a0f5d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sobsolete\scomment.\s\sNo\schanges\sto\scode. -D 2020-04-20T14:05:54.955 +C The\sSQLITE_TESTCTRL_RESERVE\soperator\sis\sremoved.\s\sIn\sits\splace\sis\sthe\nmore\sgenerate\sSQLITE_FCNTL_RESERVE_BYTES\swhich\sis\san\sAPI\sand\swhich\scan\noperator\son\smore\sthan\sjust\sthe\smain\sschema. +D 2020-04-20T15:18:43.124 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -473,9 +473,9 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 671be07873797f106cf59a81471196523bb88dacc4fcd6030d1d415fff3f7b2e -F src/btree.h 6111552f19ed7a40f029cf4b33badc6fef9880314fffd80a945f0b7f43ab7471 -F src/btreeInt.h dee1a1d0c621524e006bb260bd6b66d5d1867da6fe38cba9ad7b6a9bb9c0c175 +F src/btree.c 97673c54a3023845e7320cfa9e0de67fd6ca34b37a17a420981bb6e767601310 +F src/btree.h 32672fa1aa74a7e9ab3aae822f94ffc8e732b1eb005988dc2283f91dc7573398 +F src/btreeInt.h 887cdd2ea7f4a65143074a8a7c8928b0546f8c18dda3c06a408ce7992cbab0c0 F src/build.c ec6c0bda1e43ef55e5f5121a77ba19fac51fc6585f95ce2da795bcedcf6e8f36 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e @@ -496,7 +496,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 8e4211d04eb460c0694d486c6ba1c068d468c6f653c3f237869a802ad82854de F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c b179df50e6e8bb0c36c149e95d958d49bd8c6c7469e59c01b53d164360bc6c32 -F src/main.c 2e076b6dc1f8ab69c7fc604e8af88ab138a64c0616826361e254cee55bcba4e8 +F src/main.c 652a782cd7b6c6ddf7419fcaf06b8aa9440b7c815857241171c9bdf03ab6544c F src/malloc.c cabfef0d725e04c8abfe0231a556ed8b78bf329dcc3fddbf903f6cdcd53cf4e6 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -533,8 +533,8 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c ab4eb1aee1bd066feea5b6eff264220ae54459019654264e9f688368a7d0c0b5 -F src/shell.c.in d48577e0282bc71f0692c3585dfeb59acacf28f721520814b0229cb7ef8972cb -F src/sqlite.h.in 4276f461ed8405630e3089b682dad77ae7a65c345d8daebcee52a13be8cd880c +F src/shell.c.in c21ce88a16c04c46741ee04373992ad9982bd2fe83217e9c77012e63af0dde73 +F src/sqlite.h.in d4430b302155f757f0fbce33c5afe136525827ddfbe532a79fd7fe85b127ea29 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9c5269260409eb3275324ccace6a13a96f4ad330c708415f70ca6097901ff4ee F src/sqliteInt.h 0f3848c46310d197246003f052985b72d1cdbfc0b31e069db76cb5231062fa1d @@ -603,7 +603,7 @@ F src/update.c 3eb778c42155d944377a4ee5e440b04520f07094804ed6ce63d2528f619614d9 F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7 F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 -F src/vacuum.c 813b510ba887fee6492bcb11f2bf77d7eb58b232b83649136372e0a2fc17f4b9 +F src/vacuum.c f25d3b39681595e321a8a4e7fca3e5971cb14a401213d0742c9bf7d4ce8c2a1a F src/vdbe.c 972999395eee88702091fb5d50cf4effd07889c371807d222a7f517388e6378e F src/vdbe.h 51282fbe819ee0e8eeeaab176240860d334c20a12b14f3b363e7f1a4e05d60b9 F src/vdbeInt.h 0b728ee662862a38b1912af741e2ac64f524de3c77aa86cf4306c42bdcd9de59 @@ -1861,7 +1861,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 d5b0def96ba6d90f47bc96fab1ccf9c501d84885d086744035b16fd96f3e248c -R 4a09aaf85f0fed3dd0723d494ffedd7d +P 4135cb024456288d9c85aef5fb572dbb591527dd33d9a60ca5946b712c269941 +R 1d205cbee16938d3cfb21de74a2e62b1 U drh -Z 504e3b736c67f90426ab20d53647f809 +Z db2ebefa734c86f2ca8a25996eb4de7d diff --git a/manifest.uuid b/manifest.uuid index 7a60b45cea..5d4108268d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4135cb024456288d9c85aef5fb572dbb591527dd33d9a60ca5946b712c269941 \ No newline at end of file +abc1aad74f7b6a1e72fb09936239f2224aa942d16296c6a3de0b8daef4bc8471 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index f325ee8699..75cdd25eb3 100644 --- a/src/btree.c +++ b/src/btree.c @@ -2857,8 +2857,11 @@ int sqlite3BtreeSetPagerFlags( int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve, int iFix){ int rc = SQLITE_OK; BtShared *pBt = p->pBt; - assert( nReserve>=-1 && nReserve<=255 ); + assert( nReserve>=-1 && nReserve<=254 ); sqlite3BtreeEnter(p); + if( nReserve>=0 ){ + pBt->nReserveWanted = nReserve + 1; + } if( pBt->btsFlags & BTS_PAGESIZE_FIXED ){ sqlite3BtreeLeave(p); return SQLITE_READONLY; @@ -2911,10 +2914,11 @@ int sqlite3BtreeGetReserveNoMutex(Btree *p){ ** are intentually left unused. This is the "reserved" space that is ** sometimes used by extensions. */ -int sqlite3BtreeGetOptimalReserve(Btree *p){ +int sqlite3BtreeGetRequestedReserve(Btree *p){ int n; sqlite3BtreeEnter(p); - n = sqlite3BtreeGetReserveNoMutex(p); + n = ((int)p->pBt->nReserveWanted) - 1; + if( n<0 ) n = sqlite3BtreeGetReserveNoMutex(p); sqlite3BtreeLeave(p); return n; } diff --git a/src/btree.h b/src/btree.h index 4bd41f7f37..680742a21d 100644 --- a/src/btree.h +++ b/src/btree.h @@ -74,7 +74,7 @@ int sqlite3BtreeGetPageSize(Btree*); int sqlite3BtreeMaxPageCount(Btree*,int); u32 sqlite3BtreeLastPage(Btree*); int sqlite3BtreeSecureDelete(Btree*,int); -int sqlite3BtreeGetOptimalReserve(Btree*); +int sqlite3BtreeGetRequestedReserve(Btree*); int sqlite3BtreeGetReserveNoMutex(Btree *p); int sqlite3BtreeSetAutoVacuum(Btree *, int); int sqlite3BtreeGetAutoVacuum(Btree *); diff --git a/src/btreeInt.h b/src/btreeInt.h index e5149d97ea..34b33096ba 100644 --- a/src/btreeInt.h +++ b/src/btreeInt.h @@ -417,6 +417,7 @@ struct BtShared { #endif u8 inTransaction; /* Transaction state */ u8 max1bytePayload; /* Maximum first byte of cell for a 1-byte payload */ + u8 nReserveWanted; /* 1 more than desired number of extra bytes per page */ u16 btsFlags; /* Boolean parameters. See BTS_* macros below */ u16 maxLocal; /* Maximum local payload in non-LEAFDATA tables */ u16 minLocal; /* Minimum local payload in non-LEAFDATA tables */ diff --git a/src/main.c b/src/main.c index d693621b1e..f186d6ede2 100644 --- a/src/main.c +++ b/src/main.c @@ -3843,6 +3843,13 @@ int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, void *pArg){ }else if( op==SQLITE_FCNTL_DATA_VERSION ){ *(unsigned int*)pArg = sqlite3PagerDataVersion(pPager); rc = SQLITE_OK; + }else if( op==SQLITE_FCNTL_RESERVE_BYTES ){ + int iNew = *(int*)pArg; + *(int*)pArg = sqlite3BtreeGetRequestedReserve(pBtree); + if( iNew>=0 && iNew<=254 ){ + sqlite3BtreeSetPageSize(pBtree, 0, iNew, 0); + } + rc = SQLITE_OK; }else{ rc = sqlite3OsFileControl(fd, op, pArg); } @@ -4059,20 +4066,6 @@ int sqlite3_test_control(int op, ...){ break; } - /* sqlite3_test_control(SQLITE_TESTCTRL_RESERVE, sqlite3 *db, int N) - ** - ** Set the nReserve size to N for the main database on the database - ** connection db. - */ - case SQLITE_TESTCTRL_RESERVE: { - sqlite3 *db = va_arg(ap, sqlite3*); - int x = va_arg(ap,int); - sqlite3_mutex_enter(db->mutex); - sqlite3BtreeSetPageSize(db->aDb[0].pBt, 0, x, 0); - sqlite3_mutex_leave(db->mutex); - break; - } - /* sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS, sqlite3 *db, int N) ** ** Enable or disable various optimizations for testing purposes. The diff --git a/src/shell.c.in b/src/shell.c.in index e8517fb7ec..f252cd7bc7 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -9471,7 +9471,6 @@ static int do_meta_command(char *zLine, ShellState *p){ { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE, "" }, { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE, "" }, { "prng_seed", SQLITE_TESTCTRL_PRNG_SEED, "SEED ?db?" }, - { "reserve", SQLITE_TESTCTRL_RESERVE, "BYTES-OF-RESERVE"}, }; int testctrl = -1; int iCtrl = -1; @@ -9524,7 +9523,6 @@ static int do_meta_command(char *zLine, ShellState *p){ /* sqlite3_test_control(int, db, int) */ case SQLITE_TESTCTRL_OPTIMIZATIONS: - case SQLITE_TESTCTRL_RESERVE: if( nArg==3 ){ int opt = (int)strtol(azArg[2], 0, 0); rc2 = sqlite3_test_control(testctrl, p->db, opt); diff --git a/src/sqlite.h.in b/src/sqlite.h.in index f93fab1c59..2f05665e96 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -1157,6 +1157,7 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_DATA_VERSION 35 #define SQLITE_FCNTL_SIZE_LIMIT 36 #define SQLITE_FCNTL_CKPT_DONE 37 +#define SQLITE_FCNTL_RESERVE_BYTES 38 /* deprecated names */ #define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE @@ -7652,7 +7653,7 @@ int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_PENDING_BYTE 11 #define SQLITE_TESTCTRL_ASSERT 12 #define SQLITE_TESTCTRL_ALWAYS 13 -#define SQLITE_TESTCTRL_RESERVE 14 +#define SQLITE_TESTCTRL_RESERVE 14 /* NOT USED */ #define SQLITE_TESTCTRL_OPTIMIZATIONS 15 #define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */ #define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */ diff --git a/src/vacuum.c b/src/vacuum.c index ce9db649d2..5c230fbe14 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -233,7 +233,7 @@ SQLITE_NOINLINE int sqlite3RunVacuum( } db->mDbFlags |= DBFLAG_VacuumInto; } - nRes = sqlite3BtreeGetOptimalReserve(pMain); + nRes = sqlite3BtreeGetRequestedReserve(pMain); sqlite3BtreeSetCacheSize(pTemp, db->aDb[iDb].pSchema->cache_size); sqlite3BtreeSetSpillSize(pTemp, sqlite3BtreeSetSpillSize(pMain,0)); From 541ef2c36c3c7a42bb563cf80f73681c460a25d1 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 20 Apr 2020 16:21:30 +0000 Subject: [PATCH 030/103] Enhance the ".filectrl" command in the CLI to support the --schema option. FossilOrigin-Name: 698d40db58b76f4094687d46b5c6292702a62168054f9e6a70ee86650a6635f7 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 37 +++++++++++++++++++++++++++++++------ test/shell1.test | 18 ++++++++++++++++-- 4 files changed, 55 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index ac9b8a0f5d..861b547a6b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sSQLITE_TESTCTRL_RESERVE\soperator\sis\sremoved.\s\sIn\sits\splace\sis\sthe\nmore\sgenerate\sSQLITE_FCNTL_RESERVE_BYTES\swhich\sis\san\sAPI\sand\swhich\scan\noperator\son\smore\sthan\sjust\sthe\smain\sschema. -D 2020-04-20T15:18:43.124 +C Enhance\sthe\s".filectrl"\scommand\sin\sthe\sCLI\sto\ssupport\sthe\s--schema\soption. +D 2020-04-20T16:21:30.906 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c ab4eb1aee1bd066feea5b6eff264220ae54459019654264e9f688368a7d0c0b5 -F src/shell.c.in c21ce88a16c04c46741ee04373992ad9982bd2fe83217e9c77012e63af0dde73 +F src/shell.c.in 5402d3a7281576c96d788569778483746859c5e47052facfc4a4ccfac025d5da F src/sqlite.h.in d4430b302155f757f0fbce33c5afe136525827ddfbe532a79fd7fe85b127ea29 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9c5269260409eb3275324ccace6a13a96f4ad330c708415f70ca6097901ff4ee @@ -1334,7 +1334,7 @@ F test/sharedA.test 49d87ec54ab640fbbc3786ee3c01de94aaa482a3a9f834ad3fe92770eb69 F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 -F test/shell1.test 1796b7f76d09ffd2b2dc0ff5ad89428e9892f237d4f4e33ef2278f064a2d94a4 +F test/shell1.test 5bd10014ec494744f5e966a1521334e9d612119a0afcfa5251684a4e1f2ffc66 F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b F test/shell3.test ac8c2b744014c3e9a0e26bfd829ab65f00923dc1a91ffd044863e9423cc91494 F test/shell4.test 1c6aef11daaa2d6830acaba3ac9cbec93fbc1c3d5530743a637f39b3987d08ce @@ -1861,7 +1861,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 4135cb024456288d9c85aef5fb572dbb591527dd33d9a60ca5946b712c269941 -R 1d205cbee16938d3cfb21de74a2e62b1 +P abc1aad74f7b6a1e72fb09936239f2224aa942d16296c6a3de0b8daef4bc8471 +R 0b689458032aceec4d998f84188e0ee8 U drh -Z db2ebefa734c86f2ca8a25996eb4de7d +Z af548dcf210abacdeac04040d9882947 diff --git a/manifest.uuid b/manifest.uuid index 5d4108268d..c04fa12c7a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -abc1aad74f7b6a1e72fb09936239f2224aa942d16296c6a3de0b8daef4bc8471 \ No newline at end of file +698d40db58b76f4094687d46b5c6292702a62168054f9e6a70ee86650a6635f7 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index f252cd7bc7..a2351ce876 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3588,7 +3588,8 @@ static const char *(azHelp[]) = { ".expert EXPERIMENTAL. Suggest indexes for queries", ".explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto", ".filectrl CMD ... Run various sqlite3_file_control() operations", - " Run \".filectrl\" with no arguments for details", + " --schema SCHEMA Use SCHEMA instead of \"main\"", + " --help Show CMD details", ".fullschema ?--indent? Show schema and the content of sqlite_stat tables", ".headers on|off Turn display of headers on or off", ".help ?-all? ?PATTERN? Show help text for PATTERN", @@ -7489,6 +7490,7 @@ static int do_meta_command(char *zLine, ShellState *p){ { "tempfilename", SQLITE_FCNTL_TEMPFILENAME, "" }, { "has_moved", SQLITE_FCNTL_HAS_MOVED, "" }, { "lock_timeout", SQLITE_FCNTL_LOCK_TIMEOUT, "MILLISEC" }, + { "reserve_bytes", SQLITE_FCNTL_RESERVE_BYTES, "[N]" }, }; int filectrl = -1; int iCtrl = -1; @@ -7496,10 +7498,21 @@ static int do_meta_command(char *zLine, ShellState *p){ int isOk = 0; /* 0: usage 1: %lld 2: no-result */ int n2, i; const char *zCmd = 0; + const char *zSchema = 0; open_db(p, 0); zCmd = nArg>=2 ? azArg[1] : "help"; + if( zCmd[0]=='-' + && (strcmp(zCmd,"--schema")==0 || strcmp(zCmd,"-schema")==0) + && nArg>=4 + ){ + zSchema = azArg[2]; + for(i=3; idb, 0, SQLITE_FCNTL_SIZE_LIMIT, &iRes); + sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes); isOk = 1; break; } @@ -7550,7 +7563,7 @@ static int do_meta_command(char *zLine, ShellState *p){ int x; if( nArg!=3 ) break; x = (int)integerValue(azArg[2]); - sqlite3_file_control(p->db, 0, filectrl, &x); + sqlite3_file_control(p->db, zSchema, filectrl, &x); isOk = 2; break; } @@ -7559,7 +7572,7 @@ static int do_meta_command(char *zLine, ShellState *p){ int x; if( nArg!=2 && nArg!=3 ) break; x = nArg==3 ? booleanValue(azArg[2]) : -1; - sqlite3_file_control(p->db, 0, filectrl, &x); + sqlite3_file_control(p->db, zSchema, filectrl, &x); iRes = x; isOk = 1; break; @@ -7567,7 +7580,7 @@ static int do_meta_command(char *zLine, ShellState *p){ case SQLITE_FCNTL_HAS_MOVED: { int x; if( nArg!=2 ) break; - sqlite3_file_control(p->db, 0, filectrl, &x); + sqlite3_file_control(p->db, zSchema, filectrl, &x); iRes = x; isOk = 1; break; @@ -7575,7 +7588,7 @@ static int do_meta_command(char *zLine, ShellState *p){ case SQLITE_FCNTL_TEMPFILENAME: { char *z = 0; if( nArg!=2 ) break; - sqlite3_file_control(p->db, 0, filectrl, &z); + sqlite3_file_control(p->db, zSchema, filectrl, &z); if( z ){ utf8_printf(p->out, "%s\n", z); sqlite3_free(z); @@ -7583,6 +7596,18 @@ static int do_meta_command(char *zLine, ShellState *p){ isOk = 2; break; } + case SQLITE_FCNTL_RESERVE_BYTES: { + int x; + if( nArg>=3 ){ + x = atoi(azArg[2]); + sqlite3_file_control(p->db, zSchema, filectrl, &x); + } + x = -1; + sqlite3_file_control(p->db, zSchema, filectrl, &x); + utf8_printf(p->out,"%d\n", x); + isOk = 2; + break; + } } } if( isOk==0 && iCtrl>=0 ){ diff --git a/test/shell1.test b/test/shell1.test index bbe2ad765e..c142ea7241 100644 --- a/test/shell1.test +++ b/test/shell1.test @@ -493,7 +493,14 @@ do_test shell1-3.15.2 { do_test shell1-3.15.3 { # too many arguments catchcmd "test.db" ".output FOO BAD" -} {1 {Usage: .output [-e|-x|FILE]}} +} {1 {ERROR: extra parameter: "BAD". Usage: +.output ?FILE? Send output to FILE or stdout if FILE is omitted + If FILE begins with '|' then open it as a pipe. + Options: + --bom Prefix output with a UTF8 byte-order mark + -e Send output to the system text editor + -x Send output as CSV to a spreadsheet +child process exited abnormally}} # .output stdout Send output to the screen do_test shell1-3.16.1 { @@ -502,7 +509,14 @@ do_test shell1-3.16.1 { do_test shell1-3.16.2 { # too many arguments catchcmd "test.db" ".output stdout BAD" -} {1 {Usage: .output [-e|-x|FILE]}} +} {1 {ERROR: extra parameter: "BAD". Usage: +.output ?FILE? Send output to FILE or stdout if FILE is omitted + If FILE begins with '|' then open it as a pipe. + Options: + --bom Prefix output with a UTF8 byte-order mark + -e Send output to the system text editor + -x Send output as CSV to a spreadsheet +child process exited abnormally}} # .prompt MAIN CONTINUE Replace the standard prompts do_test shell1-3.17.1 { From 3b9f154bb7c2f5382a998ce7ca1312654ddea587 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 20 Apr 2020 17:35:32 +0000 Subject: [PATCH 031/103] Do not use O_NOFOLLOW when opening a directory just to call fsync() on that directory. FossilOrigin-Name: 2fc80ef16ce5878311ab88a0c64631813572ffbb71f75363b4619c9667e0926b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/os_unix.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 861b547a6b..f57656af3a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\s".filectrl"\scommand\sin\sthe\sCLI\sto\ssupport\sthe\s--schema\soption. -D 2020-04-20T16:21:30.906 +C Do\snot\suse\sO_NOFOLLOW\swhen\sopening\sa\sdirectory\sjust\sto\scall\sfsync()\son\nthat\sdirectory. +D 2020-04-20T17:35:32.334 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -516,7 +516,7 @@ 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 06593ba4bdfae42b30a897b3b4e59abb88a11d50dd0cad39003da955d822b8d1 +F src/os_unix.c 7ef8b60222558a373d89c18d0c3bc44365b45273a528183d40bec5bb76ce23fc F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c a71ffd145f55e28cbdc1bdabb5e6bef063da428a6c0de3c3a36e9a0c41d4c8c0 @@ -1861,7 +1861,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 abc1aad74f7b6a1e72fb09936239f2224aa942d16296c6a3de0b8daef4bc8471 -R 0b689458032aceec4d998f84188e0ee8 +P 698d40db58b76f4094687d46b5c6292702a62168054f9e6a70ee86650a6635f7 +R 1a3f713395bcb50f232d9e1e989d47d0 U drh -Z af548dcf210abacdeac04040d9882947 +Z 3de631e900a36e1c44f2a5a4e6c38aa5 diff --git a/manifest.uuid b/manifest.uuid index c04fa12c7a..567a9e7beb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -698d40db58b76f4094687d46b5c6292702a62168054f9e6a70ee86650a6635f7 \ No newline at end of file +2fc80ef16ce5878311ab88a0c64631813572ffbb71f75363b4619c9667e0926b \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index a4dd2f906c..56e53929ea 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -3685,7 +3685,7 @@ static int openDirectory(const char *zFilename, int *pFd){ if( zDirname[0]!='/' ) zDirname[0] = '.'; zDirname[1] = 0; } - fd = robust_open(zDirname, O_RDONLY|O_BINARY|O_NOFOLLOW, 0); + fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0); if( fd>=0 ){ OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname)); } From 480620c71340e8dca10d6c842985c45f6ba6cf15 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 21 Apr 2020 01:06:35 +0000 Subject: [PATCH 032/103] Experimental API: sqlite3_database_file_object(). FossilOrigin-Name: ae697b152d22737169892411a0c4d908895ff5fb249cce9bdb1ba0bbe32806f0 --- manifest | 21 ++++++++++++--------- manifest.uuid | 2 +- src/loadext.c | 1 + src/pager.c | 16 ++++++++++++++++ src/sqlite.h.in | 19 +++++++++++++++++++ src/sqlite3ext.h | 1 + 6 files changed, 50 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index f57656af3a..35ca686870 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\suse\sO_NOFOLLOW\swhen\sopening\sa\sdirectory\sjust\sto\scall\sfsync()\son\nthat\sdirectory. -D 2020-04-20T17:35:32.334 +C Experimental\sAPI:\ssqlite3_database_file_object(). +D 2020-04-21T01:06:35.069 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -495,7 +495,7 @@ F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 8e4211d04eb460c0694d486c6ba1c068d468c6f653c3f237869a802ad82854de F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa -F src/loadext.c b179df50e6e8bb0c36c149e95d958d49bd8c6c7469e59c01b53d164360bc6c32 +F src/loadext.c 4540fb20e8606b5cea7efee1d727cc69b20390ddc2e6a6c5515e20f96dcc205c F src/main.c 652a782cd7b6c6ddf7419fcaf06b8aa9440b7c815857241171c9bdf03ab6544c F src/malloc.c cabfef0d725e04c8abfe0231a556ed8b78bf329dcc3fddbf903f6cdcd53cf4e6 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 @@ -519,7 +519,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 7ef8b60222558a373d89c18d0c3bc44365b45273a528183d40bec5bb76ce23fc F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c a71ffd145f55e28cbdc1bdabb5e6bef063da428a6c0de3c3a36e9a0c41d4c8c0 +F src/pager.c 29ee0618daa1f49c24431a9f21b7ac15fa148eb63626c9e0ac145fffbe0b209d F src/pager.h 3b33619a90180e0874c7eca31d6f6ceb464d9322c6fb4e9a7bbb318c8a17bdb3 F src/parse.y c8eff38606f443d5ba245263fa7abc05e4116d95656e050c4b78e9bfbf931add F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 @@ -534,9 +534,9 @@ F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c ab4eb1aee1bd066feea5b6eff264220ae54459019654264e9f688368a7d0c0b5 F src/shell.c.in 5402d3a7281576c96d788569778483746859c5e47052facfc4a4ccfac025d5da -F src/sqlite.h.in d4430b302155f757f0fbce33c5afe136525827ddfbe532a79fd7fe85b127ea29 +F src/sqlite.h.in fd6fcfe173accab8d9cb9a843856d9e9fb475f893b60a455e01d8739b5076f0e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 -F src/sqlite3ext.h 9c5269260409eb3275324ccace6a13a96f4ad330c708415f70ca6097901ff4ee +F src/sqlite3ext.h 224bd560533a3479bd38ece4af12799b684751c61d7762a54859efc2cf68c702 F src/sqliteInt.h 0f3848c46310d197246003f052985b72d1cdbfc0b31e069db76cb5231062fa1d F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 @@ -1861,7 +1861,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 698d40db58b76f4094687d46b5c6292702a62168054f9e6a70ee86650a6635f7 -R 1a3f713395bcb50f232d9e1e989d47d0 +P 2fc80ef16ce5878311ab88a0c64631813572ffbb71f75363b4619c9667e0926b +R 179a1e5a1fd45f685d8f9f4125f02840 +T *branch * sqlite3_database_file_object +T *sym-sqlite3_database_file_object * +T -sym-trunk * U drh -Z 3de631e900a36e1c44f2a5a4e6c38aa5 +Z 4494bc3e04abebffc2e5f13976ff0914 diff --git a/manifest.uuid b/manifest.uuid index 567a9e7beb..9bb6891bbe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2fc80ef16ce5878311ab88a0c64631813572ffbb71f75363b4619c9667e0926b \ No newline at end of file +ae697b152d22737169892411a0c4d908895ff5fb249cce9bdb1ba0bbe32806f0 \ No newline at end of file diff --git a/src/loadext.c b/src/loadext.c index 06297e6bb6..5a661cdc26 100644 --- a/src/loadext.c +++ b/src/loadext.c @@ -477,6 +477,7 @@ static const sqlite3_api_routines sqlite3Apis = { /* Version 3.32.0 and later */ sqlite3_create_filename, sqlite3_free_filename, + sqlite3_database_file_object, }; /* diff --git a/src/pager.c b/src/pager.c index 5d2225590e..3377762300 100644 --- a/src/pager.c +++ b/src/pager.c @@ -4742,6 +4742,7 @@ int sqlite3PagerOpen( ** Database file handle (pVfs->szOsFile bytes) ** Sub-journal file handle (journalFileSize bytes) ** Main journal file handle (journalFileSize bytes) + ** Ptr back to the Pager (sizeof(Pager*) bytes) ** \0\0\0\0 database prefix (4 bytes) ** Database file name (nPathname+1 bytes) ** URI query parameters (nUriByte bytes) @@ -4781,6 +4782,7 @@ int sqlite3PagerOpen( ROUND8(pcacheSize) + /* PCache object */ ROUND8(pVfs->szOsFile) + /* The main db file */ journalFileSize * 2 + /* The two journal files */ + sizeof(pPager) + /* Space to hold a pointer */ 4 + /* Database prefix */ nPathname + 1 + /* database filename */ nUriByte + /* query parameters */ @@ -4801,6 +4803,7 @@ int sqlite3PagerOpen( pPager->sjfd = (sqlite3_file*)pPtr; pPtr += journalFileSize; pPager->jfd = (sqlite3_file*)pPtr; pPtr += journalFileSize; assert( EIGHT_BYTE_ALIGNMENT(pPager->jfd) ); + memcpy(pPtr, &pPager, sizeof(pPager)); pPtr += sizeof(pPager); /* Fill in the Pager.zFilename and pPager.zQueryParam fields */ pPtr += 4; /* Skip zero prefix */ @@ -5001,6 +5004,19 @@ act_like_temp_file: return SQLITE_OK; } +/* +** Return the sqlite3_file for the main database given the name +** of the corresonding WAL or Journal name as passed into +** xOpen. +*/ +sqlite3_file *sqlite3_database_file_object(const char *zName){ + Pager *pPager; + while( zName[-1]!=0 || zName[-2]!=0 || zName[-3]!=0 || zName[-4]!=0 ){ + zName--; + } + pPager = *(Pager**)(zName - 4 - sizeof(Pager*)); + return pPager->fd; +} /* diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 2f05665e96..a5e8d14974 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -3620,6 +3620,25 @@ const char *sqlite3_filename_database(const char*); const char *sqlite3_filename_journal(const char*); const char *sqlite3_filename_wal(const char*); +/* +** CAPI3REF: Database File Corresponding To A Journal +** +** ^If X is the name of a rollback or WAL-mode journal file that is +** passed into the xOpen method of [sqlite3_vfs], then +** sqlite3_database_file_object(X) returns a pointer to the [sqlite3_file] +** object that represents the main database file. +** +** This routine is intended for use in custom [VFS] implementations +** only. It is not a general-purpose interface. +** The argument sqlite3_file_object(X) must be a filename pointer that +** has been passed into [sqlite3_vfs].xOpen method where the +** flags parameter to xOpen contains one of the bits +** [SQLITE_OPEN_MAIN_JOURNAL] or [SQLITE_OPEN_WAL]. Any other use +** of this routine results in undefined and probably undesirable +** behavior. +*/ +sqlite3_file *sqlite3_database_file_object(const char*); + /* ** CAPI3REF: Create and Destroy VFS Filenames ** diff --git a/src/sqlite3ext.h b/src/sqlite3ext.h index a7c76a6784..283a679ad4 100644 --- a/src/sqlite3ext.h +++ b/src/sqlite3ext.h @@ -334,6 +334,7 @@ struct sqlite3_api_routines { char *(*create_filename)(const char*,const char*,const char*, int,const char**); void (*free_filename)(char*); + sqlite3_file *(*database_file_object)(const char*); }; /* From 9a1bb3f6166f08e9f520393b2c9c3ce892366922 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 21 Apr 2020 19:27:08 +0000 Subject: [PATCH 033/103] Add the sqlite3_database_file_object() interface to sqlite3ext.h. FossilOrigin-Name: 3cabe06b6e9433cbfb4bf7bd72a425f43b54f57d84a205adbaa6a1147bbe46bf --- manifest | 15 ++++++--------- manifest.uuid | 2 +- src/sqlite3ext.h | 1 + 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 35ca686870..c459dd328b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Experimental\sAPI:\ssqlite3_database_file_object(). -D 2020-04-21T01:06:35.069 +C Add\sthe\ssqlite3_database_file_object()\sinterface\sto\ssqlite3ext.h. +D 2020-04-21T19:27:08.207 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -536,7 +536,7 @@ F src/select.c ab4eb1aee1bd066feea5b6eff264220ae54459019654264e9f688368a7d0c0b5 F src/shell.c.in 5402d3a7281576c96d788569778483746859c5e47052facfc4a4ccfac025d5da F src/sqlite.h.in fd6fcfe173accab8d9cb9a843856d9e9fb475f893b60a455e01d8739b5076f0e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 -F src/sqlite3ext.h 224bd560533a3479bd38ece4af12799b684751c61d7762a54859efc2cf68c702 +F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 F src/sqliteInt.h 0f3848c46310d197246003f052985b72d1cdbfc0b31e069db76cb5231062fa1d F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 @@ -1861,10 +1861,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 2fc80ef16ce5878311ab88a0c64631813572ffbb71f75363b4619c9667e0926b -R 179a1e5a1fd45f685d8f9f4125f02840 -T *branch * sqlite3_database_file_object -T *sym-sqlite3_database_file_object * -T -sym-trunk * +P ae697b152d22737169892411a0c4d908895ff5fb249cce9bdb1ba0bbe32806f0 +R cc7f5aa23076777d96573db8bef15752 U drh -Z 4494bc3e04abebffc2e5f13976ff0914 +Z 0fbe741b842883ec4b35af5da437ce6d diff --git a/manifest.uuid b/manifest.uuid index 9bb6891bbe..999a5e365b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ae697b152d22737169892411a0c4d908895ff5fb249cce9bdb1ba0bbe32806f0 \ No newline at end of file +3cabe06b6e9433cbfb4bf7bd72a425f43b54f57d84a205adbaa6a1147bbe46bf \ No newline at end of file diff --git a/src/sqlite3ext.h b/src/sqlite3ext.h index 283a679ad4..78c19a0d10 100644 --- a/src/sqlite3ext.h +++ b/src/sqlite3ext.h @@ -638,6 +638,7 @@ typedef int (*sqlite3_loadext_entry)( /* Version 3.32.0 and later */ #define sqlite3_create_filename sqlite3_api->create_filename #define sqlite3_free_filename sqlite3_api->free_filename +#define sqlite3_database_file_object sqlite3_api->database_file_object #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) From 4d34766f4e537d570de4e280b1d4667244efed15 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 22 Apr 2020 00:50:21 +0000 Subject: [PATCH 034/103] Clarify the comment on the sqlite3BtreeGetRequestedReserve() routine. No changes to code. FossilOrigin-Name: 52a6acca6d5d376308d354c02f4d676d9375c34c3841d7b1941196ee8b4e2511 --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/btree.c | 4 ++++ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 263d7581cc..c310f11c49 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\ssqlite3_database_file_object()\sinterface. -D 2020-04-21T20:19:25.607 +C Clarify\sthe\scomment\son\sthe\ssqlite3BtreeGetRequestedReserve()\sroutine.\nNo\schanges\sto\scode. +D 2020-04-22T00:50:21.766 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -473,7 +473,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 97673c54a3023845e7320cfa9e0de67fd6ca34b37a17a420981bb6e767601310 +F src/btree.c 02376eb7d49ccf31b53c2504f045ad74687c142a5c15ca837516e59e737867dc F src/btree.h 32672fa1aa74a7e9ab3aae822f94ffc8e732b1eb005988dc2283f91dc7573398 F src/btreeInt.h 887cdd2ea7f4a65143074a8a7c8928b0546f8c18dda3c06a408ce7992cbab0c0 F src/build.c ec6c0bda1e43ef55e5f5121a77ba19fac51fc6585f95ce2da795bcedcf6e8f36 @@ -1861,8 +1861,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 2fc80ef16ce5878311ab88a0c64631813572ffbb71f75363b4619c9667e0926b 3cabe06b6e9433cbfb4bf7bd72a425f43b54f57d84a205adbaa6a1147bbe46bf -R cc7f5aa23076777d96573db8bef15752 -T +closed 3cabe06b6e9433cbfb4bf7bd72a425f43b54f57d84a205adbaa6a1147bbe46bf +P f534ebeaaf34f825550138f09f9a40221dfa7cd5c6537ef9f86dce5249025ec3 +R 0b277ec515801445e56dff650ba9aa79 U drh -Z c90bcd212b5c6fecb7eed98428e07741 +Z 6f8537667ffe93f8434cdb592b03d84e diff --git a/manifest.uuid b/manifest.uuid index 56d1422dc3..4d78ab2700 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f534ebeaaf34f825550138f09f9a40221dfa7cd5c6537ef9f86dce5249025ec3 \ No newline at end of file +52a6acca6d5d376308d354c02f4d676d9375c34c3841d7b1941196ee8b4e2511 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 75cdd25eb3..abe0b844f3 100644 --- a/src/btree.c +++ b/src/btree.c @@ -2913,6 +2913,10 @@ int sqlite3BtreeGetReserveNoMutex(Btree *p){ ** Return the number of bytes of space at the end of every page that ** are intentually left unused. This is the "reserved" space that is ** sometimes used by extensions. +** +** The value returned is the larger of the current reserve size and +** the latest reserve size requested by SQLITE_FILECTRL_RESERVE_BYTES. +** The amount of reserve can only grow - never shrink. */ int sqlite3BtreeGetRequestedReserve(Btree *p){ int n; From fc7f31742de0fea66610ac3211b40e27a467c923 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 22 Apr 2020 11:11:17 +0000 Subject: [PATCH 035/103] Fix an integer overflow in fts3 causing a usan error. FossilOrigin-Name: e256f85289a78e629acdf83e5bf1f8df2a0ffb3d559738eb9e49db6c228dc8c0 --- ext/fts3/fts3.c | 34 ++++++++++++++++++++++++---------- ext/fts3/fts3Int.h | 1 + ext/fts3/fts3_expr.c | 5 +---- ext/fts3/fts3_write.c | 6 +++--- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- test/fts3misc.test | 8 ++++++++ 7 files changed, 49 insertions(+), 29 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index d03f3adf87..841d7448f9 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -962,6 +962,22 @@ static char *fts3WriteExprList(Fts3Table *p, const char *zFunc, int *pRc){ return zRet; } +/* +** Buffer z contains a positive integer value encoded as utf-8 text. +** Decode this value and store it in *pnOut, returning the number of bytes +** consumed. If an overflow error occurs return a negative value. +*/ +int sqlite3Fts3ReadInt(const char *z, int *pnOut){ + u64 iVal = 0; + int i; + for(i=0; z[i]>='0' && z[i]<='9'; i++){ + iVal = iVal*10 + (z[i] - '0'); + if( iVal>0x7FFFFFFF ) return -1; + } + *pnOut = (int)iVal; + return i; +} + /* ** This function interprets the string at (*pp) as a non-negative integer ** value. It reads the integer and sets *pnOut to the value read, then @@ -977,19 +993,17 @@ static char *fts3WriteExprList(Fts3Table *p, const char *zFunc, int *pRc){ */ static int fts3GobbleInt(const char **pp, int *pnOut){ const int MAX_NPREFIX = 10000000; - const char *p; /* Iterator pointer */ int nInt = 0; /* Output value */ - - for(p=*pp; p[0]>='0' && p[0]<='9'; p++){ - nInt = nInt * 10 + (p[0] - '0'); - if( nInt>MAX_NPREFIX ){ - nInt = 0; - break; - } + int nByte; + nByte = sqlite3Fts3ReadInt(*pp, &nInt); + if( nInt>MAX_NPREFIX ){ + nInt = 0; + } + if( nByte==0 ){ + return SQLITE_ERROR; } - if( p==*pp ) return SQLITE_ERROR; *pnOut = nInt; - *pp = p; + *pp += nByte; return SQLITE_OK; } diff --git a/ext/fts3/fts3Int.h b/ext/fts3/fts3Int.h index 50370a9108..453afcebfd 100644 --- a/ext/fts3/fts3Int.h +++ b/ext/fts3/fts3Int.h @@ -591,6 +591,7 @@ int sqlite3Fts3EvalPhraseStats(Fts3Cursor *, Fts3Expr *, u32 *); int sqlite3Fts3FirstFilter(sqlite3_int64, char *, int, char *); void sqlite3Fts3CreateStatTable(int*, Fts3Table*); int sqlite3Fts3EvalTestDeferred(Fts3Cursor *pCsr, int *pRc); +int sqlite3Fts3ReadInt(const char *z, int *pnOut); /* fts3_tokenizer.c */ const char *sqlite3Fts3NextToken(const char *, int *); diff --git a/ext/fts3/fts3_expr.c b/ext/fts3/fts3_expr.c index 5775fbca3c..e19137a03d 100644 --- a/ext/fts3/fts3_expr.c +++ b/ext/fts3/fts3_expr.c @@ -446,10 +446,7 @@ static int getNextNode( if( pKey->eType==FTSQUERY_NEAR ){ assert( nKey==4 ); if( zInput[4]=='/' && zInput[5]>='0' && zInput[5]<='9' ){ - nNear = 0; - for(nKey=5; zInput[nKey]>='0' && zInput[nKey]<='9'; nKey++){ - nNear = nNear * 10 + (zInput[nKey] - '0'); - } + nKey += 1+sqlite3Fts3ReadInt(&zInput[nKey+1], &nNear); } } diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 9a052a8f26..b9acc47dc5 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -3069,11 +3069,11 @@ static void fts3ReadEndBlockField( if( zText ){ int i; int iMul = 1; - i64 iVal = 0; + u64 iVal = 0; for(i=0; zText[i]>='0' && zText[i]<='9'; i++){ iVal = iVal*10 + (zText[i] - '0'); } - *piEndBlock = iVal; + *piEndBlock = (i64)iVal; while( zText[i]==' ' ) i++; iVal = 0; if( zText[i]=='-' ){ @@ -3083,7 +3083,7 @@ static void fts3ReadEndBlockField( for(/* no-op */; zText[i]>='0' && zText[i]<='9'; i++){ iVal = iVal*10 + (zText[i] - '0'); } - *pnByte = (iVal * (i64)iMul); + *pnByte = ((i64)iVal * (i64)iMul); } } diff --git a/manifest b/manifest index c310f11c49..08a28b321b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Clarify\sthe\scomment\son\sthe\ssqlite3BtreeGetRequestedReserve()\sroutine.\nNo\schanges\sto\scode. -D 2020-04-22T00:50:21.766 +C Fix\san\sinteger\soverflow\sin\sfts3\scausing\sa\susan\serror. +D 2020-04-22T11:11:17.450 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -82,11 +82,11 @@ 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 2a9dd452003a143248e68449302da80dd0c43df72195b56577e3562e43c408a0 +F ext/fts3/fts3.c de2cc136ccc6128e948ffd5d74636756014b2430d6237d7002c3bc3ceb1ae3ae F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h f091030b976045e7df91af2337935952b477cdbd9f48058c44c965684484cb50 +F ext/fts3/fts3Int.h 2c59cc46aefde134c1782e89a6a5384710ddcd4e783071337aa5d43d07269be3 F ext/fts3/fts3_aux.c 96708c8b3a7d9b8ca1b68ea2b7e503e283f20e95f145becadedfad096dbd0f34 -F ext/fts3/fts3_expr.c b132af223e90e35b9f9efa9fe63d6ae737d34153a3b6066736086df8abc78a1f +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 @@ -100,7 +100,7 @@ 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 d5da5f010b2e2c1523f0e359ec43858bb724f608d3805d0e2a82ca2b466eb22e +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 @@ -967,7 +967,7 @@ F test/fts3fuzz001.test e3c7b0ce9b04cc02281dcc96812a277f02df03cd7dc082055d87e11e F test/fts3join.test 949b4f5ae3ae9cc2423cb865d711e32476bdb205ab2be923fdf48246e4a44166 F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6 F test/fts3matchinfo.test aa66cc50615578b30f6df9984819ae5b702511cf8a94251ec7c594096a703a4a -F test/fts3misc.test 236f37a57d97fa1b7e0a4303aab7e02da87a9818c106e513ae88af76f25ace4a +F test/fts3misc.test 9ec15e7c0b5831a6353bd4c46bf3acdf1360eda5d9f396f667db4d05bcf92ecf F test/fts3near.test 7e3354d46f155a822b59c0e957fd2a70c1d7e905 F test/fts3offsets.test b85fd382abdc78ebce721d8117bd552dfb75094c F test/fts3prefix.test fa794eaab0bdae466494947b0b153d7844478ab2 @@ -1861,7 +1861,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 f534ebeaaf34f825550138f09f9a40221dfa7cd5c6537ef9f86dce5249025ec3 -R 0b277ec515801445e56dff650ba9aa79 -U drh -Z 6f8537667ffe93f8434cdb592b03d84e +P 52a6acca6d5d376308d354c02f4d676d9375c34c3841d7b1941196ee8b4e2511 +R 239e034db6f2572fb8fec1e8bff6f6f8 +U dan +Z e2a67ef3238147bad4f5c8a4180c4e31 diff --git a/manifest.uuid b/manifest.uuid index 4d78ab2700..96679a2c15 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -52a6acca6d5d376308d354c02f4d676d9375c34c3841d7b1941196ee8b4e2511 \ No newline at end of file +e256f85289a78e629acdf83e5bf1f8df2a0ffb3d559738eb9e49db6c228dc8c0 \ No newline at end of file diff --git a/test/fts3misc.test b/test/fts3misc.test index 9becba9af7..a1bec42432 100644 --- a/test/fts3misc.test +++ b/test/fts3misc.test @@ -315,4 +315,12 @@ do_catchsql_test 10.1 { INSERT INTO f(f) VALUES ('merge=69,59'); } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +do_execsql_test 11.0 { + CREATE VIRTUAL TABLE xyz USING fts3(); +} +do_execsql_test 11.1 { + SELECT * FROM xyz WHERE xyz MATCH 'a NEAR/4294836224 a'; +} + finish_test From 542bd6521e91c49e663123848e5898cd5632d097 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 22 Apr 2020 13:49:25 +0000 Subject: [PATCH 036/103] Fix an off-by-one error in the "calculated" page count output from the sqlite3_analyzer utility for databases that are more than 1GB in size. FossilOrigin-Name: 8789368b91fb5b7477bdba3a953412fc3839b4894443b65186f7b8f79f6369c9 --- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/spaceanal.tcl | 3 +++ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 08a28b321b..2c6424a0a5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sinteger\soverflow\sin\sfts3\scausing\sa\susan\serror. -D 2020-04-22T11:11:17.450 +C Fix\san\soff-by-one\serror\sin\sthe\s"calculated"\spage\scount\soutput\sfrom\sthe\nsqlite3_analyzer\sutility\sfor\sdatabases\sthat\sare\smore\sthan\s1GB\sin\ssize. +D 2020-04-22T13:49:25.923 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1818,7 +1818,7 @@ F tool/showshm.c a0ab6ec32dd1f11218ca2a4018f8fb875b59414801ab8ceed8b2e69b7b45a80 F tool/showstat4.c 0682ebea7abf4d3657f53c4a243f2e7eab48eab344ed36a94bb75dcd19a5c2a1 F tool/showwal.c ad9d768f96ca6199ad3a8c9562d679680bd032dd01204ea3e5ea6fb931d81847 F tool/soak1.tcl 8d407956e1a45b485a8e072470a3e629a27037fe -F tool/spaceanal.tcl 4bfd19aad7eb3ce0372ef0255f58035e0bba4ff5e9acfd763a10c6fb365c8dec +F tool/spaceanal.tcl c161d838825d0242317c7cc13b1eb2126f8cec031950ef31114d42732cb2674e F tool/speed-check.sh 2b042d703a9472f08c3b13be27afac658426f8e4fc87cd2d575953fda86f08d1 F tool/speedtest.tcl 06c76698485ccf597b9e7dbb1ac70706eb873355 F tool/speedtest16.c ecb6542862151c3e6509bbc00509b234562ae81e @@ -1861,7 +1861,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 52a6acca6d5d376308d354c02f4d676d9375c34c3841d7b1941196ee8b4e2511 -R 239e034db6f2572fb8fec1e8bff6f6f8 -U dan -Z e2a67ef3238147bad4f5c8a4180c4e31 +P e256f85289a78e629acdf83e5bf1f8df2a0ffb3d559738eb9e49db6c228dc8c0 +R aa22f4b98699ca6a0df355f11de7b138 +U drh +Z c8995117adf96d65ebda024f30ba4870 diff --git a/manifest.uuid b/manifest.uuid index 96679a2c15..2591c5adff 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e256f85289a78e629acdf83e5bf1f8df2a0ffb3d559738eb9e49db6c228dc8c0 \ No newline at end of file +8789368b91fb5b7477bdba3a953412fc3839b4894443b65186f7b8f79f6369c9 \ No newline at end of file diff --git a/tool/spaceanal.tcl b/tool/spaceanal.tcl index 3e08d3ffa7..3b33f8868e 100644 --- a/tool/spaceanal.tcl +++ b/tool/spaceanal.tcl @@ -587,6 +587,9 @@ set free_percent2 [percent $free_pgcnt2 $file_pgcnt] set file_pgcnt2 [expr {$inuse_pgcnt+$free_pgcnt2+$av_pgcnt}] +# Account for the lockbyte page +if {$file_pgcnt2*$pageSize>1073742335} {incr file_pgcnt2} + set ntable [db eval {SELECT count(*)+1 FROM sqlite_master WHERE type='table'}] set nindex [db eval {SELECT count(*) FROM sqlite_master WHERE type='index'}] set sql {SELECT count(*) FROM sqlite_master WHERE name LIKE 'sqlite_autoindex%'} From 5415ab49b48be86772557e6e03572ec2600398e7 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 23 Apr 2020 20:45:46 +0000 Subject: [PATCH 037/103] Fix an uninitialized variable in the newly enhanced ".output" command of the CLI. FossilOrigin-Name: 65c6c26bb48d5347ce53bb3607de3a03a5a03946b232d35e46a20533f86750f8 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 2c6424a0a5..f9aed325cb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\soff-by-one\serror\sin\sthe\s"calculated"\spage\scount\soutput\sfrom\sthe\nsqlite3_analyzer\sutility\sfor\sdatabases\sthat\sare\smore\sthan\s1GB\sin\ssize. -D 2020-04-22T13:49:25.923 +C Fix\san\suninitialized\svariable\sin\sthe\snewly\senhanced\s".output"\scommand\sof\nthe\sCLI. +D 2020-04-23T20:45:46.822 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c ab4eb1aee1bd066feea5b6eff264220ae54459019654264e9f688368a7d0c0b5 -F src/shell.c.in 5402d3a7281576c96d788569778483746859c5e47052facfc4a4ccfac025d5da +F src/shell.c.in 1fc834b80c72dd37587ea87a4f4167cf5e6d98d12d143184ed2e732f529c0950 F src/sqlite.h.in fd6fcfe173accab8d9cb9a843856d9e9fb475f893b60a455e01d8739b5076f0e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1861,7 +1861,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 e256f85289a78e629acdf83e5bf1f8df2a0ffb3d559738eb9e49db6c228dc8c0 -R aa22f4b98699ca6a0df355f11de7b138 +P 8789368b91fb5b7477bdba3a953412fc3839b4894443b65186f7b8f79f6369c9 +R 94debbbab259c50b5d510b556b34bbe9 U drh -Z c8995117adf96d65ebda024f30ba4870 +Z adea19ccf682c3a65d10a2e98fd48b5d diff --git a/manifest.uuid b/manifest.uuid index 2591c5adff..52a8c1756d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8789368b91fb5b7477bdba3a953412fc3839b4894443b65186f7b8f79f6369c9 \ No newline at end of file +65c6c26bb48d5347ce53bb3607de3a03a5a03946b232d35e46a20533f86750f8 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index a2351ce876..0218b71876 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -8346,7 +8346,7 @@ static int do_meta_command(char *zLine, ShellState *p){ int i; int eMode = 0; int bBOM = 0; - int bOnce; + int bOnce = 0; /* 0: .output, 1: .once, 2: .excel */ if( c=='e' ){ eMode = 'x'; From 742efb67495c620b95697ffe0b2a224e3c3e4daf Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 24 Apr 2020 17:55:52 +0000 Subject: [PATCH 038/103] New test case for ticket [1dcb4d44964846ad]. FossilOrigin-Name: 9e9f1e96c9aac60fcbbcda6923e01e350ca4dd88acefb9d400979419ba4e1e4d --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/whereL.test | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index f9aed325cb..82884fd605 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\suninitialized\svariable\sin\sthe\snewly\senhanced\s".output"\scommand\sof\nthe\sCLI. -D 2020-04-23T20:45:46.822 +C New\stest\scase\sfor\sticket\s[1dcb4d44964846ad]. +D 2020-04-24T17:55:52.244 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1713,7 +1713,7 @@ F test/whereH.test e4b07f7a3c2f5d31195cd33710054c78667573b2 F test/whereI.test a2874062140ed4aba9ffae76e6190a3df6fc73d1373fdfa8fd632945082a5364 F test/whereJ.test 88287550f6ee604422403b053455b1ad894eeaa5c35d348532dfa1439286cb9a F test/whereK.test f8e3cf26a8513ecc7f514f54df9f0572c046c42b -F test/whereL.test d19499a39c9e3e5a74460778b009558d328c8a230c0e6825c9996c9adff89058 +F test/whereL.test e05cedc9389c6f09ad55bd5999a3fddccebec90672fb989433c145dcdaf26996 F test/wherefault.test 1374c3aa198388925246475f84ad4cd5f9528864 F test/wherelfault.test 9012e4ef5259058b771606616bd007af5d154e64cc25fa9fd4170f6411db44e3 F test/wherelimit.test 592081800806d297dd7449b1030c863d2883d6d42901837ccd2e5a9bd962edb0 @@ -1861,7 +1861,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 8789368b91fb5b7477bdba3a953412fc3839b4894443b65186f7b8f79f6369c9 -R 94debbbab259c50b5d510b556b34bbe9 +P 65c6c26bb48d5347ce53bb3607de3a03a5a03946b232d35e46a20533f86750f8 +R 9ce5e5b106a98ef938e13dec7c4ca6e7 U drh -Z adea19ccf682c3a65d10a2e98fd48b5d +Z ae06a854a112a06df1f524333bda4911 diff --git a/manifest.uuid b/manifest.uuid index 52a8c1756d..d24a56717c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -65c6c26bb48d5347ce53bb3607de3a03a5a03946b232d35e46a20533f86750f8 \ No newline at end of file +9e9f1e96c9aac60fcbbcda6923e01e350ca4dd88acefb9d400979419ba4e1e4d \ No newline at end of file diff --git a/test/whereL.test b/test/whereL.test index 0f577e06eb..fbb424e919 100644 --- a/test/whereL.test +++ b/test/whereL.test @@ -157,4 +157,38 @@ do_execsql_test 600 { WHERE x='good' AND y='good'; } {good good} +# 2020-04-24: Another test case for the previous (1dcb4d44964846ad) +# ticket. The test case comes from +# https://stackoverflow.com/questions/61399253/sqlite3-different-result-in-console-compared-to-python-script/ +# Output verified against postgresql. +# +do_execsql_test 610 { + CREATE TABLE tableA( + ID int, + RunYearMonth int + ); + INSERT INTO tableA VALUES(1,202003),(2,202003),(3,202003),(4,202004), + (5,202004),(6,202004),(7,202004),(8,202004); + CREATE TABLE tableB ( + ID int, + RunYearMonth int + ); + INSERT INTO tableB VALUES(1,202004),(2,202004),(3,202004),(4,202004), + (5,202004); + SELECT * + FROM ( + SELECT * + FROM tableA + WHERE RunYearMonth = 202004 + ) AS A + INNER JOIN ( + SELECT * + FROM tableB + WHERE RunYearMonth = 202004 + ) AS B + ON A.ID = B.ID + AND A.RunYearMonth = B.RunYearMonth; +} {4 202004 4 202004 5 202004 5 202004} + + finish_test From ab2172e69f5dfb5017a6a7b230862c0a54f41e7d Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 24 Apr 2020 18:20:30 +0000 Subject: [PATCH 039/103] The new sqlite3_database_file_object() interface requires that the pager never invoke xOpen with SQLITE_OPEN_MAIN_JOURNAL unless it is using a pointer to the journal name found in the Pager structure itself. Make this the case when processing a master-journal. FossilOrigin-Name: b4987a5ced0c0f2c606c040e0c1b8ee11175f40ae35a7446308a43e77b1f1db2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pager.c | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 82884fd605..0b463f86f3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scase\sfor\sticket\s[1dcb4d44964846ad]. -D 2020-04-24T17:55:52.244 +C The\snew\ssqlite3_database_file_object()\sinterface\srequires\sthat\sthe\spager\nnever\sinvoke\sxOpen\swith\sSQLITE_OPEN_MAIN_JOURNAL\sunless\sit\sis\susing\na\spointer\sto\sthe\sjournal\sname\sfound\sin\sthe\sPager\sstructure\sitself.\s\s\sMake\nthis\sthe\scase\swhen\sprocessing\sa\smaster-journal. +D 2020-04-24T18:20:30.239 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -519,7 +519,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 7ef8b60222558a373d89c18d0c3bc44365b45273a528183d40bec5bb76ce23fc F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 29ee0618daa1f49c24431a9f21b7ac15fa148eb63626c9e0ac145fffbe0b209d +F src/pager.c 52cee2f72710be47b5b13ff66b339ca3855e5bc48e92a94114d2affedc70041f F src/pager.h 3b33619a90180e0874c7eca31d6f6ceb464d9322c6fb4e9a7bbb318c8a17bdb3 F src/parse.y c8eff38606f443d5ba245263fa7abc05e4116d95656e050c4b78e9bfbf931add F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 @@ -1861,7 +1861,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 65c6c26bb48d5347ce53bb3607de3a03a5a03946b232d35e46a20533f86750f8 -R 9ce5e5b106a98ef938e13dec7c4ca6e7 +P 9e9f1e96c9aac60fcbbcda6923e01e350ca4dd88acefb9d400979419ba4e1e4d +R cf6b32c8532bdb0b49d3f8cc9bb4c572 U drh -Z ae06a854a112a06df1f524333bda4911 +Z d6dc738e7c78a8bb07af2098cfd2f141 diff --git a/manifest.uuid b/manifest.uuid index d24a56717c..6957ea7ceb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9e9f1e96c9aac60fcbbcda6923e01e350ca4dd88acefb9d400979419ba4e1e4d \ No newline at end of file +b4987a5ced0c0f2c606c040e0c1b8ee11175f40ae35a7446308a43e77b1f1db2 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 3377762300..0d08a2dfaa 100644 --- a/src/pager.c +++ b/src/pager.c @@ -2536,9 +2536,12 @@ static int pager_delmaster(Pager *pPager, const char *zMaster){ /* One of the journals pointed to by the master journal exists. ** Open it and check if it points at the master journal. If ** so, return without deleting the master journal file. + ** NB: zJournal is really a MAIN_JOURNAL. But call it a + ** MASTER_JOURNAL here so that the VFS will not send the zJournal + ** name into sqlite3_database_file_object(). */ int c; - int flags = (SQLITE_OPEN_READONLY|SQLITE_OPEN_MAIN_JOURNAL); + int flags = (SQLITE_OPEN_READONLY|SQLITE_OPEN_MASTER_JOURNAL); rc = sqlite3OsOpen(pVfs, zJournal, pJournal, flags, 0); if( rc!=SQLITE_OK ){ goto delmaster_out; From 07f9e8f4f3a473e4efac5f421b59b945a79e22a5 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 25 Apr 2020 15:01:53 +0000 Subject: [PATCH 040/103] Ensure affinity is not discarded from a view column if the view appears on the rhs of a LEFT JOIN. Fix for [45f4bf4e]. FossilOrigin-Name: ac31edd3eeafcef46164a4506bbc32c711bb7cd78378aeaa4c9bb12524ac5ea1 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/expr.c | 6 +++--- src/select.c | 1 + test/join2.test | 31 +++++++++++++++++++++++++++++++ 5 files changed, 45 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 0b463f86f3..71664328dc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\snew\ssqlite3_database_file_object()\sinterface\srequires\sthat\sthe\spager\nnever\sinvoke\sxOpen\swith\sSQLITE_OPEN_MAIN_JOURNAL\sunless\sit\sis\susing\na\spointer\sto\sthe\sjournal\sname\sfound\sin\sthe\sPager\sstructure\sitself.\s\s\sMake\nthis\sthe\scase\swhen\sprocessing\sa\smaster-journal. -D 2020-04-24T18:20:30.239 +C Ensure\saffinity\sis\snot\sdiscarded\sfrom\sa\sview\scolumn\sif\sthe\sview\sappears\son\sthe\srhs\sof\sa\sLEFT\sJOIN.\sFix\sfor\s[45f4bf4e]. +D 2020-04-25T15:01:53.394 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -484,7 +484,7 @@ F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f F src/delete.c 11000121c4281c0bce4e41db29addfaea0038eaa127ece02557c9207bc3e541d -F src/expr.c b292bdecd64cd695109ceaa3c810f8b41f202368c75adb9ea680a875df5b0308 +F src/expr.c d1e1d42cbdec08bb867a1ab43a59b401d82ff2bc88bdcb4af20e479a5facb6d8 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c f3dcdc0e95509864767c1f0991b19360f969e44177f4e058fd51da9a6154f47e @@ -532,7 +532,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c ab4eb1aee1bd066feea5b6eff264220ae54459019654264e9f688368a7d0c0b5 +F src/select.c c310de94bf67315054587c18a16e7a3e3dc3a98dc79168f0c2b776548d43f6cd F src/shell.c.in 1fc834b80c72dd37587ea87a4f4167cf5e6d98d12d143184ed2e732f529c0950 F src/sqlite.h.in fd6fcfe173accab8d9cb9a843856d9e9fb475f893b60a455e01d8739b5076f0e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1093,7 +1093,7 @@ F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b F test/istrue.test 75327829744e65cc8700e69340b8e6c192e10e39dfae7ccb0e970d3c4f49090a F test/join.test bca044589e94bb466e4c1e91fb6fecdc3f3326ca6b3f590f555f1958156eb321 -F test/join2.test 659bc6193f5c3fe20fa444dd2c91713db8c33e376b098b860644e175e87b8dbc +F test/join2.test 7d24d095ab88d3910228d53a3b548b7baf2e0e7d8aac6731a273e300e1b34b61 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 F test/join5.test 3a96dc62f0b45402d7207e22d1993fe0c2fce1c57644a11439891dd62b990eb7 @@ -1861,7 +1861,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 9e9f1e96c9aac60fcbbcda6923e01e350ca4dd88acefb9d400979419ba4e1e4d -R cf6b32c8532bdb0b49d3f8cc9bb4c572 -U drh -Z d6dc738e7c78a8bb07af2098cfd2f141 +P b4987a5ced0c0f2c606c040e0c1b8ee11175f40ae35a7446308a43e77b1f1db2 +R 71836ca611d61deceeaf6fb2607af00b +U dan +Z f46546e33cf07990942ccd1411251d86 diff --git a/manifest.uuid b/manifest.uuid index 6957ea7ceb..750cea59af 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b4987a5ced0c0f2c606c040e0c1b8ee11175f40ae35a7446308a43e77b1f1db2 \ No newline at end of file +ac31edd3eeafcef46164a4506bbc32c711bb7cd78378aeaa4c9bb12524ac5ea1 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 7165e4fa14..23e00db2ee 100644 --- a/src/expr.c +++ b/src/expr.c @@ -45,7 +45,7 @@ char sqlite3TableColumnAffinity(Table *pTab, int iCol){ char sqlite3ExprAffinity(const Expr *pExpr){ int op; while( ExprHasProperty(pExpr, EP_Skip) ){ - assert( pExpr->op==TK_COLLATE ); + assert( pExpr->op==TK_COLLATE || pExpr->op==TK_IF_NULL_ROW ); pExpr = pExpr->pLeft; assert( pExpr!=0 ); } @@ -112,7 +112,7 @@ Expr *sqlite3ExprAddCollateString(Parse *pParse, Expr *pExpr, const char *zC){ */ Expr *sqlite3ExprSkipCollate(Expr *pExpr){ while( pExpr && ExprHasProperty(pExpr, EP_Skip) ){ - assert( pExpr->op==TK_COLLATE ); + assert( pExpr->op==TK_COLLATE || pExpr->op==TK_IF_NULL_ROW ); pExpr = pExpr->pLeft; } return pExpr; @@ -131,7 +131,7 @@ Expr *sqlite3ExprSkipCollateAndLikely(Expr *pExpr){ assert( pExpr->op==TK_FUNCTION ); pExpr = pExpr->x.pList->a[0].pExpr; }else{ - assert( pExpr->op==TK_COLLATE ); + assert( pExpr->op==TK_COLLATE || pExpr->op==TK_IF_NULL_ROW ); pExpr = pExpr->pLeft; } } diff --git a/src/select.c b/src/select.c index 76b9827e8c..4b7ba37f9f 100644 --- a/src/select.c +++ b/src/select.c @@ -3498,6 +3498,7 @@ static Expr *substExpr( ifNullRow.op = TK_IF_NULL_ROW; ifNullRow.pLeft = pCopy; ifNullRow.iTable = pSubst->iNewTable; + ifNullRow.flags = EP_Skip; pCopy = &ifNullRow; } testcase( ExprHasProperty(pCopy, EP_Subquery) ); diff --git a/test/join2.test b/test/join2.test index bfcecda29b..82d597c584 100644 --- a/test/join2.test +++ b/test/join2.test @@ -293,5 +293,36 @@ do_execsql_test 8.1 { WHERE (t1.c0 BETWEEN 0 AND 0) > ('' AND t0.c0); } +#------------------------------------------------------------------------- +# Ticket [45f4bf4eb]. +# +reset_db +do_execsql_test 9.0 { + CREATE TABLE t0(c0 INT); + CREATE VIEW v0(c0) AS SELECT CAST(t0.c0 AS INTEGER) FROM t0; + INSERT INTO t0(c0) VALUES (0); +} + +do_execsql_test 9.1 { + SELECT typeof(c0), c0 FROM v0 WHERE c0>='0' +} {integer 0} + +do_execsql_test 9.2 { + SELECT * FROM t0, v0 WHERE v0.c0 >= '0'; +} {0 0} + +do_execsql_test 9.3 { + SELECT * FROM t0 LEFT JOIN v0 WHERE v0.c0 >= '0'; +} {0 0} + +do_execsql_test 9.4 { + SELECT * FROM t0 LEFT JOIN v0 ON v0.c0 >= '0'; +} {0 0} + +do_execsql_test 9.5 { + SELECT * FROM t0 LEFT JOIN v0 ON v0.c0 >= '0' WHERE TRUE + UNION SELECT 0,0 WHERE 0; +} {0 0} + finish_test From 7d9ad75a564986b06f1dc35fc745ebfed3e2fe45 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 25 Apr 2020 21:05:51 +0000 Subject: [PATCH 041/103] Fix the sqlite3_load_extension() interface so that it tolerates backslashes in place of forward-slashes in pathnames on Windows. FossilOrigin-Name: bc3bf7c6681a96bc18a1ed02f0ccced4731d5dab45f60c347dd1841706e6b62a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/loadext.c | 4 ++++ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 71664328dc..1eba766207 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\saffinity\sis\snot\sdiscarded\sfrom\sa\sview\scolumn\sif\sthe\sview\sappears\son\sthe\srhs\sof\sa\sLEFT\sJOIN.\sFix\sfor\s[45f4bf4e]. -D 2020-04-25T15:01:53.394 +C Fix\sthe\ssqlite3_load_extension()\sinterface\sso\sthat\sit\stolerates\sbackslashes\nin\splace\sof\sforward-slashes\sin\spathnames\son\sWindows. +D 2020-04-25T21:05:51.928 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -495,7 +495,7 @@ F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 8e4211d04eb460c0694d486c6ba1c068d468c6f653c3f237869a802ad82854de F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa -F src/loadext.c 4540fb20e8606b5cea7efee1d727cc69b20390ddc2e6a6c5515e20f96dcc205c +F src/loadext.c af284e30250a36af92bcf97de743bae57b215c7d3414e3b913b9d8f2e75c5214 F src/main.c 652a782cd7b6c6ddf7419fcaf06b8aa9440b7c815857241171c9bdf03ab6544c F src/malloc.c cabfef0d725e04c8abfe0231a556ed8b78bf329dcc3fddbf903f6cdcd53cf4e6 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 @@ -1861,7 +1861,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 b4987a5ced0c0f2c606c040e0c1b8ee11175f40ae35a7446308a43e77b1f1db2 -R 71836ca611d61deceeaf6fb2607af00b -U dan -Z f46546e33cf07990942ccd1411251d86 +P ac31edd3eeafcef46164a4506bbc32c711bb7cd78378aeaa4c9bb12524ac5ea1 +R a6c62e244c55732737962b844b2337e6 +U drh +Z fbfd383a8d39b6b6bd4ef76163a1c79c diff --git a/manifest.uuid b/manifest.uuid index 750cea59af..b967c2d591 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ac31edd3eeafcef46164a4506bbc32c711bb7cd78378aeaa4c9bb12524ac5ea1 \ No newline at end of file +bc3bf7c6681a96bc18a1ed02f0ccced4731d5dab45f60c347dd1841706e6b62a \ No newline at end of file diff --git a/src/loadext.c b/src/loadext.c index 5a661cdc26..aea06d4a55 100644 --- a/src/loadext.c +++ b/src/loadext.c @@ -581,7 +581,11 @@ static int sqlite3LoadExtension( return SQLITE_NOMEM_BKPT; } memcpy(zAltEntry, "sqlite3_", 8); +#if SQLITE_OS_WIN + for(iFile=ncFile-1; iFile>=0 && ((c=zFile[iFile]!='/')||c=='\\'); iFile--){} +#else for(iFile=ncFile-1; iFile>=0 && zFile[iFile]!='/'; iFile--){} +#endif iFile++; if( sqlite3_strnicmp(zFile+iFile, "lib", 3)==0 ) iFile += 3; for(iEntry=8; (c = zFile[iFile])!=0 && c!='.'; iFile++){ From ec9a25c7c701aaab2040ae3f500d9008de011c90 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 26 Apr 2020 14:33:54 +0000 Subject: [PATCH 042/103] Fix an issue with check-in [bc3bf7c6681a96bc] when compiling on Windows. FossilOrigin-Name: 57b16d8ca3d1ede3b411389256bec6686433aae716f47bca309ee7c8e5fe3128 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/loadext.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 1eba766207..4b2602159b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\ssqlite3_load_extension()\sinterface\sso\sthat\sit\stolerates\sbackslashes\nin\splace\sof\sforward-slashes\sin\spathnames\son\sWindows. -D 2020-04-25T21:05:51.928 +C Fix\san\sissue\swith\scheck-in\s[bc3bf7c6681a96bc]\swhen\scompiling\son\sWindows. +D 2020-04-26T14:33:54.319 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -495,7 +495,7 @@ F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 8e4211d04eb460c0694d486c6ba1c068d468c6f653c3f237869a802ad82854de F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa -F src/loadext.c af284e30250a36af92bcf97de743bae57b215c7d3414e3b913b9d8f2e75c5214 +F src/loadext.c acefcfb00f58b5c9d5763812c40fed82f11ded617ae8cb80a7bab540b429d039 F src/main.c 652a782cd7b6c6ddf7419fcaf06b8aa9440b7c815857241171c9bdf03ab6544c F src/malloc.c cabfef0d725e04c8abfe0231a556ed8b78bf329dcc3fddbf903f6cdcd53cf4e6 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 @@ -1861,7 +1861,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 ac31edd3eeafcef46164a4506bbc32c711bb7cd78378aeaa4c9bb12524ac5ea1 -R a6c62e244c55732737962b844b2337e6 +P bc3bf7c6681a96bc18a1ed02f0ccced4731d5dab45f60c347dd1841706e6b62a +R a1bd7af663ac8f68011b39c502abe2a2 U drh -Z fbfd383a8d39b6b6bd4ef76163a1c79c +Z dcff85cc0c5396a3824fe3ae621cc10a diff --git a/manifest.uuid b/manifest.uuid index b967c2d591..d57e584616 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bc3bf7c6681a96bc18a1ed02f0ccced4731d5dab45f60c347dd1841706e6b62a \ No newline at end of file +57b16d8ca3d1ede3b411389256bec6686433aae716f47bca309ee7c8e5fe3128 \ No newline at end of file diff --git a/src/loadext.c b/src/loadext.c index aea06d4a55..8dc632df85 100644 --- a/src/loadext.c +++ b/src/loadext.c @@ -582,7 +582,7 @@ static int sqlite3LoadExtension( } memcpy(zAltEntry, "sqlite3_", 8); #if SQLITE_OS_WIN - for(iFile=ncFile-1; iFile>=0 && ((c=zFile[iFile]!='/')||c=='\\'); iFile--){} + for(iFile=ncFile-1; iFile>=0 && ((c=zFile[iFile]!='/')&&c!='\\'); iFile--){} #else for(iFile=ncFile-1; iFile>=0 && zFile[iFile]!='/'; iFile--){} #endif From e238e3141381dc5a6e811e94f0a1ab93c1bb2286 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 26 Apr 2020 22:04:48 +0000 Subject: [PATCH 043/103] Yet another attempt to enhance sqlite3_load_extension() so that it works with Window-style pathnames using a backslash separator character. FossilOrigin-Name: b73d9a7d6f7fec0ffc9640902a849289c305f8651e891388c01255c4da7a6c4b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/loadext.c | 14 +++++++++----- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 4b2602159b..e6fae833bc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sissue\swith\scheck-in\s[bc3bf7c6681a96bc]\swhen\scompiling\son\sWindows. -D 2020-04-26T14:33:54.319 +C Yet\sanother\sattempt\sto\senhance\ssqlite3_load_extension()\sso\sthat\sit\sworks\nwith\sWindow-style\spathnames\susing\sa\sbackslash\sseparator\scharacter. +D 2020-04-26T22:04:48.458 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -495,7 +495,7 @@ F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 8e4211d04eb460c0694d486c6ba1c068d468c6f653c3f237869a802ad82854de F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa -F src/loadext.c acefcfb00f58b5c9d5763812c40fed82f11ded617ae8cb80a7bab540b429d039 +F src/loadext.c 421310045bd78afefb772294a99e50f37d87ae578786a6169074e6291e30d969 F src/main.c 652a782cd7b6c6ddf7419fcaf06b8aa9440b7c815857241171c9bdf03ab6544c F src/malloc.c cabfef0d725e04c8abfe0231a556ed8b78bf329dcc3fddbf903f6cdcd53cf4e6 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 @@ -1861,7 +1861,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 bc3bf7c6681a96bc18a1ed02f0ccced4731d5dab45f60c347dd1841706e6b62a -R a1bd7af663ac8f68011b39c502abe2a2 +P 57b16d8ca3d1ede3b411389256bec6686433aae716f47bca309ee7c8e5fe3128 +R cae58a18aebbf7b95fb40ba841d77f19 U drh -Z dcff85cc0c5396a3824fe3ae621cc10a +Z a013006b51e7e5f259533e9a3800742b diff --git a/manifest.uuid b/manifest.uuid index d57e584616..b3a75f3c82 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -57b16d8ca3d1ede3b411389256bec6686433aae716f47bca309ee7c8e5fe3128 \ No newline at end of file +b73d9a7d6f7fec0ffc9640902a849289c305f8651e891388c01255c4da7a6c4b \ No newline at end of file diff --git a/src/loadext.c b/src/loadext.c index 8dc632df85..067c47c17f 100644 --- a/src/loadext.c +++ b/src/loadext.c @@ -480,6 +480,14 @@ static const sqlite3_api_routines sqlite3Apis = { sqlite3_database_file_object, }; +/* True if x is the directory separator character +*/ +#if SQLITE_OS_WIN +# define DirSep(X) ((X)=='/'||(X)=='\\') +#else +# define DirSep(X) ((X)=='/') +#endif + /* ** Attempt to load an SQLite extension library contained in the file ** zFile. The entry point is zProc. zProc may be 0 in which case a @@ -581,11 +589,7 @@ static int sqlite3LoadExtension( return SQLITE_NOMEM_BKPT; } memcpy(zAltEntry, "sqlite3_", 8); -#if SQLITE_OS_WIN - for(iFile=ncFile-1; iFile>=0 && ((c=zFile[iFile]!='/')&&c!='\\'); iFile--){} -#else - for(iFile=ncFile-1; iFile>=0 && zFile[iFile]!='/'; iFile--){} -#endif + for(iFile=ncFile-1; iFile>=0 && !DirSep(zFile[iFile]); iFile--){} iFile++; if( sqlite3_strnicmp(zFile+iFile, "lib", 3)==0 ) iFile += 3; for(iEntry=8; (c = zFile[iFile])!=0 && c!='.'; iFile++){ From 9f603fcefdaa30dd4cd4ce5b9dd83a8abb865acd Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 28 Apr 2020 11:45:41 +0000 Subject: [PATCH 044/103] Use an AtomicLoad() macro in sqlite3HeapNearlyFull(). FossilOrigin-Name: 7556bc632e271d8a1e4fd836ce91e28213768ac09c90857b91171e9cd1009884 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/malloc.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index e6fae833bc..b657255abb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Yet\sanother\sattempt\sto\senhance\ssqlite3_load_extension()\sso\sthat\sit\sworks\nwith\sWindow-style\spathnames\susing\sa\sbackslash\sseparator\scharacter. -D 2020-04-26T22:04:48.458 +C Use\san\sAtomicLoad()\smacro\sin\ssqlite3HeapNearlyFull(). +D 2020-04-28T11:45:41.489 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -497,7 +497,7 @@ F src/insert.c 8e4211d04eb460c0694d486c6ba1c068d468c6f653c3f237869a802ad82854de F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 421310045bd78afefb772294a99e50f37d87ae578786a6169074e6291e30d969 F src/main.c 652a782cd7b6c6ddf7419fcaf06b8aa9440b7c815857241171c9bdf03ab6544c -F src/malloc.c cabfef0d725e04c8abfe0231a556ed8b78bf329dcc3fddbf903f6cdcd53cf4e6 +F src/malloc.c 998984783063d4172bb11630ba586e6c6483ddfc8e24a9881a6f495128f23569 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 @@ -1861,7 +1861,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 57b16d8ca3d1ede3b411389256bec6686433aae716f47bca309ee7c8e5fe3128 -R cae58a18aebbf7b95fb40ba841d77f19 +P b73d9a7d6f7fec0ffc9640902a849289c305f8651e891388c01255c4da7a6c4b +R 375d527c1770329817dc7ce201edba48 U drh -Z a013006b51e7e5f259533e9a3800742b +Z 59f2a3e0f3e029b2d7560f165c376f3c diff --git a/manifest.uuid b/manifest.uuid index b3a75f3c82..6ec6c7587e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b73d9a7d6f7fec0ffc9640902a849289c305f8651e891388c01255c4da7a6c4b \ No newline at end of file +7556bc632e271d8a1e4fd836ce91e28213768ac09c90857b91171e9cd1009884 \ No newline at end of file diff --git a/src/malloc.c b/src/malloc.c index a19d8bdfb3..6d149f3f98 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -179,7 +179,7 @@ int sqlite3MallocInit(void){ ** sqlite3_soft_heap_limit(). */ int sqlite3HeapNearlyFull(void){ - return mem0.nearlyFull; + return AtomicLoad(&mem0.nearlyFull); } /* From 23bef340beb7799bdac6d5fd857809139d9f3683 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 28 Apr 2020 14:01:31 +0000 Subject: [PATCH 045/103] Use AtomicStore() when setting the mem0.nearlyFull boolean to avoid harmless TSAN warnings and to forestall doubts about threadsafety. FossilOrigin-Name: ce980af65a9b528f112baa22a95020a98ac5340155a0b53b09c46f99aad9b12b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/malloc.c | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index b657255abb..af2896961d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\san\sAtomicLoad()\smacro\sin\ssqlite3HeapNearlyFull(). -D 2020-04-28T11:45:41.489 +C Use\sAtomicStore()\swhen\ssetting\sthe\smem0.nearlyFull\sboolean\sto\savoid\nharmless\sTSAN\swarnings\sand\sto\sforestall\sdoubts\sabout\sthreadsafety. +D 2020-04-28T14:01:31.572 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -497,7 +497,7 @@ F src/insert.c 8e4211d04eb460c0694d486c6ba1c068d468c6f653c3f237869a802ad82854de F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 421310045bd78afefb772294a99e50f37d87ae578786a6169074e6291e30d969 F src/main.c 652a782cd7b6c6ddf7419fcaf06b8aa9440b7c815857241171c9bdf03ab6544c -F src/malloc.c 998984783063d4172bb11630ba586e6c6483ddfc8e24a9881a6f495128f23569 +F src/malloc.c a3e13b001f988ecec6bdb90c0ea8912c8c786e623724d7098da623d8d01d19b1 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 @@ -1861,7 +1861,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 b73d9a7d6f7fec0ffc9640902a849289c305f8651e891388c01255c4da7a6c4b -R 375d527c1770329817dc7ce201edba48 +P 7556bc632e271d8a1e4fd836ce91e28213768ac09c90857b91171e9cd1009884 +R 64df80a09bb93b99ef6e199142ecf936 U drh -Z 59f2a3e0f3e029b2d7560f165c376f3c +Z 42d1735aadc2a550c1baa98e0c20e909 diff --git a/manifest.uuid b/manifest.uuid index 6ec6c7587e..e4a586a16b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7556bc632e271d8a1e4fd836ce91e28213768ac09c90857b91171e9cd1009884 \ No newline at end of file +ce980af65a9b528f112baa22a95020a98ac5340155a0b53b09c46f99aad9b12b \ No newline at end of file diff --git a/src/malloc.c b/src/malloc.c index 6d149f3f98..45f3efff9d 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -111,7 +111,7 @@ sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 n){ } mem0.alarmThreshold = n; nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); - mem0.nearlyFull = (n>0 && n<=nUsed); + AtomicStore(&mem0.nearlyFull, n>0 && n<=nUsed); sqlite3_mutex_leave(mem0.mutex); excess = sqlite3_memory_used() - n; if( excess>0 ) sqlite3_release_memory((int)(excess & 0x7fffffff)); @@ -243,7 +243,7 @@ static void mallocWithAlarm(int n, void **pp){ if( mem0.alarmThreshold>0 ){ sqlite3_int64 nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); if( nUsed >= mem0.alarmThreshold - nFull ){ - mem0.nearlyFull = 1; + AtomicStore(&mem0.nearlyFull, 1); sqlite3MallocAlarm(nFull); if( mem0.hardLimit ){ nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); @@ -253,7 +253,7 @@ static void mallocWithAlarm(int n, void **pp){ } } }else{ - mem0.nearlyFull = 0; + AtomicStore(&mem0.nearlyFull, 0); } } p = sqlite3GlobalConfig.m.xMalloc(nFull); From 065e4a8d291e4e55a2a18929184549f1245ead99 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 28 Apr 2020 20:47:40 +0000 Subject: [PATCH 046/103] Add the cksumvfs extension. FossilOrigin-Name: 237c10f941cc6cb775693ae87513ff1b816f12b5e9c3d57b057421204d2d02cf --- ext/misc/cksumvfs.c | 769 ++++++++++++++++++++++++++++++++++++++++++++ manifest | 11 +- manifest.uuid | 2 +- 3 files changed, 776 insertions(+), 6 deletions(-) create mode 100644 ext/misc/cksumvfs.c diff --git a/ext/misc/cksumvfs.c b/ext/misc/cksumvfs.c new file mode 100644 index 0000000000..cd4bb45364 --- /dev/null +++ b/ext/misc/cksumvfs.c @@ -0,0 +1,769 @@ +/* +** 2020-04-20 +** +** 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 a VFS shim that writes a checksum on each page +** of an SQLite database file. When reading pages, the checksum is verified +** and an error is raised if the checksum is incorrect. +** +** COMPILING +** +** This extension requires SQLite 3.32.0 or later. It uses the +** sqlite3_database_file_object() interface which was added in +** version 3.32.0, so it will not link with an earlier version of +** SQLite. +** +** To build this extension as a separately loaded shared library or +** DLL, use compiler command-lines similar to the following: +** +** (linux) gcc -fPIC -shared cksumvfs.c -o cksumvfs.so +** (mac) clang -fPIC -dynamiclib cksumvfs.c -o cksumvfs.dylib +** (windows) cl cksumvfs.c -link -dll -out:cksumvfs.dll +** +** You may want to add additional compiler options, of course, +** according to the needs of your project. +** +** If you want to statically link this extension with your product, +** then compile it like any other C-language module but add the +** "-DSQLITE_CKSUMVFS_STATIC" option so that this module knows that +** it is being statically linked rather than dynamically linked +** +** LOADING +** +** To load this extension as a shared library, you first have to +** bring up a dummy SQLite database connection to use as the argument +** to the sqlite3_load_extension() API call. Then you invoke the +** sqlite3_load_extension() API and shutdown the dummy database +** connection. All subsequent database connections that are opened +** will include this extension. For example: +** +** sqlite3 *db; +** sqlite3_open(":memory:", &db); +** sqlite3_load_extention(db, "./cksumvfs"); +** sqlite3_close(db); +** +** If this extension is compiled with -DSQLITE_CKSUMVFS_STATIC and +** statically linked against the application, initialize it using +** a single API call as follows: +** +** sqlite3_cksumvfs_init(); +** +** Cksumvfs is a VFS Shim. When loaded, "cksmvfs" becomes the new +** default VFS and it uses the prior default VFS as the next VFS +** down in the stack. This is normally what you want. However, it +** complex situations where multiple VFS shims are being loaded, +** it might be important to ensure that cksumvfs is loaded in the +** correct order so that it sequences itself into the default VFS +** Shim stack in the right order. +** +** USING +** +** Open database connections using the sqlite3_open() or +** sqlite3_open_v2() interfaces, as normal. Ordinary database files +** (without a checksum) will operate normally. Databases with +** checksums will return an SQLITE_CORRUPT error if a page is +** encountered that contains an invalid checksum. +** +** Checksumming only works on databases that have a reserve-bytes +** value of exactly 8. The default value for reserve-bytes is 0. +** Hence, newly created database files will omit the checksum by +** default. To create a database that includes a checksum, change +** the reserve-bytes value to 8 by runing: +** +** int n = 8; +** sqlite3_file_control(db, 0, SQLITE_FCNTL_RESERVED_BYTES, &n); +** +** If you do this immediately after creating a new database file, +** before anything else has been written into the file, then that +** might be all that you need to do. Otherwise, the API call +** above should be followed by: +** +** sqlite3_exec(db, "VACUUM", 0, 0, 0); +** +** It never hurts to run the VACUUM, even if you don't need it. +** If the database is in WAL mode, you should shutdown and +** reopen all database connections before continuing. +** +** From the CLI, use the ".filectrl reserve_bytes 8" command, +** followed by "VACUUM;". +** +** Note that SQLite allows the number of reserve-bytes to be +** increased but not decreased. So if a database file already +** has a reserve-bytes value greater than 8, there is no way to +** activate checksumming on that database, other than to dump +** and restore the database file. Note also that other extensions +** might also make use of the reserve-bytes. Checksumming will +** be incompatible with those other extensions. +** +** VERIFICATION OF CHECKSUMS +** +** If any checksum is incorrect, the "PRAGMA quick_check" command +** will find it. To verify that checksums are actually enabled +** and running, use the following query: +** +** SELECT count(*), verify_checksum(data) +** FROM sqlite_dbpage +** GROUP BY 2; +** +** There are three possible outputs form the verify_checksum() +** function: 1, 0, and NULL. 1 is returned if the checksum is +** correct. 0 is returned if the checksum is incorrect. NULL +** is returned if the page is unreadable. If checksumming is +** enabled, the read will fail if the checksum is wrong, so the +** usual result from verify_checksum() on a bad checksum is NULL. +** +** If everything is OK, the query above should return a single +** row where the second column is 1. Any other result indicates +** either that there is a checksum error, or checksum validation +** is disabled. +** +** CONTROLLING CHECKSUM VERIFICATION +** +** The cksumvfs extension implements a new PRAGMA statement that can +** be used to disable, re-enable, or query the status of checksum +** verification: +** +** PRAGMA checksum_verification; -- query status +** PRAGMA checksum_verification=OFF; -- disable verification +** PRAGMA checksum_verification=ON; -- re-enable verification +** +** The "checksum_verification" pragma will return "1" (true) or "0" +** (false) if checksum verification is enabled or disabled, respectively. +** "Verification" in this context means the feature that causes +** SQLITE_CORRUPT errors if a checksum mismatch is detected while +** reading. Checksums are always kept up-to-date as long as the +** reserve-bytes value of the database is 8, regardless of the setting +** of this pragma. Checksum verification can be disabled (for example) +** to do forensic analysis of a database that has previously reported +** a checksum error. +** +** The "checksum_verification" pragma will always respond with "0" if +** the database file does not have a reserve-bytes value of 8. The +** pragma will return no rows at all if the cksumvfs extension is +** not loaded. +** +** IMPLEMENTATION NOTES +** +** The checksum is stored in the last 8 bytes of each page. This +** module only operates if the "bytes of reserved space on each page" +** value at offset 20 the SQLite database header is exactly 8. If +** the reserved-space value is not 8, this module is a no-op. +*/ +#ifdef SQLITE_CKSUMVFS_STATIC +# include "sqlite3.h" +#else +# include "sqlite3ext.h" + SQLITE_EXTENSION_INIT1 +#endif +#include +#include + + +/* +** Forward declaration of objects used by this utility +*/ +typedef struct sqlite3_vfs CksmVfs; +typedef struct CksmFile CksmFile; + +/* +** Useful datatype abbreviations +*/ +#if !defined(SQLITE_CORE) + typedef unsigned char u8; + typedef unsigned int u32; +#endif + +/* Access to a lower-level VFS that (might) implement dynamic loading, +** access to randomness, etc. +*/ +#define ORIGVFS(p) ((sqlite3_vfs*)((p)->pAppData)) +#define ORIGFILE(p) ((sqlite3_file*)(((CksmFile*)(p))+1)) + +/* An open file */ +struct CksmFile { + sqlite3_file base; /* IO methods */ + char computeCksm; /* True to compute checksums. + ** Always true if reserve size is 8. */ + char verifyCksm; /* True to verify checksums */ + char isWal; /* True if processing a WAL file */ + CksmFile *pPartner; /* Ptr from WAL to main-db, or from main-db to WAL */ +}; + +/* +** Methods for CksmFile +*/ +static int cksmClose(sqlite3_file*); +static int cksmRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); +static int cksmWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst); +static int cksmTruncate(sqlite3_file*, sqlite3_int64 size); +static int cksmSync(sqlite3_file*, int flags); +static int cksmFileSize(sqlite3_file*, sqlite3_int64 *pSize); +static int cksmLock(sqlite3_file*, int); +static int cksmUnlock(sqlite3_file*, int); +static int cksmCheckReservedLock(sqlite3_file*, int *pResOut); +static int cksmFileControl(sqlite3_file*, int op, void *pArg); +static int cksmSectorSize(sqlite3_file*); +static int cksmDeviceCharacteristics(sqlite3_file*); +static int cksmShmMap(sqlite3_file*, int iPg, int pgsz, int, void volatile**); +static int cksmShmLock(sqlite3_file*, int offset, int n, int flags); +static void cksmShmBarrier(sqlite3_file*); +static int cksmShmUnmap(sqlite3_file*, int deleteFlag); +static int cksmFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp); +static int cksmUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p); + +/* +** Methods for CksmVfs +*/ +static int cksmOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *); +static int cksmDelete(sqlite3_vfs*, const char *zName, int syncDir); +static int cksmAccess(sqlite3_vfs*, const char *zName, int flags, int *); +static int cksmFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut); +static void *cksmDlOpen(sqlite3_vfs*, const char *zFilename); +static void cksmDlError(sqlite3_vfs*, int nByte, char *zErrMsg); +static void (*cksmDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void); +static void cksmDlClose(sqlite3_vfs*, void*); +static int cksmRandomness(sqlite3_vfs*, int nByte, char *zOut); +static int cksmSleep(sqlite3_vfs*, int microseconds); +static int cksmCurrentTime(sqlite3_vfs*, double*); +static int cksmGetLastError(sqlite3_vfs*, int, char *); +static int cksmCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*); +static int cksmSetSystemCall(sqlite3_vfs*, const char*,sqlite3_syscall_ptr); +static sqlite3_syscall_ptr cksmGetSystemCall(sqlite3_vfs*, const char *z); +static const char *cksmNextSystemCall(sqlite3_vfs*, const char *zName); + +static sqlite3_vfs cksm_vfs = { + 3, /* iVersion (set when registered) */ + 0, /* szOsFile (set when registered) */ + 1024, /* mxPathname */ + 0, /* pNext */ + "cksmvfs", /* zName */ + 0, /* pAppData (set when registered) */ + cksmOpen, /* xOpen */ + cksmDelete, /* xDelete */ + cksmAccess, /* xAccess */ + cksmFullPathname, /* xFullPathname */ + cksmDlOpen, /* xDlOpen */ + cksmDlError, /* xDlError */ + cksmDlSym, /* xDlSym */ + cksmDlClose, /* xDlClose */ + cksmRandomness, /* xRandomness */ + cksmSleep, /* xSleep */ + cksmCurrentTime, /* xCurrentTime */ + cksmGetLastError, /* xGetLastError */ + cksmCurrentTimeInt64, /* xCurrentTimeInt64 */ + cksmSetSystemCall, /* xSetSystemCall */ + cksmGetSystemCall, /* xGetSystemCall */ + cksmNextSystemCall /* xNextSystemCall */ +}; + +static const sqlite3_io_methods cksm_io_methods = { + 3, /* iVersion */ + cksmClose, /* xClose */ + cksmRead, /* xRead */ + cksmWrite, /* xWrite */ + cksmTruncate, /* xTruncate */ + cksmSync, /* xSync */ + cksmFileSize, /* xFileSize */ + cksmLock, /* xLock */ + cksmUnlock, /* xUnlock */ + cksmCheckReservedLock, /* xCheckReservedLock */ + cksmFileControl, /* xFileControl */ + cksmSectorSize, /* xSectorSize */ + cksmDeviceCharacteristics, /* xDeviceCharacteristics */ + cksmShmMap, /* xShmMap */ + cksmShmLock, /* xShmLock */ + cksmShmBarrier, /* xShmBarrier */ + cksmShmUnmap, /* xShmUnmap */ + cksmFetch, /* xFetch */ + cksmUnfetch /* xUnfetch */ +}; + +/* Do byte swapping on a unsigned 32-bit integer */ +#define BYTESWAP32(x) ( \ + (((x)&0x000000FF)<<24) + (((x)&0x0000FF00)<<8) \ + + (((x)&0x00FF0000)>>8) + (((x)&0xFF000000)>>24) \ +) + +/* Compute a checksum on a buffer */ +static void cksmCompute( + u8 *a, /* Content to be checksummed */ + int nByte, /* Bytes of content in a[]. Must be a multiple of 8. */ + u8 *aOut /* OUT: Final 8-byte checksum value output */ +){ + u32 s1 = 0, s2 = 0; + u32 *aData = (u32*)a; + u32 *aEnd = (u32*)&a[nByte]; + u32 x = 1; + + assert( nByte>=8 ); + assert( (nByte&0x00000007)==0 ); + assert( nByte<=65536 ); + + if( 1 == *(u8*)&x ){ + /* Little-endian */ + do { + s1 += *aData++ + s2; + s2 += *aData++ + s1; + }while( aData65536 || (nByte & (nByte-1))!=0 ) return; + cksmCompute(data, nByte-8, cksum); + sqlite3_result_int(context, memcmp(data+nByte-8,cksum,8)==0); +} + +/* +** Close a cksm-file. +*/ +static int cksmClose(sqlite3_file *pFile){ + CksmFile *p = (CksmFile *)pFile; + if( p->pPartner ){ + assert( p->pPartner->pPartner==p ); + p->pPartner->pPartner = 0; + p->pPartner = 0; + } + pFile = ORIGFILE(pFile); + return pFile->pMethods->xClose(pFile); +} + +/* +** Read data from a cksm-file. +*/ +static int cksmRead( + sqlite3_file *pFile, + void *zBuf, + int iAmt, + sqlite_int64 iOfst +){ + int rc; + CksmFile *p = (CksmFile *)pFile; + pFile = ORIGFILE(pFile); + rc = pFile->pMethods->xRead(pFile, zBuf, iAmt, iOfst); + if( rc==SQLITE_OK ){ + if( iOfst==0 && iAmt>=100 && memcmp(zBuf,"SQLite format 3",16)==0 ){ + u8 *d = (u8*)zBuf; + char hasCorrectReserveSize = (d[20]==8); + if( hasCorrectReserveSize!=p->computeCksm ){ + p->computeCksm = p->verifyCksm = hasCorrectReserveSize; + } + } + /* Verify the checksum if (1) the size seems appropriate for a database + ** page, and if (2) checksum verification is enabled. But (3) do not + ** verify the checksums on a WAL page if the main database file + ** has subsequently turned off checksums. + */ + if( iAmt>=512 /* (1) */ + && p->verifyCksm /* (2) */ + && (!p->isWal || (p->pPartner!=0 && p->pPartner->verifyCksm)) /* (3) */ + ){ + u8 cksum[8]; + cksmCompute((u8*)zBuf, iAmt-8, cksum); + if( memcmp(zBuf+iAmt-8, cksum, 8)!=0 ){ + rc = SQLITE_CORRUPT; + } + } + } + return rc; +} + +/* +** Write data to a cksm-file. +*/ +static int cksmWrite( + sqlite3_file *pFile, + const void *zBuf, + int iAmt, + sqlite_int64 iOfst +){ + CksmFile *p = (CksmFile *)pFile; + pFile = ORIGFILE(pFile); + if( iOfst==0 && iAmt>=100 && memcmp(zBuf,"SQLite format 3",16)==0 ){ + u8 *d = (u8*)zBuf; + char hasCorrectReserveSize = (d[20]==8); + if( hasCorrectReserveSize!=p->computeCksm ){ + p->computeCksm = p->verifyCksm = hasCorrectReserveSize; + } + } + /* If the write size is appropriate for a database page and if + ** checksums where ever enabled, then it will be safe to compute + ** the checksums. The reserve byte size might have increased, but + ** it will never decrease. And because it cannot decrease, the + ** checksum will not overwrite anything. + */ + if( iAmt>=512 && p->computeCksm ){ + cksmCompute((u8*)zBuf, iAmt-8, ((u8*)zBuf)+iAmt-8); + } + return pFile->pMethods->xWrite(pFile, zBuf, iAmt, iOfst); +} + +/* +** Truncate a cksm-file. +*/ +static int cksmTruncate(sqlite3_file *pFile, sqlite_int64 size){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xTruncate(pFile, size); +} + +/* +** Sync a cksm-file. +*/ +static int cksmSync(sqlite3_file *pFile, int flags){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xSync(pFile, flags); +} + +/* +** Return the current file-size of a cksm-file. +*/ +static int cksmFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){ + CksmFile *p = (CksmFile *)pFile; + pFile = ORIGFILE(p); + return pFile->pMethods->xFileSize(pFile, pSize); +} + +/* +** Lock a cksm-file. +*/ +static int cksmLock(sqlite3_file *pFile, int eLock){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xLock(pFile, eLock); +} + +/* +** Unlock a cksm-file. +*/ +static int cksmUnlock(sqlite3_file *pFile, int eLock){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xUnlock(pFile, eLock); +} + +/* +** Check if another file-handle holds a RESERVED lock on a cksm-file. +*/ +static int cksmCheckReservedLock(sqlite3_file *pFile, int *pResOut){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xCheckReservedLock(pFile, pResOut); +} + +/* +** File control method. For custom operations on a cksm-file. +*/ +static int cksmFileControl(sqlite3_file *pFile, int op, void *pArg){ + int rc; + CksmFile *p = (CksmFile*)pFile; + pFile = ORIGFILE(pFile); + if( op==SQLITE_FCNTL_PRAGMA ){ + char **azArg = (char**)pArg; + assert( azArg[1]!=0 ); + if( strcmp(azArg[1],"checksum_verification")==0 ){ + char *zArg = azArg[2]; + if( zArg!=0 ){ + if( (zArg[0]>='1' && zArg[0]<='9') + || sqlite3_strlike("enable%",zArg,0)==0 + || sqlite3_stricmp("yes",zArg)==0 + || sqlite3_stricmp("on",zArg)==0 + ){ + p->verifyCksm = p->computeCksm; + }else{ + p->verifyCksm = 0; + } + } + azArg[0] = sqlite3_mprintf("%d",p->verifyCksm); + return SQLITE_OK; + } + } + rc = pFile->pMethods->xFileControl(pFile, op, pArg); + if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){ + *(char**)pArg = sqlite3_mprintf("cksm/%z", *(char**)pArg); + } + return rc; +} + +/* +** Return the sector-size in bytes for a cksm-file. +*/ +static int cksmSectorSize(sqlite3_file *pFile){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xSectorSize(pFile); +} + +/* +** Return the device characteristic flags supported by a cksm-file. +*/ +static int cksmDeviceCharacteristics(sqlite3_file *pFile){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xDeviceCharacteristics(pFile); +} + +/* Create a shared memory file mapping */ +static int cksmShmMap( + sqlite3_file *pFile, + int iPg, + int pgsz, + int bExtend, + void volatile **pp +){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xShmMap(pFile,iPg,pgsz,bExtend,pp); +} + +/* Perform locking on a shared-memory segment */ +static int cksmShmLock(sqlite3_file *pFile, int offset, int n, int flags){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xShmLock(pFile,offset,n,flags); +} + +/* Memory barrier operation on shared memory */ +static void cksmShmBarrier(sqlite3_file *pFile){ + pFile = ORIGFILE(pFile); + pFile->pMethods->xShmBarrier(pFile); +} + +/* Unmap a shared memory segment */ +static int cksmShmUnmap(sqlite3_file *pFile, int deleteFlag){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xShmUnmap(pFile,deleteFlag); +} + +/* Fetch a page of a memory-mapped file */ +static int cksmFetch( + sqlite3_file *pFile, + sqlite3_int64 iOfst, + int iAmt, + void **pp +){ + CksmFile *p = (CksmFile *)pFile; + if( p->computeCksm ){ + *pp = 0; + return SQLITE_OK; + } + pFile = ORIGFILE(pFile); + return pFile->pMethods->xFetch(pFile, iOfst, iAmt, pp); +} + +/* Release a memory-mapped page */ +static int cksmUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xUnfetch(pFile, iOfst, pPage); +} + +/* +** Open a cksm file handle. +*/ +static int cksmOpen( + sqlite3_vfs *pVfs, + const char *zName, + sqlite3_file *pFile, + int flags, + int *pOutFlags +){ + CksmFile *p; + sqlite3_file *pSubFile; + sqlite3_vfs *pSubVfs; + int rc; + pSubVfs = ORIGVFS(pVfs); + if( (flags & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_WAL))==0 ){ + return pSubVfs->xOpen(pSubVfs, zName, pFile, flags, pOutFlags); + } + p = (CksmFile*)pFile; + memset(p, 0, sizeof(*p)); + pSubFile = ORIGFILE(pFile); + p->base.pMethods = &cksm_io_methods; + rc = pSubVfs->xOpen(pSubVfs, zName, pSubFile, flags, pOutFlags); + if( rc ) goto cksm_open_done; + if( flags & SQLITE_OPEN_WAL ){ + sqlite3_file *pDb = sqlite3_database_file_object(zName); + p->pPartner = (CksmFile*)pDb; + assert( p->pPartner->pPartner==0 ); + p->pPartner->pPartner = p; + p->isWal = 1; + p->computeCksm = p->pPartner->computeCksm; + }else{ + p->isWal = 0; + p->computeCksm = 0; + } +cksm_open_done: + if( rc ) pFile->pMethods = 0; + return rc; +} + +/* +** All other VFS methods are pass-thrus. +*/ +static int cksmDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ + return ORIGVFS(pVfs)->xDelete(ORIGVFS(pVfs), zPath, dirSync); +} +static int cksmAccess( + sqlite3_vfs *pVfs, + const char *zPath, + int flags, + int *pResOut +){ + return ORIGVFS(pVfs)->xAccess(ORIGVFS(pVfs), zPath, flags, pResOut); +} +static int cksmFullPathname( + sqlite3_vfs *pVfs, + const char *zPath, + int nOut, + char *zOut +){ + return ORIGVFS(pVfs)->xFullPathname(ORIGVFS(pVfs),zPath,nOut,zOut); +} +static void *cksmDlOpen(sqlite3_vfs *pVfs, const char *zPath){ + return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath); +} +static void cksmDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){ + ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg); +} +static void (*cksmDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){ + return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym); +} +static void cksmDlClose(sqlite3_vfs *pVfs, void *pHandle){ + ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle); +} +static int cksmRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ + return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut); +} +static int cksmSleep(sqlite3_vfs *pVfs, int nMicro){ + return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro); +} +static int cksmCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){ + return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut); +} +static int cksmGetLastError(sqlite3_vfs *pVfs, int a, char *b){ + return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b); +} +static int cksmCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){ + return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p); +} +static int cksmSetSystemCall( + sqlite3_vfs *pVfs, + const char *zName, + sqlite3_syscall_ptr pCall +){ + return ORIGVFS(pVfs)->xSetSystemCall(ORIGVFS(pVfs),zName,pCall); +} +static sqlite3_syscall_ptr cksmGetSystemCall( + sqlite3_vfs *pVfs, + const char *zName +){ + return ORIGVFS(pVfs)->xGetSystemCall(ORIGVFS(pVfs),zName); +} +static const char *cksmNextSystemCall(sqlite3_vfs *pVfs, const char *zName){ + return ORIGVFS(pVfs)->xNextSystemCall(ORIGVFS(pVfs), zName); +} + +/* Register the verify_checksum() SQL function. +*/ +static int cksmRegisterFunc( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + int rc; + if( db==0 ) return SQLITE_OK; + rc = sqlite3_create_function(db, "verify_checksum", 1, + SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, + 0, cksmVerifyFunc, 0, 0); + return rc; +} + +/* +** Register the cksum VFS as the default VFS for the system. +** Also make arrangements to automatically register the "verify_checksum()" +** SQL function on each new database connection. +*/ +static int cksmRegisterVfs(void){ + int rc = SQLITE_OK; + sqlite3_vfs *pOrig; + if( sqlite3_vfs_find("cksum")!=0 ) return SQLITE_OK; + pOrig = sqlite3_vfs_find(0); + cksm_vfs.iVersion = pOrig->iVersion; + cksm_vfs.pAppData = pOrig; + cksm_vfs.szOsFile = pOrig->szOsFile + sizeof(CksmFile); + rc = sqlite3_vfs_register(&cksm_vfs, 1); + if( rc==SQLITE_OK ){ + rc = sqlite3_auto_extension((void(*)(void))cksmRegisterFunc); + } + return rc; +} + +#if defined(SQLITE_CKSUMVFS_STATIC) +/* This variant of the initializer runs when the extension is +** statically linked. +*/ +int sqlite3_register_cksumvfs(const char *NotUsed){ + (void)NotUsed; + return cksmRegisterVfs(); +} +#endif /* defined(SQLITE_CKSUMVFS_STATIC */ + +#if !defined(SQLITE_CKSUMVFS_STATIC) +/* This variant of the initializer function is used when the +** extension is shared library to be loaded at run-time. +*/ +#ifdef _WIN32 +__declspec(dllexport) +#endif +/* +** This routine is called by sqlite3_load_extension() when the +** extension is first loaded. +***/ +int sqlite3_cksumvfs_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + int rc; + SQLITE_EXTENSION_INIT2(pApi); + (void)pzErrMsg; /* not used */ + rc = cksmRegisterFunc(db, 0, 0); + if( rc==SQLITE_OK ){ + + } + if( rc==SQLITE_OK ){ + rc = cksmRegisterVfs(); + } + if( rc==SQLITE_OK ) rc = SQLITE_OK_LOAD_PERMANENTLY; + return rc; +} +#endif /* !defined(SQLITE_CKSUMVFS_STATIC) */ diff --git a/manifest b/manifest index af2896961d..95b5c2849e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sAtomicStore()\swhen\ssetting\sthe\smem0.nearlyFull\sboolean\sto\savoid\nharmless\sTSAN\swarnings\sand\sto\sforestall\sdoubts\sabout\sthreadsafety. -D 2020-04-28T14:01:31.572 +C Add\sthe\scksumvfs\sextension. +D 2020-04-28T20:47:40.963 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -285,6 +285,7 @@ F ext/misc/appendvfs.c 3777f22ec1057dc4e5fd89f2fbddcc7a29fbeef1ad038c736c54411bb F ext/misc/blobio.c a867c4c4617f6ec223a307ebfe0eabb45e0992f74dd47722b96f3e631c0edb2a F ext/misc/btreeinfo.c 26004b7a6be320ec08fc20ca8d0f01fccb00a98cbe0f3197446794ff2a506aa3 F ext/misc/carray.c 91e9a7f512fda934894bed30464552fffa7d3073b5be04189ae0bd0c59f26bfd +F ext/misc/cksumvfs.c fe6f6a9de21ec23d8bc1a27f349cc7f28ae2095c6b666527c5df672209b603f8 F ext/misc/closure.c dbfd8543b2a017ae6b1a5843986b22ddf99ff126ec9634a2f4047cd14c85c243 F ext/misc/completion.c a0efe03edfdc4f717c61e6c9b0bfe2708ff7878010dae3174980a68fdf76aabc F ext/misc/compress.c 3354c77a7c8e86e07d849916000cdac451ed96500bfb5bd83b20eb61eee012c9 @@ -1861,7 +1862,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 7556bc632e271d8a1e4fd836ce91e28213768ac09c90857b91171e9cd1009884 -R 64df80a09bb93b99ef6e199142ecf936 +P ce980af65a9b528f112baa22a95020a98ac5340155a0b53b09c46f99aad9b12b +R 04c0fbb7c237ebfacc8bf51983c12e78 U drh -Z 42d1735aadc2a550c1baa98e0c20e909 +Z d04720d0bf98441f3ea328cca7d97af5 diff --git a/manifest.uuid b/manifest.uuid index e4a586a16b..e39ca5b808 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ce980af65a9b528f112baa22a95020a98ac5340155a0b53b09c46f99aad9b12b \ No newline at end of file +237c10f941cc6cb775693ae87513ff1b816f12b5e9c3d57b057421204d2d02cf \ No newline at end of file From 451f89a896f01b8e998364e3204c600d9089b802 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 28 Apr 2020 23:09:56 +0000 Subject: [PATCH 047/103] Fix incorrect error message when something goes wrong with the sqlite3_dbpage() table-valued function in the .dbinfo command of the CLI. FossilOrigin-Name: 0dcf002463f5931c3875d2038d2b97298f1800b1cdfa70485d6430ab758f3b25 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 7 +------ 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 95b5c2849e..617111c321 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\scksumvfs\sextension. -D 2020-04-28T20:47:40.963 +C Fix\sincorrect\serror\smessage\swhen\ssomething\sgoes\swrong\swith\sthe\nsqlite3_dbpage()\stable-valued\sfunction\sin\sthe\s.dbinfo\scommand\sof\sthe\sCLI. +D 2020-04-28T23:09:56.084 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -534,7 +534,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c c310de94bf67315054587c18a16e7a3e3dc3a98dc79168f0c2b776548d43f6cd -F src/shell.c.in 1fc834b80c72dd37587ea87a4f4167cf5e6d98d12d143184ed2e732f529c0950 +F src/shell.c.in 86cd0f0412b9739b769fafdfcad28f731882d522042a95c30ab033a5eba68b03 F src/sqlite.h.in fd6fcfe173accab8d9cb9a843856d9e9fb475f893b60a455e01d8739b5076f0e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1862,7 +1862,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 ce980af65a9b528f112baa22a95020a98ac5340155a0b53b09c46f99aad9b12b -R 04c0fbb7c237ebfacc8bf51983c12e78 +P 237c10f941cc6cb775693ae87513ff1b816f12b5e9c3d57b057421204d2d02cf +R 176a5d897ae4a00cb2a086f8e4bc1304 U drh -Z d04720d0bf98441f3ea328cca7d97af5 +Z 9c42efa8d6d984bdc00c683cbdf1d894 diff --git a/manifest.uuid b/manifest.uuid index e39ca5b808..097222261f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -237c10f941cc6cb775693ae87513ff1b816f12b5e9c3d57b057421204d2d02cf \ No newline at end of file +0dcf002463f5931c3875d2038d2b97298f1800b1cdfa70485d6430ab758f3b25 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 0218b71876..f65caaa8ac 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -5067,12 +5067,7 @@ static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){ "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1", -1, &pStmt, 0); if( rc ){ - if( !sqlite3_compileoption_used("ENABLE_DBPAGE_VTAB") ){ - utf8_printf(stderr, "the \".dbinfo\" command requires the " - "-DSQLITE_ENABLE_DBPAGE_VTAB compile-time options\n"); - }else{ - utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db)); - } + utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db)); sqlite3_finalize(pStmt); return 1; } From 95063d8c90b8525d3884b598c417c2b281cbeb25 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 29 Apr 2020 01:09:46 +0000 Subject: [PATCH 048/103] Do not allow page_size changes on an active cksumvfs database. FossilOrigin-Name: 2c17cdce26fd935e6d81ff828f4670291fc014013c93b2a1578506598345ee86 --- ext/misc/cksumvfs.c | 6 +++++- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/ext/misc/cksumvfs.c b/ext/misc/cksumvfs.c index cd4bb45364..8b7f37b9e1 100644 --- a/ext/misc/cksumvfs.c +++ b/ext/misc/cksumvfs.c @@ -494,7 +494,7 @@ static int cksmFileControl(sqlite3_file *pFile, int op, void *pArg){ if( op==SQLITE_FCNTL_PRAGMA ){ char **azArg = (char**)pArg; assert( azArg[1]!=0 ); - if( strcmp(azArg[1],"checksum_verification")==0 ){ + if( sqlite3_stricmp(azArg[1],"checksum_verification")==0 ){ char *zArg = azArg[2]; if( zArg!=0 ){ if( (zArg[0]>='1' && zArg[0]<='9') @@ -509,6 +509,10 @@ static int cksmFileControl(sqlite3_file *pFile, int op, void *pArg){ } azArg[0] = sqlite3_mprintf("%d",p->verifyCksm); return SQLITE_OK; + }else if( p->computeCksm && azArg[2]!=0 + && sqlite3_stricmp(azArg[1], "page_size")==0 ){ + /* Do not allow page size changes on a checksum database */ + return SQLITE_OK; } } rc = pFile->pMethods->xFileControl(pFile, op, pArg); diff --git a/manifest b/manifest index 617111c321..290630f678 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sincorrect\serror\smessage\swhen\ssomething\sgoes\swrong\swith\sthe\nsqlite3_dbpage()\stable-valued\sfunction\sin\sthe\s.dbinfo\scommand\sof\sthe\sCLI. -D 2020-04-28T23:09:56.084 +C Do\snot\sallow\spage_size\schanges\son\san\sactive\scksumvfs\sdatabase. +D 2020-04-29T01:09:46.288 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -285,7 +285,7 @@ F ext/misc/appendvfs.c 3777f22ec1057dc4e5fd89f2fbddcc7a29fbeef1ad038c736c54411bb F ext/misc/blobio.c a867c4c4617f6ec223a307ebfe0eabb45e0992f74dd47722b96f3e631c0edb2a F ext/misc/btreeinfo.c 26004b7a6be320ec08fc20ca8d0f01fccb00a98cbe0f3197446794ff2a506aa3 F ext/misc/carray.c 91e9a7f512fda934894bed30464552fffa7d3073b5be04189ae0bd0c59f26bfd -F ext/misc/cksumvfs.c fe6f6a9de21ec23d8bc1a27f349cc7f28ae2095c6b666527c5df672209b603f8 +F ext/misc/cksumvfs.c 452a699066cd2f60224525aa36301a95c9784f230b56fa67de63f76afd6c68d7 F ext/misc/closure.c dbfd8543b2a017ae6b1a5843986b22ddf99ff126ec9634a2f4047cd14c85c243 F ext/misc/completion.c a0efe03edfdc4f717c61e6c9b0bfe2708ff7878010dae3174980a68fdf76aabc F ext/misc/compress.c 3354c77a7c8e86e07d849916000cdac451ed96500bfb5bd83b20eb61eee012c9 @@ -1862,7 +1862,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 237c10f941cc6cb775693ae87513ff1b816f12b5e9c3d57b057421204d2d02cf -R 176a5d897ae4a00cb2a086f8e4bc1304 +P 0dcf002463f5931c3875d2038d2b97298f1800b1cdfa70485d6430ab758f3b25 +R 0cacdd864635f1bdd3a6aa2f972db6cd U drh -Z 9c42efa8d6d984bdc00c683cbdf1d894 +Z db05e4f978a71bce6c644e170e98280e diff --git a/manifest.uuid b/manifest.uuid index 097222261f..b3cba08095 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0dcf002463f5931c3875d2038d2b97298f1800b1cdfa70485d6430ab758f3b25 \ No newline at end of file +2c17cdce26fd935e6d81ff828f4670291fc014013c93b2a1578506598345ee86 \ No newline at end of file From cdb6ce980b348ed106e16132c5b2262535b01b46 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 May 2020 11:31:43 +0000 Subject: [PATCH 049/103] Add the new SQLITE_IOERR_DATA result code and use it in cksumvfs. Also enhance cksumvfs to emit an sqlite3_log() message whenever it finds an invalid checksum. FossilOrigin-Name: a094e8bfdef10d9e5d97f5a9f7c15b0fc547358b83367762ba5c2dfd2c9d0117 --- ext/misc/cksumvfs.c | 11 ++++++++--- manifest | 14 +++++++------- manifest.uuid | 2 +- src/sqlite.h.in | 1 + 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/ext/misc/cksumvfs.c b/ext/misc/cksumvfs.c index 8b7f37b9e1..57f91f3c1a 100644 --- a/ext/misc/cksumvfs.c +++ b/ext/misc/cksumvfs.c @@ -69,7 +69,7 @@ ** Open database connections using the sqlite3_open() or ** sqlite3_open_v2() interfaces, as normal. Ordinary database files ** (without a checksum) will operate normally. Databases with -** checksums will return an SQLITE_CORRUPT error if a page is +** checksums will return an SQLITE_IOERR_DATA error if a page is ** encountered that contains an invalid checksum. ** ** Checksumming only works on databases that have a reserve-bytes @@ -138,7 +138,7 @@ ** The "checksum_verification" pragma will return "1" (true) or "0" ** (false) if checksum verification is enabled or disabled, respectively. ** "Verification" in this context means the feature that causes -** SQLITE_CORRUPT errors if a checksum mismatch is detected while +** SQLITE_IOERR_DATA errors if a checksum mismatch is detected while ** reading. Checksums are always kept up-to-date as long as the ** reserve-bytes value of the database is 8, regardless of the setting ** of this pragma. Checksum verification can be disabled (for example) @@ -190,6 +190,7 @@ typedef struct CksmFile CksmFile; /* An open file */ struct CksmFile { sqlite3_file base; /* IO methods */ + const char *zFName; /* Original name of the file */ char computeCksm; /* True to compute checksums. ** Always true if reserve size is 8. */ char verifyCksm; /* True to verify checksums */ @@ -398,7 +399,10 @@ static int cksmRead( u8 cksum[8]; cksmCompute((u8*)zBuf, iAmt-8, cksum); if( memcmp(zBuf+iAmt-8, cksum, 8)!=0 ){ - rc = SQLITE_CORRUPT; + sqlite3_log(SQLITE_IOERR_DATA, + "checksum fault offset %lld of \"%s\"", + iOfst, p->zFName); + rc = SQLITE_IOERR_DATA; } } } @@ -625,6 +629,7 @@ static int cksmOpen( p->isWal = 0; p->computeCksm = 0; } + p->zFName = zName; cksm_open_done: if( rc ) pFile->pMethods = 0; return rc; diff --git a/manifest b/manifest index 290630f678..984be3d25f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sallow\spage_size\schanges\son\san\sactive\scksumvfs\sdatabase. -D 2020-04-29T01:09:46.288 +C Add\sthe\snew\sSQLITE_IOERR_DATA\sresult\scode\sand\suse\sit\sin\scksumvfs.\nAlso\senhance\scksumvfs\sto\semit\san\ssqlite3_log()\smessage\swhenever\sit\sfinds\nan\sinvalid\schecksum. +D 2020-05-01T11:31:43.081 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -285,7 +285,7 @@ F ext/misc/appendvfs.c 3777f22ec1057dc4e5fd89f2fbddcc7a29fbeef1ad038c736c54411bb F ext/misc/blobio.c a867c4c4617f6ec223a307ebfe0eabb45e0992f74dd47722b96f3e631c0edb2a F ext/misc/btreeinfo.c 26004b7a6be320ec08fc20ca8d0f01fccb00a98cbe0f3197446794ff2a506aa3 F ext/misc/carray.c 91e9a7f512fda934894bed30464552fffa7d3073b5be04189ae0bd0c59f26bfd -F ext/misc/cksumvfs.c 452a699066cd2f60224525aa36301a95c9784f230b56fa67de63f76afd6c68d7 +F ext/misc/cksumvfs.c 755627c9112a000bc89653cb5038e080e69c58fa0a5c8e9ebd747f24e5fc01c9 F ext/misc/closure.c dbfd8543b2a017ae6b1a5843986b22ddf99ff126ec9634a2f4047cd14c85c243 F ext/misc/completion.c a0efe03edfdc4f717c61e6c9b0bfe2708ff7878010dae3174980a68fdf76aabc F ext/misc/compress.c 3354c77a7c8e86e07d849916000cdac451ed96500bfb5bd83b20eb61eee012c9 @@ -535,7 +535,7 @@ F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c c310de94bf67315054587c18a16e7a3e3dc3a98dc79168f0c2b776548d43f6cd F src/shell.c.in 86cd0f0412b9739b769fafdfcad28f731882d522042a95c30ab033a5eba68b03 -F src/sqlite.h.in fd6fcfe173accab8d9cb9a843856d9e9fb475f893b60a455e01d8739b5076f0e +F src/sqlite.h.in 177084a0cef8c3b1df835bdec9530f102026bf0b6e9492a32349d62c30113a66 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 F src/sqliteInt.h 0f3848c46310d197246003f052985b72d1cdbfc0b31e069db76cb5231062fa1d @@ -1862,7 +1862,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 0dcf002463f5931c3875d2038d2b97298f1800b1cdfa70485d6430ab758f3b25 -R 0cacdd864635f1bdd3a6aa2f972db6cd +P 2c17cdce26fd935e6d81ff828f4670291fc014013c93b2a1578506598345ee86 +R 1e877c1fea766b151c81954ab2c1dc73 U drh -Z db05e4f978a71bce6c644e170e98280e +Z dd4cd34bda503d060e1073825c3c95ba diff --git a/manifest.uuid b/manifest.uuid index b3cba08095..7d94dfd16a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2c17cdce26fd935e6d81ff828f4670291fc014013c93b2a1578506598345ee86 \ No newline at end of file +a094e8bfdef10d9e5d97f5a9f7c15b0fc547358b83367762ba5c2dfd2c9d0117 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index a5e8d14974..8b36af77bd 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -507,6 +507,7 @@ int sqlite3_exec( #define SQLITE_IOERR_BEGIN_ATOMIC (SQLITE_IOERR | (29<<8)) #define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8)) #define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8)) +#define SQLITE_IOERR_DATA (SQLITE_IOERR | (32<<8)) #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) #define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8)) #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) From 8b2d8de3e20367e62c1320958bdedc4b534b87fd Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 May 2020 13:32:19 +0000 Subject: [PATCH 050/103] Update documentation for sqlite3_close_v2() for clarity. No functional changes. FossilOrigin-Name: 80498b69ea489e8816c80a52c9e55a62699116fcbfdcbfd922ef23c2d9938871 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 34 +++++++++++++++------------------- 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/manifest b/manifest index 984be3d25f..464caade5b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\snew\sSQLITE_IOERR_DATA\sresult\scode\sand\suse\sit\sin\scksumvfs.\nAlso\senhance\scksumvfs\sto\semit\san\ssqlite3_log()\smessage\swhenever\sit\sfinds\nan\sinvalid\schecksum. -D 2020-05-01T11:31:43.081 +C Update\sdocumentation\sfor\ssqlite3_close_v2()\sfor\sclarity.\s\sNo\sfunctional\nchanges. +D 2020-05-01T13:32:19.580 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -535,7 +535,7 @@ F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c c310de94bf67315054587c18a16e7a3e3dc3a98dc79168f0c2b776548d43f6cd F src/shell.c.in 86cd0f0412b9739b769fafdfcad28f731882d522042a95c30ab033a5eba68b03 -F src/sqlite.h.in 177084a0cef8c3b1df835bdec9530f102026bf0b6e9492a32349d62c30113a66 +F src/sqlite.h.in dc7fe6a874febed1625fe270b0bbeb9e5018c585639df2ff7a1140d048dbbc15 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 F src/sqliteInt.h 0f3848c46310d197246003f052985b72d1cdbfc0b31e069db76cb5231062fa1d @@ -1862,7 +1862,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 2c17cdce26fd935e6d81ff828f4670291fc014013c93b2a1578506598345ee86 -R 1e877c1fea766b151c81954ab2c1dc73 +P a094e8bfdef10d9e5d97f5a9f7c15b0fc547358b83367762ba5c2dfd2c9d0117 +R 693a622bdbf2543acdb106cd8db3f135 U drh -Z dd4cd34bda503d060e1073825c3c95ba +Z 6c1f5b11653b9fb726bcbb3b288cff5f diff --git a/manifest.uuid b/manifest.uuid index 7d94dfd16a..c6b677f739 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a094e8bfdef10d9e5d97f5a9f7c15b0fc547358b83367762ba5c2dfd2c9d0117 \ No newline at end of file +80498b69ea489e8816c80a52c9e55a62699116fcbfdcbfd922ef23c2d9938871 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 8b36af77bd..9e87ef8c0c 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -299,26 +299,22 @@ typedef sqlite_uint64 sqlite3_uint64; ** the [sqlite3] object is successfully destroyed and all associated ** resources are deallocated. ** -** ^If the database connection is associated with unfinalized prepared -** statements or unfinished sqlite3_backup objects then sqlite3_close() -** will leave the database connection open and return [SQLITE_BUSY]. -** ^If sqlite3_close_v2() is called with unfinalized prepared statements -** and/or unfinished sqlite3_backups, then the database connection becomes -** an unusable "zombie" which will automatically be deallocated when the -** last prepared statement is finalized or the last sqlite3_backup is -** finished. The sqlite3_close_v2() interface is intended for use with -** host languages that are garbage collected, and where the order in which -** destructors are called is arbitrary. -** -** Applications should [sqlite3_finalize | finalize] all [prepared statements], -** [sqlite3_blob_close | close] all [BLOB handles], and +** Ideally, applications should [sqlite3_finalize | finalize] all +** [prepared statements], [sqlite3_blob_close | close] all [BLOB handles], and ** [sqlite3_backup_finish | finish] all [sqlite3_backup] objects associated -** with the [sqlite3] object prior to attempting to close the object. ^If -** sqlite3_close_v2() is called on a [database connection] that still has -** outstanding [prepared statements], [BLOB handles], and/or -** [sqlite3_backup] objects then it returns [SQLITE_OK] and the deallocation -** of resources is deferred until all [prepared statements], [BLOB handles], -** and [sqlite3_backup] objects are also destroyed. +** with the [sqlite3] object prior to attempting to close the object. +** ^If the database connection is associated with unfinalized prepared +** statements, BLOB handlers, and/or unfinished sqlite3_backup objects then +** sqlite3_close() will leave the database connection open and return +** [SQLITE_BUSY]. ^If sqlite3_close_v2() is called with unfinalized prepared +** statements, unclosed BLOB handlers, and/or unfinished sqlite3_backups, +** it returns [SQLITE_OK] regardless, but instead of deallocating the database +** connection immediately, it marks the database connection as an unusable +** "zombie" and makes arrangements to automatically deallocate the database +** connection after all prepared statements are finalized, all BLOB handles +** are closed, and all backups have finished. The sqlite3_close_v2() interface +** is intended for use with host languages that are garbage collected, and +** where the order in which destructors are called is arbitrary. ** ** ^If an [sqlite3] object is destroyed while a transaction is open, ** the transaction is automatically rolled back. From 50511942700dcfca877b61aa1be1c4e4382daae1 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 May 2020 13:45:12 +0000 Subject: [PATCH 051/103] Clarification to the sqlite3_uri() family of interfaces. Documentation enhancement only - no changes to code. FossilOrigin-Name: 853703cd6d44d6dd48ef5eda6523e374b8ebdf7c338ddaad31c15a40a8b3fd9b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 17 ++++++++++++++--- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 464caade5b..feb2f07b97 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sdocumentation\sfor\ssqlite3_close_v2()\sfor\sclarity.\s\sNo\sfunctional\nchanges. -D 2020-05-01T13:32:19.580 +C Clarification\sto\sthe\ssqlite3_uri()\sfamily\sof\sinterfaces.\s\sDocumentation\nenhancement\sonly\s-\sno\schanges\sto\scode. +D 2020-05-01T13:45:12.131 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -535,7 +535,7 @@ F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c c310de94bf67315054587c18a16e7a3e3dc3a98dc79168f0c2b776548d43f6cd F src/shell.c.in 86cd0f0412b9739b769fafdfcad28f731882d522042a95c30ab033a5eba68b03 -F src/sqlite.h.in dc7fe6a874febed1625fe270b0bbeb9e5018c585639df2ff7a1140d048dbbc15 +F src/sqlite.h.in b20d5dc52765ff82f3701395a7e670611ddf138ee0ae84482452ad3a0b5f24b5 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 F src/sqliteInt.h 0f3848c46310d197246003f052985b72d1cdbfc0b31e069db76cb5231062fa1d @@ -1862,7 +1862,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 a094e8bfdef10d9e5d97f5a9f7c15b0fc547358b83367762ba5c2dfd2c9d0117 -R 693a622bdbf2543acdb106cd8db3f135 +P 80498b69ea489e8816c80a52c9e55a62699116fcbfdcbfd922ef23c2d9938871 +R 5d328ccb43b2f01beca1bf0c7121f5fa U drh -Z 6c1f5b11653b9fb726bcbb3b288cff5f +Z 9b72a689cdf698a7000a4037a7a1049c diff --git a/manifest.uuid b/manifest.uuid index c6b677f739..36b7244a29 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -80498b69ea489e8816c80a52c9e55a62699116fcbfdcbfd922ef23c2d9938871 \ No newline at end of file +853703cd6d44d6dd48ef5eda6523e374b8ebdf7c338ddaad31c15a40a8b3fd9b \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 9e87ef8c0c..f65576a15d 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -3533,8 +3533,19 @@ int sqlite3_open_v2( ** that check if a database file was a URI that contained a specific query ** parameter, and if so obtains the value of that query parameter. ** -** If F is the database filename pointer passed into the xOpen() method of -** a VFS implementation or it is the return value of [sqlite3_db_filename()] +** The first parameter to these interfaces (hereafter referred to +** as F) must be one of: +**
    +**
  • A database filename pointer created by the SQLite core and +** passed into the xOpen() method of a VFS implemention, or +**
  • A filename obtained from [sqlite3_db_filename()], or +**
  • A new filename constructed using [sqlite3_create_filename()]. +**
+** If the F parameter is not one of the above, then the behavior is +** undefined and probably undesirable. Older versions of SQLite were +** more tolerant of invalid F parameters than newer versions. +** +** If F is a suitable filename (as described in the previous paragraph) ** and if P is the name of the query parameter, then ** sqlite3_uri_parameter(F,P) returns the value of the P ** parameter if it exists or a NULL pointer if P does not appear as a @@ -3670,7 +3681,7 @@ sqlite3_file *sqlite3_database_file_object(const char*); ** ** The sqlite3_free_filename(Y) routine releases a memory allocation ** previously obtained from sqlite3_create_filename(). Invoking -** sqlite3_free_filename(Y) is a NULL pointer is a harmless no-op. +** sqlite3_free_filename(Y) where Y is a NULL pointer is a harmless no-op. ** ** If the Y parameter to sqlite3_free_filename(Y) is anything other ** than a NULL pointer or a pointer previously acquired from From fcf31b28ff038dfde90e06814c4a86e1f9aa7499 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 May 2020 18:37:34 +0000 Subject: [PATCH 052/103] Add the SQLITE_FCNTL_CKPT_START file-control. Use it to optimize the cksumvfs extension. FossilOrigin-Name: b40f5aa344ae10cf4da83b3aa9e4866d6f6ffb06ba7e34ec1ce80c92468cf3bf --- ext/misc/cksumvfs.c | 43 +++++++++++++++++++++++++++++++------------ manifest | 19 +++++++++++-------- manifest.uuid | 2 +- src/sqlite.h.in | 6 ++++++ src/wal.c | 6 ++---- 5 files changed, 51 insertions(+), 25 deletions(-) diff --git a/ext/misc/cksumvfs.c b/ext/misc/cksumvfs.c index 57f91f3c1a..2ea5a67c85 100644 --- a/ext/misc/cksumvfs.c +++ b/ext/misc/cksumvfs.c @@ -195,6 +195,7 @@ struct CksmFile { ** Always true if reserve size is 8. */ char verifyCksm; /* True to verify checksums */ char isWal; /* True if processing a WAL file */ + char inCkpt; /* Currently doing a checkpoint */ CksmFile *pPartner; /* Ptr from WAL to main-db, or from main-db to WAL */ }; @@ -366,6 +367,20 @@ static int cksmClose(sqlite3_file *pFile){ return pFile->pMethods->xClose(pFile); } +/* +** Set the computeCkSm and verifyCksm flags, if they need to be +** changed. +*/ +static void cksmSetFlags(CksmFile *p, int hasCorrectReserveSize){ + if( hasCorrectReserveSize!=p->computeCksm ){ + p->computeCksm = p->verifyCksm = hasCorrectReserveSize; + if( p->pPartner ){ + p->pPartner->verifyCksm = hasCorrectReserveSize; + p->pPartner->computeCksm = hasCorrectReserveSize; + } + } +} + /* ** Read data from a cksm-file. */ @@ -383,18 +398,17 @@ static int cksmRead( if( iOfst==0 && iAmt>=100 && memcmp(zBuf,"SQLite format 3",16)==0 ){ u8 *d = (u8*)zBuf; char hasCorrectReserveSize = (d[20]==8); - if( hasCorrectReserveSize!=p->computeCksm ){ - p->computeCksm = p->verifyCksm = hasCorrectReserveSize; - } + cksmSetFlags(p, hasCorrectReserveSize); } - /* Verify the checksum if (1) the size seems appropriate for a database - ** page, and if (2) checksum verification is enabled. But (3) do not - ** verify the checksums on a WAL page if the main database file - ** has subsequently turned off checksums. + /* Verify the checksum if + ** (1) the size indicates that we are dealing with a complete + ** database page + ** (2) checksum verification is enabled + ** (3) we are not in the middle of checkpoint */ if( iAmt>=512 /* (1) */ && p->verifyCksm /* (2) */ - && (!p->isWal || (p->pPartner!=0 && p->pPartner->verifyCksm)) /* (3) */ + && !p->inCkpt /* (3) */ ){ u8 cksum[8]; cksmCompute((u8*)zBuf, iAmt-8, cksum); @@ -423,9 +437,7 @@ static int cksmWrite( if( iOfst==0 && iAmt>=100 && memcmp(zBuf,"SQLite format 3",16)==0 ){ u8 *d = (u8*)zBuf; char hasCorrectReserveSize = (d[20]==8); - if( hasCorrectReserveSize!=p->computeCksm ){ - p->computeCksm = p->verifyCksm = hasCorrectReserveSize; - } + cksmSetFlags(p, hasCorrectReserveSize); } /* If the write size is appropriate for a database page and if ** checksums where ever enabled, then it will be safe to compute @@ -433,7 +445,10 @@ static int cksmWrite( ** it will never decrease. And because it cannot decrease, the ** checksum will not overwrite anything. */ - if( iAmt>=512 && p->computeCksm ){ + if( iAmt>=512 + && p->computeCksm + && !p->inCkpt + ){ cksmCompute((u8*)zBuf, iAmt-8, ((u8*)zBuf)+iAmt-8); } return pFile->pMethods->xWrite(pFile, zBuf, iAmt, iOfst); @@ -510,6 +525,7 @@ static int cksmFileControl(sqlite3_file *pFile, int op, void *pArg){ }else{ p->verifyCksm = 0; } + if( p->pPartner ) p->pPartner->verifyCksm = p->verifyCksm; } azArg[0] = sqlite3_mprintf("%d",p->verifyCksm); return SQLITE_OK; @@ -518,6 +534,9 @@ static int cksmFileControl(sqlite3_file *pFile, int op, void *pArg){ /* Do not allow page size changes on a checksum database */ return SQLITE_OK; } + }else if( op==SQLITE_FCNTL_CKPT_START || op==SQLITE_FCNTL_CKPT_DONE ){ + p->inCkpt = op==SQLITE_FCNTL_CKPT_START; + if( p->pPartner ) p->pPartner->inCkpt = p->inCkpt; } rc = pFile->pMethods->xFileControl(pFile, op, pArg); if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){ diff --git a/manifest b/manifest index feb2f07b97..ef2565abcc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Clarification\sto\sthe\ssqlite3_uri()\sfamily\sof\sinterfaces.\s\sDocumentation\nenhancement\sonly\s-\sno\schanges\sto\scode. -D 2020-05-01T13:45:12.131 +C Add\sthe\sSQLITE_FCNTL_CKPT_START\sfile-control.\s\sUse\sit\sto\soptimize\sthe\ncksumvfs\sextension. +D 2020-05-01T18:37:34.019 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -285,7 +285,7 @@ F ext/misc/appendvfs.c 3777f22ec1057dc4e5fd89f2fbddcc7a29fbeef1ad038c736c54411bb F ext/misc/blobio.c a867c4c4617f6ec223a307ebfe0eabb45e0992f74dd47722b96f3e631c0edb2a F ext/misc/btreeinfo.c 26004b7a6be320ec08fc20ca8d0f01fccb00a98cbe0f3197446794ff2a506aa3 F ext/misc/carray.c 91e9a7f512fda934894bed30464552fffa7d3073b5be04189ae0bd0c59f26bfd -F ext/misc/cksumvfs.c 755627c9112a000bc89653cb5038e080e69c58fa0a5c8e9ebd747f24e5fc01c9 +F ext/misc/cksumvfs.c bdbdf15edd52ed96014122745b445d2c05c968b017f36597990e5670c1b498eb F ext/misc/closure.c dbfd8543b2a017ae6b1a5843986b22ddf99ff126ec9634a2f4047cd14c85c243 F ext/misc/completion.c a0efe03edfdc4f717c61e6c9b0bfe2708ff7878010dae3174980a68fdf76aabc F ext/misc/compress.c 3354c77a7c8e86e07d849916000cdac451ed96500bfb5bd83b20eb61eee012c9 @@ -535,7 +535,7 @@ F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c c310de94bf67315054587c18a16e7a3e3dc3a98dc79168f0c2b776548d43f6cd F src/shell.c.in 86cd0f0412b9739b769fafdfcad28f731882d522042a95c30ab033a5eba68b03 -F src/sqlite.h.in b20d5dc52765ff82f3701395a7e670611ddf138ee0ae84482452ad3a0b5f24b5 +F src/sqlite.h.in 00fdd0a9cdcb4ca3ea6aed8466a23e158c4a2feb5c2552de62c70f40d2418289 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 F src/sqliteInt.h 0f3848c46310d197246003f052985b72d1cdbfc0b31e069db76cb5231062fa1d @@ -616,7 +616,7 @@ F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587d F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c ea8dad28bb0e2b85ac1ab7618968687ff5fd522af8a1a38d6960ec176ebc8ee6 +F src/wal.c 8efa749ff1e84fb69127bdab1d0f3545afc1706f4dde6f19f2f6237d7dc9c2d2 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c 7c429c694abd12413a5c17aec9f47cfe9eba6807e6b0a32df883e8e3a14835ed F src/where.c 9546c82056e8cdb27291f98cf1adca5d271240b399bb97b32f77fc2bea6146c9 @@ -1862,7 +1862,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 80498b69ea489e8816c80a52c9e55a62699116fcbfdcbfd922ef23c2d9938871 -R 5d328ccb43b2f01beca1bf0c7121f5fa +P 853703cd6d44d6dd48ef5eda6523e374b8ebdf7c338ddaad31c15a40a8b3fd9b +R d02abd9a5af9bd115679571d54eadf06 +T *branch * ckpt-start-fcntl +T *sym-ckpt-start-fcntl * +T -sym-trunk * U drh -Z 9b72a689cdf698a7000a4037a7a1049c +Z 843d07fcbc8456358389e1c6f788c09d diff --git a/manifest.uuid b/manifest.uuid index 36b7244a29..ce1bb2e80e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -853703cd6d44d6dd48ef5eda6523e374b8ebdf7c338ddaad31c15a40a8b3fd9b \ No newline at end of file +b40f5aa344ae10cf4da83b3aa9e4866d6f6ffb06ba7e34ec1ce80c92468cf3bf \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index f65576a15d..5c082623ce 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -1111,6 +1111,11 @@ struct sqlite3_io_methods { ** happen either internally or externally and that are associated with ** a particular attached database. ** +**
  • [[SQLITE_FCNTL_CKPT_START]] +** The [SQLITE_FCNTL_CKPT_START] opcode is invoked from within a checkpoint +** in wal mode before the client starts to copy pages from the wal +** file to the database file. +** **
  • [[SQLITE_FCNTL_CKPT_DONE]] ** The [SQLITE_FCNTL_CKPT_DONE] opcode is invoked from within a checkpoint ** in wal mode after the client has finished copying pages from the wal @@ -1155,6 +1160,7 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_SIZE_LIMIT 36 #define SQLITE_FCNTL_CKPT_DONE 37 #define SQLITE_FCNTL_RESERVE_BYTES 38 +#define SQLITE_FCNTL_CKPT_START 39 /* deprecated names */ #define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE diff --git a/src/wal.c b/src/wal.c index 3e4f4acfde..b230858599 100644 --- a/src/wal.c +++ b/src/wal.c @@ -1868,6 +1868,7 @@ static int walCheckpoint( if( rc==SQLITE_OK ){ i64 nReq = ((i64)mxPage * szPage); i64 nSize; /* Current size of database file */ + sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_CKPT_START, 0); rc = sqlite3OsFileSize(pWal->pDbFd, &nSize); if( rc==SQLITE_OK && nSizepDbFd, SQLITE_FCNTL_SIZE_HINT, &nReq); @@ -1895,6 +1896,7 @@ static int walCheckpoint( rc = sqlite3OsWrite(pWal->pDbFd, zBuf, szPage, iOffset); if( rc!=SQLITE_OK ) break; } + sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_CKPT_DONE, 0); /* If work was actually accomplished... */ if( rc==SQLITE_OK ){ @@ -1906,10 +1908,6 @@ static int walCheckpoint( rc = sqlite3OsSync(pWal->pDbFd, CKPT_SYNC_FLAGS(sync_flags)); } } - if( rc==SQLITE_OK ){ - rc = sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_CKPT_DONE, 0); - if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; - } if( rc==SQLITE_OK ){ pInfo->nBackfill = mxSafeFrame; } From 7e088a6c0aa2084f13fcae416077dde7e3e30adc Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 2 May 2020 00:01:39 +0000 Subject: [PATCH 053/103] Corner-case changes to the bytecode virtual table for testability and correctness. FossilOrigin-Name: baa720e4a88f268ed95337daab5f434fd3263b00f09101cddc6424765bf3b722 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/shell.c.in | 1 + src/vdbeaux.c | 3 ++- src/vdbevtab.c | 7 +++---- 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index fdbedef2b3..77f7d33d15 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\srecent\senhancements\sfrom\strunk. -D 2020-05-01T18:58:21.571 +C Corner-case\schanges\sto\sthe\sbytecode\svirtual\stable\sfor\stestability\sand\ncorrectness. +D 2020-05-02T00:01:39.619 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -534,7 +534,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c c310de94bf67315054587c18a16e7a3e3dc3a98dc79168f0c2b776548d43f6cd -F src/shell.c.in 86cd0f0412b9739b769fafdfcad28f731882d522042a95c30ab033a5eba68b03 +F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b6 F src/sqlite.h.in b20d5dc52765ff82f3701395a7e670611ddf138ee0ae84482452ad3a0b5f24b5 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -609,12 +609,12 @@ F src/vdbe.c 972999395eee88702091fb5d50cf4effd07889c371807d222a7f517388e6378e F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 F src/vdbeInt.h 571413068b5ac07e2ed8ca7a02fa529622fd5455ae6981498376e5e492d2e5ef F src/vdbeapi.c d176ee7251d5344de7bb2a0d2dd0fe536834e5843d9bc2389e0f5cdcd5374141 -F src/vdbeaux.c d191d07906d284acb458c8ba3e24a5ea0ab7610c2800f97d683d0917bda0e66d +F src/vdbeaux.c 319a6e44cff0e8ba710a8374778043609d11cf82cb4ab2ba0a80dde52e607a08 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vdbevtab.c 3f7fd339425729f6cef36ef0bc576bf42641d2a664c746b54a6e2c045ae1a248 +F src/vdbevtab.c 8094dfc28dad82d60a1c832020a1b201a5381dc185c14638affc6d4e9d54c653 F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c ea8dad28bb0e2b85ac1ab7618968687ff5fd522af8a1a38d6960ec176ebc8ee6 @@ -1863,7 +1863,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 7e6576ec00fde277c5c7abac264f7ec7e531de00c4e112bf733a07fe703fadcc 853703cd6d44d6dd48ef5eda6523e374b8ebdf7c338ddaad31c15a40a8b3fd9b -R e24ff42847364b0b675f72b087b80143 +P 96dfc71ea599702ef38b60952d03e95dce5a8c534cd943e076e9c76b00e61e65 +R 8a6312f86dfd0f2dc1b9dbd32625eb27 U drh -Z d4de9e26c72a33ad0b73d11829e14172 +Z 054131aab304a488c76322b7f6a162fc diff --git a/manifest.uuid b/manifest.uuid index a6fc3f8336..8a146fc439 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -96dfc71ea599702ef38b60952d03e95dce5a8c534cd943e076e9c76b00e61e65 \ No newline at end of file +baa720e4a88f268ed95337daab5f434fd3263b00f09101cddc6424765bf3b722 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index f65caaa8ac..5858296420 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3158,6 +3158,7 @@ static int shell_exec( const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3); int iEqpId = sqlite3_column_int(pExplain, 0); int iParentId = sqlite3_column_int(pExplain, 1); + if( zEQPLine==0 ) zEQPLine = ""; if( zEQPLine[0]=='-' ) eqp_render(pArg); eqp_append(pArg, iEqpId, iParentId, zEQPLine); } diff --git a/src/vdbeaux.c b/src/vdbeaux.c index da8108a593..454be534ba 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1847,7 +1847,8 @@ void sqlite3VdbePrintOp(FILE *pOut, int pc, VdbeOp *pOp){ ** by the mkopcodeh.awk and mkopcodec.awk scripts which extract the ** information from the vdbe.c source text */ fprintf(pOut, zFormat1, pc, - sqlite3OpcodeName(pOp->opcode), pOp->p1, pOp->p2, pOp->p3, zP4, pOp->p5, + sqlite3OpcodeName(pOp->opcode), pOp->p1, pOp->p2, pOp->p3, + zP4 ? zP4 : "", pOp->p5, zCom ? zCom : "" ); fflush(pOut); diff --git a/src/vdbevtab.c b/src/vdbevtab.c index d97db1c156..95ea0ad228 100644 --- a/src/vdbevtab.c +++ b/src/vdbevtab.c @@ -224,7 +224,6 @@ static int bytecodevtabColumn( if( pIdx->tnum==iRoot ){ pCur->zName = pIdx->zName; pCur->zType = "index"; - break; } } } @@ -268,11 +267,11 @@ static int bytecodevtabColumn( break; case 8: { /* subprog */ Op *aOp = pCur->aOp; + assert( aOp[0].opcode==OP_Init ); + assert( aOp[0].p4.z==0 || strncmp(aOp[0].p4.z,"-" "- ",3)==0 ); if( pCur->iRowid==pCur->iAddr+1 ){ break; /* Result is NULL for the main program */ - }else if( aOp[0].p4type==P4_DYNAMIC - && aOp[0].p4.z!=0 - && strncmp(aOp[0].p4.z,"-- ", 3)==0 ){ + }else if( aOp[0].p4.z!=0 ){ sqlite3_result_text(ctx, aOp[0].p4.z+3, -1, SQLITE_STATIC); }else{ sqlite3_result_text(ctx, "(FK)", 4, SQLITE_STATIC); From f72981f2d94bc9c3a17a7fa5abf821d49bad6aa0 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 2 May 2020 03:29:21 +0000 Subject: [PATCH 054/103] Add a missing VdbeCoverage() macro. FossilOrigin-Name: 77a55c394d2c313a5710229bee9262457dcfc6620e6500f9f526c5f6acf87cef --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/analyze.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 324e12ab15..ee0f01f5ce 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\srecent\strunk\senhancements. -D 2020-05-01T15:04:13.668 +C Add\sa\smissing\sVdbeCoverage()\smacro. +D 2020-05-02T03:29:21.137 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -468,7 +468,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c fa2c3be9b0ebecfafb7062072a0ae6eda126d3e5a9fd51b2eded5acd95dc783c -F src/analyze.c 05c99006dfc373a056b05a96539d86482684715b8840c097a6bbc83616c7cb50 +F src/analyze.c f71fb976b1bc8e62320e4932f979e56f535237b1579e07b392b22f9a1ccbba42 F src/attach.c ff2daea0fe62080192e3f262670e4f61f5a86c1e7bea9cec34e960fe79852aa1 F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b @@ -1862,7 +1862,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 17901ea6a1951b8c55671408841901c6660e3f8099378204f080b171a684d718 853703cd6d44d6dd48ef5eda6523e374b8ebdf7c338ddaad31c15a40a8b3fd9b -R d39b23d1b282daf000e818b2d8c99f0c +P 2100b2c8f339e9778723fa0c91e479bab8675cf6fbea1664b6af49f40db6d27b +R 90bb2d279dfaf51c661d9433e0108281 U drh -Z 7176e56ef832c90b125106619a6d3ee2 +Z fa6729d909d64e1004093dfe525b2a80 diff --git a/manifest.uuid b/manifest.uuid index 755246313d..ba532de872 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2100b2c8f339e9778723fa0c91e479bab8675cf6fbea1664b6af49f40db6d27b \ No newline at end of file +77a55c394d2c313a5710229bee9262457dcfc6620e6500f9f526c5f6acf87cef \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index baca0efad0..53bd62a822 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -1230,6 +1230,7 @@ static void analyzeOneTable( j1 = sqlite3VdbeAddOp1(v, OP_IsNull, regTemp); VdbeCoverage(v); j2 = sqlite3VdbeAddOp1(v, OP_If, regTemp); VdbeCoverage(v); j3 = sqlite3VdbeAddOp4Int(v, OP_SeekGT, iIdxCur, 0, regPrev, 1); + VdbeCoverage(v); sqlite3VdbeJumpHere(v, j1); sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); sqlite3VdbeJumpHere(v, j2); From 995e1af9faabffcfbdf0e4702be8ef75f7fef9e9 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 4 May 2020 11:47:38 +0000 Subject: [PATCH 055/103] Ensure that the master-journal name is in a form suitable to be passed into sqlite3_uri_parameter(). FossilOrigin-Name: d1ba026d882f070b351280028e2fa88a3cca59b46d4683302e24c6677e0951b9 --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/vdbeaux.c | 13 +++++++------ 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index cda7604ccf..be344da311 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sSQLITE_FCNTL_CKPT_START\sfile-control\sand\suse\sit\sto\soptimize\nthe\scksumvfs\sextension. -D 2020-05-02T04:08:23.053 +C Ensure\sthat\sthe\smaster-journal\sname\sis\sin\sa\sform\ssuitable\sto\sbe\spassed\ninto\ssqlite3_uri_parameter(). +D 2020-05-04T11:47:38.857 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -609,7 +609,7 @@ F src/vdbe.c f55fe7dbffae72e1cd5861e9ea3b55d50b70d863eebce3aebf11e1271ceae796 F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 F src/vdbeInt.h 571413068b5ac07e2ed8ca7a02fa529622fd5455ae6981498376e5e492d2e5ef F src/vdbeapi.c d176ee7251d5344de7bb2a0d2dd0fe536834e5843d9bc2389e0f5cdcd5374141 -F src/vdbeaux.c 319a6e44cff0e8ba710a8374778043609d11cf82cb4ab2ba0a80dde52e607a08 +F src/vdbeaux.c ee65c810ec97acce013e3024e5b8f3f767459b5d1499a8d379232059eb9aea03 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df @@ -1863,8 +1863,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 812547525d35df975f40cbbeb604cc9cd2dec809c1ca083cbb139fe59ffa1d73 b40f5aa344ae10cf4da83b3aa9e4866d6f6ffb06ba7e34ec1ce80c92468cf3bf -R 3e884a6ea8a79fc4f9e8f6323bb6c8f0 -T +closed b40f5aa344ae10cf4da83b3aa9e4866d6f6ffb06ba7e34ec1ce80c92468cf3bf +P efdecb13091316aeac2722f58577cb0314e008e857f2816a2a222bac0a83e9e1 +R 6897970c2b5b2cca1a8fed26518d5a6e U drh -Z aad739fd1c906055ab76678a6dc49335 +Z ec3fad1620b6ab238b8dc4b9fa847a46 diff --git a/manifest.uuid b/manifest.uuid index 54697a170e..1cca894bf0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -efdecb13091316aeac2722f58577cb0314e008e857f2816a2a222bac0a83e9e1 \ No newline at end of file +d1ba026d882f070b351280028e2fa88a3cca59b46d4683302e24c6677e0951b9 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 454be534ba..5be81a3524 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2751,8 +2751,9 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ /* Select a master journal file name */ nMainFile = sqlite3Strlen30(zMainFile); - zMaster = sqlite3MPrintf(db, "%s-mjXXXXXX9XXz%c%c", zMainFile, 0, 0); + zMaster = sqlite3MPrintf(db, "%.4c%s%.16c", 0,zMainFile,0); if( zMaster==0 ) return SQLITE_NOMEM_BKPT; + zMaster += 4; do { u32 iRandom; if( retryCount ){ @@ -2782,7 +2783,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ ); } if( rc!=SQLITE_OK ){ - sqlite3DbFree(db, zMaster); + sqlite3DbFree(db, zMaster-4); return rc; } @@ -2805,7 +2806,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ if( rc!=SQLITE_OK ){ sqlite3OsCloseFree(pMaster); sqlite3OsDelete(pVfs, zMaster, 0); - sqlite3DbFree(db, zMaster); + sqlite3DbFree(db, zMaster-4); return rc; } } @@ -2819,7 +2820,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ ){ sqlite3OsCloseFree(pMaster); sqlite3OsDelete(pVfs, zMaster, 0); - sqlite3DbFree(db, zMaster); + sqlite3DbFree(db, zMaster-4); return rc; } @@ -2842,7 +2843,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ sqlite3OsCloseFree(pMaster); assert( rc!=SQLITE_BUSY ); if( rc!=SQLITE_OK ){ - sqlite3DbFree(db, zMaster); + sqlite3DbFree(db, zMaster-4); return rc; } @@ -2851,7 +2852,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ ** transaction files are deleted. */ rc = sqlite3OsDelete(pVfs, zMaster, 1); - sqlite3DbFree(db, zMaster); + sqlite3DbFree(db, zMaster-4); zMaster = 0; if( rc ){ return rc; From 20e34f911045436190ded0c5464827fced22c87b Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 4 May 2020 17:15:21 +0000 Subject: [PATCH 056/103] Simplify the initialization of built-in extensions. FossilOrigin-Name: 729f2397358d0382e255ba0058bf70bc9ed410b7621a67466da13de437d3ba5c --- manifest | 12 ++--- manifest.uuid | 2 +- src/main.c | 141 +++++++++++++++++++++++++------------------------- 3 files changed, 77 insertions(+), 78 deletions(-) diff --git a/manifest b/manifest index be344da311..8bf5adc8d5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\smaster-journal\sname\sis\sin\sa\sform\ssuitable\sto\sbe\spassed\ninto\ssqlite3_uri_parameter(). -D 2020-05-04T11:47:38.857 +C Simplify\sthe\sinitialization\sof\sbuilt-in\sextensions. +D 2020-05-04T17:15:21.662 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -497,7 +497,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 8e4211d04eb460c0694d486c6ba1c068d468c6f653c3f237869a802ad82854de F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 421310045bd78afefb772294a99e50f37d87ae578786a6169074e6291e30d969 -F src/main.c 7e07ff5ec447451d28398d528fda25c272f86cce67bc59a9846ee5bdfb23e1d9 +F src/main.c 2dd7fc7b3f71b23b185496cd282072ba5888dc8ed8ecb9309ddd0d1efdf66d5c F src/malloc.c a3e13b001f988ecec6bdb90c0ea8912c8c786e623724d7098da623d8d01d19b1 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -1863,7 +1863,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 efdecb13091316aeac2722f58577cb0314e008e857f2816a2a222bac0a83e9e1 -R 6897970c2b5b2cca1a8fed26518d5a6e +P d1ba026d882f070b351280028e2fa88a3cca59b46d4683302e24c6677e0951b9 +R 7709315ebf43ae93c1f9067b218a4e7c U drh -Z ec3fad1620b6ab238b8dc4b9fa847a46 +Z 0528b7b773900b4185d8554d4c89985c diff --git a/manifest.uuid b/manifest.uuid index 1cca894bf0..c1e505413b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d1ba026d882f070b351280028e2fa88a3cca59b46d4683302e24c6677e0951b9 \ No newline at end of file +729f2397358d0382e255ba0058bf70bc9ed410b7621a67466da13de437d3ba5c \ No newline at end of file diff --git a/src/main.c b/src/main.c index 7322e28279..778d4324b8 100644 --- a/src/main.c +++ b/src/main.c @@ -25,15 +25,78 @@ #if defined(SQLITE_ENABLE_ICU) || defined(SQLITE_ENABLE_ICU_COLLATIONS) # include "sqliteicu.h" #endif + +/* +** This is an extension initializer that is a no-op and always +** succeeds, except that it fails if the fault-simulation is set +** to 500. +*/ +static int sqlite3TestExtInit(sqlite3 *db){ + (void)db; + return sqlite3FaultSim(500); +} + + +/* +** Forward declarations of external module initializer functions +** for modules that need them. +*/ +#ifdef SQLITE_ENABLE_FTS1 +int sqlite3Fts1Init(sqlite3*); +#endif +#ifdef SQLITE_ENABLE_FTS2 +int sqlite3Fts2Init(sqlite3*); +#endif +#ifdef SQLITE_ENABLE_FTS5 +int sqlite3Fts5Init(sqlite3*); +#endif #ifdef SQLITE_ENABLE_JSON1 int sqlite3Json1Init(sqlite3*); #endif #ifdef SQLITE_ENABLE_STMTVTAB int sqlite3StmtVtabInit(sqlite3*); #endif -#ifdef SQLITE_ENABLE_FTS5 -int sqlite3Fts5Init(sqlite3*); + +/* +** An array of pointers to extension initializer functions for +** built-in extensions. +*/ +static int (*const sqlite3BuiltinExtensions[])(sqlite3*) = { +#ifdef SQLITE_ENABLE_FTS1 + sqlite3Fts1Init, #endif +#ifdef SQLITE_ENABLE_FTS2 + sqlite3Fts2Init, +#endif +#ifdef SQLITE_ENABLE_FTS3 + sqlite3Fts3Init, +#endif +#ifdef SQLITE_ENABLE_FTS5 + sqlite3Fts5Init, +#endif +#if defined(SQLITE_ENABLE_ICU) || defined(SQLITE_ENABLE_ICU_COLLATIONS) + sqlite3IcuInit, +#endif +#ifdef SQLITE_ENABLE_RTREE + sqlite3RtreeInit, +#endif +#ifdef SQLITE_ENABLE_DBPAGE_VTAB + sqlite3DbpageRegister, +#endif +#ifdef SQLITE_ENABLE_DBSTAT_VTAB + sqlite3DbstatRegister, +#endif + sqlite3TestExtInit, +#ifdef SQLITE_ENABLE_JSON1 + sqlite3Json1Init, +#endif +#ifdef SQLITE_ENABLE_STMTVTAB + sqlite3StmtVtabInit, +#endif +#ifdef SQLITE_ENABLE_BYTECODE_VTAB + sqlite3VdbeBytecodeVtabInit, +#endif +}; #ifndef SQLITE_AMALGAMATION /* IMPLEMENTATION-OF: R-46656-45156 The sqlite3_version[] string constant @@ -3042,6 +3105,7 @@ static int openDatabase( int isThreadsafe; /* True for threadsafe connections */ char *zOpen = 0; /* Filename argument to pass to BtreeOpen() */ char *zErrMsg = 0; /* Error message from sqlite3ParseUri() */ + int i; /* Loop counter */ #ifdef SQLITE_ENABLE_API_ARMOR if( ppDb==0 ) return SQLITE_MISUSE_BKPT; @@ -3282,14 +3346,11 @@ static int openDatabase( sqlite3RegisterPerConnectionBuiltinFunctions(db); rc = sqlite3_errcode(db); -#ifdef SQLITE_ENABLE_FTS5 - /* Register any built-in FTS5 module before loading the automatic - ** extensions. This allows automatic extensions to register FTS5 - ** tokenizers and auxiliary functions. */ - if( !db->mallocFailed && rc==SQLITE_OK ){ - rc = sqlite3Fts5Init(db); + + /* Load compiled-in extensions */ + for(i=0; rc==SQLITE_OK && imallocFailed ){ - extern int sqlite3Fts1Init(sqlite3*); - rc = sqlite3Fts1Init(db); - } -#endif - -#ifdef SQLITE_ENABLE_FTS2 - if( !db->mallocFailed && rc==SQLITE_OK ){ - extern int sqlite3Fts2Init(sqlite3*); - rc = sqlite3Fts2Init(db); - } -#endif - -#ifdef SQLITE_ENABLE_FTS3 /* automatically defined by SQLITE_ENABLE_FTS4 */ - if( !db->mallocFailed && rc==SQLITE_OK ){ - rc = sqlite3Fts3Init(db); - } -#endif - -#if defined(SQLITE_ENABLE_ICU) || defined(SQLITE_ENABLE_ICU_COLLATIONS) - if( !db->mallocFailed && rc==SQLITE_OK ){ - rc = sqlite3IcuInit(db); - } -#endif - -#ifdef SQLITE_ENABLE_RTREE - if( !db->mallocFailed && rc==SQLITE_OK){ - rc = sqlite3RtreeInit(db); - } -#endif - -#ifdef SQLITE_ENABLE_DBPAGE_VTAB - if( !db->mallocFailed && rc==SQLITE_OK){ - rc = sqlite3DbpageRegister(db); - } -#endif - -#ifdef SQLITE_ENABLE_DBSTAT_VTAB - if( !db->mallocFailed && rc==SQLITE_OK){ - rc = sqlite3DbstatRegister(db); - } -#endif - -#ifdef SQLITE_ENABLE_JSON1 - if( !db->mallocFailed && rc==SQLITE_OK){ - rc = sqlite3Json1Init(db); - } -#endif - -#ifdef SQLITE_ENABLE_STMTVTAB - if( !db->mallocFailed && rc==SQLITE_OK){ - rc = sqlite3StmtVtabInit(db); - } -#endif - -#ifdef SQLITE_ENABLE_BYTECODE_VTAB - if( !db->mallocFailed && rc==SQLITE_OK){ - rc = sqlite3VdbeBytecodeVtabInit(db); - } -#endif - #ifdef SQLITE_ENABLE_INTERNAL_FUNCTIONS /* Testing use only!!! The -DSQLITE_ENABLE_INTERNAL_FUNCTIONS=1 compile-time ** option gives access to internal functions by default. From 44a5c86c6cfb2f7dde549c1336eb6a0d547239c3 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 4 May 2020 19:04:23 +0000 Subject: [PATCH 057/103] Minor change to the sqlite_stmt virtual table, for test coverage. FossilOrigin-Name: 838987b2097c4b7acaa65aea99cfdaf199f04d76bcf6ef12743c60b338a965f7 --- ext/misc/stmt.c | 3 ++- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ext/misc/stmt.c b/ext/misc/stmt.c index d2b33e7416..876b0e5cb6 100644 --- a/ext/misc/stmt.c +++ b/ext/misc/stmt.c @@ -168,7 +168,8 @@ static int stmtColumn( sqlite3_result_int(ctx, sqlite3_stmt_busy(pCur->pStmt)); break; } - case STMT_COLUMN_MEM: { + default: { + assert( i==STMT_COLUMN_MEM ); i = SQLITE_STMTSTATUS_MEMUSED + STMT_COLUMN_NSCAN - SQLITE_STMTSTATUS_FULLSCAN_STEP; /* Fall thru */ diff --git a/manifest b/manifest index 8bf5adc8d5..1a77751f22 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplify\sthe\sinitialization\sof\sbuilt-in\sextensions. -D 2020-05-04T17:15:21.662 +C Minor\schange\sto\sthe\ssqlite_stmt\svirtual\stable,\sfor\stest\scoverage. +D 2020-05-04T19:04:23.046 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -318,7 +318,7 @@ F ext/misc/shathree.c 135b7c145db4a09b1650c3e7aff9cb538763a9a361e834c015dd1aaf8d F ext/misc/showauth.c 732578f0fe4ce42d577e1c86dc89dd14a006ab52 F ext/misc/spellfix.c 94df9bbfa514a563c1484f684a2df3d128a2f7209a84ca3ca100c68a0163e29f F ext/misc/sqlar.c c9e5d58544e1506135806a1e0f525f92d4bb6bb125348dce469d778fb334fbce -F ext/misc/stmt.c 8a8dc4675042e4551e4afe99b8d0cc7a4a2fc1a8dacc0a9ce1b1bbff145da93d +F ext/misc/stmt.c 35063044a388ead95557e4b84b89c1b93accc2f1c6ddea3f9710e8486a7af94a F ext/misc/templatevtab.c 8a16a91a5ceaccfcbd6aaaa56d46828806e460dd194965b3f77bf38f14b942c4 F ext/misc/totype.c fa4aedeb07f66169005dffa8de3b0a2b621779fd44f85c103228a42afa71853b F ext/misc/uint.c 5870865fb5f6153db18db443f3ecdcdb17a06567ee47ecd9fd26e3ec7e5f6ce8 @@ -1863,7 +1863,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 d1ba026d882f070b351280028e2fa88a3cca59b46d4683302e24c6677e0951b9 -R 7709315ebf43ae93c1f9067b218a4e7c +P 729f2397358d0382e255ba0058bf70bc9ed410b7621a67466da13de437d3ba5c +R f257544101c08e8d7572c6768b674141 U drh -Z 0528b7b773900b4185d8554d4c89985c +Z a91554797ea77a37f7aa776de8214439 diff --git a/manifest.uuid b/manifest.uuid index c1e505413b..c9ebc3241e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -729f2397358d0382e255ba0058bf70bc9ed410b7621a67466da13de437d3ba5c \ No newline at end of file +838987b2097c4b7acaa65aea99cfdaf199f04d76bcf6ef12743c60b338a965f7 \ No newline at end of file From 8714de97c0137a02a885c8eba79701b22d59ff81 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 4 May 2020 19:42:35 +0000 Subject: [PATCH 058/103] Changes to avoid deadlock in SQLITE_ENABLE_SETLK_TIMEOUT builds. FossilOrigin-Name: 553423c23142cf0ec219192315d57ce8a0e10c3d8678d28bc110a1a9a7c17cee --- main.mk | 1 + manifest | 31 ++++--- manifest.uuid | 2 +- src/btree.c | 1 - src/main.c | 48 ++--------- src/pager.c | 20 ++--- src/pager.h | 9 +- src/sqliteInt.h | 1 - src/wal.c | 222 ++++++++++++++++++++++++++++-------------------- src/wal.h | 2 +- 10 files changed, 162 insertions(+), 175 deletions(-) diff --git a/main.mk b/main.mk index 04c54d74f4..654bd043f3 100644 --- a/main.mk +++ b/main.mk @@ -423,6 +423,7 @@ TESTSRC2 = \ $(TOP)/src/vdbeaux.c \ $(TOP)/src/vdbe.c \ $(TOP)/src/vdbemem.c \ + $(TOP)/src/vdbevtab.c \ $(TOP)/src/where.c \ $(TOP)/src/wherecode.c \ $(TOP)/src/whereexpr.c \ diff --git a/manifest b/manifest index be344da311..fdafb00a6b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\smaster-journal\sname\sis\sin\sa\sform\ssuitable\sto\sbe\spassed\ninto\ssqlite3_uri_parameter(). -D 2020-05-04T11:47:38.857 +C Changes\sto\savoid\sdeadlock\sin\sSQLITE_ENABLE_SETLK_TIMEOUT\sbuilds. +D 2020-05-04T19:42:35.009 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -455,7 +455,7 @@ F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 0c20162946c82e216ae3abab6334d52f1c9b09035c13619ade404b5e7fe3ce21 +F main.mk addd0a300e90ad090dc4a934df8a6f1b6c52c057a1aebb93682aed29fb68a345 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -474,7 +474,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 3383ad76753193c3529318ba30db41747663639428d2f6cb7cbcd8034d4a99cd +F src/btree.c 54d404ff88f1432fc056c638e4868fe66dac98cb0f89a6cae4bd6b636053af0f F src/btree.h 989ef3c33413549e3e148f3dcb46c030f317dac130dc86809ba6b9aa4b16c72a F src/btreeInt.h 887cdd2ea7f4a65143074a8a7c8928b0546f8c18dda3c06a408ce7992cbab0c0 F src/build.c ec6c0bda1e43ef55e5f5121a77ba19fac51fc6585f95ce2da795bcedcf6e8f36 @@ -497,7 +497,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 8e4211d04eb460c0694d486c6ba1c068d468c6f653c3f237869a802ad82854de F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 421310045bd78afefb772294a99e50f37d87ae578786a6169074e6291e30d969 -F src/main.c 7e07ff5ec447451d28398d528fda25c272f86cce67bc59a9846ee5bdfb23e1d9 +F src/main.c 28ec4d31a95affad6a6667762b55c28e67d43a195c33af03f98badc64158b916 F src/malloc.c a3e13b001f988ecec6bdb90c0ea8912c8c786e623724d7098da623d8d01d19b1 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -520,8 +520,8 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 7ef8b60222558a373d89c18d0c3bc44365b45273a528183d40bec5bb76ce23fc F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 52cee2f72710be47b5b13ff66b339ca3855e5bc48e92a94114d2affedc70041f -F src/pager.h 3b33619a90180e0874c7eca31d6f6ceb464d9322c6fb4e9a7bbb318c8a17bdb3 +F src/pager.c 8b5a3b3d12706a8692bf9b36ef0fb94029d855730f51e4615afddb9c7cc4b301 +F src/pager.h eaf8bd9b78f5033a480f66d3a9b5426d04ee352586ee75b9bc7cd50670f6a5b1 F src/parse.y c8eff38606f443d5ba245263fa7abc05e4116d95656e050c4b78e9bfbf931add F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 @@ -538,7 +538,7 @@ F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b F src/sqlite.h.in 00fdd0a9cdcb4ca3ea6aed8466a23e158c4a2feb5c2552de62c70f40d2418289 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h 1f6909cd268d1cda2f04914d150997b17afd8ff7e5cf1930cc1f88d337a49f74 +F src/sqliteInt.h 26de171e0adccf6e465434b9fcce18fcfcc757e9a727356b029fc1676639540c F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -617,8 +617,8 @@ F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143 F src/vdbevtab.c 8094dfc28dad82d60a1c832020a1b201a5381dc185c14638affc6d4e9d54c653 F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 8efa749ff1e84fb69127bdab1d0f3545afc1706f4dde6f19f2f6237d7dc9c2d2 -F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a +F src/wal.c b6c5fb152c9ed73017202b4ffda1ee97a8c6cc57a3596e29ab4b763207013d49 +F src/wal.h 642f7896526181a95dde213fe1a0a515899d8eb2fa7cb562f042b0637d11d3d7 F src/walker.c 7c429c694abd12413a5c17aec9f47cfe9eba6807e6b0a32df883e8e3a14835ed F src/where.c 9546c82056e8cdb27291f98cf1adca5d271240b399bb97b32f77fc2bea6146c9 F src/whereInt.h 6b874aa15f94e43a2cec1080be64d955b04deeafeac90ffb5d6975c0d511be3c @@ -1863,7 +1863,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 efdecb13091316aeac2722f58577cb0314e008e857f2816a2a222bac0a83e9e1 -R 6897970c2b5b2cca1a8fed26518d5a6e -U drh -Z ec3fad1620b6ab238b8dc4b9fa847a46 +P d1ba026d882f070b351280028e2fa88a3cca59b46d4683302e24c6677e0951b9 +R 7034fe62283804a1df8fc178d6719787 +T *branch * setlk-deadlock-changes +T *sym-setlk-deadlock-changes * +T -sym-trunk * +U dan +Z b3c62bfe3502546b0ce8fe477018d01b diff --git a/manifest.uuid b/manifest.uuid index 1cca894bf0..fdb4fc8030 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d1ba026d882f070b351280028e2fa88a3cca59b46d4683302e24c6677e0951b9 \ No newline at end of file +553423c23142cf0ec219192315d57ce8a0e10c3d8678d28bc110a1a9a7c17cee \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 7ad40ced71..76845e072a 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3467,7 +3467,6 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ } }while( (rc&0xFF)==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE && btreeInvokeBusyHandler(pBt) ); - sqlite3PagerResetLockTimeout(pBt->pPager); if( rc==SQLITE_OK ){ if( p->inTrans==TRANS_NONE ){ diff --git a/src/main.c b/src/main.c index 7322e28279..e386bb3848 100644 --- a/src/main.c +++ b/src/main.c @@ -1551,8 +1551,7 @@ const char *sqlite3ErrStr(int rc){ */ static int sqliteDefaultBusyCallback( void *ptr, /* Database connection */ - int count, /* Number of times table has been busy */ - sqlite3_file *pFile /* The file on which the lock occurred */ + int count /* Number of times table has been busy */ ){ #if SQLITE_OS_WIN || HAVE_USLEEP /* This case is for systems that have support for sleeping for fractions of @@ -1566,31 +1565,6 @@ static int sqliteDefaultBusyCallback( int tmout = db->busyTimeout; int delay, prior; -#ifdef SQLITE_ENABLE_SETLK_TIMEOUT - if( sqlite3OsFileControl(pFile,SQLITE_FCNTL_LOCK_TIMEOUT,&tmout)==SQLITE_OK ){ - if( count ){ - /* If this is the second or later invocation of the busy-handler, - ** but tmout==0, then code in wal.c must have disabled the blocking - ** lock before the SQLITE_BUSY error was hit. In this case, no delay - ** occurred while waiting for the lock, so fall through to the xSleep() - ** code below to delay a while before retrying the lock. - ** - ** Alternatively, if tmout!=0, then SQLite has already waited - ** sqlite3.busyTimeout ms for a lock. In this case, return 0 to - ** indicate that the lock should not be retried and the SQLITE_BUSY - ** error returned to the application. */ - if( tmout ){ - tmout = 0; - sqlite3OsFileControl(pFile, SQLITE_FCNTL_LOCK_TIMEOUT, &tmout); - return 0; - } - }else{ - return 1; - } - } -#else - UNUSED_PARAMETER(pFile); -#endif assert( count>=0 ); if( count < NDELAY ){ delay = delays[count]; @@ -1610,7 +1584,6 @@ static int sqliteDefaultBusyCallback( ** must be done in increments of whole seconds */ sqlite3 *db = (sqlite3 *)ptr; int tmout = ((sqlite3 *)ptr)->busyTimeout; - UNUSED_PARAMETER(pFile); if( (count+1)*1000 > tmout ){ return 0; } @@ -1631,16 +1604,7 @@ static int sqliteDefaultBusyCallback( int sqlite3InvokeBusyHandler(BusyHandler *p, sqlite3_file *pFile){ int rc; if( p->xBusyHandler==0 || p->nBusy<0 ) return 0; - if( p->bExtraFileArg ){ - /* Add an extra parameter with the pFile pointer to the end of the - ** callback argument list */ - int (*xTra)(void*,int,sqlite3_file*); - xTra = (int(*)(void*,int,sqlite3_file*))p->xBusyHandler; - rc = xTra(p->pBusyArg, p->nBusy, pFile); - }else{ - /* Legacy style busy handler callback */ - rc = p->xBusyHandler(p->pBusyArg, p->nBusy); - } + rc = p->xBusyHandler(p->pBusyArg, p->nBusy); if( rc==0 ){ p->nBusy = -1; }else{ @@ -1665,7 +1629,6 @@ int sqlite3_busy_handler( db->busyHandler.xBusyHandler = xBusy; db->busyHandler.pBusyArg = pArg; db->busyHandler.nBusy = 0; - db->busyHandler.bExtraFileArg = 0; db->busyTimeout = 0; sqlite3_mutex_leave(db->mutex); return SQLITE_OK; @@ -1716,7 +1679,6 @@ int sqlite3_busy_timeout(sqlite3 *db, int ms){ sqlite3_busy_handler(db, (int(*)(void*,int))sqliteDefaultBusyCallback, (void*)db); db->busyTimeout = ms; - db->busyHandler.bExtraFileArg = 1; }else{ sqlite3_busy_handler(db, 0, 0); } @@ -3359,7 +3321,7 @@ static int openDatabase( #endif #ifdef SQLITE_ENABLE_BYTECODE_VTAB - if( !db->mallocFailed && rc==SQLITE_OK){ + if( !db->mallocFailed && rc==SQLITE_OK ){ rc = sqlite3VdbeBytecodeVtabInit(db); } #endif @@ -4520,11 +4482,11 @@ int sqlite3_snapshot_open( rc = SQLITE_OK; } if( rc==SQLITE_OK ){ - rc = sqlite3PagerSnapshotOpen(pPager, pSnapshot); + rc = sqlite3PagerSnapshotOpen(pPager, db, pSnapshot); } if( rc==SQLITE_OK ){ rc = sqlite3BtreeBeginTrans(pBt, 0, 0); - sqlite3PagerSnapshotOpen(pPager, 0); + sqlite3PagerSnapshotOpen(pPager, 0, 0); } if( bUnlock ){ sqlite3PagerSnapshotUnlock(pPager); diff --git a/src/pager.c b/src/pager.c index 0d08a2dfaa..dd723b788d 100644 --- a/src/pager.c +++ b/src/pager.c @@ -5705,7 +5705,6 @@ void sqlite3PagerUnrefPageOne(DbPage *pPg){ assert( pPg->pgno==1 ); assert( (pPg->flags & PGHDR_MMAP)==0 ); /* Page1 is never memory mapped */ pPager = pPg->pPager; - sqlite3PagerResetLockTimeout(pPager); sqlite3PcacheRelease(pPg); pagerUnlockIfUnused(pPager); } @@ -6998,16 +6997,6 @@ sqlite3_file *sqlite3PagerFile(Pager *pPager){ return pPager->fd; } -#ifdef SQLITE_ENABLE_SETLK_TIMEOUT -/* -** Reset the lock timeout for pager. -*/ -void sqlite3PagerResetLockTimeout(Pager *pPager){ - int x = 0; - sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_LOCK_TIMEOUT, &x); -} -#endif - /* ** Return the file handle for the journal file (if it exists). ** This will be either the rollback journal or the WAL file. @@ -7421,7 +7410,6 @@ int sqlite3PagerCheckpoint( pPager->walSyncFlags, pPager->pageSize, (u8 *)pPager->pTmpSpace, pnLog, pnCkpt ); - sqlite3PagerResetLockTimeout(pPager); } return rc; } @@ -7606,10 +7594,14 @@ int sqlite3PagerSnapshotGet(Pager *pPager, sqlite3_snapshot **ppSnapshot){ ** read transaction is opened, attempt to read from the snapshot it ** identifies. If this is not a WAL database, return an error. */ -int sqlite3PagerSnapshotOpen(Pager *pPager, sqlite3_snapshot *pSnapshot){ +int sqlite3PagerSnapshotOpen( + Pager *pPager, + sqlite3 *db, + sqlite3_snapshot *pSnapshot +){ int rc = SQLITE_OK; if( pPager->pWal ){ - sqlite3WalSnapshotOpen(pPager->pWal, pSnapshot); + sqlite3WalSnapshotOpen(pPager->pWal, db, pSnapshot); }else{ rc = SQLITE_ERROR; } diff --git a/src/pager.h b/src/pager.h index 2c99d67a9b..a044daa18b 100644 --- a/src/pager.h +++ b/src/pager.h @@ -177,8 +177,8 @@ int sqlite3PagerSharedLock(Pager *pPager); int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen); int sqlite3PagerCloseWal(Pager *pPager, sqlite3*); # ifdef SQLITE_ENABLE_SNAPSHOT - int sqlite3PagerSnapshotGet(Pager *pPager, sqlite3_snapshot **ppSnapshot); - int sqlite3PagerSnapshotOpen(Pager *pPager, sqlite3_snapshot *pSnapshot); + int sqlite3PagerSnapshotGet(Pager*, sqlite3_snapshot **ppSnapshot); + int sqlite3PagerSnapshotOpen(Pager*, sqlite3*, sqlite3_snapshot *pSnapshot); int sqlite3PagerSnapshotRecover(Pager *pPager); int sqlite3PagerSnapshotCheck(Pager *pPager, sqlite3_snapshot *pSnapshot); void sqlite3PagerSnapshotUnlock(Pager *pPager); @@ -210,11 +210,6 @@ int sqlite3PagerIsMemdb(Pager*); void sqlite3PagerCacheStat(Pager *, int, int, int *); void sqlite3PagerClearCache(Pager*); int sqlite3SectorSize(sqlite3_file *); -#ifdef SQLITE_ENABLE_SETLK_TIMEOUT -void sqlite3PagerResetLockTimeout(Pager *pPager); -#else -# define sqlite3PagerResetLockTimeout(X) -#endif /* Functions used to truncate the database file. */ void sqlite3PagerTruncateImage(Pager*,Pgno); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 4a78d0cfda..b01f323935 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -994,7 +994,6 @@ struct BusyHandler { int (*xBusyHandler)(void *,int); /* The busy callback */ void *pBusyArg; /* First arg to busy callback */ int nBusy; /* Incremented with each busy call */ - u8 bExtraFileArg; /* Include sqlite3_file as callback arg */ }; /* diff --git a/src/wal.c b/src/wal.c index b230858599..020a481e28 100644 --- a/src/wal.c +++ b/src/wal.c @@ -466,6 +466,9 @@ struct Wal { #endif #ifdef SQLITE_ENABLE_SNAPSHOT WalIndexHdr *pSnapshot; /* Start transaction here if not NULL */ +# ifdef SQLITE_ENABLE_SETLK_TIMEOUT + sqlite3 *dbSnapshot; +# endif #endif }; @@ -1128,11 +1131,6 @@ static int walIndexRecover(Wal *pWal){ u32 aFrameCksum[2] = {0, 0}; int iLock; /* Lock offset to lock for checkpoint */ -#ifdef SQLITE_ENABLE_SETLK_TIMEOUT - int tmout = 0; - sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout); -#endif - /* 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. @@ -2750,22 +2748,45 @@ int sqlite3WalSnapshotRecover(Wal *pWal){ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ int rc; /* Return code */ int cnt = 0; /* Number of TryBeginRead attempts */ -#ifdef SQLITE_ENABLE_SETLK_TIMEOUT - int tmout = 0; -#endif + #ifdef SQLITE_ENABLE_SNAPSHOT int bChanged = 0; WalIndexHdr *pSnapshot = pWal->pSnapshot; - if( pSnapshot && memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){ - bChanged = 1; - } + if( pSnapshot ){ +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + int busyTimeout = pWal->dbSnapshot->busyTimeout; + if( busyTimeout ){ + int tmout = busyTimeout; + sqlite3OsFileControl(pWal->pDbFd,SQLITE_FCNTL_LOCK_TIMEOUT,(void*)&tmout); + } #endif + if( memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){ + bChanged = 1; + } + + /* It is possible that there is a checkpointer thread running + ** concurrent with this code. If this is the case, it may be that the + ** checkpointer has already determined that it will checkpoint + ** snapshot X, where X is later in the wal file than pSnapshot, but + ** has not yet set the pInfo->nBackfillAttempted variable to indicate + ** its intent. To avoid the race condition this leads to, ensure that + ** there is no checkpointer process by taking a shared CKPT lock + ** before checking pInfo->nBackfillAttempted. */ + rc = walLockShared(pWal, WAL_CKPT_LOCK); + #ifdef SQLITE_ENABLE_SETLK_TIMEOUT - /* Disable blocking locks. They are not useful when trying to open a - ** read-transaction, and blocking may cause deadlock anyway. */ - sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout); + if( busyTimeout ){ + int tmout = 0; + sqlite3OsFileControl(pWal->pDbFd,SQLITE_FCNTL_LOCK_TIMEOUT,(void*)&tmout); + } +#endif + + if( rc!=SQLITE_OK ){ + return rc; + } + } #endif do{ @@ -2776,16 +2797,6 @@ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ testcase( rc==SQLITE_PROTOCOL ); testcase( rc==SQLITE_OK ); -#ifdef SQLITE_ENABLE_SETLK_TIMEOUT - /* If they were disabled earlier and the read-transaction has been - ** successfully opened, re-enable blocking locks. This is because the - ** connection may attempt to upgrade to a write-transaction, which does - ** benefit from using blocking locks. */ - if( rc==SQLITE_OK ){ - sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout); - } -#endif - #ifdef SQLITE_ENABLE_SNAPSHOT if( rc==SQLITE_OK ){ if( pSnapshot && memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){ @@ -2807,48 +2818,40 @@ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ assert( pWal->readLock>0 || pWal->hdr.mxFrame==0 ); assert( pInfo->aReadMark[pWal->readLock]<=pSnapshot->mxFrame ); - /* It is possible that there is a checkpointer thread running - ** concurrent with this code. If this is the case, it may be that the - ** checkpointer has already determined that it will checkpoint - ** snapshot X, where X is later in the wal file than pSnapshot, but - ** has not yet set the pInfo->nBackfillAttempted variable to indicate - ** its intent. To avoid the race condition this leads to, ensure that - ** there is no checkpointer process by taking a shared CKPT lock - ** before checking pInfo->nBackfillAttempted. - ** - ** TODO: Does the aReadMark[] lock prevent a checkpointer from doing - ** this already? - */ - rc = walLockShared(pWal, WAL_CKPT_LOCK); - - if( rc==SQLITE_OK ){ - /* Check that the wal file has not been wrapped. Assuming that it has - ** not, also check that no checkpointer has attempted to checkpoint any - ** frames beyond pSnapshot->mxFrame. If either of these conditions are - ** true, return SQLITE_ERROR_SNAPSHOT. Otherwise, overwrite pWal->hdr - ** with *pSnapshot and set *pChanged as appropriate for opening the - ** snapshot. */ - if( !memcmp(pSnapshot->aSalt, pWal->hdr.aSalt, sizeof(pWal->hdr.aSalt)) - && pSnapshot->mxFrame>=pInfo->nBackfillAttempted - ){ - assert( pWal->readLock>0 ); - memcpy(&pWal->hdr, pSnapshot, sizeof(WalIndexHdr)); - *pChanged = bChanged; - }else{ - rc = SQLITE_ERROR_SNAPSHOT; - } - - /* Release the shared CKPT lock obtained above. */ - walUnlockShared(pWal, WAL_CKPT_LOCK); - pWal->minFrame = 1; + /* Check that the wal file has not been wrapped. Assuming that it has + ** not, also check that no checkpointer has attempted to checkpoint any + ** frames beyond pSnapshot->mxFrame. If either of these conditions are + ** true, return SQLITE_ERROR_SNAPSHOT. Otherwise, overwrite pWal->hdr + ** with *pSnapshot and set *pChanged as appropriate for opening the + ** snapshot. */ + if( !memcmp(pSnapshot->aSalt, pWal->hdr.aSalt, sizeof(pWal->hdr.aSalt)) + && pSnapshot->mxFrame>=pInfo->nBackfillAttempted + ){ + assert( pWal->readLock>0 ); + memcpy(&pWal->hdr, pSnapshot, sizeof(WalIndexHdr)); + *pChanged = bChanged; + }else{ + rc = SQLITE_ERROR_SNAPSHOT; } + /* A client using a non-current snapshot may not ignore any frames + ** from the start of the wal file. This is because, for a system + ** where (minFrame < iSnapshot < maxFrame), a checkpointer may + ** have omitted to checkpoint a frame earlier than minFrame in + ** the file because there exists a frame after iSnapshot that + ** is the same database page. */ + pWal->minFrame = 1; if( rc!=SQLITE_OK ){ sqlite3WalEndReadTransaction(pWal); } } } + + /* Release the shared CKPT lock obtained above. */ + if( pSnapshot ){ + walUnlockShared(pWal, WAL_CKPT_LOCK); + } #endif return rc; } @@ -3584,6 +3587,9 @@ int sqlite3WalCheckpoint( int isChanged = 0; /* True if a new wal-index header is loaded */ int eMode2 = eMode; /* Mode to pass to walCheckpoint() */ int (*xBusy2)(void*) = xBusy; /* Busy handler for eMode2 */ +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + int bSetLk = 0; +#endif assert( pWal->ckptLock==0 ); assert( pWal->writeLock==0 ); @@ -3595,41 +3601,54 @@ int sqlite3WalCheckpoint( if( pWal->readOnly ) return SQLITE_READONLY; WALTRACE(("WAL%p: checkpoint begins\n", pWal)); - /* IMPLEMENTATION-OF: R-62028-47212 All calls obtain an exclusive - ** "checkpoint" lock on the database file. */ - rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1); - if( rc ){ - /* EVIDENCE-OF: R-10421-19736 If any other process is running a - ** checkpoint operation at the same time, the lock cannot be obtained and - ** SQLITE_BUSY is returned. - ** EVIDENCE-OF: R-53820-33897 Even if there is a busy-handler configured, - ** it will not be invoked in this case. - */ - testcase( rc==SQLITE_BUSY ); - testcase( xBusy!=0 ); - return rc; - } - pWal->ckptLock = 1; - - /* IMPLEMENTATION-OF: R-59782-36818 The SQLITE_CHECKPOINT_FULL, RESTART and - ** TRUNCATE modes also obtain the exclusive "writer" lock on the database - ** file. - ** - ** EVIDENCE-OF: R-60642-04082 If the writer lock cannot be obtained - ** immediately, and a busy-handler is configured, it is invoked and the - ** writer lock retried until either the busy-handler returns 0 or the - ** lock is successfully obtained. - */ - if( eMode!=SQLITE_CHECKPOINT_PASSIVE ){ - rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_WRITE_LOCK, 1); - if( rc==SQLITE_OK ){ - pWal->writeLock = 1; - }else if( rc==SQLITE_BUSY ){ - eMode2 = SQLITE_CHECKPOINT_PASSIVE; +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + if( db->busyTimeout ){ + int tmout = db->busyTimeout; + sqlite3_file *fd = pWal->pDbFd; + if( SQLITE_OK== + sqlite3OsFileControl(fd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout) + ){ xBusy2 = 0; - rc = SQLITE_OK; + bSetLk = 1; } } +#endif + + /* IMPLEMENTATION-OF: R-62028-47212 All calls obtain an exclusive + ** "checkpoint" lock on the database file. + ** EVIDENCE-OF: R-10421-19736 If any other process is running a + ** checkpoint operation at the same time, the lock cannot be obtained and + ** SQLITE_BUSY is returned. + ** EVIDENCE-OF: R-53820-33897 Even if there is a busy-handler configured, + ** it will not be invoked in this case. + */ + rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1); + testcase( rc==SQLITE_BUSY ); + testcase( rc!=SQLITE_OK && xBusy2!=0 ); + if( rc==SQLITE_OK ){ + pWal->ckptLock = 1; + + /* IMPLEMENTATION-OF: R-59782-36818 The SQLITE_CHECKPOINT_FULL, RESTART and + ** TRUNCATE modes also obtain the exclusive "writer" lock on the database + ** file. + ** + ** EVIDENCE-OF: R-60642-04082 If the writer lock cannot be obtained + ** immediately, and a busy-handler is configured, it is invoked and the + ** writer lock retried until either the busy-handler returns 0 or the + ** lock is successfully obtained. + */ + if( eMode!=SQLITE_CHECKPOINT_PASSIVE ){ + rc = walBusyLock(pWal, xBusy2, pBusyArg, WAL_WRITE_LOCK, 1); + if( rc==SQLITE_OK ){ + pWal->writeLock = 1; + }else if( rc==SQLITE_BUSY ){ + eMode2 = SQLITE_CHECKPOINT_PASSIVE; + xBusy2 = 0; + rc = SQLITE_OK; + } + } + } + /* Read the wal-index header. */ if( rc==SQLITE_OK ){ @@ -3665,10 +3684,20 @@ int sqlite3WalCheckpoint( memset(&pWal->hdr, 0, sizeof(WalIndexHdr)); } +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + if( bSetLk ){ + int tmout = 0; + sqlite3_file *fd = pWal->pDbFd; + sqlite3OsFileControl(fd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout); + } +#endif + /* Release the locks. */ sqlite3WalEndWriteTransaction(pWal); - walUnlockExclusive(pWal, WAL_CKPT_LOCK, 1); - pWal->ckptLock = 0; + if( pWal->ckptLock ){ + walUnlockExclusive(pWal, WAL_CKPT_LOCK, 1); + pWal->ckptLock = 0; + } WALTRACE(("WAL%p: checkpoint %s\n", pWal, rc ? "failed" : "ok")); return (rc==SQLITE_OK && eMode!=eMode2 ? SQLITE_BUSY : rc); } @@ -3786,8 +3815,15 @@ int sqlite3WalSnapshotGet(Wal *pWal, sqlite3_snapshot **ppSnapshot){ /* Try to open on pSnapshot when the next read-transaction starts */ -void sqlite3WalSnapshotOpen(Wal *pWal, sqlite3_snapshot *pSnapshot){ +void sqlite3WalSnapshotOpen( + Wal *pWal, + sqlite3 *db, + sqlite3_snapshot *pSnapshot +){ pWal->pSnapshot = (WalIndexHdr*)pSnapshot; +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + pWal->dbSnapshot = db; +#endif } /* diff --git a/src/wal.h b/src/wal.h index 1610607481..bebd643700 100644 --- a/src/wal.h +++ b/src/wal.h @@ -130,7 +130,7 @@ int sqlite3WalHeapMemory(Wal *pWal); #ifdef SQLITE_ENABLE_SNAPSHOT int sqlite3WalSnapshotGet(Wal *pWal, sqlite3_snapshot **ppSnapshot); -void sqlite3WalSnapshotOpen(Wal *pWal, sqlite3_snapshot *pSnapshot); +void sqlite3WalSnapshotOpen(Wal *pWal, sqlite3*, sqlite3_snapshot *pSnapshot); int sqlite3WalSnapshotRecover(Wal *pWal); int sqlite3WalSnapshotCheck(Wal *pWal, sqlite3_snapshot *pSnapshot); void sqlite3WalSnapshotUnlock(Wal *pWal); From 3d42fb788ab2be01b891dba61b380c819117e12b Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 4 May 2020 19:52:00 +0000 Subject: [PATCH 059/103] Fix harmless compiler warnings. FossilOrigin-Name: 8eee591d3cb9fadfd5cac5543bd66ef9cb371a72d3ad3241fb3bfd67fb216eda --- ext/misc/uint.c | 1 + manifest | 14 +++++++------- manifest.uuid | 2 +- src/analyze.c | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/ext/misc/uint.c b/ext/misc/uint.c index 12982c2a20..286314fefa 100644 --- a/ext/misc/uint.c +++ b/ext/misc/uint.c @@ -45,6 +45,7 @@ static int uintCollFunc( const unsigned char *zA = (const unsigned char*)pKey1; const unsigned char *zB = (const unsigned char*)pKey2; int i=0, j=0, x; + (void)notUsed; while( inLimit && p->nRow>p->nLimit*(p->nSkipAhead+1) ){ + if( p->nLimit && p->nRow>(tRowcnt)p->nLimit*(p->nSkipAhead+1) ){ p->nSkipAhead++; sqlite3_result_int(context, p->current.anDLt[0]>0); } From eb8305bbc724cea443997194514eacf5b626923c Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 5 May 2020 13:41:40 +0000 Subject: [PATCH 060/103] Fix a compiler warning in cksumvfs.c. FossilOrigin-Name: 68033bcade87e6046f4c0a49936d63ce531c680c1def98fae02afa0c79db2c7f --- ext/misc/cksumvfs.c | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/misc/cksumvfs.c b/ext/misc/cksumvfs.c index 2ea5a67c85..2cc8148b2e 100644 --- a/ext/misc/cksumvfs.c +++ b/ext/misc/cksumvfs.c @@ -412,7 +412,7 @@ static int cksmRead( ){ u8 cksum[8]; cksmCompute((u8*)zBuf, iAmt-8, cksum); - if( memcmp(zBuf+iAmt-8, cksum, 8)!=0 ){ + if( memcmp((u8*)zBuf+iAmt-8, cksum, 8)!=0 ){ sqlite3_log(SQLITE_IOERR_DATA, "checksum fault offset %lld of \"%s\"", iOfst, p->zFName); diff --git a/manifest b/manifest index d0d4ba9de4..9d06ffcfe5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings. -D 2020-05-04T19:52:00.436 +C Fix\sa\scompiler\swarning\sin\scksumvfs.c. +D 2020-05-05T13:41:40.704 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -285,7 +285,7 @@ F ext/misc/appendvfs.c 3777f22ec1057dc4e5fd89f2fbddcc7a29fbeef1ad038c736c54411bb F ext/misc/blobio.c a867c4c4617f6ec223a307ebfe0eabb45e0992f74dd47722b96f3e631c0edb2a F ext/misc/btreeinfo.c 26004b7a6be320ec08fc20ca8d0f01fccb00a98cbe0f3197446794ff2a506aa3 F ext/misc/carray.c 91e9a7f512fda934894bed30464552fffa7d3073b5be04189ae0bd0c59f26bfd -F ext/misc/cksumvfs.c bdbdf15edd52ed96014122745b445d2c05c968b017f36597990e5670c1b498eb +F ext/misc/cksumvfs.c b0d07f2e1bb08f8b6f311f4e454360b6a7f0021912c326428d74900020f29c31 F ext/misc/closure.c dbfd8543b2a017ae6b1a5843986b22ddf99ff126ec9634a2f4047cd14c85c243 F ext/misc/completion.c a0efe03edfdc4f717c61e6c9b0bfe2708ff7878010dae3174980a68fdf76aabc F ext/misc/compress.c 3354c77a7c8e86e07d849916000cdac451ed96500bfb5bd83b20eb61eee012c9 @@ -1863,7 +1863,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 838987b2097c4b7acaa65aea99cfdaf199f04d76bcf6ef12743c60b338a965f7 -R 7528e6e65e1227864f6158b5b66e2ec7 +P 8eee591d3cb9fadfd5cac5543bd66ef9cb371a72d3ad3241fb3bfd67fb216eda +R afcf8b7e7e20493ca7ba128dc1fe337f U drh -Z c3bca82c00fbb5a923f61439de0de93c +Z a5e6ff175b3811c6e381211269bc5a9b diff --git a/manifest.uuid b/manifest.uuid index 19ebb523c2..a2f1db6712 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8eee591d3cb9fadfd5cac5543bd66ef9cb371a72d3ad3241fb3bfd67fb216eda \ No newline at end of file +68033bcade87e6046f4c0a49936d63ce531c680c1def98fae02afa0c79db2c7f \ No newline at end of file From 85bd353ac2dcfab05b6c249aeb9b1ad6f182cab3 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 5 May 2020 18:42:49 +0000 Subject: [PATCH 061/103] Earlier detection of index corruption caused by missing index entries. FossilOrigin-Name: f339f31f9e9a856b576f99c5230fdf6d60fdc2873e48cb5aa0a4ab1d04e3c930 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/delete.c | 1 + src/sqlite.h.in | 1 + src/vdbe.c | 13 +++++++++++-- 5 files changed, 22 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 9d06ffcfe5..06247f5c9b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scompiler\swarning\sin\scksumvfs.c. -D 2020-05-05T13:41:40.704 +C Earlier\sdetection\sof\sindex\scorruption\scaused\sby\smissing\sindex\sentries. +D 2020-05-05T18:42:49.954 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -484,7 +484,7 @@ F src/ctime.c e98518d2d3d4029a13c805e07313fb60c877be56db76e90dd5f3af73085d0ce6 F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f -F src/delete.c 11000121c4281c0bce4e41db29addfaea0038eaa127ece02557c9207bc3e541d +F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4 F src/expr.c d1e1d42cbdec08bb867a1ab43a59b401d82ff2bc88bdcb4af20e479a5facb6d8 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 @@ -535,7 +535,7 @@ F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 1720bff2168491ca79af81a03bd18c0383f61d845c6e17caff9d25aabc4ab435 F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b6 -F src/sqlite.h.in 00fdd0a9cdcb4ca3ea6aed8466a23e158c4a2feb5c2552de62c70f40d2418289 +F src/sqlite.h.in fa97fb128377b8fd8398a498eda3d48646b08519c4176adb1457243fdc5bb09a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 F src/sqliteInt.h 1f6909cd268d1cda2f04914d150997b17afd8ff7e5cf1930cc1f88d337a49f74 @@ -605,7 +605,7 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7 F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 F src/vacuum.c f25d3b39681595e321a8a4e7fca3e5971cb14a401213d0742c9bf7d4ce8c2a1a -F src/vdbe.c f55fe7dbffae72e1cd5861e9ea3b55d50b70d863eebce3aebf11e1271ceae796 +F src/vdbe.c e3dba0dee25bc92e871c13cac655260912b3be4abcc85b439259c9934b208da3 F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 F src/vdbeInt.h 571413068b5ac07e2ed8ca7a02fa529622fd5455ae6981498376e5e492d2e5ef F src/vdbeapi.c d176ee7251d5344de7bb2a0d2dd0fe536834e5843d9bc2389e0f5cdcd5374141 @@ -1863,7 +1863,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 8eee591d3cb9fadfd5cac5543bd66ef9cb371a72d3ad3241fb3bfd67fb216eda -R afcf8b7e7e20493ca7ba128dc1fe337f +P 68033bcade87e6046f4c0a49936d63ce531c680c1def98fae02afa0c79db2c7f +R 734cddd2652c965c7a46f95471ccd83f U drh -Z a5e6ff175b3811c6e381211269bc5a9b +Z 25ffd105f0b4f1cd99e583fc05bf214f diff --git a/manifest.uuid b/manifest.uuid index a2f1db6712..fb6f100e45 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -68033bcade87e6046f4c0a49936d63ce531c680c1def98fae02afa0c79db2c7f \ No newline at end of file +f339f31f9e9a856b576f99c5230fdf6d60fdc2873e48cb5aa0a4ab1d04e3c930 \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index 60efc9d569..141efa5940 100644 --- a/src/delete.c +++ b/src/delete.c @@ -858,6 +858,7 @@ void sqlite3GenerateRowIndexDelete( &iPartIdxLabel, pPrior, r1); sqlite3VdbeAddOp3(v, OP_IdxDelete, iIdxCur+i, r1, pIdx->uniqNotNull ? pIdx->nKeyCol : pIdx->nColumn); + sqlite3VdbeChangeP5(v, 1); /* Cause IdxDelete to error if no entry found */ sqlite3ResolvePartIdxLabel(pParse, iPartIdxLabel); pPrior = pIdx; } diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 5c082623ce..aa0ac9b0ff 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -516,6 +516,7 @@ int sqlite3_exec( #define SQLITE_CANTOPEN_SYMLINK (SQLITE_CANTOPEN | (6<<8)) #define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) #define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8)) +#define SQLITE_CORRUPT_INDEX (SQLITE_CORRUPT | (3<<8)) #define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) #define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) #define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8)) diff --git a/src/vdbe.c b/src/vdbe.c index 69055d9161..ce96439d1e 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -5652,12 +5652,19 @@ case OP_SorterInsert: { /* in2 */ break; } -/* Opcode: IdxDelete P1 P2 P3 * * +/* Opcode: IdxDelete P1 P2 P3 * P5 ** Synopsis: key=r[P2@P3] ** ** The content of P3 registers starting at register P2 form ** an unpacked index key. This opcode removes that entry from the ** index opened by cursor P1. +** +** If P5 is not zero, then raise an SQLITE_CORRUPT_INDEX error +** if no matching index entry is found. This happens when running +** an UPDATE or DELETE statement and the index entry to be updated +** or deleted is not found. For some uses of IdxDelete +** (example: the EXCEPT operator) it does not matter that no matching +** entry is found. For those cases, P5 is zero. */ case OP_IdxDelete: { VdbeCursor *pC; @@ -5674,7 +5681,6 @@ case OP_IdxDelete: { sqlite3VdbeIncrWriteCounter(p, pC); pCrsr = pC->uc.pCursor; assert( pCrsr!=0 ); - assert( pOp->p5==0 ); r.pKeyInfo = pC->pKeyInfo; r.nField = (u16)pOp->p3; r.default_rc = 0; @@ -5684,6 +5690,9 @@ case OP_IdxDelete: { if( res==0 ){ rc = sqlite3BtreeDelete(pCrsr, BTREE_AUXDELETE); if( rc ) goto abort_due_to_error; + }else if( pOp->p5 ){ + rc = SQLITE_CORRUPT_INDEX; + goto abort_due_to_error; } assert( pC->deferredMoveto==0 ); pC->cacheStatus = CACHE_STALE; From fde259250327c28c75e201406f1b85f6f1ef7670 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 5 May 2020 19:54:02 +0000 Subject: [PATCH 062/103] The only known path to a corruption detection branch was cut off by the previous commit implementing earlier index corruption. So make the branch NEVER. Maybe a fuzzer will find a new path. FossilOrigin-Name: 9a84d8eb44b12ddea921baa73ac3bffa8c8d23a852605dc1dbde37907360bd79 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 06247f5c9b..abd24d10c6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Earlier\sdetection\sof\sindex\scorruption\scaused\sby\smissing\sindex\sentries. -D 2020-05-05T18:42:49.954 +C The\sonly\sknown\spath\sto\sa\scorruption\sdetection\sbranch\swas\scut\soff\sby\sthe\nprevious\scommit\simplementing\searlier\sindex\scorruption.\s\sSo\smake\sthe\sbranch\nNEVER.\s\sMaybe\sa\sfuzzer\swill\sfind\sa\snew\spath. +D 2020-05-05T19:54:02.670 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 3383ad76753193c3529318ba30db41747663639428d2f6cb7cbcd8034d4a99cd +F src/btree.c 079ae87477d0d6c9c072b7f1b326e18131d14d486dc3ab729bd9be0f40d31b63 F src/btree.h 989ef3c33413549e3e148f3dcb46c030f317dac130dc86809ba6b9aa4b16c72a F src/btreeInt.h 887cdd2ea7f4a65143074a8a7c8928b0546f8c18dda3c06a408ce7992cbab0c0 F src/build.c ec6c0bda1e43ef55e5f5121a77ba19fac51fc6585f95ce2da795bcedcf6e8f36 @@ -1863,7 +1863,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 68033bcade87e6046f4c0a49936d63ce531c680c1def98fae02afa0c79db2c7f -R 734cddd2652c965c7a46f95471ccd83f +P f339f31f9e9a856b576f99c5230fdf6d60fdc2873e48cb5aa0a4ab1d04e3c930 +R fb89f805264b8e2129b7b9be6c16f034 U drh -Z 25ffd105f0b4f1cd99e583fc05bf214f +Z 05849c7dc6493e9e337f69ee2000aae8 diff --git a/manifest.uuid b/manifest.uuid index fb6f100e45..304a2d9e28 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f339f31f9e9a856b576f99c5230fdf6d60fdc2873e48cb5aa0a4ab1d04e3c930 \ No newline at end of file +9a84d8eb44b12ddea921baa73ac3bffa8c8d23a852605dc1dbde37907360bd79 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 7ad40ced71..0e1f7a2dcf 100644 --- a/src/btree.c +++ b/src/btree.c @@ -7155,7 +7155,7 @@ static int editPage( assert( nCell>=0 ); if( iOldnCell ) return SQLITE_CORRUPT_BKPT; + if( NEVER(nShift>nCell) ) return SQLITE_CORRUPT_BKPT; memmove(pPg->aCellIdx, &pPg->aCellIdx[nShift*2], nCell*2); nCell -= nShift; } From 58021b237ae7e84069aaa564c0b6834a23296aed Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 5 May 2020 20:30:07 +0000 Subject: [PATCH 063/103] Unless upgrading an existing read transaction, have ENABLE_SETLK_TIMEOUT builds attempt to use a blocking lock when opening a write transaction on a wal mode database. FossilOrigin-Name: d6f819a9e6b35f3fd558bd93255a6a24ad690a0fa15a82b009ca9c641db983c6 --- manifest | 27 ++++++------ manifest.uuid | 2 +- src/btree.c | 15 ++++++- src/os_unix.c | 18 ++++---- src/pager.c | 16 ++++++- src/pager.h | 6 +++ src/wal.c | 114 ++++++++++++++++++++++++++++++++++---------------- src/wal.h | 4 ++ test/wal.test | 1 + 9 files changed, 140 insertions(+), 63 deletions(-) diff --git a/manifest b/manifest index fdafb00a6b..8d829988c3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Changes\sto\savoid\sdeadlock\sin\sSQLITE_ENABLE_SETLK_TIMEOUT\sbuilds. -D 2020-05-04T19:42:35.009 +C Unless\supgrading\san\sexisting\sread\stransaction,\shave\sENABLE_SETLK_TIMEOUT\sbuilds\sattempt\sto\suse\sa\sblocking\slock\swhen\sopening\sa\swrite\stransaction\son\sa\swal\smode\sdatabase. +D 2020-05-05T20:30:07.254 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 54d404ff88f1432fc056c638e4868fe66dac98cb0f89a6cae4bd6b636053af0f +F src/btree.c 2a152165efcbde2a0df808705cb44b8d2588440f0a9ebcbe534ca95843c10355 F src/btree.h 989ef3c33413549e3e148f3dcb46c030f317dac130dc86809ba6b9aa4b16c72a F src/btreeInt.h 887cdd2ea7f4a65143074a8a7c8928b0546f8c18dda3c06a408ce7992cbab0c0 F src/build.c ec6c0bda1e43ef55e5f5121a77ba19fac51fc6585f95ce2da795bcedcf6e8f36 @@ -517,11 +517,11 @@ 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 7ef8b60222558a373d89c18d0c3bc44365b45273a528183d40bec5bb76ce23fc +F src/os_unix.c daabdb3c33ef4a6b49ff6809968af2f8c0d3c5811bc654d74375f015180235aa F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 8b5a3b3d12706a8692bf9b36ef0fb94029d855730f51e4615afddb9c7cc4b301 -F src/pager.h eaf8bd9b78f5033a480f66d3a9b5426d04ee352586ee75b9bc7cd50670f6a5b1 +F src/pager.c be4d6d58df5c5d02b84547fd253a80f035ea2ee53931a5393d96af0ba3f04edb +F src/pager.h 5e2c0e5bd32aa4ae6c25eda2722490bb3f671f24d2e5d665d33df13285c1d520 F src/parse.y c8eff38606f443d5ba245263fa7abc05e4116d95656e050c4b78e9bfbf931add F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 @@ -617,8 +617,8 @@ F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143 F src/vdbevtab.c 8094dfc28dad82d60a1c832020a1b201a5381dc185c14638affc6d4e9d54c653 F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c b6c5fb152c9ed73017202b4ffda1ee97a8c6cc57a3596e29ab4b763207013d49 -F src/wal.h 642f7896526181a95dde213fe1a0a515899d8eb2fa7cb562f042b0637d11d3d7 +F src/wal.c 4099109dcf2b302e0d151e6fa0678d9bbc3eb923b8bd13a3cd07db0e7df5016b +F src/wal.h 484890eaaefb89c0f2043ae34c20bf367383f201f63da631ecae424797a7f60d F src/walker.c 7c429c694abd12413a5c17aec9f47cfe9eba6807e6b0a32df883e8e3a14835ed F src/where.c 9546c82056e8cdb27291f98cf1adca5d271240b399bb97b32f77fc2bea6146c9 F src/whereInt.h 6b874aa15f94e43a2cec1080be64d955b04deeafeac90ffb5d6975c0d511be3c @@ -1658,7 +1658,7 @@ F test/vtab_alter.test 736e66fb5ec7b4fee58229aa3ada2f27ec58bc58c00edae4836890c37 F test/vtab_err.test dcc8b7b9cb67522b3fe7a272c73856829dae4ab7fdb30399aea1b6981bda2b65 F test/vtab_shared.test 5253bff2355a9a3f014c15337da7e177ab0ef8ad F test/vtabdrop.test 65d4cf6722972e5499bdaf0c0d70ee3b8133944a4e4bc31862563f32a7edca12 -F test/wal.test cdf0ca6cc0447520d19ef1c83287824ebeb3e82d75af856511ba96841a79fc9b +F test/wal.test 16180bc4becda176428ad02eaea437b4b8f5ae099314de443a4e12b2dcc007a2 F test/wal2.test 537f59e5c5932e3b45bf3591ae3e48a2601360c2e52821b633e222fe6ebd5b09 F test/wal3.test 2a93004bc0fb2b5c29888964024695bade278ab2 F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c @@ -1863,10 +1863,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 d1ba026d882f070b351280028e2fa88a3cca59b46d4683302e24c6677e0951b9 -R 7034fe62283804a1df8fc178d6719787 -T *branch * setlk-deadlock-changes -T *sym-setlk-deadlock-changes * -T -sym-trunk * +P 553423c23142cf0ec219192315d57ce8a0e10c3d8678d28bc110a1a9a7c17cee +R aa33971255c5eac84a2aa86cb20ae159 U dan -Z b3c62bfe3502546b0ce8fe477018d01b +Z dc53b638850c8fa914d5b99111645e25 diff --git a/manifest.uuid b/manifest.uuid index fdb4fc8030..2f292c1a11 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -553423c23142cf0ec219192315d57ce8a0e10c3d8678d28bc110a1a9a7c17cee \ No newline at end of file +d6f819a9e6b35f3fd558bd93255a6a24ad690a0fa15a82b009ca9c641db983c6 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 76845e072a..3b8d0529ce 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3437,6 +3437,18 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ pBt->btsFlags &= ~BTS_INITIALLY_EMPTY; if( pBt->nPage==0 ) pBt->btsFlags |= BTS_INITIALLY_EMPTY; do { + Pager *pPager = pBt->pPager; + +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + /* If transitioning from no transaction directly to a write transaction, + ** block for the WRITER lock first if possible. */ + if( pBt->pPage1==0 && wrflag ){ + assert( pBt->inTransaction==TRANS_NONE ); + rc = sqlite3PagerWalWriteLock(p->db, pPager, 1); + if( rc!=SQLITE_OK ) break; + } +#endif + /* Call lockBtree() until either pBt->pPage1 is populated or ** lockBtree() returns something other than SQLITE_OK. lockBtree() ** may return SQLITE_OK but leave pBt->pPage1 set to 0 if after @@ -3450,7 +3462,7 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ if( (pBt->btsFlags & BTS_READ_ONLY)!=0 ){ rc = SQLITE_READONLY; }else{ - rc = sqlite3PagerBegin(pBt->pPager,wrflag>1,sqlite3TempInMemory(p->db)); + rc = sqlite3PagerBegin(pPager, wrflag>1, sqlite3TempInMemory(p->db)); if( rc==SQLITE_OK ){ rc = newDatabase(pBt); }else if( rc==SQLITE_BUSY_SNAPSHOT && pBt->inTransaction==TRANS_NONE ){ @@ -3463,6 +3475,7 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ } if( rc!=SQLITE_OK ){ + sqlite3PagerWalWriteLock(p->db, pPager, 0); unlockBtreeIfUnused(pBt); } }while( (rc&0xFF)==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE && diff --git a/src/os_unix.c b/src/os_unix.c index 56e53929ea..e1ed575b01 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -4819,22 +4819,24 @@ static int unixShmLock( assert( pShmNode->hShm>=0 || pDbFd->pInode->bProcessLock==1 ); assert( pShmNode->hShm<0 || pDbFd->pInode->bProcessLock==0 ); - /* Check that, if this to be a blocking lock, that locks have been - ** obtained in the following order. + /* Check that, if this to be a blocking lock, no locks that occur later + ** in the following list than the lock being obtained are already held: ** ** 1. Checkpointer lock (ofst==1). - ** 2. Recover lock (ofst==2). + ** 2. Write lock (ofst==0). ** 3. Read locks (ofst>=3 && ofstiBusyTimeout==0 - || (flags & SQLITE_SHM_UNLOCK) || ofst==0 - || ((p->exclMask|p->sharedMask)&~((1<iBusyTimeout==0 || ( + (ofst!=2) /* not RECOVER */ + && (n==1) /* Single lock only */ + && (ofst!=1 || (p->exclMask|p->sharedMask)==0) + && (ofst!=0 || (p->exclMask|p->sharedMask)<3) + && (ofst<3 || (p->exclMask|p->sharedMask)<(1<exclusiveMode==0 ){ + rc = sqlite3WalWriteLock(db, pPager->pWal, bLock); + } + return rc; +} +#endif #ifdef SQLITE_ENABLE_SNAPSHOT /* diff --git a/src/pager.h b/src/pager.h index a044daa18b..c203908c83 100644 --- a/src/pager.h +++ b/src/pager.h @@ -185,6 +185,12 @@ int sqlite3PagerSharedLock(Pager *pPager); # endif #endif +#if !defined(SQLITE_OMIT_WAL) && defined(SQLITE_ENABLE_SETLK_TIMEOUT) + int sqlite3PagerWalWriteLock(sqlite3*, Pager*, int); +#else +# define sqlite3PagerWalWriteLock(x,y,z) SQLITE_OK +#endif + #ifdef SQLITE_DIRECT_OVERFLOW_READ int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno); #endif diff --git a/src/wal.c b/src/wal.c index 020a481e28..a70a716244 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2731,6 +2731,65 @@ int sqlite3WalSnapshotRecover(Wal *pWal){ } #endif /* SQLITE_ENABLE_SNAPSHOT */ +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT +/* +** Attempt to enable blocking locks. Blocking locks are enabled only if (a) +** they are supported by the VFS, and (b) the database handle is configured +** with a busy-timeout. Return 1 if blocking locks are successfully enabled, +** or 0 otherwise. +*/ +static int walEnableBlocking(sqlite3 *db, Wal *pWal){ + int res = 0; + if( db->busyTimeout ){ + int rc; + int tmout = db->busyTimeout; + rc = sqlite3OsFileControl( + pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout + ); + res = (rc==SQLITE_OK); + } + return res; +} + +/* +** Disable blocking locks. +*/ +static void walDisableBlocking(Wal *pWal){ + int tmout = 0; + sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout); +} + +/* +** If parameter bLock is true, attempt to enable blocking locks, take +** the WRITER lock, and then disable blocking locks. If blocking locks +** cannot be enabled, no attempt to obtain the WRITER lock is made. Return +** an SQLite error code if an error occurs, or SQLITE_OK otherwise. It is not +** an error if blocking locks can not be enabled. +** +** If the bLock parameter is false and the WRITER lock is held, release it. +*/ +int sqlite3WalWriteLock(sqlite3 *db, Wal *pWal, int bLock){ + int rc = SQLITE_OK; + assert( pWal->readLock<0 || bLock==0 ); + if( bLock ){ + if( walEnableBlocking(db, pWal) ){ + rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); + if( rc==SQLITE_OK ){ + pWal->writeLock = 1; + } + walDisableBlocking(pWal); + } + }else if( pWal->writeLock ){ + walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); + pWal->writeLock = 0; + } + return rc; +} +#else +# define walEnableBlocking(x,y) 0 +# define walDisableBlocking(x) +#endif /* ifdef SQLITE_ENABLE_SETLK_TIMEOUT */ + /* ** Begin a read transaction on the database. ** @@ -2754,14 +2813,6 @@ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ int bChanged = 0; WalIndexHdr *pSnapshot = pWal->pSnapshot; if( pSnapshot ){ -#ifdef SQLITE_ENABLE_SETLK_TIMEOUT - int busyTimeout = pWal->dbSnapshot->busyTimeout; - if( busyTimeout ){ - int tmout = busyTimeout; - sqlite3OsFileControl(pWal->pDbFd,SQLITE_FCNTL_LOCK_TIMEOUT,(void*)&tmout); - } -#endif - if( memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){ bChanged = 1; } @@ -2774,14 +2825,9 @@ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ ** its intent. To avoid the race condition this leads to, ensure that ** there is no checkpointer process by taking a shared CKPT lock ** before checking pInfo->nBackfillAttempted. */ + walEnableBlocking(pWal->dbSnapshot, pWal); rc = walLockShared(pWal, WAL_CKPT_LOCK); - -#ifdef SQLITE_ENABLE_SETLK_TIMEOUT - if( busyTimeout ){ - int tmout = 0; - sqlite3OsFileControl(pWal->pDbFd,SQLITE_FCNTL_LOCK_TIMEOUT,(void*)&tmout); - } -#endif + walDisableBlocking(pWal); if( rc!=SQLITE_OK ){ return rc; @@ -2861,8 +2907,8 @@ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ ** read-lock. */ void sqlite3WalEndReadTransaction(Wal *pWal){ - sqlite3WalEndWriteTransaction(pWal); if( pWal->readLock>=0 ){ + sqlite3WalEndWriteTransaction(pWal); walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock)); pWal->readLock = -1; } @@ -3022,6 +3068,16 @@ Pgno sqlite3WalDbsize(Wal *pWal){ int sqlite3WalBeginWriteTransaction(Wal *pWal){ int rc; +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + /* If the write-lock is already held, then it was obtained before the + ** read-transaction was even opened, making this call a no-op. + ** Return early. */ + if( pWal->writeLock ){ + assert( !memcmp(&pWal->hdr,(void *)walIndexHdr(pWal),sizeof(WalIndexHdr)) ); + return SQLITE_OK; + } +#endif + /* Cannot start a write transaction without first holding a read ** transaction. */ assert( pWal->readLock>=0 ); @@ -3587,9 +3643,6 @@ int sqlite3WalCheckpoint( int isChanged = 0; /* True if a new wal-index header is loaded */ int eMode2 = eMode; /* Mode to pass to walCheckpoint() */ int (*xBusy2)(void*) = xBusy; /* Busy handler for eMode2 */ -#ifdef SQLITE_ENABLE_SETLK_TIMEOUT - int bSetLk = 0; -#endif assert( pWal->ckptLock==0 ); assert( pWal->writeLock==0 ); @@ -3601,18 +3654,11 @@ int sqlite3WalCheckpoint( if( pWal->readOnly ) return SQLITE_READONLY; WALTRACE(("WAL%p: checkpoint begins\n", pWal)); -#ifdef SQLITE_ENABLE_SETLK_TIMEOUT - if( db->busyTimeout ){ - int tmout = db->busyTimeout; - sqlite3_file *fd = pWal->pDbFd; - if( SQLITE_OK== - sqlite3OsFileControl(fd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout) - ){ - xBusy2 = 0; - bSetLk = 1; - } + /* Enable blocking locks, if possible. If blocking locks are successfully + ** enabled, set xBusy2=0 so that the busy-handler is never invoked. */ + if( walEnableBlocking(db, pWal) ){ + xBusy2 = 0; } -#endif /* IMPLEMENTATION-OF: R-62028-47212 All calls obtain an exclusive ** "checkpoint" lock on the database file. @@ -3684,13 +3730,7 @@ int sqlite3WalCheckpoint( memset(&pWal->hdr, 0, sizeof(WalIndexHdr)); } -#ifdef SQLITE_ENABLE_SETLK_TIMEOUT - if( bSetLk ){ - int tmout = 0; - sqlite3_file *fd = pWal->pDbFd; - sqlite3OsFileControl(fd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout); - } -#endif + walDisableBlocking(pWal); /* Release the locks. */ sqlite3WalEndWriteTransaction(pWal); diff --git a/src/wal.h b/src/wal.h index bebd643700..99ebc937af 100644 --- a/src/wal.h +++ b/src/wal.h @@ -146,5 +146,9 @@ int sqlite3WalFramesize(Wal *pWal); /* Return the sqlite3_file object for the WAL file */ sqlite3_file *sqlite3WalFile(Wal *pWal); +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT +int sqlite3WalWriteLock(sqlite3 *db, Wal *pWal, int bLock); +#endif + #endif /* ifndef SQLITE_OMIT_WAL */ #endif /* SQLITE_WAL_H */ diff --git a/test/wal.test b/test/wal.test index a003b6ad20..acc2780081 100644 --- a/test/wal.test +++ b/test/wal.test @@ -43,6 +43,7 @@ proc sqlite3_wal {args} { [lindex $args 0] eval { PRAGMA journal_mode = wal } [lindex $args 0] eval { PRAGMA synchronous = normal } [lindex $args 0] function blob blob + db timeout 1000 } proc log_deleted {logfile} { From d0e6d133017d7fb82f0d16071eefc2c962762390 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 6 May 2020 17:18:57 +0000 Subject: [PATCH 064/103] Add tests for running recovery when opening a write transaction or performing a checkpoint with blocking locks enabled. Fix some failing assert() statements. FossilOrigin-Name: d096ea3fe20f8af90f9e3f798fd0a69527b32ac8e208ade58b9d0af0e831f41b --- manifest | 15 +++++----- manifest.uuid | 2 +- src/os_unix.c | 1 - src/wal.c | 42 ++++++++++++++++---------- test/walsetlk.test | 75 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 111 insertions(+), 24 deletions(-) create mode 100644 test/walsetlk.test diff --git a/manifest b/manifest index 3d7f93a31e..755c31ef40 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\slatest\strunk\schanges\sinto\sthis\sbranch. -D 2020-05-06T15:07:25.513 +C Add\stests\sfor\srunning\srecovery\swhen\sopening\sa\swrite\stransaction\sor\sperforming\sa\scheckpoint\swith\sblocking\slocks\senabled.\sFix\ssome\sfailing\sassert()\sstatements. +D 2020-05-06T17:18:57.298 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -517,7 +517,7 @@ 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 daabdb3c33ef4a6b49ff6809968af2f8c0d3c5811bc654d74375f015180235aa +F src/os_unix.c 0e1acfbb8a75f2a4acede6078b072238df63981b172a9cd16f8b090d68291c15 F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c be4d6d58df5c5d02b84547fd253a80f035ea2ee53931a5393d96af0ba3f04edb @@ -617,7 +617,7 @@ F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143 F src/vdbevtab.c 8094dfc28dad82d60a1c832020a1b201a5381dc185c14638affc6d4e9d54c653 F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 4099109dcf2b302e0d151e6fa0678d9bbc3eb923b8bd13a3cd07db0e7df5016b +F src/wal.c 9cf3f288cd4e48b49725e03037b60246a154ca8775892c75c319db8f5652ae8a F src/wal.h 484890eaaefb89c0f2043ae34c20bf367383f201f63da631ecae424797a7f60d F src/walker.c 7c429c694abd12413a5c17aec9f47cfe9eba6807e6b0a32df883e8e3a14835ed F src/where.c 9546c82056e8cdb27291f98cf1adca5d271240b399bb97b32f77fc2bea6146c9 @@ -1689,6 +1689,7 @@ F test/walprotocol2.test 7d3b6b4bf0b12f8007121b1e6ef714bc99101fb3b48e46371df1db8 F test/walro.test cb438d05ba0d191f10b688e39c4f0cd5b71569a1d1f4440e5bdf3c6880e08c20 F test/walro2.test 0e79dd15cbdb4f482c01ea248373669c732414a726b357d04846a816afafb768 F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cfd51af68 +F test/walsetlk.test 9da1ee8a18b0416a5ce1914331c1303bcb6cb7bac905eb660f788f023718d8f4 F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 @@ -1863,7 +1864,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 d6f819a9e6b35f3fd558bd93255a6a24ad690a0fa15a82b009ca9c641db983c6 9a84d8eb44b12ddea921baa73ac3bffa8c8d23a852605dc1dbde37907360bd79 -R de537778f79587f163af3363949d5ea7 +P a3727dba10b476f414f0a049b35f2a5c169a408eccefa6833821560684e07f8b +R e1d7b36a881e7c026e918bb1e2d9268d U dan -Z 87b208fa9f7bcdf2aaff63753ffc5546 +Z 92e7a8a964d43aa5533a6dd765b70a70 diff --git a/manifest.uuid b/manifest.uuid index 9593fe8777..78c3a449bb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a3727dba10b476f414f0a049b35f2a5c169a408eccefa6833821560684e07f8b \ No newline at end of file +d096ea3fe20f8af90f9e3f798fd0a69527b32ac8e208ade58b9d0af0e831f41b \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index e1ed575b01..72c446ea77 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -4832,7 +4832,6 @@ static int unixShmLock( #ifdef SQLITE_ENABLE_SETLK_TIMEOUT assert( (flags & SQLITE_SHM_UNLOCK) || pDbFd->iBusyTimeout==0 || ( (ofst!=2) /* not RECOVER */ - && (n==1) /* Single lock only */ && (ofst!=1 || (p->exclMask|p->sharedMask)==0) && (ofst!=0 || (p->exclMask|p->sharedMask)<3) && (ofst<3 || (p->exclMask|p->sharedMask)<(1<writeLock==0 ); if( badHdr ){ if( pWal->bShmUnreliable==0 && (pWal->readOnly & WAL_SHM_RDONLY) ){ if( SQLITE_OK==(rc = walLockShared(pWal, WAL_WRITE_LOCK)) ){ walUnlockShared(pWal, WAL_WRITE_LOCK); rc = SQLITE_READONLY_RECOVERY; } - }else if( SQLITE_OK==(rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1)) ){ - pWal->writeLock = 1; - if( SQLITE_OK==(rc = walIndexPage(pWal, 0, &page0)) ){ - badHdr = walIndexTryHdr(pWal, pChanged); - if( badHdr ){ - /* If the wal-index header is still malformed even while holding - ** a WRITE lock, it can only mean that the header is corrupted and - ** needs to be reconstructed. So run recovery to do exactly that. - */ - rc = walIndexRecover(pWal); - *pChanged = 1; + }else{ + int bWriteLock = pWal->writeLock; + if( bWriteLock + || SQLITE_OK==(rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1)) + ){ + pWal->writeLock = 1; + if( SQLITE_OK==(rc = walIndexPage(pWal, 0, &page0)) ){ + badHdr = walIndexTryHdr(pWal, pChanged); + if( badHdr ){ + /* If the wal-index header is still malformed even while holding + ** a WRITE lock, it can only mean that the header is corrupted and + ** needs to be reconstructed. So run recovery to do exactly that. + */ + rc = walIndexRecover(pWal); + *pChanged = 1; + } + } + if( bWriteLock==0 ){ + pWal->writeLock = 0; + walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); } } - pWal->writeLock = 0; - walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); } } @@ -2808,6 +2814,7 @@ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ int rc; /* Return code */ int cnt = 0; /* Number of TryBeginRead attempts */ + assert( pWal->ckptLock==0 ); #ifdef SQLITE_ENABLE_SNAPSHOT int bChanged = 0; @@ -2832,6 +2839,7 @@ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ if( rc!=SQLITE_OK ){ return rc; } + pWal->ckptLock = 1; } #endif @@ -2895,8 +2903,10 @@ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ } /* Release the shared CKPT lock obtained above. */ - if( pSnapshot ){ + if( pWal->ckptLock ){ + assert( pSnapshot ); walUnlockShared(pWal, WAL_CKPT_LOCK); + pWal->ckptLock = 0; } #endif return rc; @@ -3698,7 +3708,9 @@ int sqlite3WalCheckpoint( /* Read the wal-index header. */ if( rc==SQLITE_OK ){ + walDisableBlocking(pWal); rc = walIndexReadHdr(pWal, &isChanged); + walEnableBlocking(db, pWal); if( isChanged && pWal->pDbFd->pMethods->iVersion>=3 ){ sqlite3OsUnfetch(pWal->pDbFd, 0, 0); } diff --git a/test/walsetlk.test b/test/walsetlk.test new file mode 100644 index 0000000000..ff7ec18b3f --- /dev/null +++ b/test/walsetlk.test @@ -0,0 +1,75 @@ +# 2020 May 06 +# +# 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 walsetlk + +ifcapable !wal {finish_test ; return } +db timeout 1000 + +#------------------------------------------------------------------------- +# 1.*: Test that nothing goes wrong if recovery is forced while opening +# a write transaction or performing a checkpoint with blocking locks. +# + +do_execsql_test 1.0 { + CREATE TABLE t1(x, y); + PRAGMA journal_mode = wal; + INSERT INTO t1 VALUES(1, 2); + INSERT INTO t1 VALUES(3, 4); + INSERT INTO t1 VALUES(5, 6); + INSERT INTO t1 VALUES(7, 8); +} {wal} + +sqlite3 db2 test.db +db2 timeout 1000 + +do_execsql_test -db db2 1.1 { + SELECT * FROM t1 +} {1 2 3 4 5 6 7 8} + +set fd [open test.db-shm r+] +puts $fd "blahblahblahblah" +flush $fd + +do_execsql_test 1.2 { + BEGIN; + INSERT INTO t1 VALUES(9, 10); +} + +do_execsql_test -db db2 1.3 { + SELECT * FROM t1 +} {1 2 3 4 5 6 7 8} + +do_test 1.3 { + list [catch {db2 eval { BEGIN EXCLUSIVE }} msg] $msg +} {1 {database is locked}} + +do_execsql_test 1.4 { COMMIT } +do_execsql_test -db db2 1.5 { + SELECT * FROM t1 +} {1 2 3 4 5 6 7 8 9 10} + +puts $fd "blahblahblahblah" +flush $fd + +do_execsql_test -db db2 1.6 { + PRAGMA wal_checkpoint = TRUNCATE +} {0 0 0} + +do_test 1.7 { + file size test.db-wal +} 0 + +finish_test + From e0a8b712c15e2abc8bbc22d62ebec89c308451c0 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 6 May 2020 18:43:57 +0000 Subject: [PATCH 065/103] Provide the SQLITE_DEFAULT_LEGACY_ALTER_TABLE compile-time option. FossilOrigin-Name: 63e659d9a793227604aa95685a8d83cd08305f1d01e135407a3ffc6d54482ab8 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/main.c | 3 +++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index abd24d10c6..6343d8da64 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sonly\sknown\spath\sto\sa\scorruption\sdetection\sbranch\swas\scut\soff\sby\sthe\nprevious\scommit\simplementing\searlier\sindex\scorruption.\s\sSo\smake\sthe\sbranch\nNEVER.\s\sMaybe\sa\sfuzzer\swill\sfind\sa\snew\spath. -D 2020-05-05T19:54:02.670 +C Provide\sthe\sSQLITE_DEFAULT_LEGACY_ALTER_TABLE\scompile-time\soption. +D 2020-05-06T18:43:57.955 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -497,7 +497,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 8e4211d04eb460c0694d486c6ba1c068d468c6f653c3f237869a802ad82854de F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 421310045bd78afefb772294a99e50f37d87ae578786a6169074e6291e30d969 -F src/main.c 2dd7fc7b3f71b23b185496cd282072ba5888dc8ed8ecb9309ddd0d1efdf66d5c +F src/main.c b48ce4de01fac57dddb12a3a67c6da625f236b0cf6db30e6b132b488e5e0cf05 F src/malloc.c a3e13b001f988ecec6bdb90c0ea8912c8c786e623724d7098da623d8d01d19b1 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -1863,7 +1863,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 f339f31f9e9a856b576f99c5230fdf6d60fdc2873e48cb5aa0a4ab1d04e3c930 -R fb89f805264b8e2129b7b9be6c16f034 +P 9a84d8eb44b12ddea921baa73ac3bffa8c8d23a852605dc1dbde37907360bd79 +R 3b4da28cd92dfc3fa916a6592ebd618b U drh -Z 05849c7dc6493e9e337f69ee2000aae8 +Z 22c2351c8a2c47ecb255c4109b60094d diff --git a/manifest.uuid b/manifest.uuid index 304a2d9e28..c14dfaa280 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9a84d8eb44b12ddea921baa73ac3bffa8c8d23a852605dc1dbde37907360bd79 \ No newline at end of file +63e659d9a793227604aa95685a8d83cd08305f1d01e135407a3ffc6d54482ab8 \ No newline at end of file diff --git a/src/main.c b/src/main.c index 778d4324b8..0d7011e7df 100644 --- a/src/main.c +++ b/src/main.c @@ -3253,6 +3253,9 @@ static int openDatabase( #endif #if defined(SQLITE_DEFAULT_DEFENSIVE) | SQLITE_Defensive +#endif +#if defined(SQLITE_DEFAULT_LEGACY_ALTER_TABLE) + | SQLITE_LegacyAlter #endif ; sqlite3HashInit(&db->aCollSeq); From 861fb1e9dc039f00ff4997254b956352f37d71ac Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 6 May 2020 19:14:41 +0000 Subject: [PATCH 066/103] Block on the WRITER lock when attempting to run recovery. FossilOrigin-Name: 105d6c9bbcadc64faa2b24e315cb13227b17cfc6bf1b3512713f80ce56976a3d --- manifest | 22 +++---- manifest.uuid | 2 +- src/btree.c | 6 +- src/main.c | 4 +- src/pager.c | 17 ++++-- src/pager.h | 8 ++- src/wal.c | 163 ++++++++++++++++++++++++++++---------------------- src/wal.h | 5 +- 8 files changed, 130 insertions(+), 97 deletions(-) diff --git a/manifest b/manifest index 755c31ef40..df00f221f3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stests\sfor\srunning\srecovery\swhen\sopening\sa\swrite\stransaction\sor\sperforming\sa\scheckpoint\swith\sblocking\slocks\senabled.\sFix\ssome\sfailing\sassert()\sstatements. -D 2020-05-06T17:18:57.298 +C Block\son\sthe\sWRITER\slock\swhen\sattempting\sto\srun\srecovery. +D 2020-05-06T19:14:41.236 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c e810b07f2212f36c1f317b94bd9af818be4a0aec24e935c11c39470dcd77c149 +F src/btree.c 4d5a7d2208dd8d921049780c9f06201cd6a656822c4f0931807b54f3dcd79097 F src/btree.h 989ef3c33413549e3e148f3dcb46c030f317dac130dc86809ba6b9aa4b16c72a F src/btreeInt.h 887cdd2ea7f4a65143074a8a7c8928b0546f8c18dda3c06a408ce7992cbab0c0 F src/build.c ec6c0bda1e43ef55e5f5121a77ba19fac51fc6585f95ce2da795bcedcf6e8f36 @@ -497,7 +497,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 8e4211d04eb460c0694d486c6ba1c068d468c6f653c3f237869a802ad82854de F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 421310045bd78afefb772294a99e50f37d87ae578786a6169074e6291e30d969 -F src/main.c 5ae818ae552d3f68d1e67707a200d557125cdfb4f9e14e5cf1b4f12181974934 +F src/main.c 685d391fc37ad2c1162ad6784cae4a454dcd3632bbab319464af733d71eca72f F src/malloc.c a3e13b001f988ecec6bdb90c0ea8912c8c786e623724d7098da623d8d01d19b1 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -520,8 +520,8 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 0e1acfbb8a75f2a4acede6078b072238df63981b172a9cd16f8b090d68291c15 F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c be4d6d58df5c5d02b84547fd253a80f035ea2ee53931a5393d96af0ba3f04edb -F src/pager.h 5e2c0e5bd32aa4ae6c25eda2722490bb3f671f24d2e5d665d33df13285c1d520 +F src/pager.c 96436cb1920074d4ade120a1a8a9d0ae3f52df06651e21b7eccc5eae2f02b111 +F src/pager.h 8d1dc9a2c3fc5eb6eeed75f48a076f425e77706f8935f05817fa05a308f587b5 F src/parse.y c8eff38606f443d5ba245263fa7abc05e4116d95656e050c4b78e9bfbf931add F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 @@ -617,8 +617,8 @@ F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143 F src/vdbevtab.c 8094dfc28dad82d60a1c832020a1b201a5381dc185c14638affc6d4e9d54c653 F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 9cf3f288cd4e48b49725e03037b60246a154ca8775892c75c319db8f5652ae8a -F src/wal.h 484890eaaefb89c0f2043ae34c20bf367383f201f63da631ecae424797a7f60d +F src/wal.c d23410a4330d11b8c699e0e463f334f2fca6c5af2c144e34674ccaef5b73f8fc +F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7c429c694abd12413a5c17aec9f47cfe9eba6807e6b0a32df883e8e3a14835ed F src/where.c 9546c82056e8cdb27291f98cf1adca5d271240b399bb97b32f77fc2bea6146c9 F src/whereInt.h 6b874aa15f94e43a2cec1080be64d955b04deeafeac90ffb5d6975c0d511be3c @@ -1864,7 +1864,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 a3727dba10b476f414f0a049b35f2a5c169a408eccefa6833821560684e07f8b -R e1d7b36a881e7c026e918bb1e2d9268d +P d096ea3fe20f8af90f9e3f798fd0a69527b32ac8e208ade58b9d0af0e831f41b +R 452bcfebade640ff986656d7117060f0 U dan -Z 92e7a8a964d43aa5533a6dd765b70a70 +Z 21f20f1df91440f33362da9da7770293 diff --git a/manifest.uuid b/manifest.uuid index 78c3a449bb..1ed2372a34 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d096ea3fe20f8af90f9e3f798fd0a69527b32ac8e208ade58b9d0af0e831f41b \ No newline at end of file +105d6c9bbcadc64faa2b24e315cb13227b17cfc6bf1b3512713f80ce56976a3d \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index e80add6eb4..47b1136fd7 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3442,9 +3442,10 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ #ifdef SQLITE_ENABLE_SETLK_TIMEOUT /* If transitioning from no transaction directly to a write transaction, ** block for the WRITER lock first if possible. */ + sqlite3PagerWalDb(pPager, p->db); if( pBt->pPage1==0 && wrflag ){ assert( pBt->inTransaction==TRANS_NONE ); - rc = sqlite3PagerWalWriteLock(p->db, pPager, 1); + rc = sqlite3PagerWalWriteLock(pPager, 1); if( rc!=SQLITE_OK ) break; } #endif @@ -3475,9 +3476,10 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ } if( rc!=SQLITE_OK ){ - sqlite3PagerWalWriteLock(p->db, pPager, 0); + sqlite3PagerWalWriteLock(pPager, 0); unlockBtreeIfUnused(pBt); } + sqlite3PagerWalDb(pPager, 0); }while( (rc&0xFF)==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE && btreeInvokeBusyHandler(pBt) ); diff --git a/src/main.c b/src/main.c index e96f5e1133..0bc8edfec0 100644 --- a/src/main.c +++ b/src/main.c @@ -4481,11 +4481,11 @@ int sqlite3_snapshot_open( rc = SQLITE_OK; } if( rc==SQLITE_OK ){ - rc = sqlite3PagerSnapshotOpen(pPager, db, pSnapshot); + rc = sqlite3PagerSnapshotOpen(pPager, pSnapshot); } if( rc==SQLITE_OK ){ rc = sqlite3BtreeBeginTrans(pBt, 0, 0); - sqlite3PagerSnapshotOpen(pPager, 0, 0); + sqlite3PagerSnapshotOpen(pPager, 0); } if( bUnlock ){ sqlite3PagerSnapshotUnlock(pPager); diff --git a/src/pager.c b/src/pager.c index 1570b3e704..a826f256bf 100644 --- a/src/pager.c +++ b/src/pager.c @@ -7581,13 +7581,23 @@ int sqlite3PagerCloseWal(Pager *pPager, sqlite3 *db){ ** with the same db and bLock parameters as were passed to this function. ** Return an SQLite error code if an error occurs, or SQLITE_OK otherwise. */ -int sqlite3PagerWalWriteLock(sqlite3 *db, Pager *pPager, int bLock){ +int sqlite3PagerWalWriteLock(Pager *pPager, int bLock){ int rc = SQLITE_OK; if( pagerUseWal(pPager) && pPager->exclusiveMode==0 ){ - rc = sqlite3WalWriteLock(db, pPager->pWal, bLock); + rc = sqlite3WalWriteLock(pPager->pWal, bLock); } return rc; } + +/* +** Set the database handle used by the wal layer to determine if +** blocking locks are required. +*/ +void sqlite3PagerWalDb(Pager *pPager, sqlite3 *db){ + if( pagerUseWal(pPager) ){ + sqlite3WalDb(pPager->pWal, db); + } +} #endif #ifdef SQLITE_ENABLE_SNAPSHOT @@ -7610,12 +7620,11 @@ int sqlite3PagerSnapshotGet(Pager *pPager, sqlite3_snapshot **ppSnapshot){ */ int sqlite3PagerSnapshotOpen( Pager *pPager, - sqlite3 *db, sqlite3_snapshot *pSnapshot ){ int rc = SQLITE_OK; if( pPager->pWal ){ - sqlite3WalSnapshotOpen(pPager->pWal, db, pSnapshot); + sqlite3WalSnapshotOpen(pPager->pWal, pSnapshot); }else{ rc = SQLITE_ERROR; } diff --git a/src/pager.h b/src/pager.h index c203908c83..62a371ef89 100644 --- a/src/pager.h +++ b/src/pager.h @@ -178,7 +178,7 @@ int sqlite3PagerSharedLock(Pager *pPager); int sqlite3PagerCloseWal(Pager *pPager, sqlite3*); # ifdef SQLITE_ENABLE_SNAPSHOT int sqlite3PagerSnapshotGet(Pager*, sqlite3_snapshot **ppSnapshot); - int sqlite3PagerSnapshotOpen(Pager*, sqlite3*, sqlite3_snapshot *pSnapshot); + int sqlite3PagerSnapshotOpen(Pager*, sqlite3_snapshot *pSnapshot); int sqlite3PagerSnapshotRecover(Pager *pPager); int sqlite3PagerSnapshotCheck(Pager *pPager, sqlite3_snapshot *pSnapshot); void sqlite3PagerSnapshotUnlock(Pager *pPager); @@ -186,9 +186,11 @@ int sqlite3PagerSharedLock(Pager *pPager); #endif #if !defined(SQLITE_OMIT_WAL) && defined(SQLITE_ENABLE_SETLK_TIMEOUT) - int sqlite3PagerWalWriteLock(sqlite3*, Pager*, int); + int sqlite3PagerWalWriteLock(Pager*, int); + void sqlite3PagerWalDb(Pager*, sqlite3*); #else -# define sqlite3PagerWalWriteLock(x,y,z) SQLITE_OK +# define sqlite3PagerWalWriteLock(y,z) SQLITE_OK +# define sqlite3PagerWalDb(x,y) #endif #ifdef SQLITE_DIRECT_OVERFLOW_READ diff --git a/src/wal.c b/src/wal.c index 7abff64078..41a11d6548 100644 --- a/src/wal.c +++ b/src/wal.c @@ -466,9 +466,9 @@ struct Wal { #endif #ifdef SQLITE_ENABLE_SNAPSHOT WalIndexHdr *pSnapshot; /* Start transaction here if not NULL */ -# ifdef SQLITE_ENABLE_SETLK_TIMEOUT - sqlite3 *dbSnapshot; -# endif +#endif +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + sqlite3 *db; #endif }; @@ -2118,6 +2118,88 @@ static int walIndexTryHdr(Wal *pWal, int *pChanged){ */ #define WAL_RETRY (-1) +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT +/* +** Attempt to enable blocking locks. Blocking locks are enabled only if (a) +** they are supported by the VFS, and (b) the database handle is configured +** with a busy-timeout. Return 1 if blocking locks are successfully enabled, +** or 0 otherwise. +*/ +static int walEnableBlocking(Wal *pWal){ + int res = 0; + if( pWal->db ){ + int tmout = pWal->db->busyTimeout; + if( tmout ){ + int rc; + rc = sqlite3OsFileControl( + pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout + ); + res = (rc==SQLITE_OK); + } + } + return res; +} + +/* +** Disable blocking locks. +*/ +static void walDisableBlocking(Wal *pWal){ + int tmout = 0; + sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout); +} + +/* +** If parameter bLock is true, attempt to enable blocking locks, take +** the WRITER lock, and then disable blocking locks. If blocking locks +** cannot be enabled, no attempt to obtain the WRITER lock is made. Return +** an SQLite error code if an error occurs, or SQLITE_OK otherwise. It is not +** an error if blocking locks can not be enabled. +** +** If the bLock parameter is false and the WRITER lock is held, release it. +*/ +int sqlite3WalWriteLock(Wal *pWal, int bLock){ + int rc = SQLITE_OK; + assert( pWal->readLock<0 || bLock==0 ); + if( bLock ){ + assert( pWal->db ); + if( walEnableBlocking(pWal) ){ + rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); + if( rc==SQLITE_OK ){ + pWal->writeLock = 1; + } + walDisableBlocking(pWal); + } + }else if( pWal->writeLock ){ + walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); + pWal->writeLock = 0; + } + return rc; +} + +/* +** Set the database handle used to determine if blocking locks are required. +*/ +void sqlite3WalDb(Wal *pWal, sqlite3 *db){ + pWal->db = db; +} + +/* +** Take an exclusive WRITE lock. Blocking if so configured. +*/ +static int walLockWriter(Wal *pWal){ + int rc; + walEnableBlocking(pWal); + rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); + walDisableBlocking(pWal); + return rc; +} +#else +# define walEnableBlocking(x) 0 +# define walDisableBlocking(x) +# define walLockWriter(pWal) walLockExclusive((pWal), WAL_WRITE_LOCK, 1) +# define sqlite3WalDb(pWal) +#endif /* ifdef SQLITE_ENABLE_SETLK_TIMEOUT */ + /* ** Read the wal-index header from the wal-index and into pWal->hdr. ** If the wal-header appears to be corrupt, try to reconstruct the @@ -2183,9 +2265,7 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){ } }else{ int bWriteLock = pWal->writeLock; - if( bWriteLock - || SQLITE_OK==(rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1)) - ){ + if( bWriteLock || SQLITE_OK==(rc = walLockWriter(pWal)) ){ pWal->writeLock = 1; if( SQLITE_OK==(rc = walIndexPage(pWal, 0, &page0)) ){ badHdr = walIndexTryHdr(pWal, pChanged); @@ -2737,65 +2817,6 @@ int sqlite3WalSnapshotRecover(Wal *pWal){ } #endif /* SQLITE_ENABLE_SNAPSHOT */ -#ifdef SQLITE_ENABLE_SETLK_TIMEOUT -/* -** Attempt to enable blocking locks. Blocking locks are enabled only if (a) -** they are supported by the VFS, and (b) the database handle is configured -** with a busy-timeout. Return 1 if blocking locks are successfully enabled, -** or 0 otherwise. -*/ -static int walEnableBlocking(sqlite3 *db, Wal *pWal){ - int res = 0; - if( db->busyTimeout ){ - int rc; - int tmout = db->busyTimeout; - rc = sqlite3OsFileControl( - pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout - ); - res = (rc==SQLITE_OK); - } - return res; -} - -/* -** Disable blocking locks. -*/ -static void walDisableBlocking(Wal *pWal){ - int tmout = 0; - sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout); -} - -/* -** If parameter bLock is true, attempt to enable blocking locks, take -** the WRITER lock, and then disable blocking locks. If blocking locks -** cannot be enabled, no attempt to obtain the WRITER lock is made. Return -** an SQLite error code if an error occurs, or SQLITE_OK otherwise. It is not -** an error if blocking locks can not be enabled. -** -** If the bLock parameter is false and the WRITER lock is held, release it. -*/ -int sqlite3WalWriteLock(sqlite3 *db, Wal *pWal, int bLock){ - int rc = SQLITE_OK; - assert( pWal->readLock<0 || bLock==0 ); - if( bLock ){ - if( walEnableBlocking(db, pWal) ){ - rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); - if( rc==SQLITE_OK ){ - pWal->writeLock = 1; - } - walDisableBlocking(pWal); - } - }else if( pWal->writeLock ){ - walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); - pWal->writeLock = 0; - } - return rc; -} -#else -# define walEnableBlocking(x,y) 0 -# define walDisableBlocking(x) -#endif /* ifdef SQLITE_ENABLE_SETLK_TIMEOUT */ - /* ** Begin a read transaction on the database. ** @@ -2832,7 +2853,7 @@ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ ** its intent. To avoid the race condition this leads to, ensure that ** there is no checkpointer process by taking a shared CKPT lock ** before checking pInfo->nBackfillAttempted. */ - walEnableBlocking(pWal->dbSnapshot, pWal); + walEnableBlocking(pWal); rc = walLockShared(pWal, WAL_CKPT_LOCK); walDisableBlocking(pWal); @@ -3666,7 +3687,8 @@ int sqlite3WalCheckpoint( /* Enable blocking locks, if possible. If blocking locks are successfully ** enabled, set xBusy2=0 so that the busy-handler is never invoked. */ - if( walEnableBlocking(db, pWal) ){ + sqlite3WalDb(pWal, db); + if( walEnableBlocking(pWal) ){ xBusy2 = 0; } @@ -3710,7 +3732,7 @@ int sqlite3WalCheckpoint( if( rc==SQLITE_OK ){ walDisableBlocking(pWal); rc = walIndexReadHdr(pWal, &isChanged); - walEnableBlocking(db, pWal); + walEnableBlocking(pWal); if( isChanged && pWal->pDbFd->pMethods->iVersion>=3 ){ sqlite3OsUnfetch(pWal->pDbFd, 0, 0); } @@ -3743,6 +3765,7 @@ int sqlite3WalCheckpoint( } walDisableBlocking(pWal); + sqlite3WalDb(pWal, 0); /* Release the locks. */ sqlite3WalEndWriteTransaction(pWal); @@ -3869,13 +3892,9 @@ int sqlite3WalSnapshotGet(Wal *pWal, sqlite3_snapshot **ppSnapshot){ */ void sqlite3WalSnapshotOpen( Wal *pWal, - sqlite3 *db, sqlite3_snapshot *pSnapshot ){ pWal->pSnapshot = (WalIndexHdr*)pSnapshot; -#ifdef SQLITE_ENABLE_SETLK_TIMEOUT - pWal->dbSnapshot = db; -#endif } /* diff --git a/src/wal.h b/src/wal.h index 99ebc937af..02e2bab360 100644 --- a/src/wal.h +++ b/src/wal.h @@ -130,7 +130,7 @@ int sqlite3WalHeapMemory(Wal *pWal); #ifdef SQLITE_ENABLE_SNAPSHOT int sqlite3WalSnapshotGet(Wal *pWal, sqlite3_snapshot **ppSnapshot); -void sqlite3WalSnapshotOpen(Wal *pWal, sqlite3*, sqlite3_snapshot *pSnapshot); +void sqlite3WalSnapshotOpen(Wal *pWal, sqlite3_snapshot *pSnapshot); int sqlite3WalSnapshotRecover(Wal *pWal); int sqlite3WalSnapshotCheck(Wal *pWal, sqlite3_snapshot *pSnapshot); void sqlite3WalSnapshotUnlock(Wal *pWal); @@ -147,7 +147,8 @@ int sqlite3WalFramesize(Wal *pWal); sqlite3_file *sqlite3WalFile(Wal *pWal); #ifdef SQLITE_ENABLE_SETLK_TIMEOUT -int sqlite3WalWriteLock(sqlite3 *db, Wal *pWal, int bLock); +int sqlite3WalWriteLock(Wal *pWal, int bLock); +void sqlite3WalDb(Wal *pWal, sqlite3 *db); #endif #endif /* ifndef SQLITE_OMIT_WAL */ From fc87ab8c4ab229a2adae3297148eb3ebdad1134f Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 6 May 2020 19:22:59 +0000 Subject: [PATCH 067/103] Fix compiler warnings in non-SQLITE_ENABLE_SETLK_TIMEOUT builds. FossilOrigin-Name: 22de99ef410ba2a540871f3e61157d8dc4b969416f14808aeca73971b17fcd51 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/btree.c | 2 +- src/wal.c | 6 +++--- test/walsetlk.test | 10 +++++----- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index df00f221f3..a5993cb39a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Block\son\sthe\sWRITER\slock\swhen\sattempting\sto\srun\srecovery. -D 2020-05-06T19:14:41.236 +C Fix\scompiler\swarnings\sin\snon-SQLITE_ENABLE_SETLK_TIMEOUT\sbuilds. +D 2020-05-06T19:22:59.197 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 4d5a7d2208dd8d921049780c9f06201cd6a656822c4f0931807b54f3dcd79097 +F src/btree.c 98e6ff5f2f0ad531bc3f7c0be1e7c8b51339b9b1badc98da141c5e0f8ed3c9b3 F src/btree.h 989ef3c33413549e3e148f3dcb46c030f317dac130dc86809ba6b9aa4b16c72a F src/btreeInt.h 887cdd2ea7f4a65143074a8a7c8928b0546f8c18dda3c06a408ce7992cbab0c0 F src/build.c ec6c0bda1e43ef55e5f5121a77ba19fac51fc6585f95ce2da795bcedcf6e8f36 @@ -617,7 +617,7 @@ F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143 F src/vdbevtab.c 8094dfc28dad82d60a1c832020a1b201a5381dc185c14638affc6d4e9d54c653 F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c d23410a4330d11b8c699e0e463f334f2fca6c5af2c144e34674ccaef5b73f8fc +F src/wal.c 24566cac365e172a893f18a83fd6da8c4b9cfbbae118831a43b4ef427e21b710 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7c429c694abd12413a5c17aec9f47cfe9eba6807e6b0a32df883e8e3a14835ed F src/where.c 9546c82056e8cdb27291f98cf1adca5d271240b399bb97b32f77fc2bea6146c9 @@ -1689,7 +1689,7 @@ F test/walprotocol2.test 7d3b6b4bf0b12f8007121b1e6ef714bc99101fb3b48e46371df1db8 F test/walro.test cb438d05ba0d191f10b688e39c4f0cd5b71569a1d1f4440e5bdf3c6880e08c20 F test/walro2.test 0e79dd15cbdb4f482c01ea248373669c732414a726b357d04846a816afafb768 F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cfd51af68 -F test/walsetlk.test 9da1ee8a18b0416a5ce1914331c1303bcb6cb7bac905eb660f788f023718d8f4 +F test/walsetlk.test e919d2aab59185a554c170599ae28d46da2f085e2026d54ee2da799f9f328478 F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 @@ -1864,7 +1864,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 d096ea3fe20f8af90f9e3f798fd0a69527b32ac8e208ade58b9d0af0e831f41b -R 452bcfebade640ff986656d7117060f0 +P 105d6c9bbcadc64faa2b24e315cb13227b17cfc6bf1b3512713f80ce56976a3d +R 2005d6d3ddc777ab35d452dcb8060dbf U dan -Z 21f20f1df91440f33362da9da7770293 +Z 02001fbe394dba3af87ef0d8d6630ccb diff --git a/manifest.uuid b/manifest.uuid index 1ed2372a34..e7963e04d3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -105d6c9bbcadc64faa2b24e315cb13227b17cfc6bf1b3512713f80ce56976a3d \ No newline at end of file +22de99ef410ba2a540871f3e61157d8dc4b969416f14808aeca73971b17fcd51 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 47b1136fd7..47585f1a37 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3476,7 +3476,7 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ } if( rc!=SQLITE_OK ){ - sqlite3PagerWalWriteLock(pPager, 0); + (void)sqlite3PagerWalWriteLock(pPager, 0); unlockBtreeIfUnused(pBt); } sqlite3PagerWalDb(pPager, 0); diff --git a/src/wal.c b/src/wal.c index 41a11d6548..c348f0f38b 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2197,7 +2197,7 @@ static int walLockWriter(Wal *pWal){ # define walEnableBlocking(x) 0 # define walDisableBlocking(x) # define walLockWriter(pWal) walLockExclusive((pWal), WAL_WRITE_LOCK, 1) -# define sqlite3WalDb(pWal) +# define sqlite3WalDb(pWal, db) #endif /* ifdef SQLITE_ENABLE_SETLK_TIMEOUT */ /* @@ -2853,7 +2853,7 @@ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ ** its intent. To avoid the race condition this leads to, ensure that ** there is no checkpointer process by taking a shared CKPT lock ** before checking pInfo->nBackfillAttempted. */ - walEnableBlocking(pWal); + (void)walEnableBlocking(pWal); rc = walLockShared(pWal, WAL_CKPT_LOCK); walDisableBlocking(pWal); @@ -3732,7 +3732,7 @@ int sqlite3WalCheckpoint( if( rc==SQLITE_OK ){ walDisableBlocking(pWal); rc = walIndexReadHdr(pWal, &isChanged); - walEnableBlocking(pWal); + (void)walEnableBlocking(pWal); if( isChanged && pWal->pDbFd->pMethods->iVersion>=3 ){ sqlite3OsUnfetch(pWal->pDbFd, 0, 0); } diff --git a/test/walsetlk.test b/test/walsetlk.test index ff7ec18b3f..7964caa055 100644 --- a/test/walsetlk.test +++ b/test/walsetlk.test @@ -51,23 +51,23 @@ do_execsql_test -db db2 1.3 { SELECT * FROM t1 } {1 2 3 4 5 6 7 8} -do_test 1.3 { +do_test 1.4 { list [catch {db2 eval { BEGIN EXCLUSIVE }} msg] $msg } {1 {database is locked}} -do_execsql_test 1.4 { COMMIT } -do_execsql_test -db db2 1.5 { +do_execsql_test 1.5 { COMMIT } +do_execsql_test -db db2 1.6 { SELECT * FROM t1 } {1 2 3 4 5 6 7 8 9 10} puts $fd "blahblahblahblah" flush $fd -do_execsql_test -db db2 1.6 { +do_execsql_test -db db2 1.7 { PRAGMA wal_checkpoint = TRUNCATE } {0 0 0} -do_test 1.7 { +do_test 1.8 { file size test.db-wal } 0 From 7bb8b8a4f743c1bab707a01ba61c7f1fe3695195 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 6 May 2020 20:27:18 +0000 Subject: [PATCH 068/103] Add error code SQLITE_BUSY_TIMEOUT, used internally by the OS layer to indicate that a call to xShmLock() has failed due to timeout of a blocking lock. FossilOrigin-Name: f3ef9c7c2b4ba3de1057ad569f068b241d5f23e6629d8e0dacf85e57fd13b8aa --- manifest | 20 ++--- manifest.uuid | 2 +- src/btree.c | 15 ++-- src/os_unix.c | 12 ++- src/sqlite.h.in | 1 + src/wal.c | 182 +++++++++++++++++++++++---------------------- test/walsetlk.test | 109 +++++++++++++++++++++++++++ 7 files changed, 233 insertions(+), 108 deletions(-) diff --git a/manifest b/manifest index a5993cb39a..7a33b8fa5a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\scompiler\swarnings\sin\snon-SQLITE_ENABLE_SETLK_TIMEOUT\sbuilds. -D 2020-05-06T19:22:59.197 +C Add\serror\scode\sSQLITE_BUSY_TIMEOUT,\sused\sinternally\sby\sthe\sOS\slayer\sto\sindicate\sthat\sa\scall\sto\sxShmLock()\shas\sfailed\sdue\sto\stimeout\sof\sa\sblocking\slock. +D 2020-05-06T20:27:18.129 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 98e6ff5f2f0ad531bc3f7c0be1e7c8b51339b9b1badc98da141c5e0f8ed3c9b3 +F src/btree.c f0cd4a3683b60f456f17e28f24cc72febc0df9c3f3f5126d799f9dc9ee5844b6 F src/btree.h 989ef3c33413549e3e148f3dcb46c030f317dac130dc86809ba6b9aa4b16c72a F src/btreeInt.h 887cdd2ea7f4a65143074a8a7c8928b0546f8c18dda3c06a408ce7992cbab0c0 F src/build.c ec6c0bda1e43ef55e5f5121a77ba19fac51fc6585f95ce2da795bcedcf6e8f36 @@ -517,7 +517,7 @@ 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 0e1acfbb8a75f2a4acede6078b072238df63981b172a9cd16f8b090d68291c15 +F src/os_unix.c ad4f910fd62b83c57dad364913d29a554a694a4461f489c2208306c63ce6eda2 F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 96436cb1920074d4ade120a1a8a9d0ae3f52df06651e21b7eccc5eae2f02b111 @@ -535,7 +535,7 @@ F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 1720bff2168491ca79af81a03bd18c0383f61d845c6e17caff9d25aabc4ab435 F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b6 -F src/sqlite.h.in fa97fb128377b8fd8398a498eda3d48646b08519c4176adb1457243fdc5bb09a +F src/sqlite.h.in a42bae930f462294801f24468dd56832b09de01072a26dc0df60ddc3c5602210 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 F src/sqliteInt.h 26de171e0adccf6e465434b9fcce18fcfcc757e9a727356b029fc1676639540c @@ -617,7 +617,7 @@ F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143 F src/vdbevtab.c 8094dfc28dad82d60a1c832020a1b201a5381dc185c14638affc6d4e9d54c653 F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 24566cac365e172a893f18a83fd6da8c4b9cfbbae118831a43b4ef427e21b710 +F src/wal.c f4eda6e6886da4c93e679210b14b75435d0087756644179b01896e485dd32677 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7c429c694abd12413a5c17aec9f47cfe9eba6807e6b0a32df883e8e3a14835ed F src/where.c 9546c82056e8cdb27291f98cf1adca5d271240b399bb97b32f77fc2bea6146c9 @@ -1689,7 +1689,7 @@ F test/walprotocol2.test 7d3b6b4bf0b12f8007121b1e6ef714bc99101fb3b48e46371df1db8 F test/walro.test cb438d05ba0d191f10b688e39c4f0cd5b71569a1d1f4440e5bdf3c6880e08c20 F test/walro2.test 0e79dd15cbdb4f482c01ea248373669c732414a726b357d04846a816afafb768 F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cfd51af68 -F test/walsetlk.test e919d2aab59185a554c170599ae28d46da2f085e2026d54ee2da799f9f328478 +F test/walsetlk.test 5c8bd1832a828db71283c03dc4a74d648c5333a5b2e978f5bda4f0d81bae5490 F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 @@ -1864,7 +1864,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 105d6c9bbcadc64faa2b24e315cb13227b17cfc6bf1b3512713f80ce56976a3d -R 2005d6d3ddc777ab35d452dcb8060dbf +P 22de99ef410ba2a540871f3e61157d8dc4b969416f14808aeca73971b17fcd51 +R e0fe78ea85289605bc2618d432bfef86 U dan -Z 02001fbe394dba3af87ef0d8d6630ccb +Z f7eb10852628454cfaa15a83f2d2254d diff --git a/manifest.uuid b/manifest.uuid index e7963e04d3..b5754b7308 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -22de99ef410ba2a540871f3e61157d8dc4b969416f14808aeca73971b17fcd51 \ No newline at end of file +f3ef9c7c2b4ba3de1057ad569f068b241d5f23e6629d8e0dacf85e57fd13b8aa \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 47585f1a37..8ac3374dd4 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3374,6 +3374,7 @@ int sqlite3BtreeNewDb(Btree *p){ */ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ BtShared *pBt = p->pBt; + Pager *pPager = pBt->pPager; int rc = SQLITE_OK; sqlite3BtreeEnter(p); @@ -3389,7 +3390,7 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ assert( pBt->inTransaction==TRANS_WRITE || IfNotOmitAV(pBt->bDoTruncate)==0 ); if( (p->db->flags & SQLITE_ResetDatabase) - && sqlite3PagerIsreadonly(pBt->pPager)==0 + && sqlite3PagerIsreadonly(pPager)==0 ){ pBt->btsFlags &= ~BTS_READ_ONLY; } @@ -3436,17 +3437,16 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ pBt->btsFlags &= ~BTS_INITIALLY_EMPTY; if( pBt->nPage==0 ) pBt->btsFlags |= BTS_INITIALLY_EMPTY; + sqlite3PagerWalDb(pPager, p->db); do { - Pager *pPager = pBt->pPager; #ifdef SQLITE_ENABLE_SETLK_TIMEOUT /* If transitioning from no transaction directly to a write transaction, ** block for the WRITER lock first if possible. */ - sqlite3PagerWalDb(pPager, p->db); if( pBt->pPage1==0 && wrflag ){ assert( pBt->inTransaction==TRANS_NONE ); rc = sqlite3PagerWalWriteLock(pPager, 1); - if( rc!=SQLITE_OK ) break; + if( rc!=SQLITE_BUSY && rc!=SQLITE_OK ) break; } #endif @@ -3479,9 +3479,12 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ (void)sqlite3PagerWalWriteLock(pPager, 0); unlockBtreeIfUnused(pBt); } - sqlite3PagerWalDb(pPager, 0); }while( (rc&0xFF)==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE && btreeInvokeBusyHandler(pBt) ); + sqlite3PagerWalDb(pPager, 0); +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + if( rc==SQLITE_BUSY_TIMEOUT ) rc = SQLITE_BUSY; +#endif if( rc==SQLITE_OK ){ if( p->inTrans==TRANS_NONE ){ @@ -3533,7 +3536,7 @@ trans_begun: ** 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); + rc = sqlite3PagerOpenSavepoint(pPager, p->db->nSavepoint); } } diff --git a/src/os_unix.c b/src/os_unix.c index 72c446ea77..fb172e7218 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -1565,8 +1565,9 @@ static int osSetPosixAdvisoryLock( struct flock *pLock, /* The description of the lock */ unixFile *pFile /* Structure holding timeout value */ ){ + int tm = pFile->iBusyTimeout; int rc = osFcntl(h,F_SETLK,pLock); - while( rc<0 && pFile->iBusyTimeout>0 ){ + while( rc<0 && tm>0 ){ /* On systems that support some kind of blocking file lock with a timeout, ** make appropriate changes here to invoke that blocking file lock. On ** generic posix, however, there is no such API. So we simply try the @@ -1574,7 +1575,7 @@ static int osSetPosixAdvisoryLock( ** the lock is obtained. */ usleep(1000); rc = osFcntl(h,F_SETLK,pLock); - pFile->iBusyTimeout--; + tm--; } return rc; } @@ -4316,13 +4317,16 @@ static int unixShmSystemLock( assert( n>=1 && n<=SQLITE_SHM_NLOCK ); if( pShmNode->hShm>=0 ){ + int res; /* Initialize the locking parameters */ f.l_type = lockType; f.l_whence = SEEK_SET; f.l_start = ofst; f.l_len = n; - rc = osSetPosixAdvisoryLock(pShmNode->hShm, &f, pFile); - rc = (rc!=(-1)) ? SQLITE_OK : SQLITE_BUSY; + res = osSetPosixAdvisoryLock(pShmNode->hShm, &f, pFile); + if( res==-1 ){ + rc = (pFile->iBusyTimeout ? SQLITE_BUSY_TIMEOUT : SQLITE_BUSY); + } } /* Update the global lock state and do debug tracing */ diff --git a/src/sqlite.h.in b/src/sqlite.h.in index aa0ac9b0ff..90544db29e 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -508,6 +508,7 @@ int sqlite3_exec( #define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8)) #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) #define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8)) +#define SQLITE_BUSY_TIMEOUT (SQLITE_BUSY | (3<<8)) #define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) #define SQLITE_CANTOPEN_ISDIR (SQLITE_CANTOPEN | (2<<8)) #define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8)) diff --git a/src/wal.c b/src/wal.c index c348f0f38b..d9e9ef177c 100644 --- a/src/wal.c +++ b/src/wal.c @@ -843,7 +843,7 @@ static int walLockShared(Wal *pWal, int lockIdx){ SQLITE_SHM_LOCK | SQLITE_SHM_SHARED); WALTRACE(("WAL%p: acquire SHARED-%s %s\n", pWal, walLockName(lockIdx), rc ? "failed" : "ok")); - VVA_ONLY( pWal->lockError = (u8)(rc!=SQLITE_OK && rc!=SQLITE_BUSY); ) + VVA_ONLY( pWal->lockError = (u8)(rc!=SQLITE_OK && (rc&0xFF)!=SQLITE_BUSY); ) return rc; } static void walUnlockShared(Wal *pWal, int lockIdx){ @@ -859,7 +859,7 @@ static int walLockExclusive(Wal *pWal, int lockIdx, int n){ SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE); WALTRACE(("WAL%p: acquire EXCLUSIVE-%s cnt=%d %s\n", pWal, walLockName(lockIdx), n, rc ? "failed" : "ok")); - VVA_ONLY( pWal->lockError = (u8)(rc!=SQLITE_OK && rc!=SQLITE_BUSY); ) + VVA_ONLY( pWal->lockError = (u8)(rc!=SQLITE_OK && (rc&0xFF)!=SQLITE_BUSY); ) return rc; } static void walUnlockExclusive(Wal *pWal, int lockIdx, int n){ @@ -1679,6 +1679,89 @@ static int walIteratorInit(Wal *pWal, u32 nBackfill, WalIterator **pp){ return rc; } +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT +/* +** Attempt to enable blocking locks. Blocking locks are enabled only if (a) +** they are supported by the VFS, and (b) the database handle is configured +** with a busy-timeout. Return 1 if blocking locks are successfully enabled, +** or 0 otherwise. +*/ +static int walEnableBlocking(Wal *pWal){ + int res = 0; + if( pWal->db ){ + int tmout = pWal->db->busyTimeout; + if( tmout ){ + int rc; + rc = sqlite3OsFileControl( + pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout + ); + res = (rc==SQLITE_OK); + } + } + return res; +} + +/* +** Disable blocking locks. +*/ +static void walDisableBlocking(Wal *pWal){ + int tmout = 0; + sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout); +} + +/* +** If parameter bLock is true, attempt to enable blocking locks, take +** the WRITER lock, and then disable blocking locks. If blocking locks +** cannot be enabled, no attempt to obtain the WRITER lock is made. Return +** an SQLite error code if an error occurs, or SQLITE_OK otherwise. It is not +** an error if blocking locks can not be enabled. +** +** If the bLock parameter is false and the WRITER lock is held, release it. +*/ +int sqlite3WalWriteLock(Wal *pWal, int bLock){ + int rc = SQLITE_OK; + assert( pWal->readLock<0 || bLock==0 ); + if( bLock ){ + assert( pWal->db ); + if( walEnableBlocking(pWal) ){ + rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); + if( rc==SQLITE_OK ){ + pWal->writeLock = 1; + } + walDisableBlocking(pWal); + } + }else if( pWal->writeLock ){ + walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); + pWal->writeLock = 0; + } + return rc; +} + +/* +** Set the database handle used to determine if blocking locks are required. +*/ +void sqlite3WalDb(Wal *pWal, sqlite3 *db){ + pWal->db = db; +} + +/* +** Take an exclusive WRITE lock. Blocking if so configured. +*/ +static int walLockWriter(Wal *pWal){ + int rc; + walEnableBlocking(pWal); + rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); + walDisableBlocking(pWal); + return rc; +} +#else +# define walEnableBlocking(x) 0 +# define walDisableBlocking(x) +# define walLockWriter(pWal) walLockExclusive((pWal), WAL_WRITE_LOCK, 1) +# define sqlite3WalDb(pWal, db) +#endif /* ifdef SQLITE_ENABLE_SETLK_TIMEOUT */ + + /* ** Attempt to obtain the exclusive WAL lock defined by parameters lockIdx and ** n. If the attempt fails and parameter xBusy is not NULL, then it is a @@ -1696,6 +1779,12 @@ static int walBusyLock( do { rc = walLockExclusive(pWal, lockIdx, n); }while( xBusy && rc==SQLITE_BUSY && xBusy(pBusyArg) ); +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + if( rc==SQLITE_BUSY_TIMEOUT ){ + walDisableBlocking(pWal); + rc = SQLITE_BUSY; + } +#endif return rc; } @@ -2118,88 +2207,6 @@ static int walIndexTryHdr(Wal *pWal, int *pChanged){ */ #define WAL_RETRY (-1) -#ifdef SQLITE_ENABLE_SETLK_TIMEOUT -/* -** Attempt to enable blocking locks. Blocking locks are enabled only if (a) -** they are supported by the VFS, and (b) the database handle is configured -** with a busy-timeout. Return 1 if blocking locks are successfully enabled, -** or 0 otherwise. -*/ -static int walEnableBlocking(Wal *pWal){ - int res = 0; - if( pWal->db ){ - int tmout = pWal->db->busyTimeout; - if( tmout ){ - int rc; - rc = sqlite3OsFileControl( - pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout - ); - res = (rc==SQLITE_OK); - } - } - return res; -} - -/* -** Disable blocking locks. -*/ -static void walDisableBlocking(Wal *pWal){ - int tmout = 0; - sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout); -} - -/* -** If parameter bLock is true, attempt to enable blocking locks, take -** the WRITER lock, and then disable blocking locks. If blocking locks -** cannot be enabled, no attempt to obtain the WRITER lock is made. Return -** an SQLite error code if an error occurs, or SQLITE_OK otherwise. It is not -** an error if blocking locks can not be enabled. -** -** If the bLock parameter is false and the WRITER lock is held, release it. -*/ -int sqlite3WalWriteLock(Wal *pWal, int bLock){ - int rc = SQLITE_OK; - assert( pWal->readLock<0 || bLock==0 ); - if( bLock ){ - assert( pWal->db ); - if( walEnableBlocking(pWal) ){ - rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); - if( rc==SQLITE_OK ){ - pWal->writeLock = 1; - } - walDisableBlocking(pWal); - } - }else if( pWal->writeLock ){ - walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); - pWal->writeLock = 0; - } - return rc; -} - -/* -** Set the database handle used to determine if blocking locks are required. -*/ -void sqlite3WalDb(Wal *pWal, sqlite3 *db){ - pWal->db = db; -} - -/* -** Take an exclusive WRITE lock. Blocking if so configured. -*/ -static int walLockWriter(Wal *pWal){ - int rc; - walEnableBlocking(pWal); - rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); - walDisableBlocking(pWal); - return rc; -} -#else -# define walEnableBlocking(x) 0 -# define walDisableBlocking(x) -# define walLockWriter(pWal) walLockExclusive((pWal), WAL_WRITE_LOCK, 1) -# define sqlite3WalDb(pWal, db) -#endif /* ifdef SQLITE_ENABLE_SETLK_TIMEOUT */ - /* ** Read the wal-index header from the wal-index and into pWal->hdr. ** If the wal-header appears to be corrupt, try to reconstruct the @@ -3688,9 +3695,7 @@ int sqlite3WalCheckpoint( /* Enable blocking locks, if possible. If blocking locks are successfully ** enabled, set xBusy2=0 so that the busy-handler is never invoked. */ sqlite3WalDb(pWal, db); - if( walEnableBlocking(pWal) ){ - xBusy2 = 0; - } + walEnableBlocking(pWal); /* IMPLEMENTATION-OF: R-62028-47212 All calls obtain an exclusive ** "checkpoint" lock on the database file. @@ -3774,6 +3779,9 @@ int sqlite3WalCheckpoint( pWal->ckptLock = 0; } WALTRACE(("WAL%p: checkpoint %s\n", pWal, rc ? "failed" : "ok")); +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + if( rc==SQLITE_BUSY_TIMEOUT ) rc = SQLITE_BUSY; +#endif return (rc==SQLITE_OK && eMode!=eMode2 ? SQLITE_BUSY : rc); } diff --git a/test/walsetlk.test b/test/walsetlk.test index 7964caa055..635839c0cf 100644 --- a/test/walsetlk.test +++ b/test/walsetlk.test @@ -12,6 +12,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +source $testdir/lock_common.tcl set testprefix walsetlk ifcapable !wal {finish_test ; return } @@ -71,5 +72,113 @@ do_test 1.8 { file size test.db-wal } 0 +db close +db2 close +#------------------------------------------------------------------------- + +do_multiclient_test tn { + + do_test 2.$tn.1 { + sql1 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(s, v); + INSERT INTO t1 VALUES(1, 2); + INSERT INTO t1 VALUES(3, 4); + INSERT INTO t1 VALUES(5, 6); + } + code1 { db timeout 2000 } + } {} + + do_test 2.$tn.2 { + sql2 { + BEGIN; + INSERT INTO t1 VALUES(7, 8); + } + } {} + + do_test 2.$tn.3 { + set us [lindex [time { catch {db eval "BEGIN EXCLUSIVE"} }] 0] + expr $us>1000000 && $us<4000000 + } {1} + + do_test 2.$tn.4 { + sql2 { COMMIT } + sql1 { SELECT * FROM t1 } + } {1 2 3 4 5 6 7 8} + + do_test 2.$tn.5 { + sql2 { + BEGIN; + INSERT INTO t1 VALUES(9, 10); + } + } {} + + do_test 2.$tn.6 { + set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0] + expr $us>1000000 && $us<4000000 + } {1} + + do_test 2.$tn.7 { + sql2 { + COMMIT; + BEGIN; + SELECT * FROM t1; + } + } {1 2 3 4 5 6 7 8 9 10} + + do_test 2.$tn.8 { + set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0] + expr $us>1000000 && $us<4000000 + } {1} + + do_test 2.$tn.9 { + sql3 { + INSERT INTO t1 VALUES(11, 12); + } + sql2 { + COMMIT; + BEGIN; + SELECT * FROM t1; + } + sql3 { + INSERT INTO t1 VALUES(13, 14); + } + } {} + + do_test 2.$tn.10 { + set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0] + expr $us>1000000 && $us<4000000 + } {1} + + do_test 2.$tn.11 { + sql3 { + BEGIN; + SELECT * FROM t1; + } + sql1 { INSERT INTO t1 VALUES(15, 16); } + } {} + + do_test 2.$tn.12 { + set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0] + expr $us>1000000 && $us<4000000 + } {1} + + do_test 2.$tn.13 { + sql2 { + COMMIT; + BEGIN; + SELECT * FROM t1; + } + sql1 { INSERT INTO t1 VALUES(17, 18); } + } {} + + do_test 2.$tn.14 { + set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0] + puts $us + expr $us>1000000 && $us<4000000 + } {1} + +} + finish_test From 7a623e1d25f471394ac5550c6eac496ac70fbc1d Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 6 May 2020 20:45:11 +0000 Subject: [PATCH 069/103] Fix a problem preventing building without SQLITE_ENABLE_SETLK_TIMEOUT defined. FossilOrigin-Name: 98eb54c6d83992886f17a00b6fc8998df230e3b5f45bafc6fae0d15a9ee5a4c6 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/os_unix.c | 4 ++++ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 7a33b8fa5a..0a7ef8f8c7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\serror\scode\sSQLITE_BUSY_TIMEOUT,\sused\sinternally\sby\sthe\sOS\slayer\sto\sindicate\sthat\sa\scall\sto\sxShmLock()\shas\sfailed\sdue\sto\stimeout\sof\sa\sblocking\slock. -D 2020-05-06T20:27:18.129 +C Fix\sa\sproblem\spreventing\sbuilding\swithout\sSQLITE_ENABLE_SETLK_TIMEOUT\sdefined. +D 2020-05-06T20:45:11.359 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -517,7 +517,7 @@ 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 ad4f910fd62b83c57dad364913d29a554a694a4461f489c2208306c63ce6eda2 +F src/os_unix.c 13f983da988b6460ef3c4c22099c67ab0938291e543644ac4d99eccc8ba604f1 F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 96436cb1920074d4ade120a1a8a9d0ae3f52df06651e21b7eccc5eae2f02b111 @@ -1864,7 +1864,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 22de99ef410ba2a540871f3e61157d8dc4b969416f14808aeca73971b17fcd51 -R e0fe78ea85289605bc2618d432bfef86 +P f3ef9c7c2b4ba3de1057ad569f068b241d5f23e6629d8e0dacf85e57fd13b8aa +R 300add0d813f0b2aa21b7602c0922ab2 U dan -Z f7eb10852628454cfaa15a83f2d2254d +Z 6ae115939550b6311fe0efe8d583ce34 diff --git a/manifest.uuid b/manifest.uuid index b5754b7308..a91752c03e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f3ef9c7c2b4ba3de1057ad569f068b241d5f23e6629d8e0dacf85e57fd13b8aa \ No newline at end of file +98eb54c6d83992886f17a00b6fc8998df230e3b5f45bafc6fae0d15a9ee5a4c6 \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index fb172e7218..d510711087 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -4325,7 +4325,11 @@ static int unixShmSystemLock( f.l_len = n; res = osSetPosixAdvisoryLock(pShmNode->hShm, &f, pFile); if( res==-1 ){ +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT rc = (pFile->iBusyTimeout ? SQLITE_BUSY_TIMEOUT : SQLITE_BUSY); +#else + rc = SQLITE_BUSY; +#endif } } From 783e159e48979c551c204cbfe9c8f7dd4550d5e4 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 6 May 2020 20:55:38 +0000 Subject: [PATCH 070/103] Fix harmless compiler warnings. FossilOrigin-Name: 92dc59132f8547635d73c61c21ea29b380c401ddc84a6d01412808e00386b9e8 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/btree.c | 3 +-- src/main.c | 2 +- src/sqliteInt.h | 2 +- src/wal.c | 2 +- 6 files changed, 15 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index 0a7ef8f8c7..fdf31ea371 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\spreventing\sbuilding\swithout\sSQLITE_ENABLE_SETLK_TIMEOUT\sdefined. -D 2020-05-06T20:45:11.359 +C Fix\sharmless\scompiler\swarnings. +D 2020-05-06T20:55:38.208 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c f0cd4a3683b60f456f17e28f24cc72febc0df9c3f3f5126d799f9dc9ee5844b6 +F src/btree.c a0f550b2df013c6ce2e16f2134b24750654717083679e8bd65d4b3eb991e0706 F src/btree.h 989ef3c33413549e3e148f3dcb46c030f317dac130dc86809ba6b9aa4b16c72a F src/btreeInt.h 887cdd2ea7f4a65143074a8a7c8928b0546f8c18dda3c06a408ce7992cbab0c0 F src/build.c ec6c0bda1e43ef55e5f5121a77ba19fac51fc6585f95ce2da795bcedcf6e8f36 @@ -497,7 +497,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 8e4211d04eb460c0694d486c6ba1c068d468c6f653c3f237869a802ad82854de F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 421310045bd78afefb772294a99e50f37d87ae578786a6169074e6291e30d969 -F src/main.c 685d391fc37ad2c1162ad6784cae4a454dcd3632bbab319464af733d71eca72f +F src/main.c 3f4a08e109b8b100230b62d0317de8b99ed4f2f8ac0f84c96d9bd53b21693f68 F src/malloc.c a3e13b001f988ecec6bdb90c0ea8912c8c786e623724d7098da623d8d01d19b1 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -538,7 +538,7 @@ F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b F src/sqlite.h.in a42bae930f462294801f24468dd56832b09de01072a26dc0df60ddc3c5602210 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h 26de171e0adccf6e465434b9fcce18fcfcc757e9a727356b029fc1676639540c +F src/sqliteInt.h 9d2caeaee7a317af536a60fcd828425da5d64c4f26aac5356f13dce1de3cb066 F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -617,7 +617,7 @@ F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143 F src/vdbevtab.c 8094dfc28dad82d60a1c832020a1b201a5381dc185c14638affc6d4e9d54c653 F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c f4eda6e6886da4c93e679210b14b75435d0087756644179b01896e485dd32677 +F src/wal.c 43ee77f2b7d0de649bf2da5e22ec19bb4690605d9df35aeceba8a9fb1a4d890c F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7c429c694abd12413a5c17aec9f47cfe9eba6807e6b0a32df883e8e3a14835ed F src/where.c 9546c82056e8cdb27291f98cf1adca5d271240b399bb97b32f77fc2bea6146c9 @@ -1864,7 +1864,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 f3ef9c7c2b4ba3de1057ad569f068b241d5f23e6629d8e0dacf85e57fd13b8aa -R 300add0d813f0b2aa21b7602c0922ab2 -U dan -Z 6ae115939550b6311fe0efe8d583ce34 +P 98eb54c6d83992886f17a00b6fc8998df230e3b5f45bafc6fae0d15a9ee5a4c6 +R 17cffa12f5b799cb65952b123268b435 +U drh +Z 20ca82d31230a53570c1c1a513848271 diff --git a/manifest.uuid b/manifest.uuid index a91752c03e..509ff0de39 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -98eb54c6d83992886f17a00b6fc8998df230e3b5f45bafc6fae0d15a9ee5a4c6 \ No newline at end of file +92dc59132f8547635d73c61c21ea29b380c401ddc84a6d01412808e00386b9e8 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 8ac3374dd4..972063bfa4 100644 --- a/src/btree.c +++ b/src/btree.c @@ -2304,8 +2304,7 @@ static int btreeInvokeBusyHandler(void *pArg){ BtShared *pBt = (BtShared*)pArg; assert( pBt->db ); assert( sqlite3_mutex_held(pBt->db->mutex) ); - return sqlite3InvokeBusyHandler(&pBt->db->busyHandler, - sqlite3PagerFile(pBt->pPager)); + return sqlite3InvokeBusyHandler(&pBt->db->busyHandler); } /* diff --git a/src/main.c b/src/main.c index 0bc8edfec0..83ba434be4 100644 --- a/src/main.c +++ b/src/main.c @@ -1664,7 +1664,7 @@ static int sqliteDefaultBusyCallback( ** If this routine returns non-zero, the lock is retried. If it ** returns 0, the operation aborts with an SQLITE_BUSY error. */ -int sqlite3InvokeBusyHandler(BusyHandler *p, sqlite3_file *pFile){ +int sqlite3InvokeBusyHandler(BusyHandler *p){ int rc; if( p->xBusyHandler==0 || p->nBusy<0 ) return 0; rc = p->xBusyHandler(p->pBusyArg, p->nBusy); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index b01f323935..5ae69e8732 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4584,7 +4584,7 @@ void sqlite3RenameExprlistUnmap(Parse*, ExprList*); CollSeq *sqlite3GetCollSeq(Parse*, u8, CollSeq *, const char*); char sqlite3AffinityType(const char*, Column*); void sqlite3Analyze(Parse*, Token*, Token*); -int sqlite3InvokeBusyHandler(BusyHandler*, sqlite3_file*); +int sqlite3InvokeBusyHandler(BusyHandler*); int sqlite3FindDb(sqlite3*, Token*); int sqlite3FindDbName(sqlite3 *, const char *); int sqlite3AnalysisLoad(sqlite3*,int iDB); diff --git a/src/wal.c b/src/wal.c index d9e9ef177c..d3db4b27b9 100644 --- a/src/wal.c +++ b/src/wal.c @@ -3695,7 +3695,7 @@ int sqlite3WalCheckpoint( /* Enable blocking locks, if possible. If blocking locks are successfully ** enabled, set xBusy2=0 so that the busy-handler is never invoked. */ sqlite3WalDb(pWal, db); - walEnableBlocking(pWal); + (void)walEnableBlocking(pWal); /* IMPLEMENTATION-OF: R-62028-47212 All calls obtain an exclusive ** "checkpoint" lock on the database file. From bc9fc18e4576e3efe9db1c1bb0e2d6a7943e855f Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 6 May 2020 21:24:29 +0000 Subject: [PATCH 071/103] Fix an assert() failure that could follow an IO error. FossilOrigin-Name: e89c864299024cdce395a15c19b000b976142b9eed267901a288adaa695f9e65 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wal.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index fdf31ea371..3fb759114b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings. -D 2020-05-06T20:55:38.208 +C Fix\san\sassert()\sfailure\sthat\scould\sfollow\san\sIO\serror. +D 2020-05-06T21:24:29.750 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -617,7 +617,7 @@ F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143 F src/vdbevtab.c 8094dfc28dad82d60a1c832020a1b201a5381dc185c14638affc6d4e9d54c653 F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 43ee77f2b7d0de649bf2da5e22ec19bb4690605d9df35aeceba8a9fb1a4d890c +F src/wal.c fdbf7641be6fa6e57f86484e8b5ffe816dffae176c4fd72a9b76e5e0b99bf6dd F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7c429c694abd12413a5c17aec9f47cfe9eba6807e6b0a32df883e8e3a14835ed F src/where.c 9546c82056e8cdb27291f98cf1adca5d271240b399bb97b32f77fc2bea6146c9 @@ -1864,7 +1864,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 98eb54c6d83992886f17a00b6fc8998df230e3b5f45bafc6fae0d15a9ee5a4c6 -R 17cffa12f5b799cb65952b123268b435 -U drh -Z 20ca82d31230a53570c1c1a513848271 +P 92dc59132f8547635d73c61c21ea29b380c401ddc84a6d01412808e00386b9e8 +R 5643010523c06a5a3b834d328816f805 +U dan +Z 39ee58cca1df36ea8fc4467e7e30965f diff --git a/manifest.uuid b/manifest.uuid index 509ff0de39..9232410316 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -92dc59132f8547635d73c61c21ea29b380c401ddc84a6d01412808e00386b9e8 \ No newline at end of file +e89c864299024cdce395a15c19b000b976142b9eed267901a288adaa695f9e65 \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index d3db4b27b9..baa1220b0d 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2945,8 +2945,8 @@ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ ** read-lock. */ void sqlite3WalEndReadTransaction(Wal *pWal){ + sqlite3WalEndWriteTransaction(pWal); if( pWal->readLock>=0 ){ - sqlite3WalEndWriteTransaction(pWal); walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock)); pWal->readLock = -1; } From a8aae52391afb2b1d5eac44c45e8de994642e228 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 6 May 2020 21:25:39 +0000 Subject: [PATCH 072/103] Avoid leaking a file-handle in test file walsetlk.test. FossilOrigin-Name: 3cfc675e2e917b69108feb3a75728b573abe8e44f0890a7d20d307b0b6784c0e --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/walsetlk.test | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 3fb759114b..cb6a0296ca 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sfailure\sthat\scould\sfollow\san\sIO\serror. -D 2020-05-06T21:24:29.750 +C Avoid\sleaking\sa\sfile-handle\sin\stest\sfile\swalsetlk.test. +D 2020-05-06T21:25:39.157 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1689,7 +1689,7 @@ F test/walprotocol2.test 7d3b6b4bf0b12f8007121b1e6ef714bc99101fb3b48e46371df1db8 F test/walro.test cb438d05ba0d191f10b688e39c4f0cd5b71569a1d1f4440e5bdf3c6880e08c20 F test/walro2.test 0e79dd15cbdb4f482c01ea248373669c732414a726b357d04846a816afafb768 F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cfd51af68 -F test/walsetlk.test 5c8bd1832a828db71283c03dc4a74d648c5333a5b2e978f5bda4f0d81bae5490 +F test/walsetlk.test 1d5628abc149c2c9d1fc4f5830d2540f02d9efad0ed815407d54035d23cd5df9 F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 @@ -1864,7 +1864,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 92dc59132f8547635d73c61c21ea29b380c401ddc84a6d01412808e00386b9e8 -R 5643010523c06a5a3b834d328816f805 +P e89c864299024cdce395a15c19b000b976142b9eed267901a288adaa695f9e65 +R 3d441440eb789a6955c09c8d2e120384 U dan -Z 39ee58cca1df36ea8fc4467e7e30965f +Z 6de8f7ead6c68a5c01aa4ce7d42c72c9 diff --git a/manifest.uuid b/manifest.uuid index 9232410316..286ca7607c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e89c864299024cdce395a15c19b000b976142b9eed267901a288adaa695f9e65 \ No newline at end of file +3cfc675e2e917b69108feb3a75728b573abe8e44f0890a7d20d307b0b6784c0e \ No newline at end of file diff --git a/test/walsetlk.test b/test/walsetlk.test index 635839c0cf..b44412d9b1 100644 --- a/test/walsetlk.test +++ b/test/walsetlk.test @@ -72,6 +72,7 @@ do_test 1.8 { file size test.db-wal } 0 +close $fd db close db2 close #------------------------------------------------------------------------- From e937df81f0b7993f1bfa2aaffeaeca0227cf0f7d Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 7 May 2020 01:56:57 +0000 Subject: [PATCH 073/103] Fix the handling of reserve-bytes so that the maximum value of 255 can be used. FossilOrigin-Name: 99749d4fd4930ccf15227f67c732266af9e09dd3cabdc0834fb450ef98196441 --- manifest | 24 ++++++++++++------------ manifest.uuid | 2 +- src/backup.c | 2 +- src/btree.c | 20 +++++++++----------- src/btreeInt.h | 2 +- src/build.c | 2 +- src/main.c | 2 +- src/pragma.c | 2 +- src/vacuum.c | 2 +- 9 files changed, 28 insertions(+), 30 deletions(-) diff --git a/manifest b/manifest index 6343d8da64..b053ae4c69 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Provide\sthe\sSQLITE_DEFAULT_LEGACY_ALTER_TABLE\scompile-time\soption. -D 2020-05-06T18:43:57.955 +C Fix\sthe\shandling\sof\sreserve-bytes\sso\sthat\sthe\smaximum\svalue\sof\s255\scan\sbe\sused. +D 2020-05-07T01:56:57.057 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -471,13 +471,13 @@ F src/alter.c fa2c3be9b0ebecfafb7062072a0ae6eda126d3e5a9fd51b2eded5acd95dc783c F src/analyze.c 953a6c43870ccaf080597244e1eeb4dc2ff6cb84f9501b24e46323de36970b61 F src/attach.c ff2daea0fe62080192e3f262670e4f61f5a86c1e7bea9cec34e960fe79852aa1 F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 -F src/backup.c 5e617c087f1c2d6005c2ec694ce80d6e16bc68d906e1b1c556d7c7c2228b636b +F src/backup.c b1c90cd4110248c8e1273ff4578d3a84c0c34725e1b96dacd4a6294a908702de F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 079ae87477d0d6c9c072b7f1b326e18131d14d486dc3ab729bd9be0f40d31b63 +F src/btree.c b7b9b444d083f135ad0bfe973ba118916a25085160bae4afcbc232886aeb153a F src/btree.h 989ef3c33413549e3e148f3dcb46c030f317dac130dc86809ba6b9aa4b16c72a -F src/btreeInt.h 887cdd2ea7f4a65143074a8a7c8928b0546f8c18dda3c06a408ce7992cbab0c0 -F src/build.c ec6c0bda1e43ef55e5f5121a77ba19fac51fc6585f95ce2da795bcedcf6e8f36 +F src/btreeInt.h 5c8b8749805787313ecf49eb5be3ced1e94bbf8ef54bb01470ce6bd0d5185c67 +F src/build.c 5566b570435d3511a0fd57388c124491b1f74e59561f0c1679fabe74c4c54b7a F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c e98518d2d3d4029a13c805e07313fb60c877be56db76e90dd5f3af73085d0ce6 @@ -497,7 +497,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 8e4211d04eb460c0694d486c6ba1c068d468c6f653c3f237869a802ad82854de F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 421310045bd78afefb772294a99e50f37d87ae578786a6169074e6291e30d969 -F src/main.c b48ce4de01fac57dddb12a3a67c6da625f236b0cf6db30e6b132b488e5e0cf05 +F src/main.c d832077d7a1e269c7c0e15ae845fcf80690a2880cb6520ef61f182c6631644f1 F src/malloc.c a3e13b001f988ecec6bdb90c0ea8912c8c786e623724d7098da623d8d01d19b1 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -526,7 +526,7 @@ F src/parse.y c8eff38606f443d5ba245263fa7abc05e4116d95656e050c4b78e9bfbf931add F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a -F src/pragma.c 85f763714b192cc26a236e3ec020a9155fe8da248af21eae86c0d1f0f49a0753 +F src/pragma.c 1b0db48177e52b256c003b8dc6ac708b1079a82cded944a23820574586a4731f F src/pragma.h 8168e588536bffd95319451f34e9a754dc37d205ebe433031a7813c5b286beae F src/prepare.c 8d4d6c8aa6afefc48027c54b41cdf134b4d6bc2fc4badbe483ad7fd9e1728a28 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 @@ -604,7 +604,7 @@ F src/update.c 3eb778c42155d944377a4ee5e440b04520f07094804ed6ce63d2528f619614d9 F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7 F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 -F src/vacuum.c f25d3b39681595e321a8a4e7fca3e5971cb14a401213d0742c9bf7d4ce8c2a1a +F src/vacuum.c de9780b89fa4ee74c3534f60b94820e3179aca759ffc1338ee53cb4ea7693dd3 F src/vdbe.c e3dba0dee25bc92e871c13cac655260912b3be4abcc85b439259c9934b208da3 F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 F src/vdbeInt.h 571413068b5ac07e2ed8ca7a02fa529622fd5455ae6981498376e5e492d2e5ef @@ -1863,7 +1863,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 9a84d8eb44b12ddea921baa73ac3bffa8c8d23a852605dc1dbde37907360bd79 -R 3b4da28cd92dfc3fa916a6592ebd618b +P 63e659d9a793227604aa95685a8d83cd08305f1d01e135407a3ffc6d54482ab8 +R 40c51b3c9fb1a999bf30ad6cc83f2430 U drh -Z 22c2351c8a2c47ecb255c4109b60094d +Z 4244c9fee796a92a9333ce7d1083a8fb diff --git a/manifest.uuid b/manifest.uuid index c14dfaa280..954b434a4f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -63e659d9a793227604aa95685a8d83cd08305f1d01e135407a3ffc6d54482ab8 \ No newline at end of file +99749d4fd4930ccf15227f67c732266af9e09dd3cabdc0834fb450ef98196441 \ No newline at end of file diff --git a/src/backup.c b/src/backup.c index 233d0cee7f..77e7ed950f 100644 --- a/src/backup.c +++ b/src/backup.c @@ -112,7 +112,7 @@ static Btree *findBtree(sqlite3 *pErrorDb, sqlite3 *pDb, const char *zDb){ */ static int setDestPgsz(sqlite3_backup *p){ int rc; - rc = sqlite3BtreeSetPageSize(p->pDest,sqlite3BtreeGetPageSize(p->pSrc),-1,0); + rc = sqlite3BtreeSetPageSize(p->pDest,sqlite3BtreeGetPageSize(p->pSrc),0,0); return rc; } diff --git a/src/btree.c b/src/btree.c index 0e1f7a2dcf..961de0ea40 100644 --- a/src/btree.c +++ b/src/btree.c @@ -2856,19 +2856,17 @@ int sqlite3BtreeSetPagerFlags( */ int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve, int iFix){ int rc = SQLITE_OK; + int x; BtShared *pBt = p->pBt; - assert( nReserve>=-1 && nReserve<=254 ); + assert( nReserve>=0 && nReserve<=255 ); sqlite3BtreeEnter(p); - if( nReserve>=0 ){ - pBt->nReserveWanted = nReserve + 1; - } + pBt->nReserveWanted = nReserve; + x = pBt->pageSize - pBt->usableSize; + if( nReservebtsFlags & BTS_PAGESIZE_FIXED ){ sqlite3BtreeLeave(p); return SQLITE_READONLY; } - if( nReserve<0 ){ - nReserve = pBt->pageSize - pBt->usableSize; - } assert( nReserve>=0 && nReserve<=255 ); if( pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE && ((pageSize-1)&pageSize)==0 ){ @@ -2919,12 +2917,12 @@ int sqlite3BtreeGetReserveNoMutex(Btree *p){ ** The amount of reserve can only grow - never shrink. */ int sqlite3BtreeGetRequestedReserve(Btree *p){ - int n; + int n1, n2; sqlite3BtreeEnter(p); - n = ((int)p->pBt->nReserveWanted) - 1; - if( n<0 ) n = sqlite3BtreeGetReserveNoMutex(p); + n1 = (int)p->pBt->nReserveWanted; + n2 = sqlite3BtreeGetReserveNoMutex(p); sqlite3BtreeLeave(p); - return n; + return n1>n2 ? n1 : n2; } diff --git a/src/btreeInt.h b/src/btreeInt.h index 34b33096ba..ec25b54662 100644 --- a/src/btreeInt.h +++ b/src/btreeInt.h @@ -417,7 +417,7 @@ struct BtShared { #endif u8 inTransaction; /* Transaction state */ u8 max1bytePayload; /* Maximum first byte of cell for a 1-byte payload */ - u8 nReserveWanted; /* 1 more than desired number of extra bytes per page */ + u8 nReserveWanted; /* Desired number of extra bytes per page */ u16 btsFlags; /* Boolean parameters. See BTS_* macros below */ u16 maxLocal; /* Maximum local payload in non-LEAFDATA tables */ u16 minLocal; /* Minimum local payload in non-LEAFDATA tables */ diff --git a/src/build.c b/src/build.c index cf36766aef..0b47e8e774 100644 --- a/src/build.c +++ b/src/build.c @@ -4630,7 +4630,7 @@ int sqlite3OpenTempDatabase(Parse *pParse){ } db->aDb[1].pBt = pBt; assert( db->aDb[1].pSchema ); - if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, -1, 0) ){ + if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, 0, 0) ){ sqlite3OomFault(db); return 1; } diff --git a/src/main.c b/src/main.c index 0d7011e7df..9e1a0e9dab 100644 --- a/src/main.c +++ b/src/main.c @@ -3854,7 +3854,7 @@ int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, void *pArg){ }else if( op==SQLITE_FCNTL_RESERVE_BYTES ){ int iNew = *(int*)pArg; *(int*)pArg = sqlite3BtreeGetRequestedReserve(pBtree); - if( iNew>=0 && iNew<=254 ){ + if( iNew>=0 && iNew<=255 ){ sqlite3BtreeSetPageSize(pBtree, 0, iNew, 0); } rc = SQLITE_OK; diff --git a/src/pragma.c b/src/pragma.c index 7105f75a97..161a241efe 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -555,7 +555,7 @@ void sqlite3Pragma( ** buffer that the pager module resizes using sqlite3_realloc(). */ db->nextPagesize = sqlite3Atoi(zRight); - if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize,-1,0) ){ + if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize,0,0) ){ sqlite3OomFault(db); } } diff --git a/src/vacuum.c b/src/vacuum.c index 5c230fbe14..920a98e018 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -377,7 +377,7 @@ end_of_vacuum: db->nChange = saved_nChange; db->nTotalChange = saved_nTotalChange; db->mTrace = saved_mTrace; - sqlite3BtreeSetPageSize(pMain, -1, -1, 1); + sqlite3BtreeSetPageSize(pMain, -1, 0, 1); /* Currently there is an SQL level transaction open on the vacuum ** database. No locks are held on any other files (since the main file From 11a8182e5c6868a275531315c71f167a410ea86c Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 7 May 2020 14:26:40 +0000 Subject: [PATCH 074/103] Fix an error that could occur if the first transaction executed by a connection configured to use blocking locks is a write-transaction for which the WRITER lock cannot be obtained. FossilOrigin-Name: 49e4dc72f7a4b28e4b49d7b91030bc986aea3ff44dac38cb6e68305800cd1de5 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- test/walsetlk.test | 17 +++++++++++++++-- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 99b7c24f76..c9dbb5cb17 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\strunk\schanges\sinto\sthis\sbranch. -D 2020-05-07T14:05:08.190 +C Fix\san\serror\sthat\scould\soccur\sif\sthe\sfirst\stransaction\sexecuted\sby\sa\sconnection\sconfigured\sto\suse\sblocking\slocks\sis\sa\swrite-transaction\sfor\swhich\sthe\sWRITER\slock\scannot\sbe\sobtained. +D 2020-05-07T14:26:40.925 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c b1c90cd4110248c8e1273ff4578d3a84c0c34725e1b96dacd4a6294a908702de F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c d78458bf4cc0e33a7faa1ab9904ebd66c8a8c820d802b53c9d273b45b3dac667 +F src/btree.c f14e415fcfd0b52b4e4ebd193ba5fadac5e8252c30f023389af682813af44025 F src/btree.h 989ef3c33413549e3e148f3dcb46c030f317dac130dc86809ba6b9aa4b16c72a F src/btreeInt.h 5c8b8749805787313ecf49eb5be3ced1e94bbf8ef54bb01470ce6bd0d5185c67 F src/build.c 5566b570435d3511a0fd57388c124491b1f74e59561f0c1679fabe74c4c54b7a @@ -1689,7 +1689,7 @@ F test/walprotocol2.test 7d3b6b4bf0b12f8007121b1e6ef714bc99101fb3b48e46371df1db8 F test/walro.test cb438d05ba0d191f10b688e39c4f0cd5b71569a1d1f4440e5bdf3c6880e08c20 F test/walro2.test 0e79dd15cbdb4f482c01ea248373669c732414a726b357d04846a816afafb768 F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cfd51af68 -F test/walsetlk.test 1d5628abc149c2c9d1fc4f5830d2540f02d9efad0ed815407d54035d23cd5df9 +F test/walsetlk.test 11f7fe792fdce54cf09874dab824e0627f2eedecfb9f7983e325606ec5184e0c F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 @@ -1864,7 +1864,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 3cfc675e2e917b69108feb3a75728b573abe8e44f0890a7d20d307b0b6784c0e 99749d4fd4930ccf15227f67c732266af9e09dd3cabdc0834fb450ef98196441 -R a2fb9be328819586780eac9a007a3fb6 +P ac4ee69664278a828e0a64c5be3b96fdb6eb6acc95646a9425c667aea328791c +R 22b4478e3cf3c244a4ab3e6943ce3c12 U dan -Z 26b45dc1c0a43ede219cdbbfa3466d04 +Z e85493d3ac63dab3b3e9ea5cdd9d6a6e diff --git a/manifest.uuid b/manifest.uuid index 6fa7b45d5b..6f07e8c3df 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ac4ee69664278a828e0a64c5be3b96fdb6eb6acc95646a9425c667aea328791c \ No newline at end of file +49e4dc72f7a4b28e4b49d7b91030bc986aea3ff44dac38cb6e68305800cd1de5 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 3fe0e1c3ce..f269b3deee 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3434,8 +3434,8 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ pBt->btsFlags &= ~BTS_INITIALLY_EMPTY; if( pBt->nPage==0 ) pBt->btsFlags |= BTS_INITIALLY_EMPTY; - sqlite3PagerWalDb(pPager, p->db); do { + sqlite3PagerWalDb(pPager, p->db); #ifdef SQLITE_ENABLE_SETLK_TIMEOUT /* If transitioning from no transaction directly to a write transaction, diff --git a/test/walsetlk.test b/test/walsetlk.test index b44412d9b1..66513ad2dc 100644 --- a/test/walsetlk.test +++ b/test/walsetlk.test @@ -78,7 +78,6 @@ db2 close #------------------------------------------------------------------------- do_multiclient_test tn { - do_test 2.$tn.1 { sql1 { PRAGMA journal_mode = wal; @@ -175,11 +174,25 @@ do_multiclient_test tn { do_test 2.$tn.14 { set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0] - puts $us expr $us>1000000 && $us<4000000 } {1} } +#------------------------------------------------------------------------- +reset_db +sqlite3 db2 test.db +db2 timeout 1000 +do_execsql_test 3.0 { + PRAGMA journal_mode = wal; + CREATE TABLE x1(x, y); + BEGIN; + INSERT INTO x1 VALUES(1, 2); +} {wal} + +do_test 3.1 { + list [catch { db2 eval {BEGIN EXCLUSIVE} } msg] $msg +} {1 {database is locked}} + finish_test From 2d3ed22a3f0f3c4f0d93e73d2827dd82f5913839 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 7 May 2020 19:55:40 +0000 Subject: [PATCH 075/103] Fix a failing assert() in fts3 triggered by a corrupt database. FossilOrigin-Name: cb299a090c81cdc5c116c4e15ab38fce112916f8b0fad0c7f2ab127e79238a94 --- ext/fts3/fts3.c | 4 +- manifest | 14 +-- manifest.uuid | 2 +- test/fts3corrupt4.test | 219 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 230 insertions(+), 9 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 841d7448f9..d4b0a2b2a6 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -2185,7 +2185,9 @@ static void fts3ReadNextPos( sqlite3_int64 *pi /* IN/OUT: Value read from position-list */ ){ if( (**pp)&0xFE ){ - fts3GetDeltaVarint(pp, pi); + int iVal; + *pp += fts3GetVarint32((*pp), &iVal); + *pi += iVal; *pi -= 2; }else{ *pi = POSITION_LIST_END; diff --git a/manifest b/manifest index 5c9d5d6b83..efba910c93 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Changes\sto\savoid\sdeadlock\sin\sSQLITE_ENABLE_SETLK_TIMEOUT\sbuilds. -D 2020-05-07T14:39:56.994 +C Fix\sa\sfailing\sassert()\sin\sfts3\striggered\sby\sa\scorrupt\sdatabase. +D 2020-05-07T19:55:40.224 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -82,7 +82,7 @@ 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 de2cc136ccc6128e948ffd5d74636756014b2430d6237d7002c3bc3ceb1ae3ae +F ext/fts3/fts3.c 176d51ed5ae760ea801a8d75bc982687bcae94b7c476c990320a3c0c3489cf7c F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 2c59cc46aefde134c1782e89a6a5384710ddcd4e783071337aa5d43d07269be3 F ext/fts3/fts3_aux.c 96708c8b3a7d9b8ca1b68ea2b7e503e283f20e95f145becadedfad096dbd0f34 @@ -948,7 +948,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 79a32ffdcd5254e2f7fa121d9656e61949ad049c3c6554229911b7ceac37c9c6 F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 6a1331bb51dc27acc063d26e0f1b610863b56a833ee54fa32767d17cf96bda4a +F test/fts3corrupt4.test fde292a4712753c7ef235a199273c5d196e18a56bd2c4d2db7ccaf59b7027a0a F test/fts3corrupt5.test 0549f85ec4bd22e992f645f13c59b99d652f2f5e643dac75568bfd23a6db7ed5 F test/fts3cov.test 7eacdbefd756cfa4dc2241974e3db2834e9b372ca215880e00032222f32194cf F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f @@ -1864,7 +1864,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 99749d4fd4930ccf15227f67c732266af9e09dd3cabdc0834fb450ef98196441 49e4dc72f7a4b28e4b49d7b91030bc986aea3ff44dac38cb6e68305800cd1de5 -R 22b4478e3cf3c244a4ab3e6943ce3c12 +P 652e4b23fffbff128b177697d7217b7d5aad8baf2364df1646b268ce6774e0fb +R 94aba76fc697261b26718fac307f4f4b U dan -Z cc31196848103ce16439278453597677 +Z 782e0da5030df39cfcdf5f2c26f089cd diff --git a/manifest.uuid b/manifest.uuid index 08430064a8..ae428eea4a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -652e4b23fffbff128b177697d7217b7d5aad8baf2364df1646b268ce6774e0fb \ No newline at end of file +cb299a090c81cdc5c116c4e15ab38fce112916f8b0fad0c7f2ab127e79238a94 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 89853833cb..8bbf0f5bbc 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -5847,4 +5847,223 @@ do_catchsql_test 37.1 { INSERT INTO f VALUES (0,x'00'); } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +# +reset_db + +reset_db +do_test 38.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 24576 pagesize 4096 filename crash-1cc4f8a70485ce.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 00 .....@ ........ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 00 00 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 62 2c 72 6f 6f 74 ock INTEGEb,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 00 00 00 00 00 00 (a,b,c)......... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 00 00 ...t.[.@.$...... +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7e f0 .........?%...~. +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 23 00 20 42 30 31 36 2f 36 30 39 20 44 45 42 4#. B016/609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 42 92 4c 45 20 46 54 53 VTAB ENB.LE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 5c 45 1f 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 B.E.JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAD EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 88 4e 4f 43 41 53 45 17 22 DSAFE=0.NOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 54 20 45 58 54 45 4e 53 OMIT LOAT EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 04 00 33 0f 19 IONXRTRIM....3.. +| 3264: 82 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 .AX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d fa 52 59 3d 35 30 20 ..MAX MEM.RY=50 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 42 42 4c 45 20 52 54 52 ...%..ENBBLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 3c NARY....)..ENAB< +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 95 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 31 42 4c 45 20 47 45 4e 50 4f 4c 59 58 42 49 N1BLE GENPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 3e f2 1e 4c NARY....)..E>..L +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 3c NARY....#..ENAB< +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 5d 24 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 ]$RIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 ..#..ENABLE FTS5 +| 3792: 58 4e 4f 43 40 53 45 16 0a 05 00 23 0f 17 45 4e XNOC@SE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4b 45 20 44 42 53 ...1..ENABKE DBS +| 3904: 54 41 54 20 56 53 41 42 58 52 54 62 49 4d 11 06 TAT VSABXRTbIM.. +| 3920: 05 00 17 0f 19 44 45 42 54 47 58 42 49 4e 41 52 .....DEBTGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 68 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d hRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4f 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XOOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 8c 36 ..0.%.....2016.6 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 5d 70 69 6c 65 72 03 25 02 00 00 ...co]piler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 7e 73 69 6f .........xte~sio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 7f 6c 79 03 25 11 00 00 05 6a 73 6f .eop.ly.%....jso +| 3152: 6e 31 03 25 14 00 e8 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 c2 00 03 01 02 02 00 03 01 04 82 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 60 62 6c 65 3f 07 02 00 01 02 92 e1 a4 .en`ble?........ +| 3488: ff fc a2 8c 95 b2 3f 01 01 f0 f1 02 00 57 02 00 ......?......W.. +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 10 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 01 01 02 00 01 02 ................ +| 3536: 00 01 02 00 00 f2 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 01 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 63 63 09 01 03 ..........gcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 5f 70 6f 6c 79 09 .........e_poly. +| 3616: 10 03 00 01 03 00 01 03 00 00 b3 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 cc 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 62 65 65 09 19 03 00 01 03 00 01 03 00 .rtbee.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 01 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 02 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 03 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 01 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 da 00 00 f1 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 01 ff ff 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 01 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| end crash-1cc4f8a70485ce.db +}]} {} + +do_execsql_test 38.1 { + UPDATE t1 SET b=a; +} + +do_catchsql_test 38.1 { + SELECT b FROM t1 WHERE a MATCH 'e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*' +} {1 {database disk image is malformed}} + + finish_test From acc175215aa4f641cd2c80d9f5d57f6d07cd1709 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 8 May 2020 10:44:23 +0000 Subject: [PATCH 076/103] Do not retry on a failed realloc() unless SQLITE_ENABLE_MEMORY_MANAGEMENT is available, meaning that the retry has some possibility of success. FossilOrigin-Name: e9a8f910b5e2b84dd77364783f0610bca970cc88aa037c88636c72145b99f411 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/malloc.c | 2 ++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index efba910c93..742b81eb5b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sfailing\sassert()\sin\sfts3\striggered\sby\sa\scorrupt\sdatabase. -D 2020-05-07T19:55:40.224 +C Do\snot\sretry\son\sa\sfailed\srealloc()\sunless\sSQLITE_ENABLE_MEMORY_MANAGEMENT\nis\savailable,\smeaning\sthat\sthe\sretry\shas\ssome\spossibility\sof\ssuccess. +D 2020-05-08T10:44:23.243 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -498,7 +498,7 @@ F src/insert.c 8e4211d04eb460c0694d486c6ba1c068d468c6f653c3f237869a802ad82854de F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 421310045bd78afefb772294a99e50f37d87ae578786a6169074e6291e30d969 F src/main.c 266393c10ff58d0919941f3187b54c0144b27d2f3fab8ae849eefbb89c48c451 -F src/malloc.c a3e13b001f988ecec6bdb90c0ea8912c8c786e623724d7098da623d8d01d19b1 +F src/malloc.c 167e91665080a2a6f92d358419e0b7e6440f2bba0b55e764a4f0197c95c8a077 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 @@ -1864,7 +1864,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 652e4b23fffbff128b177697d7217b7d5aad8baf2364df1646b268ce6774e0fb -R 94aba76fc697261b26718fac307f4f4b -U dan -Z 782e0da5030df39cfcdf5f2c26f089cd +P cb299a090c81cdc5c116c4e15ab38fce112916f8b0fad0c7f2ab127e79238a94 +R f27461d39a2a56a5cb4b1c6171bf79e9 +U drh +Z f9c0db042a472e6e243e17937715aa3a diff --git a/manifest.uuid b/manifest.uuid index ae428eea4a..0e651ee64d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cb299a090c81cdc5c116c4e15ab38fce112916f8b0fad0c7f2ab127e79238a94 \ No newline at end of file +e9a8f910b5e2b84dd77364783f0610bca970cc88aa037c88636c72145b99f411 \ No newline at end of file diff --git a/src/malloc.c b/src/malloc.c index 45f3efff9d..b7378099a1 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -482,10 +482,12 @@ void *sqlite3Realloc(void *pOld, u64 nBytes){ sqlite3MallocAlarm(nDiff); } pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT if( pNew==0 && mem0.alarmThreshold>0 ){ sqlite3MallocAlarm((int)nBytes); pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); } +#endif if( pNew ){ nNew = sqlite3MallocSize(pNew); sqlite3StatusUp(SQLITE_STATUS_MEMORY_USED, nNew-nOld); From 91d4c374e208b73a97c01c5ba0d77aae910f4a26 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 8 May 2020 15:28:07 +0000 Subject: [PATCH 077/103] New test cases added to test/fuzzdata8.db. FossilOrigin-Name: 3fce9711a47329811cd333ae2f1d1384a96d73b9a5d6f9d08454a57a3fd24fc8 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1476608 -> 1487872 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 742b81eb5b..38f7c908f5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sretry\son\sa\sfailed\srealloc()\sunless\sSQLITE_ENABLE_MEMORY_MANAGEMENT\nis\savailable,\smeaning\sthat\sthe\sretry\shas\ssome\spossibility\sof\ssuccess. -D 2020-05-08T10:44:23.243 +C New\stest\scases\sadded\sto\stest/fuzzdata8.db. +D 2020-05-08T15:28:07.347 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1027,7 +1027,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db fb701c5653f0a75a58e2ee0f8baf5b207faa7702dda88c913ebbe2abb3b33de3 +F test/fuzzdata8.db 45a0c80ca3a1b803b8d005d77f80629a9bc0a3e53af5d8e0a01ca9160259d748 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1864,7 +1864,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 cb299a090c81cdc5c116c4e15ab38fce112916f8b0fad0c7f2ab127e79238a94 -R f27461d39a2a56a5cb4b1c6171bf79e9 +P e9a8f910b5e2b84dd77364783f0610bca970cc88aa037c88636c72145b99f411 +R f83715747a9aa44d3e127dae69988dd0 U drh -Z f9c0db042a472e6e243e17937715aa3a +Z bc6d1ff7ed1d39185b1ecbd5cc994e34 diff --git a/manifest.uuid b/manifest.uuid index 0e651ee64d..2a560f1bd8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e9a8f910b5e2b84dd77364783f0610bca970cc88aa037c88636c72145b99f411 \ No newline at end of file +3fce9711a47329811cd333ae2f1d1384a96d73b9a5d6f9d08454a57a3fd24fc8 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 944393dbf4e9d70b66bb453c1529bb916c37a68e..e75ba400e3680e383844b47264d3ae0c71bb93c5 100644 GIT binary patch delta 29672 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 delta 28407 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 Date: Fri, 8 May 2020 18:22:00 +0000 Subject: [PATCH 078/103] Fix the count-optimization so that it honors the NOT INDEXED clause. FossilOrigin-Name: 0d23a0b209900f4d7c6c13f75d4364f19afc23db72f9cfdb11e05b81502e8040 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 16 +++++++++------- test/count.test | 38 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 38f7c908f5..f775a4fca0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scases\sadded\sto\stest/fuzzdata8.db. -D 2020-05-08T15:28:07.347 +C Fix\sthe\scount-optimization\sso\sthat\sit\shonors\sthe\sNOT\sINDEXED\sclause. +D 2020-05-08T18:22:00.148 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 1720bff2168491ca79af81a03bd18c0383f61d845c6e17caff9d25aabc4ab435 +F src/select.c ee4b02ad8047c35891b7a612091beec21ae7a0155290dcbefb0824aed20c46f3 F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b6 F src/sqlite.h.in a42bae930f462294801f24468dd56832b09de01072a26dc0df60ddc3c5602210 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -783,7 +783,7 @@ F test/corruptK.test 5b4212fe346699831c5ad559a62c54e11c0611bdde1ea8423a091f9c01a F test/corruptL.test 13ef74a93223af25015d223add0df4c2d375f0b958b546a2a72033f2fdab7a70 F test/corruptM.test 7d574320e08c1b36caa3e47262061f186367d593a7e305d35f15289cc2c3e067 F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34 -F test/count.test cb2e0f934c6eb33670044520748d2ecccd46259c +F test/count.test e0699a15712bc2a4679d60e408921c2cce7f6365a30340e790c98e0f334a9c77 F test/countofview.test e17d6e6688cf74f22783c9ec6e788c0790ee4fbbaee713affd00b1ac0bb39b86 F test/coveridxscan.test 5ec98719a2e2914e8908dc75f7247d9b54a26df04625f846ac7900d5483f7296 F test/crash.test fb9dc4a02dcba30d4aa5c2c226f98b220b2b959f @@ -1864,7 +1864,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 e9a8f910b5e2b84dd77364783f0610bca970cc88aa037c88636c72145b99f411 -R f83715747a9aa44d3e127dae69988dd0 +P 3fce9711a47329811cd333ae2f1d1384a96d73b9a5d6f9d08454a57a3fd24fc8 +R 8578e4a65d9ea9285aa73605ccc6eef5 U drh -Z bc6d1ff7ed1d39185b1ecbd5cc994e34 +Z e8a05b1abf68598bded8ccc3e45f3579 diff --git a/manifest.uuid b/manifest.uuid index 2a560f1bd8..12e9064883 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3fce9711a47329811cd333ae2f1d1384a96d73b9a5d6f9d08454a57a3fd24fc8 \ No newline at end of file +0d23a0b209900f4d7c6c13f75d4364f19afc23db72f9cfdb11e05b81502e8040 \ No newline at end of file diff --git a/src/select.c b/src/select.c index d3b35377b2..869984ff4b 100644 --- a/src/select.c +++ b/src/select.c @@ -6698,13 +6698,15 @@ int sqlite3Select( ** passed to keep OP_OpenRead happy. */ if( !HasRowid(pTab) ) pBest = sqlite3PrimaryKeyIndex(pTab); - for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ - if( pIdx->bUnordered==0 - && pIdx->szIdxRowszTabRow - && pIdx->pPartIdxWhere==0 - && (!pBest || pIdx->szIdxRowszIdxRow) - ){ - pBest = pIdx; + if( !p->pSrc->a[0].fg.notIndexed ){ + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + if( pIdx->bUnordered==0 + && pIdx->szIdxRowszTabRow + && pIdx->pPartIdxWhere==0 + && (!pBest || pIdx->szIdxRowszIdxRow) + ){ + pBest = pIdx; + } } } if( pBest ){ diff --git a/test/count.test b/test/count.test index 862b62ab17..250eb669b0 100644 --- a/test/count.test +++ b/test/count.test @@ -196,4 +196,42 @@ do_catchsql_test count-6.1 { SELECT count(DISTINCT) FROM t6 GROUP BY x; } {1 {DISTINCT aggregates must have exactly one argument}} +# 2020-05-08. +# The count() optimization should honor the NOT INDEXED clause +# +reset_db +do_execsql_test count-7.1 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT, c VARCHAR(1000)); + CREATE INDEX t1b ON t1(b); + INSERT INTO t1(a,b,c) values(1,2,'count.test cases for NOT INDEXED'); + ANALYZE; + UPDATE sqlite_stat1 SET stat='1000000 10' WHERE idx='t1b'; + ANALYZE sqlite_master; +} +do_eqp_test count-7.2 { + SELECT count(1) FROM t1; +} { + QUERY PLAN + `--SCAN TABLE t1 USING COVERING INDEX t1b +} +do_eqp_test count-7.3 { + SELECT count(1) FROM t1 NOT INDEXED +} { + QUERY PLAN + `--SCAN TABLE t1 +} +do_eqp_test count-7.3 { + SELECT count(*) FROM t1; +} { + QUERY PLAN + `--SCAN TABLE t1 USING COVERING INDEX t1b +} +do_eqp_test count-7.4 { + SELECT count(*) FROM t1 NOT INDEXED +} { + QUERY PLAN + `--SCAN TABLE t1 +} + + finish_test From 9e5fdc41c1f46f92776ede52359900b41b2e3a82 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 8 May 2020 19:02:21 +0000 Subject: [PATCH 079/103] Release some restrictions on columns added by ALTER TABLE so that they only apply if the table contains one or more rows. FossilOrigin-Name: 3a16c0ce4d8851f79f670d94786032c8007619154ece44647dc9cc5b1f9654ff --- manifest | 26 +++++++++++++------------- manifest.uuid | 2 +- src/alter.c | 33 ++++++++++++++++++++++++--------- src/build.c | 2 +- src/expr.c | 7 ++++--- test/alter.test | 1 + test/alter3.test | 1 + test/alter4.test | 2 ++ test/fkey2.test | 3 +++ test/without_rowid3.test | 3 +++ 10 files changed, 53 insertions(+), 27 deletions(-) diff --git a/manifest b/manifest index f775a4fca0..07b0207e1c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\scount-optimization\sso\sthat\sit\shonors\sthe\sNOT\sINDEXED\sclause. -D 2020-05-08T18:22:00.148 +C Release\ssome\srestrictions\son\scolumns\sadded\sby\sALTER\sTABLE\sso\sthat\sthey\nonly\sapply\sif\sthe\stable\scontains\sone\sor\smore\srows. +D 2020-05-08T19:02:21.347 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -467,7 +467,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c fa2c3be9b0ebecfafb7062072a0ae6eda126d3e5a9fd51b2eded5acd95dc783c +F src/alter.c 8d8e0b512a684596b3cf7026a92328575be5cefc7d0163e27a1fd179ad484512 F src/analyze.c 953a6c43870ccaf080597244e1eeb4dc2ff6cb84f9501b24e46323de36970b61 F src/attach.c ff2daea0fe62080192e3f262670e4f61f5a86c1e7bea9cec34e960fe79852aa1 F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 @@ -477,7 +477,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c f14e415fcfd0b52b4e4ebd193ba5fadac5e8252c30f023389af682813af44025 F src/btree.h 989ef3c33413549e3e148f3dcb46c030f317dac130dc86809ba6b9aa4b16c72a F src/btreeInt.h 5c8b8749805787313ecf49eb5be3ced1e94bbf8ef54bb01470ce6bd0d5185c67 -F src/build.c 5566b570435d3511a0fd57388c124491b1f74e59561f0c1679fabe74c4c54b7a +F src/build.c 5d19ef52be003d02e072dfc2892d7e107d20caf9ca49506937563de5c8d91141 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c e98518d2d3d4029a13c805e07313fb60c877be56db76e90dd5f3af73085d0ce6 @@ -485,7 +485,7 @@ F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4 -F src/expr.c d1e1d42cbdec08bb867a1ab43a59b401d82ff2bc88bdcb4af20e479a5facb6d8 +F src/expr.c 2918cac044a96d534d2f51bd121e913afda57314b8c5b00eb6bc1cf8999a7dea F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c f3dcdc0e95509864767c1f0991b19360f969e44177f4e058fd51da9a6154f47e @@ -632,10 +632,10 @@ F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 12106f0748e8e9bfc1a8e6840e203e051eae06a26ed13fc9fd5db108a8d6db54 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13 -F test/alter.test 77f0092d137dd9470fc683b64ed92868e188462e713e52f48deae8902ea60b96 +F test/alter.test 25e109787dc5e631e117eb6e1c57f96a572bb51228db3b4f8b5f41d665e2ccaa F test/alter2.test a966ccfcddf9ce0a4e0e6ff1aca9e6e7948e0e242cd7e43fc091948521807687 -F test/alter3.test 9351a9f0c59ff9dddecccaaa2f777ffee5369870c63d30d3a74add815254ec0f -F test/alter4.test 74b22251c5e9c48093cfc4921ed9c11b59df84634aeeb00e501773320beb8424 +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 @@ -875,7 +875,7 @@ F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f9339 F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a F test/filterfault.test c08fb491d698e8df6c122c98f7db1c65ffcfcad2c1ab0e07fa8a5be1b34eaa8b F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768 -F test/fkey2.test 65c86b11127c11f80c0f450b3480321e0f087edea3031b9daa1978e3c020c91b +F test/fkey2.test b1b6a8c5556dc0ccf31291b1fed8aa57e404b38f3236110e19ab4dc6aa93edf2 F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49 F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d F test/fkey5.test 24dd28eb3d9f1b5a174f47e9899ace5facb08373a4223593c8c631e6cf9f7d5a @@ -1751,7 +1751,7 @@ F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f1982 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 F test/without_rowid1.test 9cfb83705c506e3849fa7efc88a3c9a15f9a50bf9b1516b41757a7cef9bba8c3 F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 -F test/without_rowid3.test 392e6e12f275d11d931a8bc4580e573342f391639c87ffb631010a7b3cedfdc0 +F test/without_rowid3.test f8e6b9f7cb32a3570bab743dd4f28d2000e2107808d57585e776f5c3eb076241 F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a F test/without_rowid5.test 89b1c587bd92a0590e440da33e7666bf4891572a F test/without_rowid6.test 8463b20098e9f75a501a9f17dfb42fffc79068eac0b2775fe56ef2281d2df45e @@ -1864,7 +1864,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 3fce9711a47329811cd333ae2f1d1384a96d73b9a5d6f9d08454a57a3fd24fc8 -R 8578e4a65d9ea9285aa73605ccc6eef5 +P 0d23a0b209900f4d7c6c13f75d4364f19afc23db72f9cfdb11e05b81502e8040 +R b78535f970f25edde428ed2df290db8d U drh -Z e8a05b1abf68598bded8ccc3e45f3579 +Z 5bccd85159fe501fed38247765ad943e diff --git a/manifest.uuid b/manifest.uuid index 12e9064883..b26a0cf61a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0d23a0b209900f4d7c6c13f75d4364f19afc23db72f9cfdb11e05b81502e8040 \ No newline at end of file +3a16c0ce4d8851f79f670d94786032c8007619154ece44647dc9cc5b1f9654ff \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index c357f22074..e5bac436a8 100644 --- a/src/alter.c +++ b/src/alter.c @@ -255,6 +255,22 @@ exit_rename_table: db->mDbFlags = savedDbFlags; } +/* +** Write code that will raise an error if the table described by +** zDb and zTab is not empty. +*/ +static void sqlite3ErrorIfNotEmpty( + Parse *pParse, /* Parsing context */ + const char *zDb, /* Schema holding the table */ + const char *zTab, /* Table to check for empty */ + const char *zErr /* Error message text */ +){ + sqlite3NestedParse(pParse, + "SELECT raise(ABORT,%Q) FROM \"%w\".\"%w\"", + zErr, zDb, zTab + ); +} + /* ** This function is called after an "ALTER TABLE ... ADD" statement ** has been parsed. Argument pColDef contains the text of the new @@ -307,7 +323,8 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ return; } if( pNew->pIndex ){ - sqlite3ErrorMsg(pParse, "Cannot add a UNIQUE column"); + sqlite3ErrorMsg(pParse, + "Cannot add a UNIQUE column"); return; } if( (pCol->colFlags & COLFLAG_GENERATED)==0 ){ @@ -320,16 +337,15 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ pDflt = 0; } if( (db->flags&SQLITE_ForeignKeys) && pNew->pFKey && pDflt ){ - sqlite3ErrorMsg(pParse, + sqlite3ErrorIfNotEmpty(pParse, zDb, zTab, "Cannot add a REFERENCES column with non-NULL default value"); - return; } if( pCol->notNull && !pDflt ){ - sqlite3ErrorMsg(pParse, + sqlite3ErrorIfNotEmpty(pParse, zDb, zTab, "Cannot add a NOT NULL column with default value NULL"); - return; } + /* Ensure the default expression is something that sqlite3ValueFromExpr() ** can handle (i.e. not CURRENT_TIME etc.) */ @@ -343,14 +359,13 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ return; } if( !pVal ){ - sqlite3ErrorMsg(pParse,"Cannot add a column with non-constant default"); - return; + sqlite3ErrorIfNotEmpty(pParse, zDb, zTab, + "Cannot add a column with non-constant default"); } sqlite3ValueFree(pVal); } }else if( pCol->colFlags & COLFLAG_STORED ){ - sqlite3ErrorMsg(pParse, "cannot add a STORED column"); - return; + sqlite3ErrorIfNotEmpty(pParse, zDb, zTab, "cannot add a STORED column"); } diff --git a/src/build.c b/src/build.c index 0b47e8e774..571d2652e0 100644 --- a/src/build.c +++ b/src/build.c @@ -4741,7 +4741,7 @@ void sqlite3HaltConstraint( u8 p5Errmsg /* P5_ErrMsg type */ ){ Vdbe *v = sqlite3GetVdbe(pParse); - assert( (errCode&0xff)==SQLITE_CONSTRAINT ); + assert( (errCode&0xff)==SQLITE_CONSTRAINT || pParse->nested ); if( onError==OE_Abort ){ sqlite3MayAbort(pParse); } diff --git a/src/expr.c b/src/expr.c index 23e00db2ee..528377c5d6 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4482,7 +4482,7 @@ expr_code_doover: || pExpr->affExpr==OE_Fail || pExpr->affExpr==OE_Ignore ); - if( !pParse->pTriggerTab ){ + if( !pParse->pTriggerTab && !pParse->nested ){ sqlite3ErrorMsg(pParse, "RAISE() may only be used within a trigger-program"); return 0; @@ -4496,8 +4496,9 @@ expr_code_doover: v, OP_Halt, SQLITE_OK, OE_Ignore, 0, pExpr->u.zToken,0); VdbeCoverage(v); }else{ - sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_TRIGGER, - pExpr->affExpr, pExpr->u.zToken, 0, 0); + sqlite3HaltConstraint(pParse, + pParse->pTriggerTab ? SQLITE_CONSTRAINT_TRIGGER : SQLITE_ERROR, + pExpr->affExpr, pExpr->u.zToken, 0, 0); } break; diff --git a/test/alter.test b/test/alter.test index 0ec485ef81..43d2a6d5ae 100644 --- a/test/alter.test +++ b/test/alter.test @@ -840,6 +840,7 @@ do_test alter-13.3 { do_test alter-14.1 { catchsql { CREATE TABLE t3651(a UNIQUE); + INSERT INTO t3651 VALUES(5); ALTER TABLE t3651 ADD COLUMN b UNIQUE; } } {1 {Cannot add a UNIQUE column}} diff --git a/test/alter3.test b/test/alter3.test index b16a7f305b..30bc1cbba2 100644 --- a/test/alter3.test +++ b/test/alter3.test @@ -116,6 +116,7 @@ do_test alter3-1.99 { do_test alter3-2.1 { execsql { CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(1,2); } catchsql { ALTER TABLE t1 ADD c PRIMARY KEY; diff --git a/test/alter4.test b/test/alter4.test index 92f33e7a36..3aca7df338 100644 --- a/test/alter4.test +++ b/test/alter4.test @@ -123,6 +123,7 @@ do_test alter4-1.99 { do_test alter4-2.1 { execsql { CREATE TABLE temp.t1(a, b); + INSERT INTO t1 VALUES(1,2); } catchsql { ALTER TABLE t1 ADD c PRIMARY KEY; @@ -397,6 +398,7 @@ do_test alter4-10.1 { reset_db do_execsql_test alter4-11.0 { CREATE TABLE t1(c INTEGER PRIMARY KEY, d); + INSERT INTO t1(c,d) VALUES(1,2); PRAGMA foreign_keys = on; ALTER TABLE t1 ADD COLUMN e; } diff --git a/test/fkey2.test b/test/fkey2.test index e7fa7b6457..015c43cbd3 100644 --- a/test/fkey2.test +++ b/test/fkey2.test @@ -955,6 +955,7 @@ ifcapable altertable { execsql { CREATE TABLE t1(a PRIMARY KEY); CREATE TABLE t2(a, b); + INSERT INTO t2 VALUES(1,2); } catchsql { ALTER TABLE t2 ADD COLUMN c REFERENCES t1 } } {0 {}} @@ -1046,6 +1047,7 @@ ifcapable altertable { execsql { CREATE TEMP TABLE t1(a PRIMARY KEY); CREATE TEMP TABLE t2(a, b); + INSERT INTO temp.t2 VALUES(1,2); } catchsql { ALTER TABLE t2 ADD COLUMN c REFERENCES t1 } } {0 {}} @@ -1130,6 +1132,7 @@ ifcapable altertable { ATTACH ':memory:' AS aux; CREATE TABLE aux.t1(a PRIMARY KEY); CREATE TABLE aux.t2(a, b); + INSERT INTO aux.t2(a,b) VALUES(1,2); } catchsql { ALTER TABLE t2 ADD COLUMN c REFERENCES t1 } } {0 {}} diff --git a/test/without_rowid3.test b/test/without_rowid3.test index 24ef2304de..a9839e147e 100644 --- a/test/without_rowid3.test +++ b/test/without_rowid3.test @@ -921,6 +921,7 @@ ifcapable altertable { execsql { CREATE TABLE t1(a PRIMARY KEY) WITHOUT rowid; CREATE TABLE t2(a, b); + INSERT INTO t2(a,b) VALUES(1,2); } catchsql { ALTER TABLE t2 ADD COLUMN c REFERENCES t1 } } {0 {}} @@ -1015,6 +1016,7 @@ ifcapable altertable { execsql { CREATE TEMP TABLE t1(a PRIMARY KEY) WITHOUT rowid; CREATE TEMP TABLE t2(a, b); + INSERT INTO temp.t2(a,b) VALUES(1,2); } catchsql { ALTER TABLE t2 ADD COLUMN c REFERENCES t1 } } {0 {}} @@ -1102,6 +1104,7 @@ ifcapable altertable { ATTACH ':memory:' AS aux; CREATE TABLE aux.t1(a PRIMARY KEY) WITHOUT rowid; CREATE TABLE aux.t2(a, b); + INSERT INTO aux.t2(a,b) VALUES(1,2); } catchsql { ALTER TABLE t2 ADD COLUMN c REFERENCES t1 } } {0 {}} From efa78884a8f0049b73e581c7cc93d3070ab1a453 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 11 May 2020 10:55:24 +0000 Subject: [PATCH 080/103] Fix a problem handling constant integer expressions with collation sequences in PARTITION BY clauses. FossilOrigin-Name: 155e6649efe8614718be7ac6c3cccf5b073ae57496dc220db5e4313621f5188e --- manifest | 16 ++++++------ manifest.uuid | 2 +- src/window.c | 16 ++++++++---- test/window1.test | 65 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 85 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 07b0207e1c..32e2d3798a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Release\ssome\srestrictions\son\scolumns\sadded\sby\sALTER\sTABLE\sso\sthat\sthey\nonly\sapply\sif\sthe\stable\scontains\sone\sor\smore\srows. -D 2020-05-08T19:02:21.347 +C Fix\sa\sproblem\shandling\sconstant\sinteger\sexpressions\swith\scollation\ssequences\sin\sPARTITION\sBY\sclauses. +D 2020-05-11T10:55:24.702 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -624,7 +624,7 @@ F src/where.c 9546c82056e8cdb27291f98cf1adca5d271240b399bb97b32f77fc2bea6146c9 F src/whereInt.h 6b874aa15f94e43a2cec1080be64d955b04deeafeac90ffb5d6975c0d511be3c F src/wherecode.c 7b939de85d65cc4b4bfa197513136b9e0ae03167e3b82842ca5a0ba1055ba65d F src/whereexpr.c 264d58971eaf8256eb5b0917bcd7fc7a1f1109fdda183a8382308a1b18a2dce7 -F src/window.c ba1ffb78d73c5831433681aab7ee634230ee32f14ad508efa585044662141d5a +F src/window.c 194fc168626f186a2b90dfe5edb534ab164cbeb6c4906177bfcdd5c188a0b53d F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1725,7 +1725,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test ec792f92e63ee457447c5c04de8f8d42f4a94b842b5bac1f403ac38a6d867c22 +F test/window1.test a3504d44a3a125e35c53358cde1457d55bfc487bbe00f4c86bfed3a0bcc02140 F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1864,7 +1864,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 0d23a0b209900f4d7c6c13f75d4364f19afc23db72f9cfdb11e05b81502e8040 -R b78535f970f25edde428ed2df290db8d -U drh -Z 5bccd85159fe501fed38247765ad943e +P 3a16c0ce4d8851f79f670d94786032c8007619154ece44647dc9cc5b1f9654ff +R fc69c5e59594b07293acc95ef07dae5c +U dan +Z b04ae6fcaa9aca3a141e7a953df1650c diff --git a/manifest.uuid b/manifest.uuid index b26a0cf61a..d76c0c0cea 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3a16c0ce4d8851f79f670d94786032c8007619154ece44647dc9cc5b1f9654ff \ No newline at end of file +155e6649efe8614718be7ac6c3cccf5b073ae57496dc220db5e4313621f5188e \ No newline at end of file diff --git a/src/window.c b/src/window.c index db495d8322..f168cf55b2 100644 --- a/src/window.c +++ b/src/window.c @@ -895,13 +895,19 @@ static ExprList *exprListAppendList( int i; int nInit = pList ? pList->nExpr : 0; for(i=0; inExpr; i++){ - int iDummy; Expr *pDup = sqlite3ExprDup(pParse->db, pAppend->a[i].pExpr, 0); assert( pDup==0 || !ExprHasProperty(pDup, EP_MemToken) ); - if( bIntToNull && pDup && sqlite3ExprIsInteger(pDup, &iDummy) ){ - pDup->op = TK_NULL; - pDup->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse); - pDup->u.zToken = 0; + if( bIntToNull && pDup ){ + int iDummy; + Expr *pSub; + for(pSub=pDup; ExprHasProperty(pSub, EP_Skip); pSub=pSub->pLeft){ + assert( pSub ); + } + if( sqlite3ExprIsInteger(pSub, &iDummy) ){ + pSub->op = TK_NULL; + pSub->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse); + pSub->u.zToken = 0; + } } pList = sqlite3ExprListAppend(pParse, pList, pDup); if( pList ) pList->a[nInit+i].sortFlags = pAppend->a[i].sortFlags; diff --git a/test/window1.test b/test/window1.test index e8e4bc2c4f..25a76b9247 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1663,4 +1663,69 @@ do_catchsql_test 51.1 { sum(b) OVER(PARTITION BY min(DISTINCT c), c ORDER BY b))); } {1 {row value misused}} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 52.1 { + CREATE TABLE t1(a, b, c); + INSERT INTO t1 VALUES('AA','bb',356); + INSERT INTO t1 VALUES('CC','aa',158); + INSERT INTO t1 VALUES('BB','aa',399); + INSERT INTO t1 VALUES('FF','bb',938); +} + +do_execsql_test 52.2 { + SELECT + count() OVER win1, + sum(c) OVER win2, + first_value(c) OVER win2, + count(a) OVER (ORDER BY b) + FROM t1 + WINDOW + win1 AS (ORDER BY a), + win2 AS (PARTITION BY 6 ORDER BY a + RANGE BETWEEN 5 PRECEDING AND 0 PRECEDING ); +} { + 1 356 356 4 + 2 399 399 2 + 3 158 158 2 + 4 938 938 4 +} + +do_execsql_test 52.3 { +SELECT + count() OVER (), + sum(c) OVER win2, + first_value(c) OVER win2, + count(a) OVER (ORDER BY b) +FROM t1 +WINDOW + win1 AS (ORDER BY a), + win2 AS (PARTITION BY 6 COLLATE binary ORDER BY a + RANGE BETWEEN 5 PRECEDING AND 0 PRECEDING ); +} { + 4 356 356 4 + 4 399 399 2 + 4 158 158 2 + 4 938 938 4 +} + +do_execsql_test 52.4 { + SELECT + count() OVER win1, + sum(c) OVER win2, + first_value(c) OVER win2, + count(a) OVER (ORDER BY b) + FROM t1 + WINDOW + win1 AS (ORDER BY a), + win2 AS (PARTITION BY 6 COLLATE binary ORDER BY a + RANGE BETWEEN 5 PRECEDING AND 0 PRECEDING ); +} { + 1 356 356 4 + 2 399 399 2 + 3 158 158 2 + 4 938 938 4 +} + + finish_test From 2493dcdd07c630aa452757d2c6d4132b5dbebdc2 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 11 May 2020 11:11:25 +0000 Subject: [PATCH 081/103] New test case in test/fuzzdata8.db. FossilOrigin-Name: fa11230135610f01c56d6f436f30a8b57a50b430fe7397ea3a0b6642986b3a39 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1487872 -> 1489920 bytes 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 32e2d3798a..b376e1162a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\shandling\sconstant\sinteger\sexpressions\swith\scollation\ssequences\sin\sPARTITION\sBY\sclauses. -D 2020-05-11T10:55:24.702 +C New\stest\scase\sin\stest/fuzzdata8.db. +D 2020-05-11T11:11:25.317 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1027,7 +1027,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 45a0c80ca3a1b803b8d005d77f80629a9bc0a3e53af5d8e0a01ca9160259d748 +F test/fuzzdata8.db c47e5445e331bd4a3ed66553d4c10673a285f86f37389436a6e145ebca4643ee F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1864,7 +1864,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 3a16c0ce4d8851f79f670d94786032c8007619154ece44647dc9cc5b1f9654ff -R fc69c5e59594b07293acc95ef07dae5c -U dan -Z b04ae6fcaa9aca3a141e7a953df1650c +P 155e6649efe8614718be7ac6c3cccf5b073ae57496dc220db5e4313621f5188e +R 36caa3745a6abe46d58d1719e568eb6e +U drh +Z df38843ea9d10d3e89173fd8fbdb90f5 diff --git a/manifest.uuid b/manifest.uuid index d76c0c0cea..fca8aad7cf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -155e6649efe8614718be7ac6c3cccf5b073ae57496dc220db5e4313621f5188e \ No newline at end of file +fa11230135610f01c56d6f436f30a8b57a50b430fe7397ea3a0b6642986b3a39 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index e75ba400e3680e383844b47264d3ae0c71bb93c5..0e277a8359c7a95ea802d97619baa389d8f6ef20 100644 GIT binary patch delta 28164 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 vUyG)lPNjJ2-H3>=M~yjJzzW Date: Wed, 13 May 2020 13:33:30 +0000 Subject: [PATCH 082/103] Use AtomicStore() and AtomicLoad() in a few more places to avoid a theoretically undefined behaviour. This is not actually problem on any known hardware. FossilOrigin-Name: fda57d4d2f1499c861d43026aa9362d1a30d67c9c002ebf5b0cdc25251537fbb --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wal.c | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index b376e1162a..c0186492c4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scase\sin\stest/fuzzdata8.db. -D 2020-05-11T11:11:25.317 +C Use\sAtomicStore()\sand\sAtomicLoad()\sin\sa\sfew\smore\splaces\sto\savoid\sa\stheoretically\sundefined\sbehaviour.\sThis\sis\snot\sactually\sproblem\son\sany\sknown\shardware. +D 2020-05-13T13:33:30.884 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -617,7 +617,7 @@ F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143 F src/vdbevtab.c 8094dfc28dad82d60a1c832020a1b201a5381dc185c14638affc6d4e9d54c653 F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c fdbf7641be6fa6e57f86484e8b5ffe816dffae176c4fd72a9b76e5e0b99bf6dd +F src/wal.c 3dc15756d3c859799e30460e1ec6cd304e660df7f680f5cb1b50537de1e6f678 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7c429c694abd12413a5c17aec9f47cfe9eba6807e6b0a32df883e8e3a14835ed F src/where.c 9546c82056e8cdb27291f98cf1adca5d271240b399bb97b32f77fc2bea6146c9 @@ -1864,7 +1864,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 155e6649efe8614718be7ac6c3cccf5b073ae57496dc220db5e4313621f5188e -R 36caa3745a6abe46d58d1719e568eb6e -U drh -Z df38843ea9d10d3e89173fd8fbdb90f5 +P fa11230135610f01c56d6f436f30a8b57a50b430fe7397ea3a0b6642986b3a39 +R 97cd6268c5f3d9fa542f4ecc0358de1f +U dan +Z 9f3f4a1597829e70406a86fd3ae421dc diff --git a/manifest.uuid b/manifest.uuid index fca8aad7cf..2a22db18df 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fa11230135610f01c56d6f436f30a8b57a50b430fe7397ea3a0b6642986b3a39 \ No newline at end of file +fda57d4d2f1499c861d43026aa9362d1a30d67c9c002ebf5b0cdc25251537fbb \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index baa1220b0d..115db09cd6 100644 --- a/src/wal.c +++ b/src/wal.c @@ -1822,7 +1822,7 @@ static void walRestartHdr(Wal *pWal, u32 salt1){ sqlite3Put4byte((u8*)&aSalt[0], 1 + sqlite3Get4byte((u8*)&aSalt[0])); memcpy(&pWal->hdr.aSalt[1], &salt1, 4); walIndexWriteHdr(pWal); - pInfo->nBackfill = 0; + AtomicStore(&pInfo->nBackfill, 0); pInfo->nBackfillAttempted = 0; pInfo->aReadMark[1] = 0; for(i=2; iaReadMark[i] = READMARK_NOT_USED; @@ -1996,7 +1996,7 @@ static int walCheckpoint( } } if( rc==SQLITE_OK ){ - pInfo->nBackfill = mxSafeFrame; + AtomicStore(&pInfo->nBackfill, mxSafeFrame); } } @@ -2619,7 +2619,7 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ assert( pWal->nWiData>0 ); assert( pWal->apWiData[0]!=0 ); pInfo = walCkptInfo(pWal); - if( !useWal && pInfo->nBackfill==pWal->hdr.mxFrame + if( !useWal && AtomicLoad(&pInfo->nBackfill)==pWal->hdr.mxFrame #ifdef SQLITE_ENABLE_SNAPSHOT && (pWal->pSnapshot==0 || pWal->hdr.mxFrame==0) #endif @@ -2786,7 +2786,7 @@ int sqlite3WalSnapshotRecover(Wal *pWal){ rc = SQLITE_NOMEM; }else{ u32 i = pInfo->nBackfillAttempted; - for(i=pInfo->nBackfillAttempted; i>pInfo->nBackfill; i--){ + for(i=pInfo->nBackfillAttempted; i>AtomicLoad(&pInfo->nBackfill); i--){ WalHashLoc sLoc; /* Hash table location */ u32 pgno; /* Page number in db file */ i64 iDbOff; /* Offset of db file entry */ From ffe421c76ad11c29287cbabe3548a7d95569ac37 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 13 May 2020 17:26:38 +0000 Subject: [PATCH 083/103] Remove unused constant SQLITE_FUNC_COALESCE. FossilOrigin-Name: a116b20f863e9732cd08fbfbb1aa48204a17d611c9c1edde85dcf59310bde782 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/func.c | 4 ++-- src/sqliteInt.h | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index c0186492c4..108b1bf638 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sAtomicStore()\sand\sAtomicLoad()\sin\sa\sfew\smore\splaces\sto\savoid\sa\stheoretically\sundefined\sbehaviour.\sThis\sis\snot\sactually\sproblem\son\sany\sknown\shardware. -D 2020-05-13T13:33:30.884 +C Remove\sunused\sconstant\sSQLITE_FUNC_COALESCE. +D 2020-05-13T17:26:38.564 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -488,7 +488,7 @@ F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4 F src/expr.c 2918cac044a96d534d2f51bd121e913afda57314b8c5b00eb6bc1cf8999a7dea F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 -F src/func.c f3dcdc0e95509864767c1f0991b19360f969e44177f4e058fd51da9a6154f47e +F src/func.c 3065eb46cd973dedb5159834947125a1be7e84c3f2d838ea0d5999ec59865e66 F src/global.c 79a988b56b06ce2d08ebefe1d35da9aa25b3851faa47ea5233361c4827185a64 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -538,7 +538,7 @@ F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b F src/sqlite.h.in a42bae930f462294801f24468dd56832b09de01072a26dc0df60ddc3c5602210 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h 9d2caeaee7a317af536a60fcd828425da5d64c4f26aac5356f13dce1de3cb066 +F src/sqliteInt.h 1a44887a8cea894d771114ad9d47527fd0a360dedc0392df834b425c3c8e227e F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1864,7 +1864,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 fa11230135610f01c56d6f436f30a8b57a50b430fe7397ea3a0b6642986b3a39 -R 97cd6268c5f3d9fa542f4ecc0358de1f -U dan -Z 9f3f4a1597829e70406a86fd3ae421dc +P fda57d4d2f1499c861d43026aa9362d1a30d67c9c002ebf5b0cdc25251537fbb +R bd6cc4135d37a123d6913c8ebb546f8c +U drh +Z 4c9f597f730cc29a882d279a7e4f39c6 diff --git a/manifest.uuid b/manifest.uuid index 2a22db18df..f9da663b6d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fda57d4d2f1499c861d43026aa9362d1a30d67c9c002ebf5b0cdc25251537fbb \ No newline at end of file +a116b20f863e9732cd08fbfbb1aa48204a17d611c9c1edde85dcf59310bde782 \ No newline at end of file diff --git a/src/func.c b/src/func.c index 167b6afd7d..6c1e1f7567 100644 --- a/src/func.c +++ b/src/func.c @@ -1980,7 +1980,7 @@ void sqlite3RegisterBuiltinFunctions(void){ FUNCTION(upper, 1, 0, 0, upperFunc ), FUNCTION(lower, 1, 0, 0, lowerFunc ), FUNCTION(hex, 1, 0, 0, hexFunc ), - INLINE_FUNC(ifnull, 2, INLINEFUNC_coalesce, SQLITE_FUNC_COALESCE), + INLINE_FUNC(ifnull, 2, INLINEFUNC_coalesce, 0 ), VFUNCTION(random, 0, 0, 0, randomFunc ), VFUNCTION(randomblob, 1, 0, 0, randomBlob ), FUNCTION(nullif, 2, 0, 1, nullifFunc ), @@ -2020,7 +2020,7 @@ void sqlite3RegisterBuiltinFunctions(void){ #endif FUNCTION(coalesce, 1, 0, 0, 0 ), FUNCTION(coalesce, 0, 0, 0, 0 ), - INLINE_FUNC(coalesce, -1, INLINEFUNC_coalesce, SQLITE_FUNC_COALESCE), + INLINE_FUNC(coalesce, -1, INLINEFUNC_coalesce, 0 ), }; #ifndef SQLITE_OMIT_ALTERTABLE sqlite3AlterFunctions(); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 5ae69e8732..d80337fbf5 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1764,7 +1764,7 @@ struct FuncDestructor { #define SQLITE_FUNC_LENGTH 0x0040 /* Built-in length() function */ #define SQLITE_FUNC_TYPEOF 0x0080 /* Built-in typeof() function */ #define SQLITE_FUNC_COUNT 0x0100 /* Built-in count(*) aggregate */ -#define SQLITE_FUNC_COALESCE 0x0200 /* Built-in coalesce() or ifnull() */ +/* 0x0200 -- available for reuse */ #define SQLITE_FUNC_UNLIKELY 0x0400 /* Built-in unlikely() function */ #define SQLITE_FUNC_CONSTANT 0x0800 /* Constant inputs give a constant output */ #define SQLITE_FUNC_MINMAX 0x1000 /* True for min() and max() aggregates */ From 3c0e606bba4d489285f54bbed395a16e0fddf5d4 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 13 May 2020 18:03:34 +0000 Subject: [PATCH 084/103] Implement the IIF(x,y,z) SQL function that is short-hand for "CASE WHEN x THEN y ELSE z END". For compatibility with SQL Server. FossilOrigin-Name: fce173cd211b15867369b6a54fad48168352fc83981a722ce98e57299b88608a --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/expr.c | 7 +++++++ src/func.c | 1 + src/sqliteInt.h | 1 + test/e_expr.test | 48 ++++++++++++++++++++++++------------------------ 6 files changed, 43 insertions(+), 34 deletions(-) diff --git a/manifest b/manifest index 108b1bf638..b0c1e3f1f9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sunused\sconstant\sSQLITE_FUNC_COALESCE. -D 2020-05-13T17:26:38.564 +C Implement\sthe\sIIF(x,y,z)\sSQL\sfunction\sthat\sis\sshort-hand\sfor\n"CASE\sWHEN\sx\sTHEN\sy\sELSE\sz\sEND".\s\sFor\scompatibility\swith\sSQL\sServer. +D 2020-05-13T18:03:34.396 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,10 +485,10 @@ F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4 -F src/expr.c 2918cac044a96d534d2f51bd121e913afda57314b8c5b00eb6bc1cf8999a7dea +F src/expr.c 8eed44d9de8a3b0fe1c9809bb75a02b65488774c8ba8685512d8f63adade18e5 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 -F src/func.c 3065eb46cd973dedb5159834947125a1be7e84c3f2d838ea0d5999ec59865e66 +F src/func.c 4780623a0c67f9241d4d5360a7d612826cfb22b825d95de9dce959c43c09ff47 F src/global.c 79a988b56b06ce2d08ebefe1d35da9aa25b3851faa47ea5233361c4827185a64 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -538,7 +538,7 @@ F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b F src/sqlite.h.in a42bae930f462294801f24468dd56832b09de01072a26dc0df60ddc3c5602210 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h 1a44887a8cea894d771114ad9d47527fd0a360dedc0392df834b425c3c8e227e +F src/sqliteInt.h 610ea213d892d1dce31445be864115dab6909631d224e3420b40b46fbc21e2b3 F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -835,7 +835,7 @@ F test/e_createtable.test ea27082d6f84df61e1d9e383f3fd79220418856a4a8afc41af75d4 F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e F test/e_droptrigger.test 3cd080807622c13e5bbb61fc9a57bd7754da2412 F test/e_dropview.test 74e405df7fa0f762e0c9445b166fe03955856532e2bb234c372f7c51228d75e7 -F test/e_expr.test 328d2d7c84f8e53e942a13eac771b337bcdfcf4c3569324001868b5639f3c857 +F test/e_expr.test 0d4e5bb50e60ee58aaf0c1184b4ee65cd3351e9aa54ca6568cef075288e58088 F test/e_fkey.test 2febb2084aef9b0186782421c07bc9d377abf067c9cb4efd49d9647ae31f5afe F test/e_fts3.test 17ba7c373aba4d4f5696ba147ee23fd1a1ef70782af050e03e262ca187c5ee07 F test/e_insert.test f02f7f17852b2163732c6611d193f84fc67bc641fb4882c77a464076e5eba80e @@ -1864,7 +1864,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 fda57d4d2f1499c861d43026aa9362d1a30d67c9c002ebf5b0cdc25251537fbb -R bd6cc4135d37a123d6913c8ebb546f8c +P a116b20f863e9732cd08fbfbb1aa48204a17d611c9c1edde85dcf59310bde782 +R f70dac47e4a001bdb43fd3a204ed3565 U drh -Z 4c9f597f730cc29a882d279a7e4f39c6 +Z 216cd8b87e5791c27226341eec7b12c9 diff --git a/manifest.uuid b/manifest.uuid index f9da663b6d..7bcb2f0d19 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a116b20f863e9732cd08fbfbb1aa48204a17d611c9c1edde85dcf59310bde782 \ No newline at end of file +fce173cd211b15867369b6a54fad48168352fc83981a722ce98e57299b88608a \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 528377c5d6..7205f8628a 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3700,6 +3700,13 @@ static int exprCodeInlineFunction( sqlite3VdbeResolveLabel(v, endCoalesce); break; } + case INLINEFUNC_iif: { + Expr caseExpr; + memset(&caseExpr, 0, sizeof(caseExpr)); + caseExpr.op = TK_CASE; + caseExpr.x.pList = pFarg; + return sqlite3ExprCodeTarget(pParse, &caseExpr, target); + } default: { /* The UNLIKELY() function is a no-op. The result is the value diff --git a/src/func.c b/src/func.c index 6c1e1f7567..f50fa19869 100644 --- a/src/func.c +++ b/src/func.c @@ -2021,6 +2021,7 @@ void sqlite3RegisterBuiltinFunctions(void){ FUNCTION(coalesce, 1, 0, 0, 0 ), FUNCTION(coalesce, 0, 0, 0, 0 ), INLINE_FUNC(coalesce, -1, INLINEFUNC_coalesce, 0 ), + INLINE_FUNC(iif, 3, INLINEFUNC_iif, 0 ), }; #ifndef SQLITE_OMIT_ALTERTABLE sqlite3AlterFunctions(); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d80337fbf5..05109571e7 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1785,6 +1785,7 @@ struct FuncDestructor { #define INLINEFUNC_expr_implies_expr 2 #define INLINEFUNC_expr_compare 3 #define INLINEFUNC_affinity 4 +#define INLINEFUNC_iif 5 #define INLINEFUNC_unlikely 99 /* Default case */ /* diff --git a/test/e_expr.test b/test/e_expr.test index 94e66afec6..af5f32b13f 100644 --- a/test/e_expr.test +++ b/test/e_expr.test @@ -1235,11 +1235,11 @@ db nullvalue {} # evaluating WHEN terms. # do_execsql_test e_expr-21.4.1 { - SELECT CASE WHEN NULL THEN 'A' WHEN 1 THEN 'B' END -} {B} + SELECT CASE WHEN NULL THEN 'A' WHEN 1 THEN 'B' END, iif(NULL,8,99); +} {B 99} do_execsql_test e_expr-21.4.2 { - SELECT CASE WHEN 0 THEN 'A' WHEN NULL THEN 'B' ELSE 'C' END -} {C} + SELECT CASE WHEN 0 THEN 'A' WHEN NULL THEN 'B' ELSE 'C' END, iif(0,8,99); +} {C 99} # EVIDENCE-OF: R-38620-19499 In a CASE with a base expression, the base # expression is evaluated just once and the result is compared against @@ -1952,39 +1952,39 @@ foreach {tn expr} { # 'english' and '0' are all considered to be false. # do_execsql_test e_expr-37.1 { - SELECT CASE WHEN NULL THEN 'true' ELSE 'false' END; -} {false} + SELECT CASE WHEN NULL THEN 'true' ELSE 'false' END, iif(NULL,'true','false'); +} {false false} do_execsql_test e_expr-37.2 { - SELECT CASE WHEN 0.0 THEN 'true' ELSE 'false' END; -} {false} + SELECT CASE WHEN 0.0 THEN 'true' ELSE 'false' END, iif(0.0,'true','false'); +} {false false} do_execsql_test e_expr-37.3 { - SELECT CASE WHEN 0 THEN 'true' ELSE 'false' END; -} {false} + SELECT CASE WHEN 0 THEN 'true' ELSE 'false' END, iif(0,'true','false'); +} {false false} do_execsql_test e_expr-37.4 { - SELECT CASE WHEN 'engligh' THEN 'true' ELSE 'false' END; -} {false} + SELECT CASE WHEN 'engligh' THEN 'true' ELSE 'false' END, iif('engligh','true','false'); +} {false false} do_execsql_test e_expr-37.5 { - SELECT CASE WHEN '0' THEN 'true' ELSE 'false' END; -} {false} + SELECT CASE WHEN '0' THEN 'true' ELSE 'false' END, iif('0','true','false'); +} {false false} # EVIDENCE-OF: R-55532-10108 Values 1, 1.0, 0.1, -0.1 and '1english' are # considered to be true. # do_execsql_test e_expr-37.6 { - SELECT CASE WHEN 1 THEN 'true' ELSE 'false' END; -} {true} + SELECT CASE WHEN 1 THEN 'true' ELSE 'false' END, iif(1,'true','false'); +} {true true} do_execsql_test e_expr-37.7 { - SELECT CASE WHEN 1.0 THEN 'true' ELSE 'false' END; -} {true} + SELECT CASE WHEN 1.0 THEN 'true' ELSE 'false' END, iif(1.0,'true','false'); +} {true true} do_execsql_test e_expr-37.8 { - SELECT CASE WHEN 0.1 THEN 'true' ELSE 'false' END; -} {true} + SELECT CASE WHEN 0.1 THEN 'true' ELSE 'false' END, iif(0.1,'true','false'); +} {true true} do_execsql_test e_expr-37.9 { - SELECT CASE WHEN -0.1 THEN 'true' ELSE 'false' END; -} {true} + SELECT CASE WHEN -0.1 THEN 'true' ELSE 'false' END, iif(-0.1,'true','false'); +} {true true} do_execsql_test e_expr-37.10 { - SELECT CASE WHEN '1english' THEN 'true' ELSE 'false' END; -} {true} + SELECT CASE WHEN '1english' THEN 'true' ELSE 'false' END, iif('1engl','true','false'); +} {true true} finish_test From 3d863b5e4efb2305d64f87a2128289d1c3ce09b6 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 14 May 2020 21:16:52 +0000 Subject: [PATCH 085/103] Do not allow a virtual table to be renamed into the name of one of its shadows. FossilOrigin-Name: eca0ba2cf4c0fdf757bae19c6397a48245adb99e8017ddc28f01804072a30b2c --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/alter.c | 5 ++++- src/build.c | 31 ++++++++++++++++++++++++------- src/sqliteInt.h | 2 ++ 5 files changed, 39 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index b0c1e3f1f9..6696be625f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Implement\sthe\sIIF(x,y,z)\sSQL\sfunction\sthat\sis\sshort-hand\sfor\n"CASE\sWHEN\sx\sTHEN\sy\sELSE\sz\sEND".\s\sFor\scompatibility\swith\sSQL\sServer. -D 2020-05-13T18:03:34.396 +C Do\snot\sallow\sa\svirtual\stable\sto\sbe\srenamed\sinto\sthe\sname\sof\sone\sof\sits\nshadows. +D 2020-05-14T21:16:52.998 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -467,7 +467,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 8d8e0b512a684596b3cf7026a92328575be5cefc7d0163e27a1fd179ad484512 +F src/alter.c 826bc4561456094cf758f095776026f25892a2bb3a7cd86742323267dc9bdb5f F src/analyze.c 953a6c43870ccaf080597244e1eeb4dc2ff6cb84f9501b24e46323de36970b61 F src/attach.c ff2daea0fe62080192e3f262670e4f61f5a86c1e7bea9cec34e960fe79852aa1 F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 @@ -477,7 +477,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c f14e415fcfd0b52b4e4ebd193ba5fadac5e8252c30f023389af682813af44025 F src/btree.h 989ef3c33413549e3e148f3dcb46c030f317dac130dc86809ba6b9aa4b16c72a F src/btreeInt.h 5c8b8749805787313ecf49eb5be3ced1e94bbf8ef54bb01470ce6bd0d5185c67 -F src/build.c 5d19ef52be003d02e072dfc2892d7e107d20caf9ca49506937563de5c8d91141 +F src/build.c 520d6d125288b7da745f8299840015f66c1d1b896a9308e24d7fde6fa5fafc9b F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c e98518d2d3d4029a13c805e07313fb60c877be56db76e90dd5f3af73085d0ce6 @@ -538,7 +538,7 @@ F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b F src/sqlite.h.in a42bae930f462294801f24468dd56832b09de01072a26dc0df60ddc3c5602210 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h 610ea213d892d1dce31445be864115dab6909631d224e3420b40b46fbc21e2b3 +F src/sqliteInt.h 8878a88c18a013d1843638001d7fc56a8f99740f151fc7597b1641b61accf58c F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1864,7 +1864,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 a116b20f863e9732cd08fbfbb1aa48204a17d611c9c1edde85dcf59310bde782 -R f70dac47e4a001bdb43fd3a204ed3565 +P fce173cd211b15867369b6a54fad48168352fc83981a722ce98e57299b88608a +R c4bbcaebfa551f5607badab106ccec9f U drh -Z 216cd8b87e5791c27226341eec7b12c9 +Z 2e6f5c9c35bee9feb15786a37381648b diff --git a/manifest.uuid b/manifest.uuid index 7bcb2f0d19..a40c9a7b93 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fce173cd211b15867369b6a54fad48168352fc83981a722ce98e57299b88608a \ No newline at end of file +eca0ba2cf4c0fdf757bae19c6397a48245adb99e8017ddc28f01804072a30b2c \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index e5bac436a8..3332665a6c 100644 --- a/src/alter.c +++ b/src/alter.c @@ -123,7 +123,10 @@ void sqlite3AlterRenameTable( /* Check that a table or index named 'zName' does not already exist ** in database iDb. If so, this is an error. */ - if( sqlite3FindTable(db, zName, zDb) || sqlite3FindIndex(db, zName, zDb) ){ + if( sqlite3FindTable(db, zName, zDb) + || sqlite3FindIndex(db, zName, zDb) + || sqlite3IsShadowTableOf(db, pTab, zName) + ){ sqlite3ErrorMsg(pParse, "there is already another table or index with this name: %s", zName); goto exit_rename_table; diff --git a/src/build.c b/src/build.c index 571d2652e0..8b0977a48d 100644 --- a/src/build.c +++ b/src/build.c @@ -2131,6 +2131,28 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ recomputeColumnsNotIndexed(pPk); } + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Return true if pTab is a virtual table and zName is a shadow table name +** for that virtual table. +*/ +int sqlite3IsShadowTableOf(sqlite3 *db, Table *pTab, const char *zName){ + int nName; /* Length of zName */ + Module *pMod; /* Module for the virtual table */ + + if( !IsVirtual(pTab) ) return 0; + nName = sqlite3Strlen30(pTab->zName); + if( sqlite3_strnicmp(zName, pTab->zName, nName)!=0 ) return 0; + if( zName[nName]!='_' ) return 0; + pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->azModuleArg[0]); + if( pMod==0 ) return 0; + if( pMod->pModule->iVersion<3 ) return 0; + if( pMod->pModule->xShadowName==0 ) return 0; + return pMod->pModule->xShadowName(zName+nName+1); +} +#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ + #ifndef SQLITE_OMIT_VIRTUALTABLE /* ** Return true if zName is a shadow table name in the current database @@ -2142,8 +2164,6 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ int sqlite3ShadowTableName(sqlite3 *db, const char *zName){ char *zTail; /* Pointer to the last "_" in zName */ Table *pTab; /* Table that zName is a shadow of */ - Module *pMod; /* Module for the virtual table */ - zTail = strrchr(zName, '_'); if( zTail==0 ) return 0; *zTail = 0; @@ -2151,14 +2171,11 @@ int sqlite3ShadowTableName(sqlite3 *db, const char *zName){ *zTail = '_'; if( pTab==0 ) return 0; if( !IsVirtual(pTab) ) return 0; - pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->azModuleArg[0]); - if( pMod==0 ) return 0; - if( pMod->pModule->iVersion<3 ) return 0; - if( pMod->pModule->xShadowName==0 ) return 0; - return pMod->pModule->xShadowName(zTail+1); + return sqlite3IsShadowTableOf(db, pTab, zName); } #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ + #ifdef SQLITE_DEBUG /* ** Mark all nodes of an expression as EP_Immutable, indicating that diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 05109571e7..2b1c483192 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4710,8 +4710,10 @@ void sqlite3AutoLoadExtensions(sqlite3*); int sqlite3ReadOnlyShadowTables(sqlite3 *db); #ifndef SQLITE_OMIT_VIRTUALTABLE int sqlite3ShadowTableName(sqlite3 *db, const char *zName); + int sqlite3IsShadowTableOf(sqlite3*,Table*,const char*); #else # define sqlite3ShadowTableName(A,B) 0 +# define sqlite3IsShadowTableOf(A,B,C) 0 #endif int sqlite3VtabEponymousTableInit(Parse*,Module*); void sqlite3VtabEponymousTableClear(sqlite3*,Module*); From 219b8e7e7587df8669d96ce867cdd61ca1c05730 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 14 May 2020 23:59:24 +0000 Subject: [PATCH 086/103] Fix a null pointer deference that can occur on a strange matchinfo() query. FossilOrigin-Name: a4dd148928ea65bd4e1654dfacc3d8057d1f85b8c9939416991d50722e5a720e --- ext/fts3/fts3_snippet.c | 2 +- manifest | 13 +++++++------ manifest.uuid | 2 +- test/fts3matchinfo2.test | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 test/fts3matchinfo2.test diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index 2b20ba10a7..ebc771fd6a 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -876,7 +876,7 @@ static int fts3ExprLHits( iStart = pExpr->iPhrase * ((p->nCol + 31) / 32); } - while( 1 ){ + if( pIter ) while( 1 ){ int nHit = fts3ColumnlistCount(&pIter); if( (pPhrase->iColumn>=pTab->nColumn || pPhrase->iColumn==iCol) ){ if( p->flag==FTS3_MATCHINFO_LHITS ){ diff --git a/manifest b/manifest index 6696be625f..51af44edeb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sallow\sa\svirtual\stable\sto\sbe\srenamed\sinto\sthe\sname\sof\sone\sof\sits\nshadows. -D 2020-05-14T21:16:52.998 +C Fix\sa\snull\spointer\sdeference\sthat\scan\soccur\son\sa\sstrange\smatchinfo()\nquery. +D 2020-05-14T23:59:24.284 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -91,7 +91,7 @@ F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6 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 052b35ad746349ffb53820379bacdb23ff3ac60d3cc13d986e56d42822ef5a9a +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 @@ -969,6 +969,7 @@ F test/fts3fuzz001.test e3c7b0ce9b04cc02281dcc96812a277f02df03cd7dc082055d87e11e 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 @@ -1864,7 +1865,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 fce173cd211b15867369b6a54fad48168352fc83981a722ce98e57299b88608a -R c4bbcaebfa551f5607badab106ccec9f +P eca0ba2cf4c0fdf757bae19c6397a48245adb99e8017ddc28f01804072a30b2c +R 93ec1508046ac4f2440810e7eae364a9 U drh -Z 2e6f5c9c35bee9feb15786a37381648b +Z da65f05a0fff3a0cfb59242dba1c187f diff --git a/manifest.uuid b/manifest.uuid index a40c9a7b93..8ed1accafd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eca0ba2cf4c0fdf757bae19c6397a48245adb99e8017ddc28f01804072a30b2c \ No newline at end of file +a4dd148928ea65bd4e1654dfacc3d8057d1f85b8c9939416991d50722e5a720e \ No newline at end of file diff --git a/test/fts3matchinfo2.test b/test/fts3matchinfo2.test new file mode 100644 index 0000000000..670e1079f1 --- /dev/null +++ b/test/fts3matchinfo2.test @@ -0,0 +1,35 @@ +# 2020-05-14 +# +# 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 the FTS3 module. The focus +# of this file is tables created with the "matchinfo=fts3" option. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +# If SQLITE_ENABLE_FTS3 is not defined, omit this file. +ifcapable !fts3 { finish_test ; return } + +set sqlite_fts3_enable_parentheses 1 + +# Crash case found by cyg0810 at gmail.com 2020-05-14. Reported to +# chromium (which is not vulnerable) who kindly referred it to us. +# +do_execsql_test 1.0 { + CREATE TABLE t_content(col0 INTEGER); + CREATE VIRTUAL TABLE t0 USING fts3(col0 INTEGER PRIMARY KEY,col1 VARCHAR(8),col2 BINARY,col3 BINARY); + INSERT INTO t0 VALUES (1, '1234','aaaa','bbbb'); + SELECT hex(matchinfo(t0,'yxy')) FROM t0 WHERE t0 MATCH x'2b0a312b0a312a312a2a0b5d0a0b0b0a312a0a0b0b0a312a0b310a392a0b0a27312a2a0b5d0a312a0b310a31315d0b310a312a316d2a0b313b15bceaa50a312a0b0a27312a2a0b5d0a312a0b310a312b0b2a310a312a0b2a0b2a0b2e5d0a0bff313336e34a2a312a0b0a3c310b0a0b4b4b0b4b2a4bec40322b2a0b310a0a312a0a0a0a0a0a0a0a0a0b310a312a2a2a0b5d0a0b0b0a312a0b310a312a0b0a4e4541530b310a5df5ced70a0a0a0a0a4f520a0a0a0a0a0a0a312a0b0a4e4541520b310a5d616161610a0a0a0a4f520a0a0a0a0a0a312b0a312a312a0a0a0a0a0a0a004a0b0a310b220a0b0a310a4a22310a0b0a7e6fe0e0e030e0e0e0e0e01176e02000e0e0e0e0e01131320226310a0b0a310a4a22310a0b0a310a766f8b8b4ee0e0300ae0090909090909090909090909090909090909090909090909090909090909090947aaaa540b09090909090909090909090909090909090909090909090909090909090909fae0e0f2f22164e0e0f273e07fefefef7d6dfafafafa6d6d6d6d'; +} {/000000.*0000000/} + + +set sqlite_fts3_enable_parentheses 0 +finish_test From 856408abf447129df8e5345dc1673b2afba5f9ae Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 15 May 2020 01:02:00 +0000 Subject: [PATCH 087/103] Add the SQLITE_ENABLE_FTS3_PARENTHESIS option to fuzzcheck. Add a new test case that uses that option. FossilOrigin-Name: c49a33db954f1a3fbc1889bbe9f3f3fdb8fb00e31aafb91cd6f5d1602db5c2b9 --- Makefile.in | 1 + manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1489920 -> 1492992 bytes 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Makefile.in b/Makefile.in index 563f25860c..1341dee634 100644 --- a/Makefile.in +++ b/Makefile.in @@ -619,6 +619,7 @@ FUZZCHECK_OPT += -DSQLITE_MAX_MEMORY=50000000 FUZZCHECK_OPT += -DSQLITE_PRINTF_PRECISION_LIMIT=1000 FUZZCHECK_OPT += -DSQLITE_ENABLE_DESERIALIZE FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS4 +FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS3_PARENTHESIS #FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS5 FUZZCHECK_OPT += -DSQLITE_ENABLE_RTREE FUZZCHECK_OPT += -DSQLITE_ENABLE_GEOPOLY diff --git a/manifest b/manifest index 51af44edeb..896cdfc10a 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Fix\sa\snull\spointer\sdeference\sthat\scan\soccur\son\sa\sstrange\smatchinfo()\nquery. -D 2020-05-14T23:59:24.284 +C Add\sthe\sSQLITE_ENABLE_FTS3_PARENTHESIS\soption\sto\sfuzzcheck.\s\sAdd\sa\snew\ntest\scase\sthat\suses\sthat\soption. +D 2020-05-15T01:02:00.869 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in 280cf54350738dfd567bd97ae1bff1bf68c64658c4d5ff21be9cae117e92f063 +F Makefile.in 376f53999defeb32b7ad2626fd58aae8f3694c38ab7ee30c2289e0d0525a9238 F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 F Makefile.msc d9232f9339da7d2b82611cb148734d36be4cc90e17a968882e71d9bf75e512df F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a @@ -1028,7 +1028,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db c47e5445e331bd4a3ed66553d4c10673a285f86f37389436a6e145ebca4643ee +F test/fuzzdata8.db 209623791b0ad72ab39110c867af2080a79004e493c4da14ad661e790b5d1ed8 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1865,7 +1865,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 eca0ba2cf4c0fdf757bae19c6397a48245adb99e8017ddc28f01804072a30b2c -R 93ec1508046ac4f2440810e7eae364a9 +P a4dd148928ea65bd4e1654dfacc3d8057d1f85b8c9939416991d50722e5a720e +R 4101535aba6c5042c0d4f516e5579ecd U drh -Z da65f05a0fff3a0cfb59242dba1c187f +Z 949af4778c40886003cffdbf5f6e2f2a diff --git a/manifest.uuid b/manifest.uuid index 8ed1accafd..2e69efcb1c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a4dd148928ea65bd4e1654dfacc3d8057d1f85b8c9939416991d50722e5a720e \ No newline at end of file +c49a33db954f1a3fbc1889bbe9f3f3fdb8fb00e31aafb91cd6f5d1602db5c2b9 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 0e277a8359c7a95ea802d97619baa389d8f6ef20..350ffa26312c32b3452ebf103c8b7bb90ec69ce0 100644 GIT binary patch delta 18358 zcmc({33wDm69Af?Bb%L_+1c5Pa3#p8v#iOL_vWB!5yM1e$5Q4kV2L`8Vj8x897f8TrG`@Z+G-}dhIOxM*_)z#HC z$-4J=R?euLx<+L{fV?Z<(O*(->j+j^oV?A%@NG57#WFYgh6V(P`Mx34zT_K3ZH6zA z+DX3t)DHIbqqdXpF>2#{J*kcI^`JJy*PU92FM(Rs*M-^uU*~`T;TK;=YJc#xr}nZh zn%d8NQPh6qi=g(P&r9tdpNHBVzIN0Ws=l`Lk?U(s?JLmWn)S-tIm#5q_RfE3dFi2r z(OaOmNNL19TOd?M90O1N2Nu0VBgui1hjf>Zr)b zC=y^)RCsutXT0Z+KgH`&MupRlF*SW&Puhf3>Yn{5k(Bfcw(zx-l%9&fpAYmB#FY~ z@kV&*rQfV^q)lx;-P5|+teLZ#wFnLEIcQ-2(CMDg;k|nd>cPMCPZ-jz zcWCI$X5r&JDWpx+E&rAhp5hr7HQqxlz5G3Y`#z4iNQsE!cX?96WBemB{}{r5c&cw8 zW(mk2-@^$^^!Vy)5#zj3<5DN2q(uDz{1KRcfkK3ht)m&5SCCsdP|My47Okr@#^ zAtI6}uO@(QCJW*8dB#Q3i?`t^k>e($MtUN`!~Fm_$UlJ6=igp6ME|QSYOZqlr1Mdv z^_daXoJNgLi%Oj^KIRd)$h4^NN5A;DKS}&!X!xHa|5Ud>@BZgV8b=8EXg`F%lI+Qh zBu@E75)MaK{XK;w67J`de#cCRPMhH2uLyrz{oU)0iJsusu@De0fLrx7s|JZa%+;o;us z$m;Jg5feNyX%qafnDNo$(^9Hm(e$0ansrb#GHu3+16VN{L)a!3w4#fzl@zc=gu)}r z2*~Ug)S}gds2DQHXwP^O9GU*OR8LxDv}ZzUjAuern!k5Kc%(9lE{}n%VM17=e=H;a zvam#f_mEK+JRJm?Tz_G@&=R_ARb?1^#Z(T5@32M|TI3eddugO62ErDpjo{E(OEZjb ztnL&g>R$$>>rC}9w7GIwWI6ELOtn4~c$F5|r?uixSZjPDS}A1m61p`H%C0G`pfb~K z!jRcY1>1W<8Npy`2W16Y0YA=Fvhl@^%3P7HgnmDm8^Br@b79+3rBZ+fFDPGdZ28dd zhWQL0e^H5HuymK$2L>!uM&sK(l|;q>!_Fy#84Osg?1C}3%_g+7SKFM`IWKN_}faw&9Kf;<$Hm>24$}*h>1@r$qYu1RR-Y1$CcHLy$)m3 zlymsiXr-CR-hjesN&?u%C|Ni&UC|jliM55Y>B@TZy8FF+ZR7yoFHm*X5)b7^l%_DfOOUbWH6=(0BCyNpy?)QTN~VCT zW0kpns@|*-b}o{r-2&SHOSg)Vu;i+_4`yd6K9OyNr8~qiIH{|W&uRqSp0Q1SQ6q_Z zkH|KoxsUQQ!{3$=Hns&?UsM+0k^#!I)RjwJ@>UN;9q9R5DP{Q&%qo08SgFOu92Cgj z0+z>?KzdJ01Kjz#GDKwCq00%e3AQLuwgt)Uq=5Y$xW3QF(OZ=Dg1n6wDT0JULC~#;GTj6(V~lKU;CZq#w)*Y;iFQ*WI%s zdpG|@OU{Ls4N#v8bW#ta3|W??KjXF%%!XOxg>ZZkb0y(PPSg;Q8C;190gT z#S7tIDrIbc{#~;d%}bT(47XfR9v9ew{9nzFVgGXFdQhO36k$;>C^TDMf`K!XhBWO? zzY^>vnoGd=R@{a=uX9l!#=|=lm7%SQ<9;6w?^1q-N~c9d(;el$z&^mkdzE$!c22d# z;Mm%he7`h5gv0MD+0f;T`Be=0oy+hD96m@hTED%;$1r|{0)NDO6hm8DE;CjN#y;{diO0;>pvx|07XIGG5-6}TF!r-p?C7x^71S;JOQG zGRzE;_Xt+}Il)3E@d@$zIeJ%HS}<(W!}7Vn{tHH$}pRse0 zdrKjA+RsAn^b0ViST4!_pfHu}12U1CjGBr`fj{Rzxa~ zXJ4?i71(zWwp%%apD(nu5!qD?+ovc366)Fv;?I~D!p>y`^m`23uVhfqpA!V}BP_*` z{saxsrLKUSalU0Y}V#ozNQB zG=krA0}^g2&tUqSmOPQ&gu|09cm6uBaa%1X7^{S$!5mPTxjr1<%u?}_GIO{9Pi$jm zNPM8QgsfQ0Q4XyN56`f4Vt<+Rpk0>V82bqlL{piz&n0?HPKO zs0RhSf7D`<*gcd^TDAtUj=1wPOM52&x+2im0dJhO7=rvWA@~iF8gt2?ox{|fBy*8vcl33V0v61zzD8Q}wIB-MOEuNS zklU6kA``JnQ;#q_{)?r(z$C0P)DIXQ{oT@0U@}y>)Od)$Vo~-CP-&S8gsR%=2Y6Ic zJDOM!>gO$0WolP!Zp2t@aj~0q?lf&+wc_Z6z{0bo$X$ z3rlOO>lhx0QZZ0YkOIE&;~ISiigatr%Eqe6-h-3bSXcPe5rKbpy}gy0Cs^{NeF)jZV= zIZSn6Vn6k56RU%n!`$^4h7MIP3#=~Wu2W0#vk_`Lk=29T6>1w;R-&qqIYvE;_AzRe z!0Ll+1&n zr>K+6p}U&4QNSxygi9e} zFeGlH(Dl0nbqyYxu67q$BiL?JW3a~^!3gcF& zCq&i?Do_o9n;S`P?MACsD7j1mPhO?2H?cODd&Kgz0HqHF9n!xS+z@hG-3DFOs~=K8 zm$60-hobLHF335qZo|88s+!2!LBZ?p5NxzrEf;x0<~=P6#(r!ngpwVkOiRb9#ZdX9 z8U=^8s!w3h9`$4HhD0wErm7T56{+V%77k?x)JnX)Th&Ecn7zg7X#oljnQOt0Pt|%* ze%M+MLJz8MLglqU9iE?OYN!ng?K(1a;`j~_H(0OhlR~JC7_x z%6o}1kZ?^s1O>O56XVyZT`7#OP`%jag!&F+v5@q(+7jEIR0jmHo;de2HCvP^u_kta z+$yyf#+Rvm8F+@PrI5Hr9bChIIy^jP=|n4?x{!5T>D8v;b6=^gf~3c!fS-7*+Z!6} z(VW1(QG1$u9-8LsO-_3v*C6h+#m=us`FcqK`=)YAJNYT4l%CiHy9{%WW|;iFx?W)M zShYfRFgS5r?FlDN77Z=(D?ZQ;)j-q0I@43T~{TBL3h;O1lA2JzERgR zTqJ1=8MOP2EVny`RjHQ*upL)F;t+@PQ9Us14)4@fYfYe}qZ*8%qIOwgy&z?uHVB6W zY1>80)1~a!dc(Z$MH^fkuT6mT`C1(Qs%mDDJqEs~v|FUhf&trG2ngx3gqu*1XYByx zv)#3!=w)p(gudwN1nCc1Z<{xcl6a9(lr@TqCG>s3_l(vUn>)2HMb;OS7S{&eS1OxmXvh>$6Zqq+QsVbXq$Plc}a=f8(z zQi&GG;K2b`IGmnlJ&#$Fh!M!yp!ps22u%7=dq=ew_ z3CNJe_u--4Iv3tJ&*E_G0c`<~i^Z|%eNjvQ2U+tOO9t;Etq>B+H5-)fF@-_$VZxiU zktU$?W!4Kz`fH#2%{2v#$Asxn(7;-NI})|4eyHQX=r07LXF1ogQi*lKOTUQyS^jD5 z3`d#@thP8Bi3@Tp6R`NKHc)_pldXMmO|~|Hu{13HLJMM$xXfAvhn^GO#N-#X^^83U z#TT^g5b~>*4q0z%_p$yW?OVp40^=9G9h6sSv+#jS6DX#Mvkvl8HxYC1Tay^*A8S?M zxhHnyQjBJ}FHdV5DAUAzm&qq~BgC8Z{g4(v*9`6+#?$*5EVfzSq!{>~rB;4t z+WC_Nr{du?T35yY@mSj1`ZdK2Th&nTWNCg5pC&ZV zLek@b4X|jlwV?Vc($xn3Nt}*h=`XkgePj7OmJ|sc9VDh2htb0w%6!)W1fQ%XV!4{fr-tAq)ko-lYs=ZD)-&WN@3Y~X5|ia3MSss-WJ$= ztSThFxvb~lvR}37j4i;b4ZJJ<7b}Iwo3%3k_!qEh3-3)|p*4priA6y9H0{K{X%2+O zXhEE`7qM!)cAhNkIc*q523k!fd5{$F^OH!%VD_&$3*XUwNsy#lcgR^Z;AQX~qeVOY zjH|MS`gRP5+O0bnTLhI;tS7P5X^jxsVn{mZdIt{#TYHM^6-avDMWoiV(mrqr6iPxe zCgx~QiQFsDE;B$}3WY(mIFxK7$6AzWP0U}Zt-`mOSceCSInk-;ZK}OS_Sao=;O;io zfdb2gq-H`VsN7;}2u00=M3~Y`Tb@_+vl$CAtjVMW>5>GAd1RTMaROyx0>tIOjtJpU znrHPuX^gEd6sTeplvdDgr0A}d)Odq70^5zSQb=u&u~xA>EZpKMr0pDczNK;22!Yai zh1*>ezjw4!{Js)PhiM*)!pB>K7jHZ|gKsUPh=_!Oc*L zwMV^dEfjF_UDne-U$1h*YRLR^4dtB$4`$ubu9ErvM^N%JtbI7qtGTh+8IGRD{m-9F z75y&;+VC;2LDKU=E6&PiA|?CC!rp-IW?7fRkyowvvE36^3ew-;HdYI_ziu5Y!jx3& zO11{PCg#RuAFZ(XZkqKmnH50%8!pOK{a4FDa?85~RtO0Wp*Cg}Xk7$O(n zhA<_M5d2?>b+O->tcM*j)ARX*LWhv^F%!!=!)*Q~5%Y4(Y2bLDdruG~v7XO0tRGMNs&a^e%*y38Nr= zC&kGj)AZ}O^P)tHQ}T3uCC5+ zqMiYU86Vhf0u4Q38;wPKtb-{hh{dzq6kwFzv8wrFq*Gw)A((JV9rtnuX zw33G7sQuQ{CYi##8~@=%k3dTcca;DkZ%O{UcJ94mZN@VHe><42K9>&s%fU3}d~2P~ zf+n*$bi5$%0`;o(oWSPf8TD3W%Ej3YsB>#}U1~RG2UEK?yB4*tX1l3fmF=K5H``9_ z(rlgDtZXZ_GqcUqPRgbUlE-BSQk#-3Q=6Pkf|7@3i_|7&b99gSGO3OC&84=3?|Et? zeY2^J@Xew&)8m^N5Fj1#{fF9TeKV+?;+szGIN!6>j`U?vJJ2_k+P=QY)b{c{Lv3dt zt-exw-$ZI7d{0r^%J(F-jeKd;*7HrER`ZRgR`!jfnfu+BLhTJ-GPU3Oo}l&%-xz9- zWco(Y$3fo+YWMhtQ@g`AjN1RNiVGV3kLrSd78iWO-ocbC_i^&8Ir>$u`F;JC`Y!ku z3$4*}()y`LndDH^Uw}(9^%+o0_%E0jlQ4vuX6iHQYGLkFg3)T z4Jbl|Qk%6YzWSqelE4l_;Swu(ic0P&-UqLf@*NFsTWQz*0aQ(sC@Xo-`klx=giaoE z;gR>PJ%i*?Qoy%kAftC+7kEatwZUtWKAf3P;SAs7QozlrJX_ZdmImsL%pdJ)>l;bg zffPgg|-*e76QTAD%0bw!8rdA7m%WolzASfbN9 znbpgd1zpl?Q@LL_4Za_QI#4uCAN9y5jlhO2^$MPA_T3QfVY$cl8|6;6*vx+UmO=76 zI-MAJbUHCO1G)2bigY4%igZ3h?;`zUTHe+QP4MOp-C+4E=`_vL%T@}PCP@B`%ULKp zA|+sau|AKYp`%hdW<6zlpXo9FV|+UA_war8=TLTB+5|<51PfG#NjChbyWUA;lyr`l zXkvQnG%@F(YPS0&T-;B$1j%D4pzrG!Ka%+OF*@}V&+qEvqaE2d)oFa{E`uGz^(6UI zy7ncMU00@KQDZ$(%s(Sg_B25J3RA4^wY2807hGH|PckT3BFy2JE&sBMOmJX&zMezoGms|EwnYfScC&R_(XT+o`@#WC z|4g6F;Eg4=E;xIh{xW0V09!0Qgz}?8C?wAn!l0;?RF9T+FhYP}I-*CFYwbwv$bFOpiclydOLHM*OzA2FkZqrOb} zroLHUdNcFQcVc~GDRVNT#;kJrqWT@ZE3vAn%|i1t&(a+) z1={K}Oy8mBF;)c$K6hQPS!|Wy`9bIfo{Lf%T=+roK+YoJ44gJeUMO8G)CIk(ewR<} zPmowEun2OBrJri_Z4=jd@(Cv@g%Kvo{n2f=;M8W@ES$Sfe^I2&wC|2ihm$4Kq_+}!HevM78wV`~CC7Mm1oaNha~otb^9 z4`KHq`4H_}O9tsF@W$`@i@5lLE}K{i=3ddKi1J+m@(_wYvPOb!q}~X=sw;&;smmZ3 zSA`1bPP5ZfyOAK;v3R5BTzk≻{~E1 z2~bgN`UDQ?lJO6IQW<5@EB2T|1e{vmeZdbv0`{2Hi?fjQhyf%97Mo<+j{W*6^V7sMHhVnDkB<$(39pGto_PqNYOpLXip|pTo3xvt_-A{8k>LZy0$^0Bz>f691 zkEhL-rG~)Qx#N^vQZ2|W6C&||&(=-A$~NTbcyBOP?bde- ze_6Oaz4YdAbD?cDzg!#2%B*xOnP{V9$vTkRN^l~1DmqIk-(w0EIR0Ujk1zYey2g)} zcGMrMCfM7>)(4XFZS_~?1WJ2H+cpKt6X-m)+7WPp7=D4c2txx1Gnqmm3x)cBUviSL zWCD@OLLf_*v$)OIdF0f;gp!T6_c(>2P}NXs1DE#dAN_@in&<=5d+WXYoQ6?iPB_cG z?J6>#4C#3&>Ml)&k@&mmx=Bux08t8HRWqW5*%C!*Y#u(iRAbbYk|6nm|N zi1oHop17Z`FUR~hZIgMrK4YeS`JZtYZ7w$BS6gj#MC!qm?LsEQ`P*$-0u(o~m0@UO zy*1C>Na2tYD>X$jev%8pu7?-**d_+aPe}oHqiQ_&9*93=J0w%)U5bLRf#j$9me?pw z8x6ioQYO+yXs#bx4EQcf-LdyE+j}CV;SVQBkq|mnT7{)2ZIoh&gRq`L8}ydijs?jR zNxCDeG0=Kp;D9e|#ey73C^|w|mL&w++Ke+|zGC7>^-?EbjSS+r+?E$4lSRHyTvN1` z*KT4ElngN*rwqK*<@MS=%E|7Fskwx7iH?$Oy3v%IUkzrT{sQ>mgVkZiF%z zIMSd~!2pVDd|~`j!2qci)~&Fm`8B62R=sLamge^bh6lUdwUx+}crObyQK^C_)~JJ_ zBaOHHCe{PX6yBTD%|a)wswu_a+Y`#HrpF*O*=T{!Nyh3R_6!=DaYK;15z5EF8)G_+ zrvpviN8rBpQ!~u0!&0qYYHHGjzEh0Z#%tk#4+qs4?9y>PMH=8YxpmF$la*8>g|s;|AqG zi7wg&lceZuB|sVs-l@iEC~9tLT1^}hahGH^^zVQ_#N@69rIUwoNE9k}H(n6ga6a}R zzTewO5ZMUuK5I0Gb`wp{Lr9=86z}&lW}4&-Dd425hCwd0Qo;QA=61exDWEj9=7OJd znX0;_QRuyIJ1s(T9mNK(rJ8siRT{n0YlK4J6eAfIj5abwHU?5&Ft*_KWMi0#jRk94 z<0Cxrlo2OVHqy9cy9x0HbYPflGYlvnXX=GRCmU4hkOC?E6t3ikV&lw?W%zQ2G0P-B zOIwiY82C@6rmBkB#*60EbxnQKq<{~T9uZ0$T;mf?`$=g$7RsivLX9%c_iN7tDjndx ze=4Kb-qG%X!D*mvOynbtl%6ziG>Cc1fGt@Jec|#Gvg008?^;W z)E754dtq!>8znl&Y9{RSit&z#O~RybW2fJKD&U*$h7Zcyo7Tc^Fb1-xF)7-R8Jb@; zeihg=kkrQ@clf$N?r<{X&M+z=bdwQ;_X~`^LGpAd;QU_{khuEhdH%5 zgmWCi9AGENtgl!$CTTpVR@2#NjebmVi- zcvEBxp!kLnijD6Zmqhl$9?4FEco8N4=S#5gBO?ww1=&9m#f2UZjID343mZ-t?QxW9 z-z>71Vc{nR9f;cOXGM8YgeOgbSI!vSv7gh9Jn@@zig*tRwo{Vy6p zXD3>gpcKlnEk&s@eG1EB{$QlJofyeMsWtVQb7QGsHZ?ZV1H}zUTunXp3nE)ihjV;r z9!jzNa|KEr`R7W=NU#&ec)}>>)2Nv0Q4PD>X=e!7^ontwsnOrJwf^RlqZ8^vOg=pFktI%Tt z9w?h*kHpSd_9MJJvT%mojdd2-zZa<{GI;|>zmU+g%`jl1JsR7;Vm~gjEs#6O-WKLe zwl~BfIdyU+KS#)cGA$dAYrjR4&u{EmVG}X_3Qh(ovda%N(Fqt z4oJwe(_!wLb~?=63C1~lGi|Sa=L^Y1UKJ{Cyoh z0$c8JExpd|;xHJc_BQZVq&*1ZD(zHs@jkF82nY@E;K18Pq=@(J zmLPIE9VJJJ<)arCNBf?W0~X~^^}BJRKG2KI_83Yk|2&Q-S~{pC zq@;mkDHODDgyXMbsT*e zC6(fB4mz-{=U6X-*xJz!5^au7I5pHk$)8Wqo8_cMuASS_CO^_4quku_K%}%$vEA_` zRJL@C+zZo1*cmKHmR?`=n z>^$y|RL`New}Y4`=>_upo8^yoH0NImq0d5R<7%lA$e;b(o#$9B4E3Ro+XDL%eY2gJ z6u#&V8^>^%HsJRhZ*dO4;`B!&q4~&<<^p<0b2KDEGl$-o-*l1F(u|K>Ly5V04%)c> zNk$UCehE{SI@Z!MtUKys$wUWjgUUJFU=D!_*jqXk%$e*=r%3g;j=l&ZZC=?2P&c?yDTmchGN(V+4*~=-9-oBrB#nL&$e8b#~`O(4n>4F^k{!Jti%5 z)+dD?;Y`A5xsF_(m@;lVjzMy;qZN_>&3;<1ak6MXpX~hD|NA;7^>d6Df#k&VAkvRq z5)F~aewp$tlN^4D-2k@M@f3v4ca%fXWKy8?4URm43LO((a7=*uFF7tF5s3n;#4xub zhN^KqjwAk=t>Wm~pzT#I&I_M9G~BVvF_f1wQhy_kMin@5r~LA`h29yC(|(H}3vfGv z{k^w2Nls33wRrhSt#pTXhI96({bi2%plSX=ccG%O;~E!rrGNVWGPzK>!SNY~@iQbm z?Pvs9FOvNoe8JIG;G&+4cTPC0JnKXhhHwgpP~n8f@vvVy5)t~XbadoEfBUEA^UnL6+QyuPbAGA+&K17=pW4Zf+ocB_uZ!cg`!(gPA1~Eg zF7RX7;>RKfK)mMkV$^lVDUqJ-z=U|`A;0d~xky?OAX(rzDaYw@{!TSZj;{qK@*X$F z&vljvnDv;WDF-b}XzX*`^bh9iyewlB+_z zry0}S&NmpPiHxg`B)@+130=atv!MXaO@58Owcwre{Isi>@`RI2nM|P`2bSQcLgVz+ zdZaLNzQ-BIhj-#?ZpFD-&N*U!q*H}0VUA)TuM^B6_*G;fXUmHJ?c;30pvzH5cO-w{ z;8mPEUT`#plGe_*InViUZ6MKGI>1SJqpao5VEnMHvkL>Uqmvdng2kyZ`xWP1Kc#le z$a0dMk>dDy9V|KGyy2Ks=@=;fgFQ}ZOD;_(=Oc{s@g>(9*@a17$4&vuLmmD7K;7Uu z>UgD^dm2Qw=GFX#I+_dlL!6PE2ueNv4+dK^77SHk)hybm=;3KvP{GJ>(% z)qK`Vbbd#RU9z)&HJ?P?F+X*6v9Q>oF*HUxe-fy2G;D%1kDGRqU$ufc1NFHAQqYp@ zq-_A@rgTSpPT~nl?9X%D<9CE$!YhuxepM^ZpXs#Vu}O~De;P3N&d&-g3=U5r{~Uk9 zu?I(HIJc6XWjWi`%;a*eY>mbI1x^|5!A^1m9==M@1PsE&+0M5aBZG81s2rV$^gml7 zH{m3;<@9~xXQ}C5m+%!%1D5IzJ7gVkG{?RRo%=`(tDLPlLOWka;%Phh_f>=(O}Kxe zT0l{2=LcMIvZ{^adb)E8u3GMVnkS}GPCC}o8dlpu=QIIwD?aP3xLh>9x^%~^*PQbu z)&{(xt{K?+j#FW95@jnK408p;=)2DO*m|Awzl^m-Z)4YT%8_kwQjV-0c$>T0VZ>(V zU6VXh3OH@%kx^$TswBmoQRG}C@`RHdPTM`F(=5{}vaLhS9R@ygz)3FNySK!7k+Io$ z>9Di0Knbaox1F^>kD@xdWw)J$c=SVON0G(Axd~nh! z^So5?m(GDur_`cha;bB@Nagw^)6J9?JMW~$IsH@TGx*%+&fjJEc`4w>34S7w$UH?k zwTsRg*ZB=Hiq}XG1Y4VeK#<9b6sa8RRZp9!+dCjvf=2yV7w6{e^p} z#MQaY4;Kk;H&N&o4P{52ZrE|u*&jj&y1d{y=G+UVajv2G<}c2%0_&bf1P7QI* zq}noPS9I#G2wBdQ0@iCa^RkE%adMvxiN1MKz{gE$B(;X0+RF48yxf;6gPrtzpx3n% zZM9vu0!{rnM^Q0Q80l&RMUgIzOX?ZKC>I?rc*8;!74uG&@ z&LdRj38RD)LOcF z2L@)-`Nk*yB%)vA`ao&1TL=Auvm=qh1y65Ti4uWLZMMpd5wgYK5NsgG+kqnsG2 z8|{Glxh{!RpPFlSQFb!Xl}DwikgK^|@JT0E1}+-nnq^|6Ib14gAMLs(n#b^GJ?Rl_ zFXYOucGPbq zSoBSI-H=!yrq6Pb!H&;kRispNT(rfTfRDfHqMGKDg|0{ezMSuB&e9;`Gb?3L)@wO6 z#flPG54nD#NAScgkhn-waLkLYjl8NfCHCybZW_6yX4(i|zU_kewXPf}n6F8&Et5u*K({b99Wq*Kvcnz0;LnR-JIY%Y{uV3yPk~Y4-zN&ZS6VCT0(WP&}p%2IwyH3 z5}}lb{SThr?(&jsud#ZVbix%KD4WSYR?8OhZn>zWywoL&@-&j=Y-C%k1FLIQc_r&= z)IN9JWt3kl+paW&O1oA6H->;1YJy|FaBZZzA*@>G(%Ik1|BGI5dGoRec`j6KbfrVb zms}s#u=0vO@|p)#TU}Ig@|!jE@9Y#j(i;C`v~ng^?cm7#%!L-YsGP0K53UyiWvYW% z_iP?BdEl2y*HZHf%QCVlEM5B~b$Myy?}{?de|da1W!>}oQ&%{6e{$_HXTLN)o6a$o z_4lh7G`{8X2Kn9z%vSz*v>=*`>lrp{?`@YDMCGE=eHT4C#S?sP`doG@@SsR#qd z@k53Hc?o1J&}n=28daD~IirQ39Om9)Vmj_@?oJfdm*|!p`o|pJ@YvYA_=8Q*)7t$o zh)yg$QEsvy*xV?a^4`(zN%HdCCfPO^7~?LoP;sT4=cRx85S5mf+ui{eivt^Cmst0Q z)yY9O?O<1;6wg2NQR?otX|h8KSUif$8y`z@*B50s33~?pZVbzYxVxHPdwE8-i-bM( z&#rn$Gb-< zaxE!f!$b}Sw@z^nW%3(DY#|mdaZ?_BPPRJ&cBV-xcFS=;;WvwQSeWa+OZ67VB^x}L zC|S_;ocji&d|u&7cQV8Av)pT`P!cQ7*h0vVR|^NRVy?R(fATp4g~d=X-WCIy@QqJZ>Tr>IQ=Bxu&*ywZ=ht#2%Hk7IHH(X|;e7U`4_-AcIAJJX|5 z$*;I6ZrSp8Lg~SXx>7(+LKKAVc6X(Ga!{y2gNrstWY?jikEf#^Jbd^Nl12u`z;mnJ zE!AzS`)1dc0`}C6+FXqn2=6a^0i;?;`7Joy&oq#-mZmuZo?hdQWc2)W`Dr@8?Xuhy zfx`>jZ&A(=ePdjW8O*!nG-109?#~3u99Fy;7zJx`1B2jDZs0-48E7(L;1;*dB2$G# vb}uN|?Op;?KT_48agvW^YuWX2|8BR9kzYBr$Gt?BL+G}F|G4cQ(f)q`w%@ai delta 16616 zcmc(GcYG98_jm4;Y<6~LXJ>b3X@L}a%`SxA61vnxiXbhaC`d~XP-?Of5vd7*97KUc zs?-F511OLvND(DLKtzN@u+Wp|QA9;}&)qyvP+x!V=l$z_`F!RsxifQ5x#ymH?)RKY zO&^;2@cHy=#@(PGd3Vs$e{mU&nz6fi3EM5~gZI@Clcj9;4-5(tH~0roo9XXQ?R+vg68`YFr}lxrEww-R zTT@%?Z%%EIKbqQ){Y|O;!0)AYk3Wjq?W(^C{jBphrgj zjnO60CDJ9)CDRp5mxZnnx~%xbrpT4WXm3l1$Wm*<(Gpu-jPa_wMTtgS0)_8dLNPpA zxh}G$@cVqVI%Kz3>SNDVic4V)aYQF2hslfR(R3*KMQI47i#-+$TcDJ%{TG$N45oBf zRU5Hnth!_G66r54s0ic*yg*7c9N z`y0tY{$HW2#1;d^MM@o*)-lA`_qGxugwU|d>B`=BNJ$ZJO&4WufUBGeWoIC%+9R-c zVc9k@8kYWO?TKki6u-zez_MN9aD1t+lEo?%-G;G^0aYWZdY{NPp>>e*3&Y>vB5G_i zG`gkC$ED9JFH_fA>XNs3eNBDny{8nitjAUrZjMwcaW#hov-f~yl941mYpa2~w<-ff zwhcO-7Hebu9m@6)xrr3?VOz*4QeMMh`;-lWyp;sm39&Gx+J;`yum8~JxzaTagxKek+(O3BGPxD}Z3zX*| zX|w3Sl=I4bk?n(OJ(LMJ<&v^eWc#z0DJHyh%c{V8CbMzdy&y8oTA`eR8uzUYvf>pL zmgb2XI!cs(3+w=-?iIuF@hY-j*z#}d5Xc>W2eTeneP~^y zOk?=oP33uk9m@L6`V98DqudDz_L3ni>JB-k?G5PXS0ZWJ-2o$bpLjkD#`ofO-2ITN z`Un;rQdEYHKRE59P;f-~1xmwhDq5KBk-+k?;3Fl9!S30%mN>GuEi0hS0x0-INrR5( ztZ!kM)kZq}2ntTqj8^Yv^D~Uewr!+Vw+#zsO>wPhi)JCm4k>=06!a6sHVP*5G;P

    Y2H>b7WsodBba?G6%iE|Hx?U9$0) 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 Date: Fri, 15 May 2020 01:13:46 +0000 Subject: [PATCH 088/103] Move some new test cases from fts3snippet.test into fts3snippet2.test. FossilOrigin-Name: fa203999944133941a38e5c858f1f66fc1ef4d2f33222ab81cbf4e3fc1539f1c --- manifest | 13 ++++++------ manifest.uuid | 2 +- test/fts3snippet.test | 13 ------------ test/fts3snippet2.test | 47 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 20 deletions(-) create mode 100644 test/fts3snippet2.test diff --git a/manifest b/manifest index 896cdfc10a..0e8d8ca4d3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sSQLITE_ENABLE_FTS3_PARENTHESIS\soption\sto\sfuzzcheck.\s\sAdd\sa\snew\ntest\scase\sthat\suses\sthat\soption. -D 2020-05-15T01:02:00.869 +C Move\ssome\snew\stest\scases\sfrom\sfts3snippet.test\sinto\sfts3snippet2.test. +D 2020-05-15T01:13:46.164 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -979,7 +979,8 @@ F test/fts3query.test ca033ff2ebcc22c69d89032fb0bc1850997d31e7e60ecd26440796ba16 F test/fts3rank.test cd99bc83a3c923c8d52afd90d86979cf05fc41849f892faeac3988055ef37b99 F test/fts3rnd.test 1320d8826a845e38a96e769562bf83d7a92a15d0 F test/fts3shared.test 57e26a801f21027b7530da77db54286a6fe4997e -F test/fts3snippet.test d9b9f4b717584040fb56df1dacab53acd474958e9c1d00b073d10726695cea0c +F test/fts3snippet.test 0887196d67cffbe365edde535b95ecc642a532ce8551ccd9a73aab5999c3ffae +F test/fts3snippet2.test 2df9d1ec8d1d0ab5059960d0520b50205aa90237c6e03fae83860ca0343bb4c7 F test/fts3sort.test ed34c716a11cc2009a35210e84ad5f9c102362ca F test/fts3tok1.test a663f4cac22a9505400bc22aacb818d7055240409c28729669ea7d4cc2120d15 F test/fts3tok_err.test 52273cd193b9036282f7bacb43da78c6be87418d @@ -1865,7 +1866,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 a4dd148928ea65bd4e1654dfacc3d8057d1f85b8c9939416991d50722e5a720e -R 4101535aba6c5042c0d4f516e5579ecd +P c49a33db954f1a3fbc1889bbe9f3f3fdb8fb00e31aafb91cd6f5d1602db5c2b9 +R ab9a1ca7ae485203753c6cd48c252b3f U drh -Z 949af4778c40886003cffdbf5f6e2f2a +Z c56fcaf393007d8449a678ebac3305f3 diff --git a/manifest.uuid b/manifest.uuid index 2e69efcb1c..7d8e8ee510 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c49a33db954f1a3fbc1889bbe9f3f3fdb8fb00e31aafb91cd6f5d1602db5c2b9 \ No newline at end of file +fa203999944133941a38e5c858f1f66fc1ef4d2f33222ab81cbf4e3fc1539f1c \ No newline at end of file diff --git a/test/fts3snippet.test b/test/fts3snippet.test index 749aa4e0b8..ae022b68a6 100644 --- a/test/fts3snippet.test +++ b/test/fts3snippet.test @@ -588,18 +588,5 @@ do_execsql_test 5.1 { {[a70] [a71] [a72]} } -#------------------------------------------------------------------------- -# Request a snippet from a query with more than 64 phrases. -# -reset_db -do_execsql_test 6.0 { - CREATE VIRTUAL TABLE f USING fts3(b); - INSERT INTO f VALUES ( x'746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218'); -} - -do_execsql_test 6.1 { - SELECT length(snippet(f))>0 FROM f WHERE b MATCH x'1065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a010f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c2a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e0f42'; -} {1} - set sqlite_fts3_enable_parentheses 0 finish_test diff --git a/test/fts3snippet2.test b/test/fts3snippet2.test new file mode 100644 index 0000000000..c1c8084ca4 --- /dev/null +++ b/test/fts3snippet2.test @@ -0,0 +1,47 @@ +# 2020-05-14 +# +# 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 tests in this file test the FTS3 auxillary functions offsets(), +# snippet() and matchinfo() work. At time of writing, running this file +# provides full coverage of fts3_snippet.c. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix fts3snippet + +# If SQLITE_ENABLE_FTS3 is not defined, omit this file. +ifcapable !fts3 { finish_test ; return } +source $testdir/fts3_common.tcl + +set sqlite_fts3_enable_parentheses 1 +#------------------------------------------------------------------------- +# Request a snippet from a query with more than 64 phrases. +# +reset_db +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE f USING fts3(b); + INSERT INTO f VALUES ( x'746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218'); +} + +do_execsql_test 1.1 { + SELECT length(snippet(f))>0 FROM f WHERE b MATCH x'1065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a010f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c2a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e0f42'; +} {1} + +reset_db +do_execsql_test 2.0 { + CREATE VIRTUAL TABLE t0 USING fts3(col0 INTEGER PRIMARY KEY,col1 VARCHAR(8),col2 BINARY,col3 BINARY); + INSERT INTO t0 VALUES (1, '1234','aaaa','bbbb'); + SELECT snippet(t0) FROM t0 WHERE t0 MATCH x'0a4d4d4d4d320a4f52d70a310a310a4e4541520a0a31f6ce0a4f520a0a310a310a310a4f520a75fc2a242424' ; +} {1} + +set sqlite_fts3_enable_parentheses 0 +finish_test From a8e41ecaca3b1690898ccfb39fbc2aa085dfc435 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Fri, 15 May 2020 01:18:07 +0000 Subject: [PATCH 089/103] Enhancements to long-path support in the Win32 VFS. FossilOrigin-Name: 0119d96decd344ae711388ac8475b92464a6d018ecf73862170f137410036dac --- Makefile.msc | 11 ++++++++++- autoconf/Makefile.msc | 2 ++ manifest | 24 ++++++++++++------------ manifest.uuid | 2 +- src/os_win.c | 19 ++++++++++++++++--- src/printf.c | 2 +- src/tclsqlite.c | 13 +++++++++++-- test/win32longpath.test | 31 ++++++++++++++++++++++++++++++- 8 files changed, 83 insertions(+), 21 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index b2d5862d90..d3817e4e84 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -234,6 +234,15 @@ OSTRACE = 0 DEBUG = 0 !ENDIF +# <> +# Disable use of the --linemacros argument to the mksqlite3c.tcl tool, which +# is used to build the amalgamation. +# +!IFNDEF NO_LINEMACROS +NO_LINEMACROS = 0 +!ENDIF +# <> + # Enable use of available compiler optimizations? Normally, this should be # non-zero. Setting this to zero, thus disabling all compiler optimizations, # can be useful for testing. @@ -776,7 +785,7 @@ MKSQLITE3C_TOOL = $(TOP)\tool\mksqlite3c.tcl !ENDIF !IFNDEF MKSQLITE3C_ARGS -!IF $(DEBUG)>1 +!IF $(DEBUG)>1 && $(NO_LINEMACROS)==0 MKSQLITE3C_ARGS = --linemacros !ELSE MKSQLITE3C_ARGS = diff --git a/autoconf/Makefile.msc b/autoconf/Makefile.msc index 37a3c1b18a..746162a00c 100644 --- a/autoconf/Makefile.msc +++ b/autoconf/Makefile.msc @@ -196,6 +196,7 @@ OSTRACE = 0 DEBUG = 0 !ENDIF + # Enable use of available compiler optimizations? Normally, this should be # non-zero. Setting this to zero, thus disabling all compiler optimizations, # can be useful for testing. @@ -288,6 +289,7 @@ OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_JSON1=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_STMTVTAB=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DBPAGE_VTAB=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DBSTAT_VTAB=1 +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_BYTECODE_VTAB=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DESERIALIZE=1 !ENDIF OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_COLUMN_METADATA=1 diff --git a/manifest b/manifest index 0e8d8ca4d3..3eaef99ee0 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Move\ssome\snew\stest\scases\sfrom\sfts3snippet.test\sinto\sfts3snippet2.test. -D 2020-05-15T01:13:46.164 +C Enhancements\sto\slong-path\ssupport\sin\sthe\sWin32\sVFS. +D 2020-05-15T01:18:07.884 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 d9232f9339da7d2b82611cb148734d36be4cc90e17a968882e71d9bf75e512df +F Makefile.msc 14bbe230f81498ed1d5a4df79317c9abdbd2f950cb8030527acccf4e2eddfd34 F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a F VERSION 980d78a2ce04a1fd0ebefbaabd665f7f9186563820629ee29c6e350e96f19b52 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -15,7 +15,7 @@ F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 F autoconf/Makefile.am e14b629addaa1ce372b72043f28f40de2e32b7e211b6e0fc18dbb87989197e40 F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.msc 1d1e4af61289c62b94aa65a93afcd3dfa4b53e4195908980e0b138203e71e1c9 +F autoconf/Makefile.msc e0f1dafc48d000fd6ddfdb01815271528db55cbc7299ca888df5b93367f0d5a4 F autoconf/README.first 6c4f34fe115ff55d4e8dbfa3cecf04a0188292f7 F autoconf/README.txt 4f04b0819303aabaa35fff5f7b257fb0c1ef95f1 F autoconf/configure.ac 3cd933b959fe514eebd1ca1717dfddbf2c9b825b6bc2c5f744deaf5d63af9288 @@ -518,7 +518,7 @@ F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 13f983da988b6460ef3c4c22099c67ab0938291e543644ac4d99eccc8ba604f1 -F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 +F src/os_win.c 317718e8f04c449e7d9e1eacac0d14e7508e4a77c9d4c3cb7382299bd24561b7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 96436cb1920074d4ade120a1a8a9d0ae3f52df06651e21b7eccc5eae2f02b111 F src/pager.h 8d1dc9a2c3fc5eb6eeed75f48a076f425e77706f8935f05817fa05a308f587b5 @@ -529,7 +529,7 @@ F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a F src/pragma.c 1b0db48177e52b256c003b8dc6ac708b1079a82cded944a23820574586a4731f F src/pragma.h 8168e588536bffd95319451f34e9a754dc37d205ebe433031a7813c5b286beae F src/prepare.c 8d4d6c8aa6afefc48027c54b41cdf134b4d6bc2fc4badbe483ad7fd9e1728a28 -F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 +F src/printf.c 4c76c0f4920c5a8a774540c5624d861fab0097212ee7444c07bbcaae15734999 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 @@ -542,7 +542,7 @@ F src/sqliteInt.h 8878a88c18a013d1843638001d7fc56a8f99740f151fc7597b1641b61accf5 F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 -F src/tclsqlite.c d0aa320416efe88c4dbb0156ed6c494f2f9958871a940e46984ee57b3e7fcc50 +F src/tclsqlite.c 986b6391f02cd9b53c1d688be55899f6ffddeb8e8014cd83c1b73ff912579a71 F src/test1.c 5e8b8cc54e8c88906ea8a084387aa79bad245e539f4cee73149e5c0527e1db16 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 @@ -1725,7 +1725,7 @@ F test/wherelimit.test 592081800806d297dd7449b1030c863d2883d6d42901837ccd2e5a9bd F test/wherelimit2.test 9bf0aa56cca40ea0e4c5e2915341355a2bbc0859ec4ce1589197fe2a9d94635f F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2aeee74 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 -F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d +F test/win32longpath.test 4baffc3acb2e5188a5e3a895b2b543ed09e62f7c72d713c1feebf76222fe9976 F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc F test/window1.test a3504d44a3a125e35c53358cde1457d55bfc487bbe00f4c86bfed3a0bcc02140 F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 @@ -1866,7 +1866,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 c49a33db954f1a3fbc1889bbe9f3f3fdb8fb00e31aafb91cd6f5d1602db5c2b9 -R ab9a1ca7ae485203753c6cd48c252b3f -U drh -Z c56fcaf393007d8449a678ebac3305f3 +P fa203999944133941a38e5c858f1f66fc1ef4d2f33222ab81cbf4e3fc1539f1c +R a0a34f2b0bd0aea5761e83ec8647144d +U mistachkin +Z fbe8c263b07eca107dc29f71e69a86ce diff --git a/manifest.uuid b/manifest.uuid index 7d8e8ee510..139de710eb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fa203999944133941a38e5c858f1f66fc1ef4d2f33222ab81cbf4e3fc1539f1c \ No newline at end of file +0119d96decd344ae711388ac8475b92464a6d018ecf73862170f137410036dac \ No newline at end of file diff --git a/src/os_win.c b/src/os_win.c index 32758ab760..86789ced87 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -3502,6 +3502,7 @@ static void winModeBit(winFile *pFile, unsigned char mask, int *pArg){ /* Forward references to VFS helper methods used for temporary files */ static int winGetTempname(sqlite3_vfs *, char **); static int winIsDir(const void *); +static BOOL winIsLongPathPrefix(const char *); static BOOL winIsDriveLetterAndColon(const char *); /* @@ -5481,6 +5482,17 @@ static int winAccess( return SQLITE_OK; } +/* +** Returns non-zero if the specified path name starts with the "long path" +** prefix. +*/ +static BOOL winIsLongPathPrefix( + const char *zPathname +){ + return ( zPathname[0]=='\\' && zPathname[1]=='\\' + && zPathname[2]=='?' && zPathname[3]=='\\' ); +} + /* ** Returns non-zero if the specified path name starts with a drive letter ** followed by a colon character. @@ -5545,10 +5557,11 @@ static int winFullPathname( char *zOut; #endif - /* If this path name begins with "/X:", where "X" is any alphabetic - ** character, discard the initial "/" from the pathname. + /* If this path name begins with "/X:" or "\\?\", where "X" is any + ** alphabetic character, discard the initial "/" from the pathname. */ - if( zRelative[0]=='/' && winIsDriveLetterAndColon(zRelative+1) ){ + if( zRelative[0]=='/' && (winIsDriveLetterAndColon(zRelative+1) + || winIsLongPathPrefix(zRelative+1)) ){ zRelative++; } diff --git a/src/printf.c b/src/printf.c index fc77f68dff..a7d1b2f9d5 100644 --- a/src/printf.c +++ b/src/printf.c @@ -1266,7 +1266,7 @@ void sqlite3_log(int iErrCode, const char *zFormat, ...){ void sqlite3DebugPrintf(const char *zFormat, ...){ va_list ap; StrAccum acc; - char zBuf[500]; + char zBuf[SQLITE_PRINT_BUF_SIZE*10]; sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); va_start(ap,zFormat); sqlite3_str_vappendf(&acc, zFormat, ap); diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 69da2ccd90..d80c25251c 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -3699,6 +3699,7 @@ static int SQLITE_TCLAPI DbMain( const char *zFile = 0; const char *zVfs = 0; int flags; + int bTranslateFileName = 1; Tcl_DString translatedFilename; int rc; @@ -3796,6 +3797,10 @@ static int SQLITE_TCLAPI DbMain( }else{ flags &= ~SQLITE_OPEN_URI; } + }else if( strcmp(zArg, "-translatefilename")==0 ){ + if( Tcl_GetBooleanFromObj(interp, objv[i], &bTranslateFileName) ){ + return TCL_ERROR; + } }else{ Tcl_AppendResult(interp, "unknown option: ", zArg, (char*)0); return TCL_ERROR; @@ -3805,9 +3810,13 @@ static int SQLITE_TCLAPI DbMain( p = (SqliteDb*)Tcl_Alloc( sizeof(*p) ); memset(p, 0, sizeof(*p)); if( zFile==0 ) zFile = ""; - zFile = Tcl_TranslateFileName(interp, zFile, &translatedFilename); + if( bTranslateFileName ){ + zFile = Tcl_TranslateFileName(interp, zFile, &translatedFilename); + } rc = sqlite3_open_v2(zFile, &p->db, flags, zVfs); - Tcl_DStringFree(&translatedFilename); + if( bTranslateFileName ){ + Tcl_DStringFree(&translatedFilename); + } if( p->db ){ if( SQLITE_OK!=sqlite3_errcode(p->db) ){ zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(p->db)); diff --git a/test/win32longpath.test b/test/win32longpath.test index 9e9ed359c6..01b4af70ac 100644 --- a/test/win32longpath.test +++ b/test/win32longpath.test @@ -24,7 +24,8 @@ do_test 1.0 { } win32 db close -set path [file nativename [get_pwd]] +set rawPath [get_pwd] +set path [file nativename $rawPath] sqlite3 db [file join $path test.db] -vfs win32-longpath do_test 1.1 { @@ -45,16 +46,32 @@ do_test 1.2 { } {1 2 3 4} set longPath(1) \\\\?\\$path\\[pid] +set uriPath(1a) %5C%5C%3F%5C$path\\[pid] +set uriPath(1b) %5C%5C%3F%5C$rawPath/[pid] + make_win32_dir $longPath(1) set longPath(2) $longPath(1)\\[string repeat X 255] +set uriPath(2a) $uriPath(1a)\\[string repeat X 255] +set uriPath(2b) $uriPath(1b)/[string repeat X 255] + make_win32_dir $longPath(2) set longPath(3) $longPath(2)\\[string repeat Y 255] +set uriPath(3a) $uriPath(2a)\\[string repeat Y 255] +set uriPath(3b) $uriPath(2b)/[string repeat Y 255] + make_win32_dir $longPath(3) set fileName $longPath(3)\\test.db +set uri(1a) file:$uriPath(3a)\\test.db +set uri(1b) file:$uriPath(3b)/test.db +set uri(1c) file:///$uriPath(3a)\\test.db +set uri(1d) file:///$uriPath(3b)/test.db +set uri(1e) file://localhost/$uriPath(3a)\\test.db +set uri(1f) file://localhost/$uriPath(3b)/test.db + do_test 1.3 { list [catch {sqlite3 db2 [string range $fileName 4 end]} msg] $msg } {1 {unable to open database file}} @@ -100,6 +117,18 @@ do_test 1.6 { db3 close # puts " Database exists \{[exists_win32_path $fileName]\}" +foreach tn {1a 1b 1c 1d 1e 1f} { + sqlite3 db3 $uri($tn) -vfs win32-longpath -uri 1 -translatefilename 0 + + do_test 1.7.$tn { + db3 eval { + SELECT x FROM t1 ORDER BY x; + } + } {5 6 7 8 9 10 11 12} + + db3 close +} + do_delete_win32_file $fileName # puts " Files remaining \{[find_win32_file $longPath(3)\\*]\}" From a796de83007e06a935b212c16b264640e2b9ea24 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 15 May 2020 11:26:31 +0000 Subject: [PATCH 090/103] Test script changes to account for the fact that the "p5" column in the EXPLAIN output is now an integer, not a text values containing a 2-digit hex value. FossilOrigin-Name: 102126d80872fdb7469233611cab28100c8455aab4ce25702b83398394559185 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/cursorhint.test | 8 ++++---- test/fordelete.test | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 3eaef99ee0..cf067fcfc7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhancements\sto\slong-path\ssupport\sin\sthe\sWin32\sVFS. -D 2020-05-15T01:18:07.884 +C Test\sscript\schanges\sto\saccount\sfor\sthe\sfact\sthat\sthe\s"p5"\scolumn\sin\sthe\sEXPLAIN\soutput\sis\snow\san\sinteger,\snot\sa\stext\svalues\scontaining\sa\s2-digit\shex\svalue. +D 2020-05-15T11:26:31.871 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -800,7 +800,7 @@ F test/createtab.test 85cdfdae5c3de331cd888d6c66e1aba575b47c2e3c3cc4a1d6f5414069 F test/cse.test 00b3aea44b16828833c94fbe92475fd6977583fcb064ae0bc590986812b38d0c F test/csv01.test c9c3af0d58c34e9ac970c5875a77939edb958762c8aafb95409e19a3f088b6cd F test/ctime.test 78749e6c9a5f0010d67985be80788f841e3cd2da18114e2ed6010399a7d807f3 -F test/cursorhint.test 7bc346788390475e77a345da2b92270d04d35856 +F test/cursorhint.test 0175e4404181ace3ceca8b114eb0a98eae600d565aa4e2705abbe6614c7fe201 F test/cursorhint2.test 6f3aa9cb19e7418967a10ec6905209bcbb5968054da855fc36c8beee9ae9c42f F test/dataversion1.test 6e5e86ac681f0782e766ebcb56c019ae001522d114e0e111e5ebf68ccf2a7bb8 F test/date.test 9b73bbeb1b82d9c1f44dec5cf563bf7da58d2373 @@ -883,7 +883,7 @@ 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 eb93a2f34137bb87bdab88fcab06c0bd92719aff +F test/fordelete.test ba98f14446b310f9c9d935b97ec748753d0144a28b356ba30d1f4f6958fdde5c F test/format4.test eeae341953db8b6bda7f549044797c3278a6cc345d11ada81471671b654f8ef4 F test/fts-9fd058691.test 78b887e30ae6816df0e1fed6259de4b5a64ad33c F test/fts1a.test 46090311f85da51bb33bd5ce84f7948359c6d8d7 @@ -1866,7 +1866,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 fa203999944133941a38e5c858f1f66fc1ef4d2f33222ab81cbf4e3fc1539f1c -R a0a34f2b0bd0aea5761e83ec8647144d -U mistachkin -Z fbe8c263b07eca107dc29f71e69a86ce +P 0119d96decd344ae711388ac8475b92464a6d018ecf73862170f137410036dac +R d72e9e24ea3275e9f913caa9518ab6bd +U dan +Z 51708100c83a40a3a5b69be047e25cde diff --git a/manifest.uuid b/manifest.uuid index 139de710eb..a3d722dd0d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0119d96decd344ae711388ac8475b92464a6d018ecf73862170f137410036dac \ No newline at end of file +102126d80872fdb7469233611cab28100c8455aab4ce25702b83398394559185 \ No newline at end of file diff --git a/test/cursorhint.test b/test/cursorhint.test index ae86120fa8..a3397b8673 100644 --- a/test/cursorhint.test +++ b/test/cursorhint.test @@ -69,7 +69,7 @@ do_test 1.2 { p5_of_opcode db OpenRead { SELECT * FROM t1 CROSS JOIN t2 WHERE a=x } -} {00 00} +} {0 0} # Do the same test the other way around. # @@ -82,7 +82,7 @@ do_test 2.2 { p5_of_opcode db OpenRead { SELECT * FROM t2 CROSS JOIN t1 WHERE a=x } -} {00 00} +} {0 0} # Various expressions captured by CursorHint # @@ -117,7 +117,7 @@ do_test 4.2 { p5_of_opcode db OpenRead { SELECT * FROM t1 WHERE b>11; } -} {02 00} +} {2 0} do_test 4.3asc { p4_of_opcode db CursorHint { SELECT c FROM t1 WHERE b<11 ORDER BY b ASC; @@ -132,7 +132,7 @@ do_test 4.4 { p5_of_opcode db OpenRead { SELECT c FROM t1 WHERE b<11; } -} {00} +} {0} do_test 4.5asc { p4_of_opcode db CursorHint { diff --git a/test/fordelete.test b/test/fordelete.test index 9a382d97f5..39c0c3585e 100644 --- a/test/fordelete.test +++ b/test/fordelete.test @@ -48,7 +48,7 @@ proc analyze_delete_program {sql} { set obj $T($root) set O($obj) "" - if {"0x$R(p5)" & 0x08} { + if {$R(p5) & 0x08} { set O($obj) * } else { set O($obj) "" From 34d15667639c95a930ee2943876d807d325051d8 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 15 May 2020 11:36:16 +0000 Subject: [PATCH 091/103] Fix SQLITE_OMIT_VIRTUALTABLE testfixture builds. FossilOrigin-Name: 3d9780c5f6095ea35bc731a51eb34d7cf8bd5dcece825b686b94fd50131626e2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbevtab.c | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index cf067fcfc7..555ba5e897 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Test\sscript\schanges\sto\saccount\sfor\sthe\sfact\sthat\sthe\s"p5"\scolumn\sin\sthe\sEXPLAIN\soutput\sis\snow\san\sinteger,\snot\sa\stext\svalues\scontaining\sa\s2-digit\shex\svalue. -D 2020-05-15T11:26:31.871 +C Fix\sSQLITE_OMIT_VIRTUALTABLE\stestfixture\sbuilds. +D 2020-05-15T11:36:16.858 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -614,7 +614,7 @@ F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vdbevtab.c 8094dfc28dad82d60a1c832020a1b201a5381dc185c14638affc6d4e9d54c653 +F src/vdbevtab.c 1abe8515dbcd5a6a34f862b10f9ce7ec24a8f844b0ff538a589116d977ca3590 F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 3dc15756d3c859799e30460e1ec6cd304e660df7f680f5cb1b50537de1e6f678 @@ -1866,7 +1866,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 0119d96decd344ae711388ac8475b92464a6d018ecf73862170f137410036dac -R d72e9e24ea3275e9f913caa9518ab6bd +P 102126d80872fdb7469233611cab28100c8455aab4ce25702b83398394559185 +R b05244cfd1ff6a4eb143a24bbb82b72b U dan -Z 51708100c83a40a3a5b69be047e25cde +Z 43c364040ea40a63ecc6e8697e3a868b diff --git a/manifest.uuid b/manifest.uuid index a3d722dd0d..67edd5d038 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -102126d80872fdb7469233611cab28100c8455aab4ce25702b83398394559185 \ No newline at end of file +3d9780c5f6095ea35bc731a51eb34d7cf8bd5dcece825b686b94fd50131626e2 \ No newline at end of file diff --git a/src/vdbevtab.c b/src/vdbevtab.c index 95ea0ad228..c4f3c92c1a 100644 --- a/src/vdbevtab.c +++ b/src/vdbevtab.c @@ -13,7 +13,7 @@ ** This file implements virtual-tables for examining the bytecode content ** of a prepared statement. */ -#ifdef SQLITE_ENABLE_BYTECODE_VTAB +#if defined(SQLITE_ENABLE_BYTECODE_VTAB) && !defined(SQLITE_OMIT_VIRTUALTABLE) #include "sqliteInt.h" #include "vdbeInt.h" @@ -419,4 +419,6 @@ int sqlite3VdbeBytecodeVtabInit(sqlite3 *db){ } return rc; } +#elif defined(SQLITE_ENABLE_BYTECODE_VTAB) +int sqlite3VdbeBytecodeVtabInit(sqlite3 *db){ return SQLITE_OK; } #endif /* SQLITE_ENABLE_BYTECODE_VTAB */ From 2629adc7b28f8d87377bcf170ad888365b388095 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 15 May 2020 13:52:33 +0000 Subject: [PATCH 092/103] Update test file e_fkey.test to account for the fact that new columns with REFERENCE clauses and non-NULL default values may now be added using ALTER TABLE if the table is empty. FossilOrigin-Name: 4087fce97252beda2456164afe9508f952fc9fe4be68ad0e9b330569a78e42f2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/e_fkey.test | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 555ba5e897..2e34ef5956 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sSQLITE_OMIT_VIRTUALTABLE\stestfixture\sbuilds. -D 2020-05-15T11:36:16.858 +C Update\stest\sfile\se_fkey.test\sto\saccount\sfor\sthe\sfact\sthat\snew\scolumns\swith\sREFERENCE\sclauses\sand\snon-NULL\sdefault\svalues\smay\snow\sbe\sadded\susing\sALTER\sTABLE\sif\sthe\stable\sis\sempty. +D 2020-05-15T13:52:33.178 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -836,7 +836,7 @@ F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e F test/e_droptrigger.test 3cd080807622c13e5bbb61fc9a57bd7754da2412 F test/e_dropview.test 74e405df7fa0f762e0c9445b166fe03955856532e2bb234c372f7c51228d75e7 F test/e_expr.test 0d4e5bb50e60ee58aaf0c1184b4ee65cd3351e9aa54ca6568cef075288e58088 -F test/e_fkey.test 2febb2084aef9b0186782421c07bc9d377abf067c9cb4efd49d9647ae31f5afe +F test/e_fkey.test b497feb7c436693e16a36cdaba8d81ffe12f23659d139ee71dfa57c0c52d1e5b F test/e_fts3.test 17ba7c373aba4d4f5696ba147ee23fd1a1ef70782af050e03e262ca187c5ee07 F test/e_insert.test f02f7f17852b2163732c6611d193f84fc67bc641fb4882c77a464076e5eba80e F test/e_reindex.test 2b0e29344497d9a8a999453a003cb476b6b1d2eef2d6c120f83c2d3a429f3164 @@ -1866,7 +1866,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 102126d80872fdb7469233611cab28100c8455aab4ce25702b83398394559185 -R b05244cfd1ff6a4eb143a24bbb82b72b +P 3d9780c5f6095ea35bc731a51eb34d7cf8bd5dcece825b686b94fd50131626e2 +R 1aa74fbbeea29e20ef0f665d7f17da85 U dan -Z 43c364040ea40a63ecc6e8697e3a868b +Z 09f5476076724069e2aae07c067bea21 diff --git a/manifest.uuid b/manifest.uuid index 67edd5d038..7f1fdd8a0d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3d9780c5f6095ea35bc731a51eb34d7cf8bd5dcece825b686b94fd50131626e2 \ No newline at end of file +4087fce97252beda2456164afe9508f952fc9fe4be68ad0e9b330569a78e42f2 \ No newline at end of file diff --git a/test/e_fkey.test b/test/e_fkey.test index 8d465abf36..3636bef872 100644 --- a/test/e_fkey.test +++ b/test/e_fkey.test @@ -2507,7 +2507,7 @@ proc test_efkey_6 {tn zAlter isError} { drop_all_tables do_test e_fkey-56.$tn.1 " - execsql { CREATE TABLE tbl(a, b) } + execsql { CREATE TABLE tbl(a, b); INSERT INTO tbl VALUES(1, 2); } [list catchsql $zAlter] " [lindex {{0 {}} {1 {Cannot add a REFERENCES column with non-NULL default value}}} $isError] @@ -2771,7 +2771,7 @@ do_test e_fkey-60.6 { # do_test e_fkey-61.1.1 { drop_all_tables - execsql { CREATE TABLE t1(a, b) } + execsql { CREATE TABLE t1(a, b) ; INSERT INTO t1 VALUES(1, 2) } catchsql { ALTER TABLE t1 ADD COLUMN c DEFAULT 'xxx' REFERENCES t2 } } {1 {Cannot add a REFERENCES column with non-NULL default value}} do_test e_fkey-61.1.2 { From bbf6d4328eb0c292c31db7cdf9c0191549e4d002 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 15 May 2020 15:03:51 +0000 Subject: [PATCH 093/103] Adjust some requirement marks. No changes to code. FossilOrigin-Name: 7285ae2ce8fb1439e1acea2ec321abbc76aab0a2e84b58683fddb0a7bf74fb1b --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/main.c | 2 +- src/vdbeapi.c | 2 +- test/e_expr.test | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 2e34ef5956..1bec71ecc8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\stest\sfile\se_fkey.test\sto\saccount\sfor\sthe\sfact\sthat\snew\scolumns\swith\sREFERENCE\sclauses\sand\snon-NULL\sdefault\svalues\smay\snow\sbe\sadded\susing\sALTER\sTABLE\sif\sthe\stable\sis\sempty. -D 2020-05-15T13:52:33.178 +C Adjust\ssome\srequirement\smarks.\s\sNo\schanges\sto\scode. +D 2020-05-15T15:03:51.480 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -497,7 +497,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 8e4211d04eb460c0694d486c6ba1c068d468c6f653c3f237869a802ad82854de F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 421310045bd78afefb772294a99e50f37d87ae578786a6169074e6291e30d969 -F src/main.c 266393c10ff58d0919941f3187b54c0144b27d2f3fab8ae849eefbb89c48c451 +F src/main.c 7e38af6c454cf25d3f543e94647b3d1f5a56d43c4bdcb2d85b94c24392810d45 F src/malloc.c 167e91665080a2a6f92d358419e0b7e6440f2bba0b55e764a4f0197c95c8a077 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -608,7 +608,7 @@ F src/vacuum.c de9780b89fa4ee74c3534f60b94820e3179aca759ffc1338ee53cb4ea7693dd3 F src/vdbe.c e3dba0dee25bc92e871c13cac655260912b3be4abcc85b439259c9934b208da3 F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 F src/vdbeInt.h 571413068b5ac07e2ed8ca7a02fa529622fd5455ae6981498376e5e492d2e5ef -F src/vdbeapi.c d176ee7251d5344de7bb2a0d2dd0fe536834e5843d9bc2389e0f5cdcd5374141 +F src/vdbeapi.c e467b75a710ea099f8d2d022abf601d2ccd05e28f63b44b12d93000b6a75f4a8 F src/vdbeaux.c ee65c810ec97acce013e3024e5b8f3f767459b5d1499a8d379232059eb9aea03 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 @@ -835,7 +835,7 @@ F test/e_createtable.test ea27082d6f84df61e1d9e383f3fd79220418856a4a8afc41af75d4 F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e F test/e_droptrigger.test 3cd080807622c13e5bbb61fc9a57bd7754da2412 F test/e_dropview.test 74e405df7fa0f762e0c9445b166fe03955856532e2bb234c372f7c51228d75e7 -F test/e_expr.test 0d4e5bb50e60ee58aaf0c1184b4ee65cd3351e9aa54ca6568cef075288e58088 +F test/e_expr.test 62000e6675d5bcf4b09276fe011a27779629ff8f6678ba5937fb6f1b78d645ff F test/e_fkey.test b497feb7c436693e16a36cdaba8d81ffe12f23659d139ee71dfa57c0c52d1e5b F test/e_fts3.test 17ba7c373aba4d4f5696ba147ee23fd1a1ef70782af050e03e262ca187c5ee07 F test/e_insert.test f02f7f17852b2163732c6611d193f84fc67bc641fb4882c77a464076e5eba80e @@ -1866,7 +1866,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 3d9780c5f6095ea35bc731a51eb34d7cf8bd5dcece825b686b94fd50131626e2 -R 1aa74fbbeea29e20ef0f665d7f17da85 -U dan -Z 09f5476076724069e2aae07c067bea21 +P 4087fce97252beda2456164afe9508f952fc9fe4be68ad0e9b330569a78e42f2 +R 0e87e1d67d406d67252e12a2529c3979 +U drh +Z 68b4e5e66d04a2c36db31d5c9314b859 diff --git a/manifest.uuid b/manifest.uuid index 7f1fdd8a0d..78c336eec0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4087fce97252beda2456164afe9508f952fc9fe4be68ad0e9b330569a78e42f2 \ No newline at end of file +7285ae2ce8fb1439e1acea2ec321abbc76aab0a2e84b58683fddb0a7bf74fb1b \ No newline at end of file diff --git a/src/main.c b/src/main.c index 9fc410faec..019b7538bc 100644 --- a/src/main.c +++ b/src/main.c @@ -3261,7 +3261,7 @@ static int openDatabase( testcase( (1<<(flags&7))==0x04 ); /* READWRITE */ testcase( (1<<(flags&7))==0x40 ); /* READWRITE | CREATE */ if( ((1<<(flags&7)) & 0x46)==0 ){ - rc = SQLITE_MISUSE_BKPT; /* IMP: R-65497-44594 */ + rc = SQLITE_MISUSE_BKPT; /* IMP: R-18321-05872 */ }else{ rc = sqlite3ParseUri(zVfs, zFilename, &flags, &db->pVfs, &zOpen, &zErrMsg); } diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 4337a33a54..b9ac9fa797 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -1355,7 +1355,7 @@ static int vdbeUnbind(Vdbe *p, int i){ /* If the bit corresponding to this variable in Vdbe.expmask is set, then ** binding a new value to this variable invalidates the current query plan. ** - ** IMPLEMENTATION-OF: R-48440-37595 If the specific value bound to host + ** IMPLEMENTATION-OF: R-57496-20354 If the specific value bound to a host ** parameter in the WHERE clause might influence the choice of query plan ** for a statement, then the statement will be automatically recompiled, ** as if there had been a schema change, on the first sqlite3_step() call diff --git a/test/e_expr.test b/test/e_expr.test index af5f32b13f..8dd75079ba 100644 --- a/test/e_expr.test +++ b/test/e_expr.test @@ -1139,7 +1139,7 @@ sqlite3 db test.db #------------------------------------------------------------------------- # Test cases for the testable statements related to the CASE expression. # -# EVIDENCE-OF: R-15199-61389 There are two basic forms of the CASE +# EVIDENCE-OF: R-57495-24088 There are two fundamental forms of the CASE # expression: those with a base expression and those without. # do_execsql_test e_expr-20.1 { From cc1d9109c4322f22b5ae4d6c3286c28e03556a26 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 15 May 2020 16:05:31 +0000 Subject: [PATCH 094/103] Fix a documentation typo. No changes to code. FossilOrigin-Name: 758353c72627a847ba027ca44a750bbf057827dafd05811f56e4765dfc77623b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 1bec71ecc8..94979b0fd3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Adjust\ssome\srequirement\smarks.\s\sNo\schanges\sto\scode. -D 2020-05-15T15:03:51.480 +C Fix\sa\sdocumentation\stypo.\s\sNo\schanges\sto\scode. +D 2020-05-15T16:05:31.021 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -535,7 +535,7 @@ F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c ee4b02ad8047c35891b7a612091beec21ae7a0155290dcbefb0824aed20c46f3 F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b6 -F src/sqlite.h.in a42bae930f462294801f24468dd56832b09de01072a26dc0df60ddc3c5602210 +F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 F src/sqliteInt.h 8878a88c18a013d1843638001d7fc56a8f99740f151fc7597b1641b61accf58c @@ -1866,7 +1866,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 4087fce97252beda2456164afe9508f952fc9fe4be68ad0e9b330569a78e42f2 -R 0e87e1d67d406d67252e12a2529c3979 +P 7285ae2ce8fb1439e1acea2ec321abbc76aab0a2e84b58683fddb0a7bf74fb1b +R 82f26485d0557dfa82ad4eb09ad0f580 U drh -Z 68b4e5e66d04a2c36db31d5c9314b859 +Z b99f1b4505989b336860095e0b7d2d7a diff --git a/manifest.uuid b/manifest.uuid index 78c336eec0..934a2162f0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7285ae2ce8fb1439e1acea2ec321abbc76aab0a2e84b58683fddb0a7bf74fb1b \ No newline at end of file +758353c72627a847ba027ca44a750bbf057827dafd05811f56e4765dfc77623b \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 90544db29e..0b08cd5e86 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -5495,7 +5495,7 @@ void sqlite3_value_free(sqlite3_value*); ** ** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is ** determined by the N parameter on first successful call. Changing the -** value of N in any subsequents call to sqlite3_aggregate_context() within +** value of N in any subsequent call to sqlite3_aggregate_context() within ** the same aggregate function instance will not resize the memory ** allocation.)^ Within the xFinal callback, it is customary to set ** N=0 in calls to sqlite3_aggregate_context(C,N) so that no From d48eafb984b7e034dbc6a7558174fda36547ae2c Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 15 May 2020 16:19:35 +0000 Subject: [PATCH 095/103] Fix another build problem for SQLITE_OMIT_VIRTUALTABLE builds. FossilOrigin-Name: 5e1eb0fa3afd74251bc8f484e3edfa81b15610479431af205bd952c91eecd21f --- ext/expert/sqlite3expert.c | 2 +- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/vdbevtab.c | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/ext/expert/sqlite3expert.c b/ext/expert/sqlite3expert.c index e88fb7e78c..72c6024552 100644 --- a/ext/expert/sqlite3expert.c +++ b/ext/expert/sqlite3expert.c @@ -1950,4 +1950,4 @@ void sqlite3_expert_destroy(sqlite3expert *p){ } } -#endif /* ifndef SQLITE_OMIT_VIRTUAL_TABLE */ +#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ diff --git a/manifest b/manifest index 94979b0fd3..3575c8348f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sdocumentation\stypo.\s\sNo\schanges\sto\scode. -D 2020-05-15T16:05:31.021 +C Fix\sanother\sbuild\sproblem\sfor\sSQLITE_OMIT_VIRTUALTABLE\sbuilds. +D 2020-05-15T16:19:35.484 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -49,7 +49,7 @@ 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 3da865f2286433588260f41e796422c611bceaca3a0bbf9139a619cf7d062c19 +F ext/expert/sqlite3expert.c fbcf97d9d0286ec8b1909308ff53b573a8aedb80e7ef13033f0dc66c146902de F ext/expert/sqlite3expert.h ca81efc2679a92373a13a3e76a6138d0310e32be53d6c3bfaedabd158ea8969b F ext/expert/test_expert.c d56c194b769bdc90cf829a14c9ecbc1edca9c850b837a4d0b13be14095c32a72 F ext/fts1/README.txt 20ac73b006a70bcfd80069bdaf59214b6cf1db5e @@ -614,7 +614,7 @@ F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vdbevtab.c 1abe8515dbcd5a6a34f862b10f9ce7ec24a8f844b0ff538a589116d977ca3590 +F src/vdbevtab.c ee5b4c902fdda2230f9503ac7b84c6d614c91e8f6f4dc1633e2e8dfef8ffb144 F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 3dc15756d3c859799e30460e1ec6cd304e660df7f680f5cb1b50537de1e6f678 @@ -1866,7 +1866,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 7285ae2ce8fb1439e1acea2ec321abbc76aab0a2e84b58683fddb0a7bf74fb1b -R 82f26485d0557dfa82ad4eb09ad0f580 -U drh -Z b99f1b4505989b336860095e0b7d2d7a +P 758353c72627a847ba027ca44a750bbf057827dafd05811f56e4765dfc77623b +R 10897399024bb26c2d342206bd761968 +U dan +Z ae18daba7855167da6d0a790a481b18b diff --git a/manifest.uuid b/manifest.uuid index 934a2162f0..1fe05e52c1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -758353c72627a847ba027ca44a750bbf057827dafd05811f56e4765dfc77623b \ No newline at end of file +5e1eb0fa3afd74251bc8f484e3edfa81b15610479431af205bd952c91eecd21f \ No newline at end of file diff --git a/src/vdbevtab.c b/src/vdbevtab.c index c4f3c92c1a..2fbee62571 100644 --- a/src/vdbevtab.c +++ b/src/vdbevtab.c @@ -13,8 +13,8 @@ ** This file implements virtual-tables for examining the bytecode content ** of a prepared statement. */ -#if defined(SQLITE_ENABLE_BYTECODE_VTAB) && !defined(SQLITE_OMIT_VIRTUALTABLE) #include "sqliteInt.h" +#if defined(SQLITE_ENABLE_BYTECODE_VTAB) && !defined(SQLITE_OMIT_VIRTUALTABLE) #include "vdbeInt.h" /* An instance of the bytecode() table-valued function. From b2c6fe225ae5467478658a5dc32fe50b063f7419 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 15 May 2020 18:48:31 +0000 Subject: [PATCH 096/103] Update code in sqlite3expert.c to account for the fact that "-- TRIGGER xyz" VM comments are now omitted for some builds. FossilOrigin-Name: 7cf93dc55c48c68731a1fe3ae3517fcfeb5c252bfa87e715a333c6194bcc0ace --- ext/expert/sqlite3expert.c | 5 ++++- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/ext/expert/sqlite3expert.c b/ext/expert/sqlite3expert.c index 72c6024552..0685e54222 100644 --- a/ext/expert/sqlite3expert.c +++ b/ext/expert/sqlite3expert.c @@ -1128,9 +1128,12 @@ int idxFindIndexes( /* int iParent = sqlite3_column_int(pExplain, 1); */ /* int iNotUsed = sqlite3_column_int(pExplain, 2); */ const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3); - int nDetail = STRLEN(zDetail); + int nDetail; int i; + if( !zDetail ) continue; + nDetail = STRLEN(zDetail); + for(i=0; i Date: Sat, 16 May 2020 15:18:27 +0000 Subject: [PATCH 097/103] Add sqlite3BeginBenignMalloc() and EndBenignMalloc() calls to debugging function sqlite3VdbePrintOp(). FossilOrigin-Name: 6f857d0e9e0893524c2f828a1a1600fefb6efeff12ecbc9bb1da106a5aff9c1c --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeaux.c | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 792bffec3f..456ff4f533 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\scode\sin\ssqlite3expert.c\sto\saccount\sfor\sthe\sfact\sthat\s"--\sTRIGGER\sxyz"\sVM\scomments\sare\snow\somitted\sfor\ssome\sbuilds. -D 2020-05-15T18:48:31.264 +C Add\ssqlite3BeginBenignMalloc()\sand\sEndBenignMalloc()\scalls\sto\sdebugging\sfunction\ssqlite3VdbePrintOp(). +D 2020-05-16T15:18:27.540 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -609,7 +609,7 @@ F src/vdbe.c e3dba0dee25bc92e871c13cac655260912b3be4abcc85b439259c9934b208da3 F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 F src/vdbeInt.h 571413068b5ac07e2ed8ca7a02fa529622fd5455ae6981498376e5e492d2e5ef F src/vdbeapi.c e467b75a710ea099f8d2d022abf601d2ccd05e28f63b44b12d93000b6a75f4a8 -F src/vdbeaux.c ee65c810ec97acce013e3024e5b8f3f767459b5d1499a8d379232059eb9aea03 +F src/vdbeaux.c 80626786d21296d9e7936186850343afe5fc6368ad9724a172e151788425a063 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df @@ -1866,7 +1866,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 5e1eb0fa3afd74251bc8f484e3edfa81b15610479431af205bd952c91eecd21f -R 0e397fa4d97a0dd7081692cb693410ed +P 7cf93dc55c48c68731a1fe3ae3517fcfeb5c252bfa87e715a333c6194bcc0ace +R 60cac945dac221a30fe3e7456c780110 U dan -Z 81fc3648557f632403998e24e4aa1d05 +Z a51f2ca285cdfd2574eb5f3711aed080 diff --git a/manifest.uuid b/manifest.uuid index 4581705e33..6c6071d1ae 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7cf93dc55c48c68731a1fe3ae3517fcfeb5c252bfa87e715a333c6194bcc0ace \ No newline at end of file +6f857d0e9e0893524c2f828a1a1600fefb6efeff12ecbc9bb1da106a5aff9c1c \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 5be81a3524..38dc7cd869 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1836,6 +1836,7 @@ void sqlite3VdbePrintOp(FILE *pOut, int pc, VdbeOp *pOp){ sqlite3 dummyDb; static const char *zFormat1 = "%4d %-13s %4d %4d %4d %-13s %.2X %s\n"; if( pOut==0 ) pOut = stdout; + sqlite3BeginBenignMalloc(); dummyDb.mallocFailed = 1; zP4 = sqlite3VdbeDisplayP4(&dummyDb, pOp); #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS @@ -1854,6 +1855,7 @@ void sqlite3VdbePrintOp(FILE *pOut, int pc, VdbeOp *pOp){ fflush(pOut); sqlite3_free(zP4); sqlite3_free(zCom); + sqlite3EndBenignMalloc(); } #endif From c48428899d5ba5f8689455d0a82174a1fe3fa4c3 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 16 May 2020 16:23:48 +0000 Subject: [PATCH 098/103] Extra memory barrier during initialization. FossilOrigin-Name: 043a7e142dfc2b0da5fbc0b025d005ccad4886f0b0ff65426ba9155ca40394ca --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/main.c | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 456ff4f533..cf51b213b3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\ssqlite3BeginBenignMalloc()\sand\sEndBenignMalloc()\scalls\sto\sdebugging\sfunction\ssqlite3VdbePrintOp(). -D 2020-05-16T15:18:27.540 +C Extra\smemory\sbarrier\sduring\sinitialization. +D 2020-05-16T16:23:48.870 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -497,7 +497,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 8e4211d04eb460c0694d486c6ba1c068d468c6f653c3f237869a802ad82854de F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 421310045bd78afefb772294a99e50f37d87ae578786a6169074e6291e30d969 -F src/main.c 7e38af6c454cf25d3f543e94647b3d1f5a56d43c4bdcb2d85b94c24392810d45 +F src/main.c 97d962ab1f830540043042e41085c5b85636a60e6ed95002c1a56b64f7eb6a0b F src/malloc.c 167e91665080a2a6f92d358419e0b7e6440f2bba0b55e764a4f0197c95c8a077 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -1866,7 +1866,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 7cf93dc55c48c68731a1fe3ae3517fcfeb5c252bfa87e715a333c6194bcc0ace -R 60cac945dac221a30fe3e7456c780110 -U dan -Z a51f2ca285cdfd2574eb5f3711aed080 +P 6f857d0e9e0893524c2f828a1a1600fefb6efeff12ecbc9bb1da106a5aff9c1c +R 54e24fb1c480e2f51c51fab1349d1fa6 +U drh +Z 893128c3f173bb6e030eff4437373b32 diff --git a/manifest.uuid b/manifest.uuid index 6c6071d1ae..d09b04e7c3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6f857d0e9e0893524c2f828a1a1600fefb6efeff12ecbc9bb1da106a5aff9c1c \ No newline at end of file +043a7e142dfc2b0da5fbc0b025d005ccad4886f0b0ff65426ba9155ca40394ca \ No newline at end of file diff --git a/src/main.c b/src/main.c index 019b7538bc..9f99cbdf3a 100644 --- a/src/main.c +++ b/src/main.c @@ -313,6 +313,7 @@ int sqlite3_initialize(void){ if( rc==SQLITE_OK ){ sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage, sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage); + sqlite3MemoryBarrier(); sqlite3GlobalConfig.isInit = 1; #ifdef SQLITE_EXTRA_INIT bRunExtraInit = 1; From becd68ba0dac41904aa817d96a67fb4685734b41 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 16 May 2020 17:26:58 +0000 Subject: [PATCH 099/103] Fix a use-after-free bug in the fts3 snippet() function. FossilOrigin-Name: 0d69f76f0865f9626078bee087a22fb826407279e78cf9d5382e1c985c9f64a9 --- ext/fts3/fts3.c | 1 + manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/fts3snippet2.test | 13 +++++++++++++ 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index d4b0a2b2a6..e6092a215e 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -5317,6 +5317,7 @@ static void fts3EvalNextRow( fts3EvalNextRow(pCsr, pLeft, pRc); } } + pRight->bEof = pLeft->bEof = 1; } } break; diff --git a/manifest b/manifest index cf51b213b3..a85e8515b3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Extra\smemory\sbarrier\sduring\sinitialization. -D 2020-05-16T16:23:48.870 +C Fix\sa\suse-after-free\sbug\sin\sthe\sfts3\ssnippet()\sfunction. +D 2020-05-16T17:26:58.154 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -82,7 +82,7 @@ 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 176d51ed5ae760ea801a8d75bc982687bcae94b7c476c990320a3c0c3489cf7c +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 @@ -980,7 +980,7 @@ F test/fts3rank.test cd99bc83a3c923c8d52afd90d86979cf05fc41849f892faeac3988055ef F test/fts3rnd.test 1320d8826a845e38a96e769562bf83d7a92a15d0 F test/fts3shared.test 57e26a801f21027b7530da77db54286a6fe4997e F test/fts3snippet.test 0887196d67cffbe365edde535b95ecc642a532ce8551ccd9a73aab5999c3ffae -F test/fts3snippet2.test 2df9d1ec8d1d0ab5059960d0520b50205aa90237c6e03fae83860ca0343bb4c7 +F test/fts3snippet2.test 2dabb5889eda4c9980aad325e688b470781f97ce7c0fca0db125616fae0a2cdd F test/fts3sort.test ed34c716a11cc2009a35210e84ad5f9c102362ca F test/fts3tok1.test a663f4cac22a9505400bc22aacb818d7055240409c28729669ea7d4cc2120d15 F test/fts3tok_err.test 52273cd193b9036282f7bacb43da78c6be87418d @@ -1866,7 +1866,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 6f857d0e9e0893524c2f828a1a1600fefb6efeff12ecbc9bb1da106a5aff9c1c -R 54e24fb1c480e2f51c51fab1349d1fa6 -U drh -Z 893128c3f173bb6e030eff4437373b32 +P 043a7e142dfc2b0da5fbc0b025d005ccad4886f0b0ff65426ba9155ca40394ca +R bc8dceddadfbacb63dd62d4fb3d44931 +U dan +Z 0667027f5cfff5899f95c896ef81c0ee diff --git a/manifest.uuid b/manifest.uuid index d09b04e7c3..081b224e5b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -043a7e142dfc2b0da5fbc0b025d005ccad4886f0b0ff65426ba9155ca40394ca \ No newline at end of file +0d69f76f0865f9626078bee087a22fb826407279e78cf9d5382e1c985c9f64a9 \ No newline at end of file diff --git a/test/fts3snippet2.test b/test/fts3snippet2.test index c1c8084ca4..fc39941890 100644 --- a/test/fts3snippet2.test +++ b/test/fts3snippet2.test @@ -43,5 +43,18 @@ do_execsql_test 2.0 { SELECT snippet(t0) FROM t0 WHERE t0 MATCH x'0a4d4d4d4d320a4f52d70a310a310a4e4541520a0a31f6ce0a4f520a0a310a310a310a4f520a75fc2a242424' ; } {1} +reset_db +do_execsql_test 2.1 { + CREATE VIRTUAL TABLE t0 USING fts3( + col0 INTEGER PRIMARY KEY,col1 VARCHAR(8),col2 BINARY,col3 BINARY + ); + INSERT INTO t0 VALUES ('one', '1234','aaaa','bbbb'); +} +do_execsql_test 2.2 { + SELECT snippet(t0) FROM t0 WHERE t0 MATCH + '(def AND (one NEAR abc)) OR one' +} {one} + set sqlite_fts3_enable_parentheses 0 finish_test + From 8c1febb2f91ec824362ca9f5b400622262c17191 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 16 May 2020 18:01:02 +0000 Subject: [PATCH 100/103] The OP_RealAffinity opcode is not necessary after reading values from a virtual table (such as rtree). It is harmless, but it does use CPU cycles. Might as well leave it off. FossilOrigin-Name: dc18d89354cffcb726722c234a0271ab628a71277b22887eea2bf118028193a6 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/update.c | 10 +++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index a85e8515b3..ab646e73ec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\suse-after-free\sbug\sin\sthe\sfts3\ssnippet()\sfunction. -D 2020-05-16T17:26:58.154 +C The\sOP_RealAffinity\sopcode\sis\snot\snecessary\safter\sreading\svalues\sfrom\na\svirtual\stable\s(such\sas\srtree).\s\sIt\sis\sharmless,\sbut\sit\sdoes\suse\sCPU\ncycles.\s\sMight\sas\swell\sleave\sit\soff. +D 2020-05-16T18:01:02.987 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -600,7 +600,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c eee7bae3ec0bc4abee951554bf46a8ba567c0f7752ac90c820ed8afff4c612dc F src/treeview.c 82c6391a3ba76215d4185fd4719a56ec4caf186a40c8a7b6e6ba4ae4467c2742 F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04 -F src/update.c 3eb778c42155d944377a4ee5e440b04520f07094804ed6ce63d2528f619614d9 +F src/update.c 3199098455830fc2d8c8fc4ae3ec2ea513eef64339ae9a7048db62b21169bc7a F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7 F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 @@ -1866,7 +1866,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 043a7e142dfc2b0da5fbc0b025d005ccad4886f0b0ff65426ba9155ca40394ca -R bc8dceddadfbacb63dd62d4fb3d44931 -U dan -Z 0667027f5cfff5899f95c896ef81c0ee +P 0d69f76f0865f9626078bee087a22fb826407279e78cf9d5382e1c985c9f64a9 +R 038aaeab4f18be62314e9be676a83d68 +U drh +Z f53eca45dfc23be88eb50db1df821f15 diff --git a/manifest.uuid b/manifest.uuid index 081b224e5b..c658518beb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0d69f76f0865f9626078bee087a22fb826407279e78cf9d5382e1c985c9f64a9 \ No newline at end of file +dc18d89354cffcb726722c234a0271ab628a71277b22887eea2bf118028193a6 \ No newline at end of file diff --git a/src/update.c b/src/update.c index d54a6cb9f0..470370f54f 100644 --- a/src/update.c +++ b/src/update.c @@ -53,10 +53,10 @@ static void updateVirtualTable( ** function is capable of transforming these types of expressions into ** sqlite3_value objects. ** -** If parameter iReg is not negative, code an OP_RealAffinity instruction -** on register iReg. This is used when an equivalent integer value is -** stored in place of an 8-byte floating point value in order to save -** space. +** If column as REAL affinity and the table is an ordinary b-tree table +** (not a virtual table) then the value might have been stored as an +** integer. In that case, add an OP_RealAffinity opcode to make sure +** it has been converted into REAL. */ void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){ assert( pTab!=0 ); @@ -73,7 +73,7 @@ void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){ } } #ifndef SQLITE_OMIT_FLOATING_POINT - if( pTab->aCol[i].affinity==SQLITE_AFF_REAL ){ + if( pTab->aCol[i].affinity==SQLITE_AFF_REAL && !IsVirtual(pTab) ){ sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg); } #endif From b2eb7e46eb3c0a1611d7777fb3a1ba9b30f56ea5 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 16 May 2020 21:01:00 +0000 Subject: [PATCH 101/103] Performance optimization for the sqlite3FindTable() subroutine. FossilOrigin-Name: 55910b9a7287be92af9f95e0af54af822055d15b7eabbcc81d61410d0bf67726 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 43 ++++++++++++++++++++++++++++++------------- 3 files changed, 37 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index ab646e73ec..f4811e8bfb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sOP_RealAffinity\sopcode\sis\snot\snecessary\safter\sreading\svalues\sfrom\na\svirtual\stable\s(such\sas\srtree).\s\sIt\sis\sharmless,\sbut\sit\sdoes\suse\sCPU\ncycles.\s\sMight\sas\swell\sleave\sit\soff. -D 2020-05-16T18:01:02.987 +C Performance\soptimization\sfor\sthe\ssqlite3FindTable()\ssubroutine. +D 2020-05-16T21:01:00.138 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c f14e415fcfd0b52b4e4ebd193ba5fadac5e8252c30f023389af682813af44025 F src/btree.h 989ef3c33413549e3e148f3dcb46c030f317dac130dc86809ba6b9aa4b16c72a F src/btreeInt.h 5c8b8749805787313ecf49eb5be3ced1e94bbf8ef54bb01470ce6bd0d5185c67 -F src/build.c 520d6d125288b7da745f8299840015f66c1d1b896a9308e24d7fde6fa5fafc9b +F src/build.c ca9e7a33b74f1bf2eb3a5f37f9d07dfed335469f2d70c0bd350e0dd42a50183a F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c e98518d2d3d4029a13c805e07313fb60c877be56db76e90dd5f3af73085d0ce6 @@ -1866,7 +1866,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 0d69f76f0865f9626078bee087a22fb826407279e78cf9d5382e1c985c9f64a9 -R 038aaeab4f18be62314e9be676a83d68 +P dc18d89354cffcb726722c234a0271ab628a71277b22887eea2bf118028193a6 +R 19171e788e643226a8c2486a995489b0 U drh -Z f53eca45dfc23be88eb50db1df821f15 +Z 994ffac4ccc32781ab809d359e7c6892 diff --git a/manifest.uuid b/manifest.uuid index c658518beb..29df6b90b5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dc18d89354cffcb726722c234a0271ab628a71277b22887eea2bf118028193a6 \ No newline at end of file +55910b9a7287be92af9f95e0af54af822055d15b7eabbcc81d61410d0bf67726 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 8b0977a48d..6ff595c623 100644 --- a/src/build.c +++ b/src/build.c @@ -312,22 +312,39 @@ Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){ return 0; } #endif - while(1){ - for(i=OMIT_TEMPDB; inDb; i++){ - int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ - if( zDatabase==0 || sqlite3DbIsNamed(db, j, zDatabase) ){ - assert( sqlite3SchemaMutexHeld(db, j, 0) ); - p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName); - if( p ) return p; + if( zDatabase ){ + for(i=0; inDb; i++){ + if( sqlite3StrICmp(zDatabase, db->aDb[i].zDbSName)==0 ) break; + } + if( i>=db->nDb ){ + /* No match against the official names. But always match "main" + ** to schema 0 as a legacy fallback. */ + if( sqlite3StrICmp(zDatabase,"main")==0 ){ + i = 0; + }else{ + return 0; } } - /* Not found. If the name we were looking for was temp.sqlite_master - ** then change the name to sqlite_temp_master and try again. */ - if( sqlite3StrICmp(zName, MASTER_NAME)!=0 ) break; - if( sqlite3_stricmp(zDatabase, db->aDb[1].zDbSName)!=0 ) break; - zName = TEMP_MASTER_NAME; + p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName); + if( p==0 && i==1 && sqlite3StrICmp(zName, MASTER_NAME)==0 ){ + /* All temp.sqlite_master to be an alias for sqlite_temp_master */ + p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, TEMP_MASTER_NAME); + } + }else{ + /* Match against TEMP first */ + p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, zName); + if( p ) return p; + /* The main database is second */ + p = sqlite3HashFind(&db->aDb[0].pSchema->tblHash, zName); + if( p ) return p; + /* Attached databases are in order of attachment */ + for(i=2; inDb; i++){ + assert( sqlite3SchemaMutexHeld(db, i, 0) ); + p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName); + if( p ) break; + } } - return 0; + return p; } /* From d924e7bc78a4ca604bce0f8d9d0390d3feddba01 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 17 May 2020 00:26:44 +0000 Subject: [PATCH 102/103] Use the sqlite3Realloc() interface internally, rather than the public sqlite3_realloc64() equivalent, to avoid unnecessary calls to sqlite3_initialize(). FossilOrigin-Name: 1313557b512297e7b75ed748894379b2022aecf696d5a58318e46a668321c1ff --- manifest | 24 ++++++++++++------------ manifest.uuid | 2 +- src/func.c | 2 +- src/malloc.c | 2 +- src/memdb.c | 2 +- src/printf.c | 2 +- src/table.c | 4 ++-- src/vtab.c | 2 +- src/wal.c | 2 +- 9 files changed, 21 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index f4811e8bfb..fb24b80edf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\soptimization\sfor\sthe\ssqlite3FindTable()\ssubroutine. -D 2020-05-16T21:01:00.138 +C Use\sthe\ssqlite3Realloc()\sinterface\sinternally,\srather\sthan\sthe\spublic\nsqlite3_realloc64()\sequivalent,\sto\savoid\sunnecessary\scalls\sto\nsqlite3_initialize(). +D 2020-05-17T00:26:44.076 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -488,7 +488,7 @@ F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4 F src/expr.c 8eed44d9de8a3b0fe1c9809bb75a02b65488774c8ba8685512d8f63adade18e5 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 -F src/func.c 4780623a0c67f9241d4d5360a7d612826cfb22b825d95de9dce959c43c09ff47 +F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 F src/global.c 79a988b56b06ce2d08ebefe1d35da9aa25b3851faa47ea5233361c4827185a64 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -498,13 +498,13 @@ F src/insert.c 8e4211d04eb460c0694d486c6ba1c068d468c6f653c3f237869a802ad82854de F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 421310045bd78afefb772294a99e50f37d87ae578786a6169074e6291e30d969 F src/main.c 97d962ab1f830540043042e41085c5b85636a60e6ed95002c1a56b64f7eb6a0b -F src/malloc.c 167e91665080a2a6f92d358419e0b7e6440f2bba0b55e764a4f0197c95c8a077 +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 02a5fcec19b9d40dd449ca802dc1b2e8f93f255fbf2a886277a3c3800d8d35db +F src/memdb.c 1d05bcc3fb6bde5c4aab7a56279d232f204625d74e627121e0562f355f5c843e F src/memjournal.c 7561c01c90958f3ba9bc6cb2d857123d932bdfa5539ea34427a0957b2e35154d F src/msvc.h 3a15918220367a8876be3fa4f2abe423a861491e84b864fb2b7426bf022a28f8 F src/mutex.c 5e3409715552348732e97b9194abe92fdfcd934cfb681df4ba0ab87ac6c18d25 @@ -529,7 +529,7 @@ F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a F src/pragma.c 1b0db48177e52b256c003b8dc6ac708b1079a82cded944a23820574586a4731f F src/pragma.h 8168e588536bffd95319451f34e9a754dc37d205ebe433031a7813c5b286beae F src/prepare.c 8d4d6c8aa6afefc48027c54b41cdf134b4d6bc2fc4badbe483ad7fd9e1728a28 -F src/printf.c 4c76c0f4920c5a8a774540c5624d861fab0097212ee7444c07bbcaae15734999 +F src/printf.c ebf563cff3122f6a61149964b738b470196d3619df31d6a720d0ff72fcfd7c7b F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 @@ -541,7 +541,7 @@ F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0 F src/sqliteInt.h 8878a88c18a013d1843638001d7fc56a8f99740f151fc7597b1641b61accf58c F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 -F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 +F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 F src/tclsqlite.c 986b6391f02cd9b53c1d688be55899f6ffddeb8e8014cd83c1b73ff912579a71 F src/test1.c 5e8b8cc54e8c88906ea8a084387aa79bad245e539f4cee73149e5c0527e1db16 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 @@ -615,9 +615,9 @@ F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vdbevtab.c ee5b4c902fdda2230f9503ac7b84c6d614c91e8f6f4dc1633e2e8dfef8ffb144 -F src/vtab.c 7b704a90515a239c6cdba6a66b1bb3a385e62326cceb5ecb05ec7a091d6b8515 +F src/vtab.c 7b452592ed2ee95dedb1f323d557cebede5a6f3b4558b21a5dca527e6ae9b12c F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 3dc15756d3c859799e30460e1ec6cd304e660df7f680f5cb1b50537de1e6f678 +F src/wal.c d0365581aed11a75e176f67cdbdc1bdfe685c5381a052360a00bbf58d3252fa0 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7c429c694abd12413a5c17aec9f47cfe9eba6807e6b0a32df883e8e3a14835ed F src/where.c 9546c82056e8cdb27291f98cf1adca5d271240b399bb97b32f77fc2bea6146c9 @@ -1866,7 +1866,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 dc18d89354cffcb726722c234a0271ab628a71277b22887eea2bf118028193a6 -R 19171e788e643226a8c2486a995489b0 +P 55910b9a7287be92af9f95e0af54af822055d15b7eabbcc81d61410d0bf67726 +R c5e07dc7678cd93b85244f746fa56268 U drh -Z 994ffac4ccc32781ab809d359e7c6892 +Z 57cf691f47068786612ca081f4bb8ca2 diff --git a/manifest.uuid b/manifest.uuid index 29df6b90b5..2b70686a2b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -55910b9a7287be92af9f95e0af54af822055d15b7eabbcc81d61410d0bf67726 \ No newline at end of file +1313557b512297e7b75ed748894379b2022aecf696d5a58318e46a668321c1ff \ No newline at end of file diff --git a/src/func.c b/src/func.c index f50fa19869..48b5f5f198 100644 --- a/src/func.c +++ b/src/func.c @@ -1283,7 +1283,7 @@ static void replaceFunc( ** whose index is a power of two: 1, 2, 4, 8, 16, 32, ... */ u8 *zOld; zOld = zOut; - zOut = sqlite3_realloc64(zOut, (int)nOut + (nOut - nStr - 1)); + zOut = sqlite3Realloc(zOut, (int)nOut + (nOut - nStr - 1)); if( zOut==0 ){ sqlite3_result_error_nomem(context); sqlite3_free(zOld); diff --git a/src/malloc.c b/src/malloc.c index b7378099a1..577836ef9a 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -672,7 +672,7 @@ static SQLITE_NOINLINE void *dbReallocFinish(sqlite3 *db, void *p, u64 n){ assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); sqlite3MemdebugSetType(p, MEMTYPE_HEAP); - pNew = sqlite3_realloc64(p, n); + pNew = sqlite3Realloc(p, n); if( !pNew ){ sqlite3OomFault(db); } diff --git a/src/memdb.c b/src/memdb.c index 2ddecae725..aabac5226f 100644 --- a/src/memdb.c +++ b/src/memdb.c @@ -166,7 +166,7 @@ static int memdbEnlarge(MemFile *p, sqlite3_int64 newSz){ } newSz *= 2; if( newSz>p->szMax ) newSz = p->szMax; - pNew = sqlite3_realloc64(p->aData, newSz); + pNew = sqlite3Realloc(p->aData, newSz); if( pNew==0 ) return SQLITE_NOMEM; p->aData = pNew; p->szAlloc = newSz; diff --git a/src/printf.c b/src/printf.c index a7d1b2f9d5..fd42bd2bca 100644 --- a/src/printf.c +++ b/src/printf.c @@ -924,7 +924,7 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){ if( p->db ){ zNew = sqlite3DbRealloc(p->db, zOld, p->nAlloc); }else{ - zNew = sqlite3_realloc64(zOld, p->nAlloc); + zNew = sqlite3Realloc(zOld, p->nAlloc); } if( zNew ){ assert( p->zText!=0 || p->nChar==0 ); diff --git a/src/table.c b/src/table.c index c79255f990..db60a827a0 100644 --- a/src/table.c +++ b/src/table.c @@ -56,7 +56,7 @@ static int sqlite3_get_table_cb(void *pArg, int nCol, char **argv, char **colv){ if( p->nData + need > p->nAlloc ){ char **azNew; p->nAlloc = p->nAlloc*2 + need; - azNew = sqlite3_realloc64( p->azResult, sizeof(char*)*p->nAlloc ); + azNew = sqlite3Realloc( p->azResult, sizeof(char*)*p->nAlloc ); if( azNew==0 ) goto malloc_failed; p->azResult = azNew; } @@ -165,7 +165,7 @@ int sqlite3_get_table( } if( res.nAlloc>res.nData ){ char **azNew; - azNew = sqlite3_realloc64( res.azResult, sizeof(char*)*res.nData ); + azNew = sqlite3Realloc( res.azResult, sizeof(char*)*res.nData ); if( azNew==0 ){ sqlite3_free_table(&res.azResult[1]); db->errCode = SQLITE_NOMEM; diff --git a/src/vtab.c b/src/vtab.c index 013511cfb4..d94f6b5ed3 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -1177,7 +1177,7 @@ void sqlite3VtabMakeWritable(Parse *pParse, Table *pTab){ if( pTab==pToplevel->apVtabLock[i] ) return; } n = (pToplevel->nVtabLock+1)*sizeof(pToplevel->apVtabLock[0]); - apVtabLock = sqlite3_realloc64(pToplevel->apVtabLock, n); + apVtabLock = sqlite3Realloc(pToplevel->apVtabLock, n); if( apVtabLock ){ pToplevel->apVtabLock = apVtabLock; pToplevel->apVtabLock[pToplevel->nVtabLock++] = pTab; diff --git a/src/wal.c b/src/wal.c index 115db09cd6..e8f7f24f85 100644 --- a/src/wal.c +++ b/src/wal.c @@ -568,7 +568,7 @@ static SQLITE_NOINLINE int walIndexPageRealloc( if( pWal->nWiData<=iPage ){ sqlite3_int64 nByte = sizeof(u32*)*(iPage+1); volatile u32 **apNew; - apNew = (volatile u32 **)sqlite3_realloc64((void *)pWal->apWiData, nByte); + apNew = (volatile u32 **)sqlite3Realloc((void *)pWal->apWiData, nByte); if( !apNew ){ *ppPage = 0; return SQLITE_NOMEM_BKPT; From c795e3df7aacc12f064a491ca1bc61923185e2df Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 17 May 2020 13:47:28 +0000 Subject: [PATCH 103/103] Avoid harmless UB in memcpy() in the JSON extension. FossilOrigin-Name: 69e149f76853d196c8855fedfc98848b60fb116ac36bc08824b1a122469f8ece --- ext/misc/json1.c | 1 + manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index d42cad17a9..caf7a99d60 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -254,6 +254,7 @@ static int jsonGrow(JsonString *p, u32 N){ /* Append N bytes from zIn onto the end of the JsonString string. */ static void jsonAppendRaw(JsonString *p, const char *zIn, u32 N){ + if( N==0 ) return; if( (N+p->nUsed >= p->nAlloc) && jsonGrow(p,N)!=0 ) return; memcpy(p->zBuf+p->nUsed, zIn, N); p->nUsed += N; diff --git a/manifest b/manifest index fb24b80edf..09bc31b904 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sthe\ssqlite3Realloc()\sinterface\sinternally,\srather\sthan\sthe\spublic\nsqlite3_realloc64()\sequivalent,\sto\savoid\sunnecessary\scalls\sto\nsqlite3_initialize(). -D 2020-05-17T00:26:44.076 +C Avoid\sharmless\sUB\sin\smemcpy()\sin\sthe\sJSON\sextension. +D 2020-05-17T13:47:28.477 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -298,7 +298,7 @@ F ext/misc/fileio.c 9b69e25da3b51d4a1d905a464ccb96709792ad627a742ba09215bc0d1447 F ext/misc/fossildelta.c 1240b2d3e52eab1d50c160c7fe1902a9bd210e052dc209200a750bbf885402d5 F ext/misc/fuzzer.c eae560134f66333e9e1ca4c8ffea75df42056e2ce8456734565dbe1c2a92bf3d F ext/misc/ieee754.c eaffd9b364d7c8371727e9c43fc8bec38cdacc4d11fc26beffaa3ca05a0ea9d6 -F ext/misc/json1.c 2d44e3fa37f958b42cbcd41651f9f0a0eaaf3bac3f1f4b8eb456431623cb3bd8 +F ext/misc/json1.c 3a42e3231d716516a8ae33b0a052d3ed5f52943e3d627b68744a427a6e552ae3 F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567 @@ -1866,7 +1866,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 55910b9a7287be92af9f95e0af54af822055d15b7eabbcc81d61410d0bf67726 -R c5e07dc7678cd93b85244f746fa56268 +P 1313557b512297e7b75ed748894379b2022aecf696d5a58318e46a668321c1ff +R 0a3aaa0509481c9d6269f1e12c4b65a3 U drh -Z 57cf691f47068786612ca081f4bb8ca2 +Z c1782df13623caf985a15e6cbac97877 diff --git a/manifest.uuid b/manifest.uuid index 2b70686a2b..892a8523c0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1313557b512297e7b75ed748894379b2022aecf696d5a58318e46a668321c1ff \ No newline at end of file +69e149f76853d196c8855fedfc98848b60fb116ac36bc08824b1a122469f8ece \ No newline at end of file