From 9d33d9e7ac064aed9de16d25544c7f45dcb76465 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 10 Mar 2020 01:24:13 +0000 Subject: [PATCH 001/224] 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/224] 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/224] 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/224] 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/224] 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/224] 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/224] 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/224] 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/224] 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/224] 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/224] 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/224] 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/224] 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/224] 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/224] 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/224] 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/224] 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/224] 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/224] 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/224] 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/224] 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 9f603fcefdaa30dd4cd4ce5b9dd83a8abb865acd Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 28 Apr 2020 11:45:41 +0000 Subject: [PATCH 022/224] 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 023/224] 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 024/224] 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 025/224] 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 026/224] 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 027/224] 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 028/224] 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 029/224] 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 030/224] 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 031/224] 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 032/224] 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 033/224] 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 034/224] 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 035/224] 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 036/224] 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 037/224] 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 038/224] 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 039/224] 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 040/224] 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 041/224] 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 042/224] 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 043/224] 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 044/224] 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 045/224] 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 046/224] 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 047/224] 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 048/224] 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 049/224] 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 050/224] 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 051/224] 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 052/224] 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 053/224] 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 054/224] 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 055/224] 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 056/224] 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 057/224] 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 058/224] 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 059/224] 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 060/224] 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 061/224] 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 062/224] 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 063/224] 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 064/224] 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 065/224] 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 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 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 066/224] 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 067/224] 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 068/224] 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 069/224] 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 070/224] 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 071/224] 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 072/224] 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 073/224] 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 074/224] 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 075/224] 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 076/224] 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 077/224] 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 078/224] 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 079/224] 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 080/224] 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 081/224] 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 From a5ee67d5b3ec8eaca71bde483dbb9fd9c77cea1a Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 18 May 2020 18:02:37 +0000 Subject: [PATCH 082/224] Add vdbevtab.lo to build of libsqlite3.lib in Makefile.msc. FossilOrigin-Name: f64d054b799c0af8d582fd9aff9bcbfa380ef08026ba5db8c5f89f6f56dfdad9 --- Makefile.msc | 3 ++- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index d3817e4e84..a5c9828901 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1256,7 +1256,8 @@ LIBOBJS0 = vdbe.lo parse.lo alter.lo analyze.lo attach.lo auth.lo \ table.lo threads.lo tokenize.lo treeview.lo trigger.lo \ update.lo upsert.lo util.lo vacuum.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 vdbevtab.lo wal.lo walker.lo where.lo wherecode.lo \ + whereexpr.lo \ window.lo utf.lo vtab.lo # <> diff --git a/manifest b/manifest index 09bc31b904..9f4f6e3da8 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Avoid\sharmless\sUB\sin\smemcpy()\sin\sthe\sJSON\sextension. -D 2020-05-17T13:47:28.477 +C Add\svdbevtab.lo\sto\sbuild\sof\slibsqlite3.lib\sin\sMakefile.msc. +D 2020-05-18T18:02:37.420 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 14bbe230f81498ed1d5a4df79317c9abdbd2f950cb8030527acccf4e2eddfd34 +F Makefile.msc 8d00aeba2609bb498dded5eead2890126321f02e292573bf29bf2d18487d37bd F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a F VERSION 980d78a2ce04a1fd0ebefbaabd665f7f9186563820629ee29c6e350e96f19b52 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -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 1313557b512297e7b75ed748894379b2022aecf696d5a58318e46a668321c1ff -R 0a3aaa0509481c9d6269f1e12c4b65a3 -U drh -Z c1782df13623caf985a15e6cbac97877 +P 69e149f76853d196c8855fedfc98848b60fb116ac36bc08824b1a122469f8ece +R 3630bc41d5bae3aeb507521e3969369e +U dan +Z ad12d06ec98773d9201d7cf643b16e9f diff --git a/manifest.uuid b/manifest.uuid index 892a8523c0..7c14e40f17 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -69e149f76853d196c8855fedfc98848b60fb116ac36bc08824b1a122469f8ece \ No newline at end of file +f64d054b799c0af8d582fd9aff9bcbfa380ef08026ba5db8c5f89f6f56dfdad9 \ No newline at end of file From f16cf653f44115821c4718a255f8be6d8d594baa Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 19 May 2020 12:27:29 +0000 Subject: [PATCH 083/224] In wal.c, improved comments on concurrency issues. More use of AtomicLoad() and AtomicStore(). FossilOrigin-Name: 4bf566feca3a8fbe5e386533aac30e0ac25836cfc820a3abd91e156bd6198b4a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wal.c | 48 +++++++++++++++++++++--------------------------- 3 files changed, 29 insertions(+), 35 deletions(-) diff --git a/manifest b/manifest index 9f4f6e3da8..26d7750597 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\svdbevtab.lo\sto\sbuild\sof\slibsqlite3.lib\sin\sMakefile.msc. -D 2020-05-18T18:02:37.420 +C In\swal.c,\simproved\scomments\son\sconcurrency\sissues.\s\sMore\suse\sof\nAtomicLoad()\sand\sAtomicStore(). +D 2020-05-19T12:27:29.008 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 ee5b4c902fdda2230f9503ac7b84c6d614c91e8f6f4dc1633e2e8dfef8ffb144 F src/vtab.c 7b452592ed2ee95dedb1f323d557cebede5a6f3b4558b21a5dca527e6ae9b12c F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c d0365581aed11a75e176f67cdbdc1bdfe685c5381a052360a00bbf58d3252fa0 +F src/wal.c fc763af2c20d1770e872378b28031c100b52061ec47599f38499cf4bd4977284 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 69e149f76853d196c8855fedfc98848b60fb116ac36bc08824b1a122469f8ece -R 3630bc41d5bae3aeb507521e3969369e -U dan -Z ad12d06ec98773d9201d7cf643b16e9f +P f64d054b799c0af8d582fd9aff9bcbfa380ef08026ba5db8c5f89f6f56dfdad9 +R 7f686b5b79d2dddadbc47e9d743b06cb +U drh +Z 8798d48c38c827000797710a250a5723 diff --git a/manifest.uuid b/manifest.uuid index 7c14e40f17..09b77250a7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f64d054b799c0af8d582fd9aff9bcbfa380ef08026ba5db8c5f89f6f56dfdad9 \ No newline at end of file +4bf566feca3a8fbe5e386533aac30e0ac25836cfc820a3abd91e156bd6198b4a \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index e8f7f24f85..3816883686 100644 --- a/src/wal.c +++ b/src/wal.c @@ -689,6 +689,10 @@ static void walChecksumBytes( aOut[1] = s2; } +/* +** If there is the possibility of concurrent access to the SHM file +** from multiple threads and/or processes, then do a memory barrier. +*/ static void walShmBarrier(Wal *pWal){ if( pWal->exclusiveMode!=WAL_HEAPMEMORY_MODE ){ sqlite3OsShmBarrier(pWal->pDbFd); @@ -708,6 +712,7 @@ static void walIndexWriteHdr(Wal *pWal){ pWal->hdr.isInit = 1; pWal->hdr.iVersion = WALINDEX_MAX_VERSION; walChecksumBytes(1, (u8*)&pWal->hdr, nCksum, 0, pWal->hdr.aCksum); + /* Possible TSAN false-positive. See tag-20200519-1 */ memcpy((void*)&aHdr[1], (const void*)&pWal->hdr, sizeof(WalIndexHdr)); walShmBarrier(pWal); memcpy((void*)&aHdr[0], (const void*)&pWal->hdr, sizeof(WalIndexHdr)); @@ -1897,32 +1902,13 @@ static int walCheckpoint( mxSafeFrame = pWal->hdr.mxFrame; mxPage = pWal->hdr.nPage; for(i=1; iaReadMark[i]; + u32 y = AtomicLoad(pInfo->aReadMark+i); if( mxSafeFrame>y ){ assert( y<=pWal->hdr.mxFrame ); rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(i), 1); if( rc==SQLITE_OK ){ - pInfo->aReadMark[i] = (i==1 ? mxSafeFrame : READMARK_NOT_USED); + u32 iMark = (i==1 ? mxSafeFrame : READMARK_NOT_USED); + AtomicStore(pInfo->aReadMark+i, iMark); walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); }else if( rc==SQLITE_BUSY ){ mxSafeFrame = y; @@ -1940,7 +1926,7 @@ static int walCheckpoint( } if( pIter - && (rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(0),1))==SQLITE_OK + && (rc = walBusyLock(pWal,xBusy,pBusyArg,WAL_READ_LOCK(0),1))==SQLITE_OK ){ u32 nBackfill = pInfo->nBackfill; @@ -2168,13 +2154,19 @@ static int walIndexTryHdr(Wal *pWal, int *pChanged){ ** meaning it is possible that an inconsistent snapshot is read ** from the file. If this happens, return non-zero. ** + ** tag-20200519-1: ** There are two copies of the header at the beginning of the wal-index. ** When reading, read [0] first then [1]. Writes are in the reverse order. ** Memory barriers are used to prevent the compiler or the hardware from - ** reordering the reads and writes. + ** reordering the reads and writes. TSAN and similar tools can sometimes + ** give false-positive warnings about these accesses because the tools do not + ** account for the double-read and the memory barrier. The use of mutexes + ** here would be problematic as the memory being accessed is potentially + ** shared among multiple processes and not all mutex implementions work + ** reliably in that environment. */ aHdr = walIndexHdr(pWal); - memcpy(&h1, (void *)&aHdr[0], sizeof(h1)); + memcpy(&h1, (void *)&aHdr[0], sizeof(h1)); /* Possible TSAN false-positive */ walShmBarrier(pWal); memcpy(&h2, (void *)&aHdr[1], sizeof(h2)); @@ -3015,14 +3007,15 @@ int sqlite3WalFindFrame( int iKey; /* Hash slot index */ int nCollide; /* Number of hash collisions remaining */ int rc; /* Error code */ + u32 iH; rc = walHashGet(pWal, iHash, &sLoc); if( rc!=SQLITE_OK ){ return rc; } nCollide = HASHTABLE_NSLOT; - for(iKey=walHash(pgno); sLoc.aHash[iKey]; iKey=walNextHash(iKey)){ - u32 iH = sLoc.aHash[iKey]; + iKey = walHash(pgno); + while( (iH = AtomicLoad(&sLoc.aHash[iKey]))!=0 ){ u32 iFrame = iH + sLoc.iZero; if( iFrame<=iLast && iFrame>=pWal->minFrame && sLoc.aPgno[iH]==pgno ){ assert( iFrame>iRead || CORRUPT_DB ); @@ -3031,6 +3024,7 @@ int sqlite3WalFindFrame( if( (nCollide--)==0 ){ return SQLITE_CORRUPT_BKPT; } + iKey = walNextHash(iKey); } if( iRead ) break; } From 1a7feefac5c1729394bc70f22e652e0097c55747 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 19 May 2020 12:29:56 +0000 Subject: [PATCH 084/224] User-suggested improvement to the README.txt for the ICU extension. FossilOrigin-Name: 1d1293c25abdd4b0fca64e5b1d0a118e2f339635dbc89422c0c2463fbf9ee27f --- ext/icu/README.txt | 3 ++- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ext/icu/README.txt b/ext/icu/README.txt index af75d22e61..be443f54ef 100644 --- a/ext/icu/README.txt +++ b/ext/icu/README.txt @@ -116,7 +116,8 @@ SQLite. Documentation follows. and use it as a dynamically loadable SQLite extension. To do this using gcc on *nix: - gcc -shared icu.c `icu-config --ldflags` -o libSqliteIcu.so + gcc -fPIC -shared icu.c `pkg-config --libs --cflags icu-uc icu-io` \ + -o libSqliteIcu.so You may need to add "-I" flags so that gcc can find sqlite3ext.h and sqlite3.h. The resulting shared lib, libSqliteIcu.so, may be diff --git a/manifest b/manifest index 26d7750597..3afe29ae0d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\swal.c,\simproved\scomments\son\sconcurrency\sissues.\s\sMore\suse\sof\nAtomicLoad()\sand\sAtomicStore(). -D 2020-05-19T12:27:29.008 +C User-suggested\simprovement\sto\sthe\sREADME.txt\sfor\sthe\sICU\sextension. +D 2020-05-19T12:29:56.039 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -230,7 +230,7 @@ F ext/fts5/tool/fts5txt2db.tcl 526a9979c963f1c54fd50976a05a502e533a4c59 F ext/fts5/tool/loadfts5.tcl 95b03429ee6b138645703c6ca192c3ac96eaf093 F ext/fts5/tool/mkfts5c.tcl d1c2a9ab8e0ec690a52316f33dd9b1d379942f45 F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c -F ext/icu/README.txt a295e91db742b153e8dce8f7efd31d28ad1eea4df31ef4daa3eedc85be2f5138 +F ext/icu/README.txt 1c48ffaf7f255bd73d00a35f68f6de357c2a6594f16cb00506a151be23694706 F ext/icu/icu.c 91c021c7e3e8bbba286960810fa303295c622e323567b2e6def4ce58e4466e60 F ext/icu/sqliteicu.h 728867a802baa5a96de7495e9689a8e01715ef37 F ext/lsm1/Makefile a553b728bba6c11201b795188c5708915cc4290f02b7df6ba7e8c4c943fd5cd9 @@ -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 f64d054b799c0af8d582fd9aff9bcbfa380ef08026ba5db8c5f89f6f56dfdad9 -R 7f686b5b79d2dddadbc47e9d743b06cb +P 4bf566feca3a8fbe5e386533aac30e0ac25836cfc820a3abd91e156bd6198b4a +R 967365fc0f01aa59917c371276c2fe8f U drh -Z 8798d48c38c827000797710a250a5723 +Z 6f8bf30a9a141e896db917f9dbf77f7a diff --git a/manifest.uuid b/manifest.uuid index 09b77250a7..78e460a488 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4bf566feca3a8fbe5e386533aac30e0ac25836cfc820a3abd91e156bd6198b4a \ No newline at end of file +1d1293c25abdd4b0fca64e5b1d0a118e2f339635dbc89422c0c2463fbf9ee27f \ No newline at end of file From 10757ed0cae8a7b8b70e74bea2ba521008e0bc2a Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 19 May 2020 15:40:07 +0000 Subject: [PATCH 085/224] In os_win.c, avoid calling sqlite3_uri_boolean() on anything other than a main-db filename. FossilOrigin-Name: cb0a18e64f8d81c2ada9f698faaf5ca68a0666687bf6f3abc860324cb1997463 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/os_win.c | 4 +++- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 3afe29ae0d..f97053e0ff 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C User-suggested\simprovement\sto\sthe\sREADME.txt\sfor\sthe\sICU\sextension. -D 2020-05-19T12:29:56.039 +C In\sos_win.c,\savoid\scalling\ssqlite3_uri_boolean()\son\sanything\sother\sthan\sa\smain-db\sfilename. +D 2020-05-19T15:40:07.909 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -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 317718e8f04c449e7d9e1eacac0d14e7508e4a77c9d4c3cb7382299bd24561b7 +F src/os_win.c e832e21e830c1f9409c9c54053939b6dcb14c1e92128b756204ce1e3e331d678 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 96436cb1920074d4ade120a1a8a9d0ae3f52df06651e21b7eccc5eae2f02b111 F src/pager.h 8d1dc9a2c3fc5eb6eeed75f48a076f425e77706f8935f05817fa05a308f587b5 @@ -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 4bf566feca3a8fbe5e386533aac30e0ac25836cfc820a3abd91e156bd6198b4a -R 967365fc0f01aa59917c371276c2fe8f -U drh -Z 6f8bf30a9a141e896db917f9dbf77f7a +P 1d1293c25abdd4b0fca64e5b1d0a118e2f339635dbc89422c0c2463fbf9ee27f +R 77702df5e982362c55239f265fbb9eea +U dan +Z 7af2360054e2377399137e1a09b7af22 diff --git a/manifest.uuid b/manifest.uuid index 78e460a488..82c4823f99 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1d1293c25abdd4b0fca64e5b1d0a118e2f339635dbc89422c0c2463fbf9ee27f \ No newline at end of file +cb0a18e64f8d81c2ada9f698faaf5ca68a0666687bf6f3abc860324cb1997463 \ No newline at end of file diff --git a/src/os_win.c b/src/os_win.c index 86789ced87..0adfd7fbf2 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -5272,7 +5272,9 @@ static int winOpen( if( isReadonly ){ pFile->ctrlFlags |= WINFILE_RDONLY; } - if( sqlite3_uri_boolean(zName, "psow", SQLITE_POWERSAFE_OVERWRITE) ){ + if( (flags & SQLITE_OPEN_MAIN_DB) + && sqlite3_uri_boolean(zName, "psow", SQLITE_POWERSAFE_OVERWRITE) + ){ pFile->ctrlFlags |= WINFILE_PSOW; } pFile->lastErrno = NO_ERROR; From 5a8cd2e40ce5287e638f77d4922068dbf7ba7e03 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 19 May 2020 15:51:10 +0000 Subject: [PATCH 086/224] Add compiler hints to disable TSAN for the routines that access the -shm file header in WAL mode using a double-read with memory barrier. FossilOrigin-Name: 3117c1b5a9e348fd8d16ba9d03fdafaad8514567fb3403f72b86d6162ad40bde --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wal.c | 17 +++++++++++++++-- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index f97053e0ff..a5b7b1fcbf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sos_win.c,\savoid\scalling\ssqlite3_uri_boolean()\son\sanything\sother\sthan\sa\smain-db\sfilename. -D 2020-05-19T15:40:07.909 +C Add\scompiler\shints\sto\sdisable\sTSAN\sfor\sthe\sroutines\sthat\saccess\sthe\s-shm\nfile\sheader\sin\sWAL\smode\susing\sa\sdouble-read\swith\smemory\sbarrier. +D 2020-05-19T15:51:10.216 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 ee5b4c902fdda2230f9503ac7b84c6d614c91e8f6f4dc1633e2e8dfef8ffb144 F src/vtab.c 7b452592ed2ee95dedb1f323d557cebede5a6f3b4558b21a5dca527e6ae9b12c F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c fc763af2c20d1770e872378b28031c100b52061ec47599f38499cf4bd4977284 +F src/wal.c 17ea0a319d3ead17ef3b16aa30f10f2626056893effea7e609a20a6661ffec1b 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 1d1293c25abdd4b0fca64e5b1d0a118e2f339635dbc89422c0c2463fbf9ee27f -R 77702df5e982362c55239f265fbb9eea -U dan -Z 7af2360054e2377399137e1a09b7af22 +P cb0a18e64f8d81c2ada9f698faaf5ca68a0666687bf6f3abc860324cb1997463 +R 8462379efa542a8195db58fd9ef94a35 +U drh +Z 5f8f2ff4f8e169f83e77c91d9875e042 diff --git a/manifest.uuid b/manifest.uuid index 82c4823f99..c90a442804 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cb0a18e64f8d81c2ada9f698faaf5ca68a0666687bf6f3abc860324cb1997463 \ No newline at end of file +3117c1b5a9e348fd8d16ba9d03fdafaad8514567fb3403f72b86d6162ad40bde \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index 3816883686..63dee82330 100644 --- a/src/wal.c +++ b/src/wal.c @@ -699,12 +699,25 @@ static void walShmBarrier(Wal *pWal){ } } +/* +** Add the SQLITE_NO_TSAN as part of the return-type of a function +** definition as a hint that the function contains constructs that +** might give false-positive TSAN warnings. +** +** See tag-20200519-1. +*/ +#if defined(__clang__) && !defined(SQLITE_NO_TSAN) +# define SQLITE_NO_TSAN __attribute__((no_sanitize_thread)) +#else +# define SQLITE_NO_TSAN +#endif + /* ** Write the header information in pWal->hdr into the wal-index. ** ** The checksum on pWal->hdr is updated before it is written. */ -static void walIndexWriteHdr(Wal *pWal){ +static SQLITE_NO_TSAN void walIndexWriteHdr(Wal *pWal){ volatile WalIndexHdr *aHdr = walIndexHdr(pWal); const int nCksum = offsetof(WalIndexHdr, aCksum); @@ -2141,7 +2154,7 @@ int sqlite3WalClose( ** If the checksum cannot be verified return non-zero. If the header ** is read successfully and the checksum verified, return zero. */ -static int walIndexTryHdr(Wal *pWal, int *pChanged){ +static SQLITE_NO_TSAN int walIndexTryHdr(Wal *pWal, int *pChanged){ u32 aCksum[2]; /* Checksum on the header content */ WalIndexHdr h1, h2; /* Two copies of the header content */ WalIndexHdr volatile *aHdr; /* Header in shared memory */ From 4f1315a43203026aa23f1c1df630249ccf2b32b1 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 20 May 2020 15:02:04 +0000 Subject: [PATCH 087/224] Back out the change from [7fab1393c2b22b1f] that tries to convert invalid surrogate characters in UTF16 into the replacement character 0xfffd, as we find that this breaks some software. FossilOrigin-Name: 4218c7b71fb6b227dbe4b852718584c150164af2d84e067cb810aa602554a609 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/utf.c | 16 ++++++++++++++++ test/tkt-3fe897352e.test | 8 ++++---- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index a5b7b1fcbf..81eb1b4a4a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\scompiler\shints\sto\sdisable\sTSAN\sfor\sthe\sroutines\sthat\saccess\sthe\s-shm\nfile\sheader\sin\sWAL\smode\susing\sa\sdouble-read\swith\smemory\sbarrier. -D 2020-05-19T15:51:10.216 +C Back\sout\sthe\schange\sfrom\s[7fab1393c2b22b1f]\sthat\stries\sto\sconvert\sinvalid\nsurrogate\scharacters\sin\sUTF16\sinto\sthe\sreplacement\scharacter\s0xfffd,\sas\swe\nfind\sthat\sthis\sbreaks\ssome\ssoftware. +D 2020-05-20T15:02:04.035 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -602,7 +602,7 @@ F src/treeview.c 82c6391a3ba76215d4185fd4719a56ec4caf186a40c8a7b6e6ba4ae4467c274 F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04 F src/update.c 3199098455830fc2d8c8fc4ae3ec2ea513eef64339ae9a7048db62b21169bc7a F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 -F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7 +F src/utf.c d7a61c1dfdac3eb091d43341a674032dca5a34e122f78ef0b5bd2d5a31967dde F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 F src/vacuum.c de9780b89fa4ee74c3534f60b94820e3179aca759ffc1338ee53cb4ea7693dd3 F src/vdbe.c e3dba0dee25bc92e871c13cac655260912b3be4abcc85b439259c9934b208da3 @@ -1446,7 +1446,7 @@ F test/tkt-385a5b56b9.test 5204a7cba0e28c99df0acbf95af5e1af4d32965a7a14de6eccebf F test/tkt-38cb5df375.test f3cc8671f1eb604d4ae9cf886ed4366bec656678 F test/tkt-3998683a16.test 6d1d04d551ed1704eb3396ca87bb9ccc8c5c1eb7 F test/tkt-3a77c9714e.test 90e3e8455ee945a4076d4c44062b8845708af24a880355328fe7008f2047c9f0 -F test/tkt-3fe897352e.test 6849fde0a87165ff83f54f5047af7c743d72af26908fadb90174f3294450b3f4 +F test/tkt-3fe897352e.test 27e26eb0f1811aeba4d65aba43a4c52e99da5e70 F test/tkt-4a03edc4c8.test 91c0e135888cdc3d4eea82406a44b05c8c1648d0 F test/tkt-4c86b126f2.test cbcc611becd0396890169ab23102dd70048bbc9a F test/tkt-4dd95f6943.test 3d0ce415d2ee15d3d564121960016b9c7be79407 @@ -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 cb0a18e64f8d81c2ada9f698faaf5ca68a0666687bf6f3abc860324cb1997463 -R 8462379efa542a8195db58fd9ef94a35 +P 3117c1b5a9e348fd8d16ba9d03fdafaad8514567fb3403f72b86d6162ad40bde +R e941513d71fae9ce3b558d98a564d148 U drh -Z 5f8f2ff4f8e169f83e77c91d9875e042 +Z db42a456dee4143dc7c71c6203f4a854 diff --git a/manifest.uuid b/manifest.uuid index c90a442804..c96b83728e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3117c1b5a9e348fd8d16ba9d03fdafaad8514567fb3403f72b86d6162ad40bde \ No newline at end of file +4218c7b71fb6b227dbe4b852718584c150164af2d84e067cb810aa602554a609 \ No newline at end of file diff --git a/src/utf.c b/src/utf.c index f6c8e79e50..3a2becfbcc 100644 --- a/src/utf.c +++ b/src/utf.c @@ -284,6 +284,7 @@ SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){ c = *(zIn++); c += (*(zIn++))<<8; if( c>=0xd800 && c<0xe000 ){ +#ifdef SQLITE_REPLACE_INVALID_UTF if( c>=0xdc00 || zIn>=zTerm ){ c = 0xfffd; }else{ @@ -296,6 +297,13 @@ SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){ c = ((c&0x3ff)<<10) + (c2&0x3ff) + 0x10000; } } +#else + if( zIn=0xd800 && c<0xe000 ){ +#ifdef SQLITE_REPLACE_INVALID_UTF if( c>=0xdc00 || zIn>=zTerm ){ c = 0xfffd; }else{ @@ -317,6 +326,13 @@ SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){ c = ((c&0x3ff)<<10) + (c2&0x3ff) + 0x10000; } } +#else + if( zIn Date: Thu, 21 May 2020 19:13:46 +0000 Subject: [PATCH 088/224] Avoid another potential OOB read in sqlite3expert.c. FossilOrigin-Name: 0ccea80092f16e7f17f4c4de4f8be3fdef217199fcc08ace37e179c1b22c1294 --- ext/expert/sqlite3expert.c | 6 ++++-- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/ext/expert/sqlite3expert.c b/ext/expert/sqlite3expert.c index 0685e54222..b5a6fd2ab4 100644 --- a/ext/expert/sqlite3expert.c +++ b/ext/expert/sqlite3expert.c @@ -1136,9 +1136,11 @@ int idxFindIndexes( for(i=0; i Date: Thu, 21 May 2020 20:38:39 +0000 Subject: [PATCH 089/224] Change a NEVER macro into a NO_TEST comment, as the conditional is reachable, but only when compiling for Windows 32-bit. FossilOrigin-Name: ce36b6d1331edba5a921fef32553e2470a79bdb1f62d2cfd81190691c83d5b06 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/memdb.c | 9 +++++---- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index ca56096d0d..cb328cbc7e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sanother\spotential\sOOB\sread\sin\ssqlite3expert.c. -D 2020-05-21T19:13:46.854 +C Change\sa\sNEVER\smacro\sinto\sa\sNO_TEST\scomment,\sas\sthe\sconditional\sis\sreachable,\nbut\sonly\swhen\scompiling\sfor\sWindows\s32-bit. +D 2020-05-21T20:38:39.168 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -504,7 +504,7 @@ F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 F src/mem3.c 8768ac94694f31ffaf8b4d0ea5dc08af7010a35a F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memdb.c 1d05bcc3fb6bde5c4aab7a56279d232f204625d74e627121e0562f355f5c843e +F src/memdb.c 252137ca122acb8f54a99b48cf9f96a31d5130f19d174381a53294446d8b64a3 F src/memjournal.c 7561c01c90958f3ba9bc6cb2d857123d932bdfa5539ea34427a0957b2e35154d F src/msvc.h 3a15918220367a8876be3fa4f2abe423a861491e84b864fb2b7426bf022a28f8 F src/mutex.c 5e3409715552348732e97b9194abe92fdfcd934cfb681df4ba0ab87ac6c18d25 @@ -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 4218c7b71fb6b227dbe4b852718584c150164af2d84e067cb810aa602554a609 -R a34ce7e81c0a64aa29d603331470468c -U dan -Z d5344c700a7ec03fab9c05b6e6d6dc98 +P 0ccea80092f16e7f17f4c4de4f8be3fdef217199fcc08ace37e179c1b22c1294 +R b5a877f3e2a7ab538bc565ffd2aae787 +U drh +Z 2acfb479c943aedec5bae0c532948916 diff --git a/manifest.uuid b/manifest.uuid index ca563882f2..ffe54a24bf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0ccea80092f16e7f17f4c4de4f8be3fdef217199fcc08ace37e179c1b22c1294 \ No newline at end of file +ce36b6d1331edba5a921fef32553e2470a79bdb1f62d2cfd81190691c83d5b06 \ No newline at end of file diff --git a/src/memdb.c b/src/memdb.c index aabac5226f..10da6d8018 100644 --- a/src/memdb.c +++ b/src/memdb.c @@ -613,10 +613,11 @@ int sqlite3MemdbInit(void){ sqlite3_vfs *pLower = sqlite3_vfs_find(0); int sz = pLower->szOsFile; memdb_vfs.pAppData = pLower; - /* In all known configurations of SQLite, the size of a default - ** sqlite3_file is greater than the size of a memdb sqlite3_file. - ** Should that ever change, remove the following NEVER() */ - if( NEVER(sz Date: Fri, 22 May 2020 17:46:16 +0000 Subject: [PATCH 090/224] Version 3.32.0 FossilOrigin-Name: 5998789c9c744bce92e4cff7636bba800a75574243d6977e1fc8281e360f8d5a --- manifest | 11 +++++++---- manifest.uuid | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/manifest b/manifest index cb328cbc7e..e020405f88 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sa\sNEVER\smacro\sinto\sa\sNO_TEST\scomment,\sas\sthe\sconditional\sis\sreachable,\nbut\sonly\swhen\scompiling\sfor\sWindows\s32-bit. -D 2020-05-21T20:38:39.168 +C Version\s3.32.0 +D 2020-05-22T17:46:16.912 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1866,7 +1866,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 0ccea80092f16e7f17f4c4de4f8be3fdef217199fcc08ace37e179c1b22c1294 +P ce36b6d1331edba5a921fef32553e2470a79bdb1f62d2cfd81190691c83d5b06 R b5a877f3e2a7ab538bc565ffd2aae787 +T +bgcolor * #d0c0ff +T +sym-release * +T +sym-version-3.32.0 * U drh -Z 2acfb479c943aedec5bae0c532948916 +Z 4af13806b6e302c99aeddae94a54c013 diff --git a/manifest.uuid b/manifest.uuid index ffe54a24bf..d9fa627cdb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ce36b6d1331edba5a921fef32553e2470a79bdb1f62d2cfd81190691c83d5b06 \ No newline at end of file +5998789c9c744bce92e4cff7636bba800a75574243d6977e1fc8281e360f8d5a \ No newline at end of file From 8e50d65aaf255c6db0631cfab8dc2b5329b5bb08 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 23 May 2020 17:56:49 +0000 Subject: [PATCH 091/224] Improved bytecode comment. FossilOrigin-Name: 9224f1543b51a674ad6d7db8e90d97e1b0d1abe68bed3417820ebd09d27270f9 --- manifest | 15 ++++++--------- manifest.uuid | 2 +- src/insert.c | 2 +- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index e020405f88..0c8b492aff 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.32.0 -D 2020-05-22T17:46:16.912 +C Improved\sbytecode\scomment. +D 2020-05-23T17:56:49.281 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -494,7 +494,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 8e4211d04eb460c0694d486c6ba1c068d468c6f653c3f237869a802ad82854de +F src/insert.c 92b07a7f7e682114948ce59fd6511ffec7672b508cc343a804ef6afee21b6c11 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 421310045bd78afefb772294a99e50f37d87ae578786a6169074e6291e30d969 F src/main.c 97d962ab1f830540043042e41085c5b85636a60e6ed95002c1a56b64f7eb6a0b @@ -1866,10 +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 ce36b6d1331edba5a921fef32553e2470a79bdb1f62d2cfd81190691c83d5b06 -R b5a877f3e2a7ab538bc565ffd2aae787 -T +bgcolor * #d0c0ff -T +sym-release * -T +sym-version-3.32.0 * +P 5998789c9c744bce92e4cff7636bba800a75574243d6977e1fc8281e360f8d5a +R 46f8cad64628f73fad5fb35bbcf77d33 U drh -Z 4af13806b6e302c99aeddae94a54c013 +Z 4863066a6f020b85f58b052a58cecb44 diff --git a/manifest.uuid b/manifest.uuid index d9fa627cdb..ad075ce08f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5998789c9c744bce92e4cff7636bba800a75574243d6977e1fc8281e360f8d5a \ No newline at end of file +9224f1543b51a674ad6d7db8e90d97e1b0d1abe68bed3417820ebd09d27270f9 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index f4049fb3de..287caeb0ff 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1944,7 +1944,7 @@ void sqlite3GenerateConstraintChecks( sqlite3TableAffinity(v, pTab, regNewData+1); bAffinityDone = 1; } - VdbeNoopComment((v, "uniqueness check for %s", pIdx->zName)); + VdbeNoopComment((v, "prep index %s", pIdx->zName)); iThisCur = iIdxCur+ix; From dd6c33d372f3b83f4fe57904c2bd5ebba5c38018 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 23 May 2020 19:58:07 +0000 Subject: [PATCH 092/224] Limit the "precision" of floating-point to text conversions in the printf() function to 100,000,000. Fix for ticket [23439ea582241138]. FossilOrigin-Name: d08d3405878d394e08e5d3af281246edfbd81ca74cc8d16458808591512fb93d --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/printf.c | 12 ++++++++++++ test/printf.test | 7 +++++++ 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 0c8b492aff..05284619de 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sbytecode\scomment. -D 2020-05-23T17:56:49.281 +C Limit\sthe\s"precision"\sof\sfloating-point\sto\stext\sconversions\sin\sthe\sprintf()\nfunction\sto\s100,000,000.\s\sFix\sfor\sticket\s[23439ea582241138]. +D 2020-05-23T19:58:07.338 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -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 ebf563cff3122f6a61149964b738b470196d3619df31d6a720d0ff72fcfd7c7b +F src/printf.c c558075d06f0c83b0471499cebd30ef979e600709cde1e2b744abadcf52c7ba2 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 @@ -1246,7 +1246,7 @@ F test/pragma4.test 10c624e45a83c0096a82a7579a5ff658542391d3b77355192da6572c8c17 F test/pragma5.test 7b33fc43e2e41abf17f35fb73f71b49671a380ea92a6c94b6ce530a25f8d9102 F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8 F test/prefixes.test b524a1c44bffec225b9aec98bd728480352aa8532ac4c15771fb85e8beef65d9 -F test/printf.test 0300699733e53101b2ce48800518427249edd4053bb50fa0621c6607482f0fdb +F test/printf.test 1e0e469f5f8a09afa8a182f34647e3d9b8c01978cbbe2313a194ccc3a8471506 F test/printf2.test 30b5dd0b4b992dc5626496846ecce17ff592cacbcb11c3e589f3ac4d7e129dae F test/progress.test ebab27f670bd0d4eb9d20d49cef96e68141d92fb F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc @@ -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 5998789c9c744bce92e4cff7636bba800a75574243d6977e1fc8281e360f8d5a -R 46f8cad64628f73fad5fb35bbcf77d33 +P 9224f1543b51a674ad6d7db8e90d97e1b0d1abe68bed3417820ebd09d27270f9 +R 6f18c0d227a8684c188f3f9391d707f5 U drh -Z 4863066a6f020b85f58b052a58cecb44 +Z 72d530f720119a1c4278481f4c5a947d diff --git a/manifest.uuid b/manifest.uuid index ad075ce08f..f6ed5310c7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9224f1543b51a674ad6d7db8e90d97e1b0d1abe68bed3417820ebd09d27270f9 \ No newline at end of file +d08d3405878d394e08e5d3af281246edfbd81ca74cc8d16458808591512fb93d \ No newline at end of file diff --git a/src/printf.c b/src/printf.c index fd42bd2bca..4505a5675e 100644 --- a/src/printf.c +++ b/src/printf.c @@ -194,6 +194,13 @@ static char *printfTempBuf(sqlite3_str *pAccum, sqlite3_int64 n){ #endif #define etBUFSIZE SQLITE_PRINT_BUF_SIZE /* Size of the output buffer */ +/* +** Hard limit on the precision of floating-point conversions. +*/ +#ifndef SQLITE_PRINTF_PRECISION_LIMIT +# define SQLITE_FP_PRECISION_LIMIT 100000000 +#endif + /* ** Render a string given by "fmt" into the StrAccum object. */ @@ -515,6 +522,11 @@ void sqlite3_str_vappendf( length = 0; #else if( precision<0 ) precision = 6; /* Set default precision */ +#ifdef SQLITE_FP_PRECISION_LIMIT + if( precision>SQLITE_FP_PRECISION_LIMIT ){ + precision = SQLITE_FP_PRECISION_LIMIT; + } +#endif if( realvalue<0.0 ){ realvalue = -realvalue; prefix = '-'; diff --git a/test/printf.test b/test/printf.test index d099da8fa2..d6acacb0f0 100644 --- a/test/printf.test +++ b/test/printf.test @@ -3777,4 +3777,11 @@ foreach ::iRepeat {0 1} { } } +# 2020-05-23 +# ticket 23439ea582241138 +# +do_execsql_test printf-16.1 { + SELECT printf('%.*g',2147483647,0.01); +} {0.01} + finish_test From 16dc07f7568bb2063d159fb41ab68ccf749c5e84 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 24 May 2020 00:30:38 +0000 Subject: [PATCH 093/224] Minor fix to a comment. No code changes. FossilOrigin-Name: efdbb2b499bda8ffcfe54f5d6ece08a2c58fe7a490d9550785d806bd404abb8c --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqliteInt.h | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 05284619de..099dc3f987 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Limit\sthe\s"precision"\sof\sfloating-point\sto\stext\sconversions\sin\sthe\sprintf()\nfunction\sto\s100,000,000.\s\sFix\sfor\sticket\s[23439ea582241138]. -D 2020-05-23T19:58:07.338 +C Minor\sfix\sto\sa\scomment.\s\sNo\scode\schanges. +D 2020-05-24T00:30:38.726 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -538,7 +538,7 @@ F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h 8878a88c18a013d1843638001d7fc56a8f99740f151fc7597b1641b61accf58c +F src/sqliteInt.h 9b05097d99ecbda6d5d5f6cad1a40a5113ef3534f0b4b78047ede65416f7c5b4 F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -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 9224f1543b51a674ad6d7db8e90d97e1b0d1abe68bed3417820ebd09d27270f9 -R 6f18c0d227a8684c188f3f9391d707f5 +P d08d3405878d394e08e5d3af281246edfbd81ca74cc8d16458808591512fb93d +R 6de336218c279399d0b1ec9bc6cc973c U drh -Z 72d530f720119a1c4278481f4c5a947d +Z 8cca70ea822ec140677c69f2076a66bc diff --git a/manifest.uuid b/manifest.uuid index f6ed5310c7..c9350f0acd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d08d3405878d394e08e5d3af281246edfbd81ca74cc8d16458808591512fb93d \ No newline at end of file +efdbb2b499bda8ffcfe54f5d6ece08a2c58fe7a490d9550785d806bd404abb8c \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 2b1c483192..f82efca956 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2486,7 +2486,7 @@ struct Token { ** code for a SELECT that contains aggregate functions. ** ** If Expr.op==TK_AGG_COLUMN or TK_AGG_FUNCTION then Expr.pAggInfo is a -** pointer to this structure. The Expr.iColumn field is the index in +** pointer to this structure. The Expr.iAgg field is the index in ** AggInfo.aCol[] or AggInfo.aFunc[] of information needed to generate ** code for that node. ** From ca74fbf6f164ad6fa9c6bd79050dc57cdcd69388 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 24 May 2020 02:05:04 +0000 Subject: [PATCH 094/224] Improvements to parse-tree tracing logic. No changes in deliverable code. FossilOrigin-Name: f7e5a68a7ebbb97a5beb050a75b3b4cf2fd6adc54653da993a8950fb3a5799f7 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 2 +- src/treeview.c | 5 +++-- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 099dc3f987..afe251ac7f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\sfix\sto\sa\scomment.\s\sNo\scode\schanges. -D 2020-05-24T00:30:38.726 +C Improvements\sto\sparse-tree\stracing\slogic.\s\sNo\schanges\sin\sdeliverable\scode. +D 2020-05-24T02:05:04.435 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/printf.c c558075d06f0c83b0471499cebd30ef979e600709cde1e2b744abadcf52c7ba2 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c ee4b02ad8047c35891b7a612091beec21ae7a0155290dcbefb0824aed20c46f3 +F src/select.c 7fe2902639a13d54f1a9ba140326804dca493c1c0c299005c2b48408fdcf0763 F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b6 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -598,7 +598,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c eee7bae3ec0bc4abee951554bf46a8ba567c0f7752ac90c820ed8afff4c612dc -F src/treeview.c 82c6391a3ba76215d4185fd4719a56ec4caf186a40c8a7b6e6ba4ae4467c2742 +F src/treeview.c 9df54af6e5830fd527496e62ae0148e1ba33197205d8e232c2826537d42d4063 F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04 F src/update.c 3199098455830fc2d8c8fc4ae3ec2ea513eef64339ae9a7048db62b21169bc7a F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 @@ -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 d08d3405878d394e08e5d3af281246edfbd81ca74cc8d16458808591512fb93d -R 6de336218c279399d0b1ec9bc6cc973c +P efdbb2b499bda8ffcfe54f5d6ece08a2c58fe7a490d9550785d806bd404abb8c +R 6dd20f3d976336460f5c02d76543f7db U drh -Z 8cca70ea822ec140677c69f2076a66bc +Z bccbcc790188c841772c26b7434cfbf8 diff --git a/manifest.uuid b/manifest.uuid index c9350f0acd..676441a5bc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -efdbb2b499bda8ffcfe54f5d6ece08a2c58fe7a490d9550785d806bd404abb8c \ No newline at end of file +f7e5a68a7ebbb97a5beb050a75b3b4cf2fd6adc54653da993a8950fb3a5799f7 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 869984ff4b..20295e1c43 100644 --- a/src/select.c +++ b/src/select.c @@ -6422,7 +6422,7 @@ int sqlite3Select( #if SELECTTRACE_ENABLED if( sqlite3SelectTrace & 0x400 ){ int ii; - SELECTTRACE(0x400,pParse,p,("After aggregate analysis:\n")); + SELECTTRACE(0x400,pParse,p,("After aggregate analysis %p:\n", &sAggInfo)); sqlite3TreeViewSelect(0, p, 0); for(ii=0; iiop==TK_AGG_FUNCTION ){ - sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q%s", - pExpr->op2, pExpr->u.zToken, zFlgs); + sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q%s iAgg=%d agg=%p", + pExpr->op2, pExpr->u.zToken, zFlgs, + pExpr->iAgg, pExpr->pAggInfo); }else if( pExpr->op2!=0 ){ const char *zOp2; char zBuf[8]; From e40cc16b472071f553700c7208394e6cf73d5688 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 24 May 2020 03:01:36 +0000 Subject: [PATCH 095/224] Move some utility Walker callbacks into the walker.c source file, as they seem to belong there better. FossilOrigin-Name: dac438236f7c5419d4e7e094e8b3f19f83cd3b1a18bc8acb14aee90d4514fa3c --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/expr.c | 13 ++----------- src/select.c | 23 ----------------------- src/sqliteInt.h | 3 +++ src/walker.c | 37 +++++++++++++++++++++++++++++++++++++ 6 files changed, 52 insertions(+), 44 deletions(-) diff --git a/manifest b/manifest index afe251ac7f..96ec7abd69 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\sparse-tree\stracing\slogic.\s\sNo\schanges\sin\sdeliverable\scode. -D 2020-05-24T02:05:04.435 +C Move\ssome\sutility\sWalker\scallbacks\sinto\sthe\swalker.c\ssource\sfile,\sas\sthey\nseem\sto\sbelong\sthere\sbetter. +D 2020-05-24T03:01:36.080 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -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 8eed44d9de8a3b0fe1c9809bb75a02b65488774c8ba8685512d8f63adade18e5 +F src/expr.c 30bdb15abfa93d32862160795c3cb25d87489186ac0e34020eb2894767c80b42 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -533,12 +533,12 @@ F src/printf.c c558075d06f0c83b0471499cebd30ef979e600709cde1e2b744abadcf52c7ba2 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 7fe2902639a13d54f1a9ba140326804dca493c1c0c299005c2b48408fdcf0763 +F src/select.c e2a59548681bf1c407132863ae87bf2444aca5543867c21d9d09aa07f44aef5d F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b6 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h 9b05097d99ecbda6d5d5f6cad1a40a5113ef3534f0b4b78047ede65416f7c5b4 +F src/sqliteInt.h 37f74544c8e2f59a16d1b13e6847bc02fb3fcbbfae4d6e6342c7a94c3a3984a5 F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -619,7 +619,7 @@ F src/vtab.c 7b452592ed2ee95dedb1f323d557cebede5a6f3b4558b21a5dca527e6ae9b12c F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 17ea0a319d3ead17ef3b16aa30f10f2626056893effea7e609a20a6661ffec1b F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a -F src/walker.c 7c429c694abd12413a5c17aec9f47cfe9eba6807e6b0a32df883e8e3a14835ed +F src/walker.c 3df26a33dc4f54e8771600fb7fdebe1ece0896c2ad68c30ab40b017aa4395049 F src/where.c 9546c82056e8cdb27291f98cf1adca5d271240b399bb97b32f77fc2bea6146c9 F src/whereInt.h 6b874aa15f94e43a2cec1080be64d955b04deeafeac90ffb5d6975c0d511be3c F src/wherecode.c 7b939de85d65cc4b4bfa197513136b9e0ae03167e3b82842ca5a0ba1055ba65d @@ -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 efdbb2b499bda8ffcfe54f5d6ece08a2c58fe7a490d9550785d806bd404abb8c -R 6dd20f3d976336460f5c02d76543f7db +P f7e5a68a7ebbb97a5beb050a75b3b4cf2fd6adc54653da993a8950fb3a5799f7 +R dbe8893e129b18dae1c69a78f2ea7c07 U drh -Z bccbcc790188c841772c26b7434cfbf8 +Z bac4c0e757f80b1b93a3ee3b61a5b760 diff --git a/manifest.uuid b/manifest.uuid index 676441a5bc..7928f1c7f9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f7e5a68a7ebbb97a5beb050a75b3b4cf2fd6adc54653da993a8950fb3a5799f7 \ No newline at end of file +dac438236f7c5419d4e7e094e8b3f19f83cd3b1a18bc8acb14aee90d4514fa3c \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 7205f8628a..83dd8b1ab3 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5867,15 +5867,6 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ } return WRC_Continue; } -static int analyzeAggregatesInSelect(Walker *pWalker, Select *pSelect){ - UNUSED_PARAMETER(pSelect); - pWalker->walkerDepth++; - return WRC_Continue; -} -static void analyzeAggregatesInSelectEnd(Walker *pWalker, Select *pSelect){ - UNUSED_PARAMETER(pSelect); - pWalker->walkerDepth--; -} /* ** Analyze the pExpr expression looking for aggregate functions and @@ -5889,8 +5880,8 @@ static void analyzeAggregatesInSelectEnd(Walker *pWalker, Select *pSelect){ void sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){ Walker w; w.xExprCallback = analyzeAggregate; - w.xSelectCallback = analyzeAggregatesInSelect; - w.xSelectCallback2 = analyzeAggregatesInSelectEnd; + w.xSelectCallback = sqlite3WalkerDepthIncrease; + w.xSelectCallback2 = sqlite3WalkerDepthDecrease; w.walkerDepth = 0; w.u.pNC = pNC; w.pParse = 0; diff --git a/src/select.c b/src/select.c index 20295e1c43..534dfbc01b 100644 --- a/src/select.c +++ b/src/select.c @@ -5229,29 +5229,6 @@ static int selectExpander(Walker *pWalker, Select *p){ return WRC_Continue; } -/* -** No-op routine for the parse-tree walker. -** -** When this routine is the Walker.xExprCallback then expression trees -** are walked without any actions being taken at each node. Presumably, -** when this routine is used for Walker.xExprCallback then -** Walker.xSelectCallback is set to do something useful for every -** subquery in the parser tree. -*/ -int sqlite3ExprWalkNoop(Walker *NotUsed, Expr *NotUsed2){ - UNUSED_PARAMETER2(NotUsed, NotUsed2); - return WRC_Continue; -} - -/* -** No-op routine for the parse-tree walker for SELECT statements. -** subquery in the parser tree. -*/ -int sqlite3SelectWalkNoop(Walker *NotUsed, Select *NotUsed2){ - UNUSED_PARAMETER2(NotUsed, NotUsed2); - return WRC_Continue; -} - #if SQLITE_DEBUG /* ** Always assert. This xSelectCallback2 implementation proves that the diff --git a/src/sqliteInt.h b/src/sqliteInt.h index f82efca956..122e26ad73 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3725,6 +3725,9 @@ int sqlite3WalkSelectFrom(Walker*, Select*); int sqlite3ExprWalkNoop(Walker*, Expr*); int sqlite3SelectWalkNoop(Walker*, Select*); int sqlite3SelectWalkFail(Walker*, Select*); +int sqlite3WalkerDepthIncrease(Walker*,Select*); +void sqlite3WalkerDepthDecrease(Walker*,Select*); + #ifdef SQLITE_DEBUG void sqlite3SelectWalkAssert2(Walker*, Select*); #endif diff --git a/src/walker.c b/src/walker.c index 48d7ddbf3d..7649036f56 100644 --- a/src/walker.c +++ b/src/walker.c @@ -207,3 +207,40 @@ int sqlite3WalkSelect(Walker *pWalker, Select *p){ }while( p!=0 ); return WRC_Continue; } + +/* Increase the walkerDepth when entering a subquery, and +** descrease when leaving the subquery. +*/ +int sqlite3WalkerDepthIncrease(Walker *pWalker, Select *pSelect){ + UNUSED_PARAMETER(pSelect); + pWalker->walkerDepth++; + return WRC_Continue; +} +void sqlite3WalkerDepthDecrease(Walker *pWalker, Select *pSelect){ + UNUSED_PARAMETER(pSelect); + pWalker->walkerDepth--; +} + + +/* +** No-op routine for the parse-tree walker. +** +** When this routine is the Walker.xExprCallback then expression trees +** are walked without any actions being taken at each node. Presumably, +** when this routine is used for Walker.xExprCallback then +** Walker.xSelectCallback is set to do something useful for every +** subquery in the parser tree. +*/ +int sqlite3ExprWalkNoop(Walker *NotUsed, Expr *NotUsed2){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + return WRC_Continue; +} + +/* +** No-op routine for the parse-tree walker for SELECT statements. +** subquery in the parser tree. +*/ +int sqlite3SelectWalkNoop(Walker *NotUsed, Select *NotUsed2){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + return WRC_Continue; +} From c37577bb2dfb602a5cdbba8322a01b548c34c185 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 24 May 2020 03:38:37 +0000 Subject: [PATCH 096/224] When rewriting a query for window functions, if the rewrite changes the depth of TK_AGG_FUNCTION nodes, be sure to adjust the Expr.op2 field appropriately. Fix for ticket [7a5279a25c57adf1] FossilOrigin-Name: ad7bb70af9bb68d192137188bb2528f1e9e43ad164c925174ca1dafc9e1f5339 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/resolve.c | 2 ++ src/window.c | 23 +++++++++++++++++++++++ test/window1.test | 16 ++++++++++++++++ 5 files changed, 50 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 96ec7abd69..3bd2ba543d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Move\ssome\sutility\sWalker\scallbacks\sinto\sthe\swalker.c\ssource\sfile,\sas\sthey\nseem\sto\sbelong\sthere\sbetter. -D 2020-05-24T03:01:36.080 +C When\srewriting\sa\squery\sfor\swindow\sfunctions,\sif\sthe\srewrite\schanges\sthe\ndepth\sof\sTK_AGG_FUNCTION\snodes,\sbe\ssure\sto\sadjust\sthe\sExpr.op2\sfield\nappropriately.\s\sFix\sfor\sticket\s[7a5279a25c57adf1] +D 2020-05-24T03:38:37.646 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -531,7 +531,7 @@ F src/pragma.h 8168e588536bffd95319451f34e9a754dc37d205ebe433031a7813c5b286beae F src/prepare.c 8d4d6c8aa6afefc48027c54b41cdf134b4d6bc2fc4badbe483ad7fd9e1728a28 F src/printf.c c558075d06f0c83b0471499cebd30ef979e600709cde1e2b744abadcf52c7ba2 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 +F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c e2a59548681bf1c407132863ae87bf2444aca5543867c21d9d09aa07f44aef5d F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b6 @@ -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 194fc168626f186a2b90dfe5edb534ab164cbeb6c4906177bfcdd5c188a0b53d +F src/window.c 66c5fd1e48af7581cf90b97700268294f4da4037f120f367715f912e1148d3f9 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1727,7 +1727,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 4baffc3acb2e5188a5e3a895b2b543ed09e62f7c72d713c1feebf76222fe9976 F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test a3504d44a3a125e35c53358cde1457d55bfc487bbe00f4c86bfed3a0bcc02140 +F test/window1.test 502a3e72fce895aaaa633bbe709f6de3c24eed3ecb8098ab9fb8b47584b4452c F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -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 f7e5a68a7ebbb97a5beb050a75b3b4cf2fd6adc54653da993a8950fb3a5799f7 -R dbe8893e129b18dae1c69a78f2ea7c07 +P dac438236f7c5419d4e7e094e8b3f19f83cd3b1a18bc8acb14aee90d4514fa3c +R 29b2a5afa5bc78735afdeb2a8382bf79 U drh -Z bac4c0e757f80b1b93a3ee3b61a5b760 +Z 337b069bd9531722136b7b0d8a6208d2 diff --git a/manifest.uuid b/manifest.uuid index 7928f1c7f9..610cf66762 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dac438236f7c5419d4e7e094e8b3f19f83cd3b1a18bc8acb14aee90d4514fa3c \ No newline at end of file +ad7bb70af9bb68d192137188bb2528f1e9e43ad164c925174ca1dafc9e1f5339 \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 60fed0b109..aff6dbeadb 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -24,6 +24,8 @@ ** ** incrAggFunctionDepth(pExpr,n) is the main routine. incrAggDepth(..) ** is a helper function - a callback for the tree walker. +** +** See also the sqlite3WindowExtraAggFuncDepth() routine in window.c */ static int incrAggDepth(Walker *pWalker, Expr *pExpr){ if( pExpr->op==TK_AGG_FUNCTION ) pExpr->op2 += pWalker->u.n; diff --git a/src/window.c b/src/window.c index f168cf55b2..77ec8a02e0 100644 --- a/src/window.c +++ b/src/window.c @@ -916,6 +916,23 @@ static ExprList *exprListAppendList( return pList; } +/* +** When rewriting a query, if the new subquery in the FROM clause +** contains TK_AGG_FUNCTION nodes that refer to an outer query, +** then we have to increase the Expr->op2 values of those nodes +** due to the extra subquery layer that was added. +** +** See also the incrAggDepth() routine in resolve.c +*/ +static int sqlite3WindowExtraAggFuncDepth(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_AGG_FUNCTION + && pExpr->op2>=pWalker->walkerDepth + ){ + pExpr->op2++; + } + return WRC_Continue; +} + /* ** If the SELECT statement passed as the second argument does not invoke ** any SQL window functions, this function is a no-op. Otherwise, it @@ -1025,6 +1042,7 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ p->pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( p->pSrc ){ Table *pTab2; + Walker w; p->pSrc->a[0].pSelect = pSub; sqlite3SrcListAssignCursors(pParse, p->pSrc); pSub->selFlags |= SF_Expanded; @@ -1040,6 +1058,11 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ pTab->tabFlags |= TF_Ephemeral; p->pSrc->a[0].pTab = pTab; pTab = pTab2; + memset(&w, 0, sizeof(w)); + w.xExprCallback = sqlite3WindowExtraAggFuncDepth; + w.xSelectCallback = sqlite3WalkerDepthIncrease; + w.xSelectCallback2 = sqlite3WalkerDepthDecrease; + sqlite3WalkSelect(&w, pSub); } }else{ sqlite3SelectDelete(db, pSub); diff --git a/test/window1.test b/test/window1.test index 25a76b9247..677297fc89 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1727,5 +1727,21 @@ do_execsql_test 52.4 { 4 938 938 4 } +# 2020-05-23 +# ticket 7a5279a25c57adf1 +# +reset_db +do_execsql_test 53.0 { + CREATE TABLE a(c UNIQUE); + INSERT INTO a VALUES(4),(0),(9),(-9); + SELECT a.c + FROM a + JOIN a AS b ON a.c=4 + JOIN a AS e ON a.c=e.c + WHERE a.c=(SELECT (SELECT coalesce(lead(2) OVER(),0) + sum(d.c)) + FROM a AS d + WHERE a.c); +} {4 4 4 4} + finish_test From e859e43bb87baa49cd3cdbbf81b4cbc9fe93d1de Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 24 May 2020 12:36:20 +0000 Subject: [PATCH 097/224] Version number to 3.32.1. FossilOrigin-Name: 56e5063c326ffbfd3e3cb6f2b05718412aca2cb183274bfe11f5666effdd04b9 --- VERSION | 2 +- configure | 18 +++++++++--------- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/VERSION b/VERSION index cac6068cfc..1367bf750d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.32.0 +3.32.1 diff --git a/configure b/configure index e44efa9380..854b2460a6 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for sqlite 3.32.0. +# Generated by GNU Autoconf 2.69 for sqlite 3.32.1. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -726,8 +726,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='sqlite' PACKAGE_TARNAME='sqlite' -PACKAGE_VERSION='3.32.0' -PACKAGE_STRING='sqlite 3.32.0' +PACKAGE_VERSION='3.32.1' +PACKAGE_STRING='sqlite 3.32.1' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1467,7 +1467,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures sqlite 3.32.0 to adapt to many kinds of systems. +\`configure' configures sqlite 3.32.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1532,7 +1532,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of sqlite 3.32.0:";; + short | recursive ) echo "Configuration of sqlite 3.32.1:";; esac cat <<\_ACEOF @@ -1659,7 +1659,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -sqlite configure 3.32.0 +sqlite configure 3.32.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2078,7 +2078,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by sqlite $as_me 3.32.0, which was +It was created by sqlite $as_me 3.32.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -12243,7 +12243,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by sqlite $as_me 3.32.0, which was +This file was extended by sqlite $as_me 3.32.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -12309,7 +12309,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -sqlite config.status 3.32.0 +sqlite config.status 3.32.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/manifest b/manifest index 3bd2ba543d..4b5b59e03a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\srewriting\sa\squery\sfor\swindow\sfunctions,\sif\sthe\srewrite\schanges\sthe\ndepth\sof\sTK_AGG_FUNCTION\snodes,\sbe\ssure\sto\sadjust\sthe\sExpr.op2\sfield\nappropriately.\s\sFix\sfor\sticket\s[7a5279a25c57adf1] -D 2020-05-24T03:38:37.646 +C Version\snumber\sto\s3.32.1. +D 2020-05-24T12:36:20.131 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -7,7 +7,7 @@ F Makefile.in 376f53999defeb32b7ad2626fd58aae8f3694c38ab7ee30c2289e0d0525a9238 F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 F Makefile.msc 8d00aeba2609bb498dded5eead2890126321f02e292573bf29bf2d18487d37bd F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a -F VERSION 980d78a2ce04a1fd0ebefbaabd665f7f9186563820629ee29c6e350e96f19b52 +F VERSION 7d1da8465e06354a9ffb67a9ef3f933552767d8e239b507cb2a08ba417048322 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 @@ -34,7 +34,7 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 883205ddf25b46f10c181818bf42c09da9888884af96f79e1719264345053bd6 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc F config.sub c2d0260f17f3e4bc0b6808fccf1b291cb5e9126c14fc5890efc77b9fd0175559 -F configure 4bbb5f13998f2faf929b9ae708aea9fbcb08a46cb6dd3150e36c3f09c0a05a75 x +F configure 4705718305e176b707e65047b69dca834fe7bc5475584e30fe1f63c8e33751b8 x F configure.ac 798a24cee2879325ca5b688a618199eb32cc77ed8136edbaa43d9137b470d54e F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd @@ -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 dac438236f7c5419d4e7e094e8b3f19f83cd3b1a18bc8acb14aee90d4514fa3c -R 29b2a5afa5bc78735afdeb2a8382bf79 +P ad7bb70af9bb68d192137188bb2528f1e9e43ad164c925174ca1dafc9e1f5339 +R 9b4861350c19f604797570d532809e1e U drh -Z 337b069bd9531722136b7b0d8a6208d2 +Z bbda9cc25034e5e4447ce8684480d98d diff --git a/manifest.uuid b/manifest.uuid index 610cf66762..4d5c18c3a9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ad7bb70af9bb68d192137188bb2528f1e9e43ad164c925174ca1dafc9e1f5339 \ No newline at end of file +56e5063c326ffbfd3e3cb6f2b05718412aca2cb183274bfe11f5666effdd04b9 \ No newline at end of file From d3bf76612724f79616d6aba959af92b609b941c9 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 25 May 2020 01:31:09 +0000 Subject: [PATCH 098/224] Attempt to work around a false-positive warning in the CGo compiler. FossilOrigin-Name: d4bf60f464789935dc193ea99bf730c8fade448c7dca13eb3ce297965980f36e --- manifest | 15 +++++++++------ manifest.uuid | 2 +- src/select.c | 9 ++++----- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 4b5b59e03a..52af8c9c07 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\snumber\sto\s3.32.1. -D 2020-05-24T12:36:20.131 +C Attempt\sto\swork\saround\sa\sfalse-positive\swarning\sin\sthe\sCGo\scompiler. +D 2020-05-25T01:31:09.337 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/printf.c c558075d06f0c83b0471499cebd30ef979e600709cde1e2b744abadcf52c7ba2 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c e2a59548681bf1c407132863ae87bf2444aca5543867c21d9d09aa07f44aef5d +F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b6 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1866,7 +1866,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 ad7bb70af9bb68d192137188bb2528f1e9e43ad164c925174ca1dafc9e1f5339 -R 9b4861350c19f604797570d532809e1e +P 56e5063c326ffbfd3e3cb6f2b05718412aca2cb183274bfe11f5666effdd04b9 +R 8b82e85659228458f67d774145dc6d1d +T *branch * cgo-warning-workaround +T *sym-cgo-warning-workaround * +T -sym-trunk * U drh -Z bbda9cc25034e5e4447ce8684480d98d +Z 9456cb6ba774169f54e2af5894cea4a0 diff --git a/manifest.uuid b/manifest.uuid index 4d5c18c3a9..e9a6b27414 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -56e5063c326ffbfd3e3cb6f2b05718412aca2cb183274bfe11f5666effdd04b9 \ No newline at end of file +d4bf60f464789935dc193ea99bf730c8fade448c7dca13eb3ce297965980f36e \ No newline at end of file diff --git a/src/select.c b/src/select.c index 534dfbc01b..7ff2b5d347 100644 --- a/src/select.c +++ b/src/select.c @@ -138,9 +138,9 @@ Select *sqlite3SelectNew( u32 selFlags, /* Flag parameters, such as SF_Distinct */ Expr *pLimit /* LIMIT value. NULL means not used */ ){ - Select *pNew; + Select *pNew, *pAllocated; Select standin; - pNew = sqlite3DbMallocRawNN(pParse->db, sizeof(*pNew) ); + pAllocated = pNew = sqlite3DbMallocRawNN(pParse->db, sizeof(*pNew) ); if( pNew==0 ){ assert( pParse->db->mallocFailed ); pNew = &standin; @@ -174,12 +174,11 @@ Select *sqlite3SelectNew( #endif if( pParse->db->mallocFailed ) { clearSelect(pParse->db, pNew, pNew!=&standin); - pNew = 0; + pAllocated = 0; }else{ assert( pNew->pSrc!=0 || pParse->nErr>0 ); } - assert( pNew!=&standin ); - return pNew; + return pAllocated; } From 91960aa53ff5b08f28b9edb627d8a1b62231e125 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 25 May 2020 12:02:12 +0000 Subject: [PATCH 099/224] Make sure variable declarations are at start of scope even when SQLITE_ENABLE_SNAPSHOT is used. FossilOrigin-Name: a77ceaf6ba934b1d73c90b8980191a65d02ad6ce1e11e6baf573b3a132685545 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wal.c | 6 ++++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 4b5b59e03a..b0791595ca 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\snumber\sto\s3.32.1. -D 2020-05-24T12:36:20.131 +C Make\ssure\svariable\sdeclarations\sare\sat\sstart\sof\sscope\seven\swhen\nSQLITE_ENABLE_SNAPSHOT\sis\sused. +D 2020-05-25T12:02:12.498 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 ee5b4c902fdda2230f9503ac7b84c6d614c91e8f6f4dc1633e2e8dfef8ffb144 F src/vtab.c 7b452592ed2ee95dedb1f323d557cebede5a6f3b4558b21a5dca527e6ae9b12c F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 17ea0a319d3ead17ef3b16aa30f10f2626056893effea7e609a20a6661ffec1b +F src/wal.c 04c3d2a673192016a671eb051a1900945a8c7331f4378636a8bfb70e8e596c84 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 3df26a33dc4f54e8771600fb7fdebe1ece0896c2ad68c30ab40b017aa4395049 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 ad7bb70af9bb68d192137188bb2528f1e9e43ad164c925174ca1dafc9e1f5339 -R 9b4861350c19f604797570d532809e1e +P 56e5063c326ffbfd3e3cb6f2b05718412aca2cb183274bfe11f5666effdd04b9 +R 01324a5a46d5370d11de237fae1d2b79 U drh -Z bbda9cc25034e5e4447ce8684480d98d +Z 4612882d193bb7431c4c9f4670ae6370 diff --git a/manifest.uuid b/manifest.uuid index 4d5c18c3a9..3f74ebb5d8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -56e5063c326ffbfd3e3cb6f2b05718412aca2cb183274bfe11f5666effdd04b9 \ No newline at end of file +a77ceaf6ba934b1d73c90b8980191a65d02ad6ce1e11e6baf573b3a132685545 \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index 63dee82330..52087e1296 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2846,12 +2846,14 @@ int sqlite3WalSnapshotRecover(Wal *pWal){ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ int rc; /* Return code */ int cnt = 0; /* Number of TryBeginRead attempts */ +#ifdef SQLITE_ENABLE_SNAPSHOT + int bChanged = 0; + WalIndexHdr *pSnapshot = pWal->pSnapshot; +#endif assert( pWal->ckptLock==0 ); #ifdef SQLITE_ENABLE_SNAPSHOT - int bChanged = 0; - WalIndexHdr *pSnapshot = pWal->pSnapshot; if( pSnapshot ){ if( memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){ bChanged = 1; From efc752b131cd2745e1bd71ae1511303150478b07 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 25 May 2020 12:49:58 +0000 Subject: [PATCH 100/224] Fix minor compile issues with optional extensions. FossilOrigin-Name: 3261ee9ec26bbeaa64190c12556a1d8146270b6660c70004830bd38c1b5b63f4 --- ext/misc/sqlar.c | 1 + ext/misc/vfsstat.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/ext/misc/sqlar.c b/ext/misc/sqlar.c index 8b90f9d1d8..47cb68ff60 100644 --- a/ext/misc/sqlar.c +++ b/ext/misc/sqlar.c @@ -17,6 +17,7 @@ #include "sqlite3ext.h" SQLITE_EXTENSION_INIT1 #include +#include /* ** Implementation of the "sqlar_compress(X)" SQL function. diff --git a/ext/misc/vfsstat.c b/ext/misc/vfsstat.c index 7b5102a5a1..186ed788fc 100644 --- a/ext/misc/vfsstat.c +++ b/ext/misc/vfsstat.c @@ -811,7 +811,7 @@ int sqlite3_vfsstat_init( if( rc==SQLITE_OK ){ rc = vstatRegister(db, pzErrMsg, pApi); if( rc==SQLITE_OK ){ - rc = sqlite3_auto_extension(vstatRegister); + rc = sqlite3_auto_extension((void(*)(void))vstatRegister); } } if( rc==SQLITE_OK ) rc = SQLITE_OK_LOAD_PERMANENTLY; diff --git a/manifest b/manifest index b0791595ca..f699358d39 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\svariable\sdeclarations\sare\sat\sstart\sof\sscope\seven\swhen\nSQLITE_ENABLE_SNAPSHOT\sis\sused. -D 2020-05-25T12:02:12.498 +C Fix\sminor\scompile\sissues\swith\soptional\sextensions. +D 2020-05-25T12:49:58.975 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -317,7 +317,7 @@ F ext/misc/sha1.c c8f2253c8792ffab9517695ea7d88c079f0395a5505eefef5c8198fe184ed5 F ext/misc/shathree.c 135b7c145db4a09b1650c3e7aff9cb538763a9a361e834c015dd1aaf8d5c9a00 F ext/misc/showauth.c 732578f0fe4ce42d577e1c86dc89dd14a006ab52 F ext/misc/spellfix.c 94df9bbfa514a563c1484f684a2df3d128a2f7209a84ca3ca100c68a0163e29f -F ext/misc/sqlar.c c9e5d58544e1506135806a1e0f525f92d4bb6bb125348dce469d778fb334fbce +F ext/misc/sqlar.c 0ace5d3c10fe736dc584bf1159a36b8e2e60fab309d310cd8a0eecd9036621b6 F ext/misc/stmt.c 35063044a388ead95557e4b84b89c1b93accc2f1c6ddea3f9710e8486a7af94a F ext/misc/templatevtab.c 8a16a91a5ceaccfcbd6aaaa56d46828806e460dd194965b3f77bf38f14b942c4 F ext/misc/totype.c fa4aedeb07f66169005dffa8de3b0a2b621779fd44f85c103228a42afa71853b @@ -326,7 +326,7 @@ F ext/misc/unionvtab.c 36237f0607ca954ac13a4a0e2d2ac40c33bc6e032a5f55f431713061e F ext/misc/urifuncs.c f71360d14fa9e7626b563f1f781c6148109462741c5235ac63ae0f8917b9c751 F ext/misc/uuid.c 5bb2264c1b64d163efa46509544fd7500cb8769cb7c16dd52052da8d961505cf F ext/misc/vfslog.c 3b25c2f56ba60788db247287be6ab024b53c4afffd412b4876db563389be0d35 -F ext/misc/vfsstat.c 77b5b4235c9f7f11eddf82487c0a422944ac2f132dafd5af3be7a68a057b1cdb +F ext/misc/vfsstat.c 389ea13983d3af926504c314f06a83cc858d5adc24b40af74aaed1fece00c118 F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd F ext/misc/wholenumber.c 520f34c3099e5b7d546f13708607dc2fa173c46b68952eecf0d19cd675fec85e @@ -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 56e5063c326ffbfd3e3cb6f2b05718412aca2cb183274bfe11f5666effdd04b9 -R 01324a5a46d5370d11de237fae1d2b79 +P a77ceaf6ba934b1d73c90b8980191a65d02ad6ce1e11e6baf573b3a132685545 +R 4196412a957656021e354dac48b171f2 U drh -Z 4612882d193bb7431c4c9f4670ae6370 +Z 047ce2029fbbe737be54b5d1a4d5fdc1 diff --git a/manifest.uuid b/manifest.uuid index 3f74ebb5d8..a5fa9fad94 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a77ceaf6ba934b1d73c90b8980191a65d02ad6ce1e11e6baf573b3a132685545 \ No newline at end of file +3261ee9ec26bbeaa64190c12556a1d8146270b6660c70004830bd38c1b5b63f4 \ No newline at end of file From 0934d640456bb168a8888ae388643c5160afe501 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 25 May 2020 15:19:52 +0000 Subject: [PATCH 101/224] Defensive code that tries to prevent a recurrence of problems like the one described in ticket [7a5279a25c57adf1] FossilOrigin-Name: 572105de1d44bca4f18c99d373458889163611384eebbc9659474874ee1701f4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 10 ++++++++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index f699358d39..a59fff912d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sminor\scompile\sissues\swith\soptional\sextensions. -D 2020-05-25T12:49:58.975 +C Defensive\scode\sthat\stries\sto\sprevent\sa\srecurrence\sof\sproblems\slike\sthe\none\sdescribed\sin\sticket\s[7a5279a25c57adf1] +D 2020-05-25T15:19:52.511 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -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 30bdb15abfa93d32862160795c3cb25d87489186ac0e34020eb2894767c80b42 +F src/expr.c b46669d9fc9e0361dba6cc289901a013789e0b1dc629c4c1bc88ec9403633b38 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -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 a77ceaf6ba934b1d73c90b8980191a65d02ad6ce1e11e6baf573b3a132685545 -R 4196412a957656021e354dac48b171f2 +P 3261ee9ec26bbeaa64190c12556a1d8146270b6660c70004830bd38c1b5b63f4 +R e34a1f962ac5984191c7a26f2bb9dcc0 U drh -Z 047ce2029fbbe737be54b5d1a4d5fdc1 +Z b86a7669719466f4efe7df019d717545 diff --git a/manifest.uuid b/manifest.uuid index a5fa9fad94..2e0598a04e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3261ee9ec26bbeaa64190c12556a1d8146270b6660c70004830bd38c1b5b63f4 \ No newline at end of file +572105de1d44bca4f18c99d373458889163611384eebbc9659474874ee1701f4 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 83dd8b1ab3..c5b6783871 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3811,7 +3811,10 @@ expr_code_doover: switch( op ){ case TK_AGG_COLUMN: { AggInfo *pAggInfo = pExpr->pAggInfo; - struct AggInfo_col *pCol = &pAggInfo->aCol[pExpr->iAgg]; + struct AggInfo_col *pCol; + assert( pAggInfo!=0 ); + assert( pExpr->iAgg>=0 && pExpr->iAggnColumn ); + pCol = &pAggInfo->aCol[pExpr->iAgg]; if( !pAggInfo->directMode ){ assert( pCol->iMem>0 ); return pCol->iMem; @@ -4111,7 +4114,10 @@ expr_code_doover: } case TK_AGG_FUNCTION: { AggInfo *pInfo = pExpr->pAggInfo; - if( pInfo==0 ){ + if( pInfo==0 + || NEVER(pExpr->iAgg<0) + || NEVER(pExpr->iAgg>=pInfo->nFunc) + ){ assert( !ExprHasProperty(pExpr, EP_IntValue) ); sqlite3ErrorMsg(pParse, "misuse of aggregate: %s()", pExpr->u.zToken); }else{ From b6907e299370683129fd6a7380ba052ee7b11a0e Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 25 May 2020 15:41:03 +0000 Subject: [PATCH 102/224] Extra assert() statements in the printf() logic. FossilOrigin-Name: b1b182be2ab34cec1d94c5570bc361331a34f727eb9fa4aadfabb7f1ef79f83e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/printf.c | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index a59fff912d..5ccf836e5d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Defensive\scode\sthat\stries\sto\sprevent\sa\srecurrence\sof\sproblems\slike\sthe\none\sdescribed\sin\sticket\s[7a5279a25c57adf1] -D 2020-05-25T15:19:52.511 +C Extra\sassert()\sstatements\sin\sthe\sprintf()\slogic. +D 2020-05-25T15:41:03.801 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -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 c558075d06f0c83b0471499cebd30ef979e600709cde1e2b744abadcf52c7ba2 +F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 @@ -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 3261ee9ec26bbeaa64190c12556a1d8146270b6660c70004830bd38c1b5b63f4 -R e34a1f962ac5984191c7a26f2bb9dcc0 +P 572105de1d44bca4f18c99d373458889163611384eebbc9659474874ee1701f4 +R 060d4022d9a6a2267bacd2bd89abcc90 U drh -Z b86a7669719466f4efe7df019d717545 +Z a8ddab7e601365298b675d3fa3c141bd diff --git a/manifest.uuid b/manifest.uuid index 2e0598a04e..0d03b644b5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -572105de1d44bca4f18c99d373458889163611384eebbc9659474874ee1701f4 \ No newline at end of file +b1b182be2ab34cec1d94c5570bc361331a34f727eb9fa4aadfabb7f1ef79f83e \ No newline at end of file diff --git a/src/printf.c b/src/printf.c index 4505a5675e..ae957022a1 100644 --- a/src/printf.c +++ b/src/printf.c @@ -401,6 +401,8 @@ void sqlite3_str_vappendf( ** xtype The class of the conversion. ** infop Pointer to the appropriate info struct. */ + assert( width>=0 ); + assert( precision>=(-1) ); switch( xtype ){ case etPOINTER: flag_long = sizeof(char*)==sizeof(i64) ? 2 : @@ -809,7 +811,7 @@ void sqlite3_str_vappendf( } isnull = escarg==0; if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)"); - /* For %q, %Q, and %w, the precision is the number of byte (or + /* For %q, %Q, and %w, the precision is the number of bytes (or ** characters if the ! flags is present) to use from the input. ** Because of the extra quoting characters inserted, the number ** of output characters may be larger than the precision. From d63c76fb31a0e262fb12a93b171e95a4e30c1a2e Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 25 May 2020 16:19:56 +0000 Subject: [PATCH 103/224] Version 3.32.1 FossilOrigin-Name: 0c1fcf4711a2e66c813aed38cf41cd3e2123ee8eb6db98118086764c4ba83350 --- manifest | 11 +++++++---- manifest.uuid | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/manifest b/manifest index 5ccf836e5d..306c86e783 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Extra\sassert()\sstatements\sin\sthe\sprintf()\slogic. -D 2020-05-25T15:41:03.801 +C Version\s3.32.1 +D 2020-05-25T16:19:56.155 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1866,7 +1866,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 572105de1d44bca4f18c99d373458889163611384eebbc9659474874ee1701f4 +P b1b182be2ab34cec1d94c5570bc361331a34f727eb9fa4aadfabb7f1ef79f83e R 060d4022d9a6a2267bacd2bd89abcc90 +T +bgcolor * #d0c0ff +T +sym-release * +T +sym-version-3.32.1 * U drh -Z a8ddab7e601365298b675d3fa3c141bd +Z 2dade396208e30c3681b79baa530525b diff --git a/manifest.uuid b/manifest.uuid index 0d03b644b5..93007e9da7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b1b182be2ab34cec1d94c5570bc361331a34f727eb9fa4aadfabb7f1ef79f83e \ No newline at end of file +0c1fcf4711a2e66c813aed38cf41cd3e2123ee8eb6db98118086764c4ba83350 \ No newline at end of file From bdd4f7d91c7ee622c914d96f8f36e6b6d523f9df Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 May 2020 10:54:46 +0000 Subject: [PATCH 104/224] Innocuous changes to help Coverity avoid false-positives. FossilOrigin-Name: 4ec8a5a203f10d228d0b3389120638766cc343179dbe38d5dbf69b650765934c --- manifest | 17 +++++++---------- manifest.uuid | 2 +- src/expr.c | 1 + src/prepare.c | 11 ++++++----- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index 306c86e783..23ea3b8f46 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.32.1 -D 2020-05-25T16:19:56.155 +C Innocuous\schanges\sto\shelp\sCoverity\savoid\sfalse-positives. +D 2020-05-26T10:54:46.900 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -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 b46669d9fc9e0361dba6cc289901a013789e0b1dc629c4c1bc88ec9403633b38 +F src/expr.c 7a388ddfac396635f38630429a2777fa36e9c1604e48114cb53be7316487a868 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -528,7 +528,7 @@ F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a F src/pragma.c 1b0db48177e52b256c003b8dc6ac708b1079a82cded944a23820574586a4731f F src/pragma.h 8168e588536bffd95319451f34e9a754dc37d205ebe433031a7813c5b286beae -F src/prepare.c 8d4d6c8aa6afefc48027c54b41cdf134b4d6bc2fc4badbe483ad7fd9e1728a28 +F src/prepare.c aeb3ba661e2666dab15c4b5c55f6eb816f01d20e35fa860bb807e4a3b36e1e27 F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d @@ -1866,10 +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 b1b182be2ab34cec1d94c5570bc361331a34f727eb9fa4aadfabb7f1ef79f83e -R 060d4022d9a6a2267bacd2bd89abcc90 -T +bgcolor * #d0c0ff -T +sym-release * -T +sym-version-3.32.1 * +P 0c1fcf4711a2e66c813aed38cf41cd3e2123ee8eb6db98118086764c4ba83350 +R 85d34056e1232590b03a0479ee5fb897 U drh -Z 2dade396208e30c3681b79baa530525b +Z 1828178303ff8f8ff8fc532baf643ec7 diff --git a/manifest.uuid b/manifest.uuid index 93007e9da7..715e3b3e2b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0c1fcf4711a2e66c813aed38cf41cd3e2123ee8eb6db98118086764c4ba83350 \ No newline at end of file +4ec8a5a203f10d228d0b3389120638766cc343179dbe38d5dbf69b650765934c \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index c5b6783871..69cd674efb 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2563,6 +2563,7 @@ int sqlite3FindInIndex( /* Code an OP_Transaction and OP_TableLock for . */ iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iDb>=0 && iDbtnum, 0, pTab->zName); diff --git a/src/prepare.c b/src/prepare.c index 228d14876e..2599546760 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -504,17 +504,18 @@ static void schemaIsValid(Parse *pParse){ ** attached database is returned. */ int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){ - int i = -1000000; + int i = -32768; - /* If pSchema is NULL, then return -1000000. This happens when code in + /* If pSchema is NULL, then return -32768. This happens when code in ** expr.c is trying to resolve a reference to a transient table (i.e. one ** created by a sub-select). In this case the return value of this ** function should never be used. ** - ** We return -1000000 instead of the more usual -1 simply because using - ** -1000000 as the incorrect index into db->aDb[] is much + ** We return -32768 instead of the more usual -1 simply because using + ** -32768 as the incorrect index into db->aDb[] is much ** more likely to cause a segfault than -1 (of course there are assert() - ** statements too, but it never hurts to play the odds). + ** statements too, but it never hurts to play the odds) and + ** -32768 will still fit into a 16-bit signed integer. */ assert( sqlite3_mutex_held(db->mutex) ); if( pSchema ){ From 47937cfd8defac2d926a863dabb3ec0232ca0eb5 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 May 2020 11:23:48 +0000 Subject: [PATCH 105/224] Increase the version number to 3.33.0 to begin the next release cycle. FossilOrigin-Name: 790badb390d59062cd2d8d1dec76cc6104c9425610a67503f6be38076b6a458e --- VERSION | 2 +- configure | 18 +++++++++--------- manifest | 15 +++++++-------- manifest.uuid | 2 +- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/VERSION b/VERSION index 1367bf750d..949654dc3e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.32.1 +3.33.0 diff --git a/configure b/configure index 854b2460a6..fb1d9cfaa8 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for sqlite 3.32.1. +# Generated by GNU Autoconf 2.69 for sqlite 3.33.0. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -726,8 +726,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='sqlite' PACKAGE_TARNAME='sqlite' -PACKAGE_VERSION='3.32.1' -PACKAGE_STRING='sqlite 3.32.1' +PACKAGE_VERSION='3.33.0' +PACKAGE_STRING='sqlite 3.33.0' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1467,7 +1467,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures sqlite 3.32.1 to adapt to many kinds of systems. +\`configure' configures sqlite 3.33.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1532,7 +1532,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of sqlite 3.32.1:";; + short | recursive ) echo "Configuration of sqlite 3.33.0:";; esac cat <<\_ACEOF @@ -1659,7 +1659,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -sqlite configure 3.32.1 +sqlite configure 3.33.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2078,7 +2078,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by sqlite $as_me 3.32.1, which was +It was created by sqlite $as_me 3.33.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -12243,7 +12243,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by sqlite $as_me 3.32.1, which was +This file was extended by sqlite $as_me 3.33.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -12309,7 +12309,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -sqlite config.status 3.32.1 +sqlite config.status 3.33.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/manifest b/manifest index aa56b2d7e2..2733dd6d6c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Changes\sto\ssqlite3SelectNew()\sto\swork\saround\sa\sfalse-positive\swarning\nfrom\sGCC-10.\s\sThe\scode\sis\svery\sslightly\slarger\sand\sslower\sas\sa\sresult. -D 2020-05-26T11:10:25.934 +C Increase\sthe\sversion\snumber\sto\s3.33.0\sto\sbegin\sthe\snext\srelease\scycle. +D 2020-05-26T11:23:48.742 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -7,7 +7,7 @@ F Makefile.in 376f53999defeb32b7ad2626fd58aae8f3694c38ab7ee30c2289e0d0525a9238 F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 F Makefile.msc 8d00aeba2609bb498dded5eead2890126321f02e292573bf29bf2d18487d37bd F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a -F VERSION 7d1da8465e06354a9ffb67a9ef3f933552767d8e239b507cb2a08ba417048322 +F VERSION 5db2ee2cfcc790af73775fa485c13b2e8ccaa5936c6e1f47aedeba7056041ca5 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 @@ -34,7 +34,7 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 883205ddf25b46f10c181818bf42c09da9888884af96f79e1719264345053bd6 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc F config.sub c2d0260f17f3e4bc0b6808fccf1b291cb5e9126c14fc5890efc77b9fd0175559 -F configure 4705718305e176b707e65047b69dca834fe7bc5475584e30fe1f63c8e33751b8 x +F configure 5a2d453f527dcf969eecaac335d8261b3f1a8a6bd2c693a00dd7d18c29ccc7e4 x F configure.ac 798a24cee2879325ca5b688a618199eb32cc77ed8136edbaa43d9137b470d54e F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd @@ -1866,8 +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 4ec8a5a203f10d228d0b3389120638766cc343179dbe38d5dbf69b650765934c d4bf60f464789935dc193ea99bf730c8fade448c7dca13eb3ce297965980f36e -R 4b76e75897c43803d6dbedd7b8f1a56e -T +closed d4bf60f464789935dc193ea99bf730c8fade448c7dca13eb3ce297965980f36e +P 04e1edd8e5821a377407263829ed0d87968c708c9aeb1282107ea6f39a11c1cc +R d32bbb281af1aa287830644a32a7b4c0 U drh -Z d313ebf5bd4e6feaaa94a16cfe06a420 +Z 05e8a4ff8d6715588483ef98172b1d7e diff --git a/manifest.uuid b/manifest.uuid index 51b60ae1bb..34217c129b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -04e1edd8e5821a377407263829ed0d87968c708c9aeb1282107ea6f39a11c1cc \ No newline at end of file +790badb390d59062cd2d8d1dec76cc6104c9425610a67503f6be38076b6a458e \ No newline at end of file From ed505ce3e47b971ced26b585506d0efa5efffc85 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 May 2020 20:31:17 +0000 Subject: [PATCH 106/224] Performance optimization in the transfer of error messages from statements to connections. FossilOrigin-Name: 0e898f4fed1c851cb90f940175110e632a20668a285d39f5f94f7358c3064882 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeaux.c | 12 +++++++++--- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 2733dd6d6c..ea5d83cd5e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Increase\sthe\sversion\snumber\sto\s3.33.0\sto\sbegin\sthe\snext\srelease\scycle. -D 2020-05-26T11:23:48.742 +C Performance\soptimization\sin\sthe\stransfer\sof\serror\smessages\sfrom\sstatements\nto\sconnections. +D 2020-05-26T20:31:17.309 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 80626786d21296d9e7936186850343afe5fc6368ad9724a172e151788425a063 +F src/vdbeaux.c 00746a04b3a1e917bab5e3846f0931820a5ded53cbe1648ba1ad57c0869c1ba3 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 04e1edd8e5821a377407263829ed0d87968c708c9aeb1282107ea6f39a11c1cc -R d32bbb281af1aa287830644a32a7b4c0 +P 790badb390d59062cd2d8d1dec76cc6104c9425610a67503f6be38076b6a458e +R abd22ed4e954a363c14f11187a7348c8 U drh -Z 05e8a4ff8d6715588483ef98172b1d7e +Z e7622c5a97ba4fe1a01d807db0ece61d diff --git a/manifest.uuid b/manifest.uuid index 34217c129b..ed41f32414 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -790badb390d59062cd2d8d1dec76cc6104c9425610a67503f6be38076b6a458e \ No newline at end of file +0e898f4fed1c851cb90f940175110e632a20668a285d39f5f94f7358c3064882 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 38dc7cd869..af4fa37894 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -3302,7 +3302,11 @@ int sqlite3VdbeReset(Vdbe *p){ */ if( p->pc>=0 ){ vdbeInvokeSqllog(p); - sqlite3VdbeTransferError(p); + if( db->pErr || p->zErrMsg ){ + sqlite3VdbeTransferError(p); + }else{ + db->errCode = p->rc; + } if( p->runOnlyOnce ) p->expired = 1; }else if( p->rc && p->expired ){ /* The expired flag was set on the VDBE before the first call @@ -3322,8 +3326,10 @@ int sqlite3VdbeReset(Vdbe *p){ for(i=0; inMem; i++) assert( p->aMem[i].flags==MEM_Undefined ); } #endif - sqlite3DbFree(db, p->zErrMsg); - p->zErrMsg = 0; + if( p->zErrMsg ){ + sqlite3DbFree(db, p->zErrMsg); + p->zErrMsg = 0; + } p->pResultSet = 0; #ifdef SQLITE_DEBUG p->nWrite = 0; From a3d6b8e5a78c5af92620f1d96001c046fa35d920 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 May 2020 20:33:18 +0000 Subject: [PATCH 107/224] Fix the cksumvfs extension so that it will not register itself more than once. FossilOrigin-Name: d5cdd57150db914b61b8b9c61c6caac9690fe7b647ee2c003e75b9b62be62752 --- 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 2cc8148b2e..80ace2ac8f 100644 --- a/ext/misc/cksumvfs.c +++ b/ext/misc/cksumvfs.c @@ -743,7 +743,7 @@ static int cksmRegisterFunc( static int cksmRegisterVfs(void){ int rc = SQLITE_OK; sqlite3_vfs *pOrig; - if( sqlite3_vfs_find("cksum")!=0 ) return SQLITE_OK; + if( sqlite3_vfs_find("cksmvfs")!=0 ) return SQLITE_OK; pOrig = sqlite3_vfs_find(0); cksm_vfs.iVersion = pOrig->iVersion; cksm_vfs.pAppData = pOrig; diff --git a/manifest b/manifest index ea5d83cd5e..ffe48d94fb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\soptimization\sin\sthe\stransfer\sof\serror\smessages\sfrom\sstatements\nto\sconnections. -D 2020-05-26T20:31:17.309 +C Fix\sthe\scksumvfs\sextension\sso\sthat\sit\swill\snot\sregister\sitself\smore\sthan\nonce. +D 2020-05-26T20:33:18.026 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 b0d07f2e1bb08f8b6f311f4e454360b6a7f0021912c326428d74900020f29c31 +F ext/misc/cksumvfs.c a3271f5cc3f87d80897cca76d54220380aeae3448efd23fefe47853443ef1185 F ext/misc/closure.c dbfd8543b2a017ae6b1a5843986b22ddf99ff126ec9634a2f4047cd14c85c243 F ext/misc/completion.c a0efe03edfdc4f717c61e6c9b0bfe2708ff7878010dae3174980a68fdf76aabc F ext/misc/compress.c 3354c77a7c8e86e07d849916000cdac451ed96500bfb5bd83b20eb61eee012c9 @@ -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 790badb390d59062cd2d8d1dec76cc6104c9425610a67503f6be38076b6a458e -R abd22ed4e954a363c14f11187a7348c8 +P 0e898f4fed1c851cb90f940175110e632a20668a285d39f5f94f7358c3064882 +R 72833d867a696e36a90b89db4d555cd5 U drh -Z e7622c5a97ba4fe1a01d807db0ece61d +Z 876d4518a5496ca7a456d49d64fbf19e diff --git a/manifest.uuid b/manifest.uuid index ed41f32414..e910202d57 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0e898f4fed1c851cb90f940175110e632a20668a285d39f5f94f7358c3064882 \ No newline at end of file +d5cdd57150db914b61b8b9c61c6caac9690fe7b647ee2c003e75b9b62be62752 \ No newline at end of file From 399062cccbb0d14ab16e175a565e2efc1b1d0c8f Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 27 May 2020 00:02:07 +0000 Subject: [PATCH 108/224] Change a datatype from i16 to int to appease Converity and help eliminate a false-positive. FossilOrigin-Name: 5b560ec49041d89c87ea3315d8fc17f7fb0e03a82091934be7373b290183f82e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index ffe48d94fb..031fcc6538 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\scksumvfs\sextension\sso\sthat\sit\swill\snot\sregister\sitself\smore\sthan\nonce. -D 2020-05-26T20:33:18.026 +C Change\sa\sdatatype\sfrom\si16\sto\sint\sto\sappease\sConverity\sand\shelp\seliminate\na\sfalse-positive. +D 2020-05-27T00:02:07.312 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -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 7a388ddfac396635f38630429a2777fa36e9c1604e48114cb53be7316487a868 +F src/expr.c 4d5ca337ac207a15e647a1db2356d14282647afc8edca5ff577601048c88ceb4 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -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 0e898f4fed1c851cb90f940175110e632a20668a285d39f5f94f7358c3064882 -R 72833d867a696e36a90b89db4d555cd5 +P d5cdd57150db914b61b8b9c61c6caac9690fe7b647ee2c003e75b9b62be62752 +R e25f872a3296dd9d4a4620f30c7f47be U drh -Z 876d4518a5496ca7a456d49d64fbf19e +Z 7d2d03c71662193ff9282263dd7aee70 diff --git a/manifest.uuid b/manifest.uuid index e910202d57..1bb3e87e66 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d5cdd57150db914b61b8b9c61c6caac9690fe7b647ee2c003e75b9b62be62752 \ No newline at end of file +5b560ec49041d89c87ea3315d8fc17f7fb0e03a82091934be7373b290183f82e \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 69cd674efb..663c15e492 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2552,7 +2552,7 @@ int sqlite3FindInIndex( if( pParse->nErr==0 && (p = isCandidateForInOpt(pX))!=0 ){ sqlite3 *db = pParse->db; /* Database connection */ Table *pTab; /* Table
    . */ - i16 iDb; /* Database idx for pTab */ + int iDb; /* Database idx for pTab */ ExprList *pEList = p->pEList; int nExpr = pEList->nExpr; From b639a2094a39d2e02acb4dbc912d9f3ebd988d09 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 27 May 2020 12:44:28 +0000 Subject: [PATCH 109/224] Small performance improvement and size reduction in the expression code generator. FossilOrigin-Name: eeb53e219551d8a05a87f1de9a7cd9af295d08a296f1f435a8509ea1252ccdcc --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 10 ++++------ 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 031fcc6538..b3792caebe 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sa\sdatatype\sfrom\si16\sto\sint\sto\sappease\sConverity\sand\shelp\seliminate\na\sfalse-positive. -D 2020-05-27T00:02:07.312 +C Small\sperformance\simprovement\sand\ssize\sreduction\sin\sthe\sexpression\ncode\sgenerator. +D 2020-05-27T12:44:28.447 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -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 4d5ca337ac207a15e647a1db2356d14282647afc8edca5ff577601048c88ceb4 +F src/expr.c 4750c6b63419eefb24c8a6158b9287dea2a9714b4e6e297e25805505c9f73b6c F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -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 d5cdd57150db914b61b8b9c61c6caac9690fe7b647ee2c003e75b9b62be62752 -R e25f872a3296dd9d4a4620f30c7f47be +P 5b560ec49041d89c87ea3315d8fc17f7fb0e03a82091934be7373b290183f82e +R 49a1e2497fcf7da09e39544b00e72660 U drh -Z 7d2d03c71662193ff9282263dd7aee70 +Z 247f47fe4deb86e087e29547910405d2 diff --git a/manifest.uuid b/manifest.uuid index 1bb3e87e66..4069128f8b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5b560ec49041d89c87ea3315d8fc17f7fb0e03a82091934be7373b290183f82e \ No newline at end of file +eeb53e219551d8a05a87f1de9a7cd9af295d08a296f1f435a8509ea1252ccdcc \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 663c15e492..496177a5c7 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3797,10 +3797,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ int p5 = 0; assert( target>0 && target<=pParse->nMem ); - if( v==0 ){ - assert( pParse->db->mallocFailed ); - return 0; - } + assert( v!=0 ); expr_code_doover: if( pExpr==0 ){ @@ -4630,9 +4627,10 @@ void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ assert( pExpr==0 || !ExprHasVVAProperty(pExpr,EP_Immutable) ); assert( target>0 && target<=pParse->nMem ); - inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); assert( pParse->pVdbe!=0 || pParse->db->mallocFailed ); - if( inReg!=target && pParse->pVdbe ){ + if( pParse->pVdbe==0 ) return; + inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); + if( inReg!=target ){ u8 op; if( ExprHasProperty(pExpr,EP_Subquery) ){ op = OP_Copy; From 56c65c92cb922039fe3edb4f624a79acdcc7a5c2 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 28 May 2020 00:45:16 +0000 Subject: [PATCH 110/224] When the sqlite_stat1 data is missing for some indexes of a table but is present for the table itself or for other indexes in the same table, then do not let the estimated number of rows in that table get too small, as doing so can deceive the query planner into ignoring a perfectly good index. FossilOrigin-Name: 98d4262018a81a9a36dd8beb4b02ff0e75cdcbb8a121d143157ffb37b228d60d --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/build.c | 24 ++++++++++++++++++------ test/cost.test | 4 ++-- test/index7.test | 12 ++++++++++++ 5 files changed, 41 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index b3792caebe..43afb8af6e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Small\sperformance\simprovement\sand\ssize\sreduction\sin\sthe\sexpression\ncode\sgenerator. -D 2020-05-27T12:44:28.447 +C When\sthe\ssqlite_stat1\sdata\sis\smissing\sfor\ssome\sindexes\sof\sa\stable\sbut\sis\npresent\sfor\sthe\stable\sitself\sor\sfor\sother\sindexes\sin\sthe\ssame\stable,\sthen\sdo\nnot\slet\sthe\sestimated\snumber\sof\srows\sin\sthat\stable\sget\stoo\ssmall,\sas\ndoing\sso\scan\sdeceive\sthe\squery\splanner\sinto\signoring\sa\sperfectly\sgood\sindex. +D 2020-05-28T00:45:16.053 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 ca9e7a33b74f1bf2eb3a5f37f9d07dfed335469f2d70c0bd350e0dd42a50183a +F src/build.c 1c3dec6d36ddc697dbc1df04100687cdbbed65aacfda067d1e9632e4102e9999 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c e98518d2d3d4029a13c805e07313fb60c877be56db76e90dd5f3af73085d0ce6 @@ -782,7 +782,7 @@ F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 F test/corruptK.test 5b4212fe346699831c5ad559a62c54e11c0611bdde1ea8423a091f9c01aa32af F test/corruptL.test 13ef74a93223af25015d223add0df4c2d375f0b958b546a2a72033f2fdab7a70 F test/corruptM.test 7d574320e08c1b36caa3e47262061f186367d593a7e305d35f15289cc2c3e067 -F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34 +F test/cost.test 1d156ce9858780a966c062694687afe0343a0ed12d081d071fb57027e726bafc F test/count.test e0699a15712bc2a4679d60e408921c2cce7f6365a30340e790c98e0f334a9c77 F test/countofview.test e17d6e6688cf74f22783c9ec6e788c0790ee4fbbaee713affd00b1ac0bb39b86 F test/coveridxscan.test 5ec98719a2e2914e8908dc75f7247d9b54a26df04625f846ac7900d5483f7296 @@ -1067,7 +1067,7 @@ F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473a F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 F test/index6.test f172653b35b20233e59200e8b92a76db61bf7285437bf777b93b306ba26a47e7 -F test/index7.test 1d764c0cca45f5a76150b08e127ccc8d52492cfa788b5fafed4be784a351b020 +F test/index7.test b8a0ba2110fd517bb48c4e76d26d60f1ab2ed9e257b18d71f820d7e71e9f8570 F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e @@ -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 5b560ec49041d89c87ea3315d8fc17f7fb0e03a82091934be7373b290183f82e -R 49a1e2497fcf7da09e39544b00e72660 +P eeb53e219551d8a05a87f1de9a7cd9af295d08a296f1f435a8509ea1252ccdcc +R 3d5c5e3daaf0dbc29f6c7d64057e20af U drh -Z 247f47fe4deb86e087e29547910405d2 +Z e68e2bba0e62e900331d67a29c0ab0bb diff --git a/manifest.uuid b/manifest.uuid index 4069128f8b..7248988b8e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eeb53e219551d8a05a87f1de9a7cd9af295d08a296f1f435a8509ea1252ccdcc \ No newline at end of file +98d4262018a81a9a36dd8beb4b02ff0e75cdcbb8a121d143157ffb37b228d60d \ No newline at end of file diff --git a/src/build.c b/src/build.c index 6ff595c623..877db05084 100644 --- a/src/build.c +++ b/src/build.c @@ -4047,9 +4047,10 @@ exit_create_index: ** are based on typical values found in actual indices. */ void sqlite3DefaultRowEst(Index *pIdx){ - /* 10, 9, 8, 7, 6 */ - LogEst aVal[] = { 33, 32, 30, 28, 26 }; + /* 10, 9, 8, 7, 6 */ + static const LogEst aVal[] = { 33, 32, 30, 28, 26 }; LogEst *a = pIdx->aiRowLogEst; + LogEst x; int nCopy = MIN(ArraySize(aVal), pIdx->nKeyCol); int i; @@ -4058,10 +4059,21 @@ void sqlite3DefaultRowEst(Index *pIdx){ /* Set the first entry (number of rows in the index) to the estimated ** number of rows in the table, or half the number of rows in the table - ** for a partial index. But do not let the estimate drop below 10. */ - a[0] = pIdx->pTable->nRowLogEst; - if( pIdx->pPartIdxWhere!=0 ) a[0] -= 10; assert( 10==sqlite3LogEst(2) ); - if( a[0]<33 ) a[0] = 33; assert( 33==sqlite3LogEst(10) ); + ** for a partial index. + ** + ** 2020-05-27: If some of the stat data is coming from the sqlite_stat1 + ** table but other parts we are having to guess at, then do not let the + ** estimated number of rows in the table be less than 1000 (LogEst 99). + ** Failure to do this can cause the indexes for which we do not have + ** stat1 data to be ignored by the query planner. tag-20200527-1 + */ + x = pIdx->pTable->nRowLogEst; + assert( 99==sqlite3LogEst(1000) ); + if( x<99 ){ + pIdx->pTable->nRowLogEst = x = 99; + } + if( pIdx->pPartIdxWhere!=0 ) x -= 10; assert( 10==sqlite3LogEst(2) ); + a[0] = x; /* Estimate that a[1] is 10, a[2] is 9, a[3] is 8, a[4] is 7, a[5] is ** 6 and each subsequent value (if any) is 5. */ diff --git a/test/cost.test b/test/cost.test index 2922a0a054..592973ab56 100644 --- a/test/cost.test +++ b/test/cost.test @@ -230,10 +230,10 @@ do_test 9.2 { set L [list a=? b=? c=? d=? e=? f=? g=? h=? i=? j=?] foreach {tn nTerm nRow} { 1 1 10 - 2 2 9 + 2 2 10 3 3 8 4 4 7 - 5 5 6 + 5 5 7 6 6 5 7 7 5 8 8 5 diff --git a/test/index7.test b/test/index7.test index f57792e4c2..084e8c3c7d 100644 --- a/test/index7.test +++ b/test/index7.test @@ -339,5 +339,17 @@ do_execsql_test index7-7.1 { SELECT * FROM t6 WHERE y IS TRUE ORDER BY x; } {1 1} +# 2020-05-27. tag-20200527-1. +# Incomplete stat1 information on a table with few rows should still use the +# index. +reset_db +do_execsql_test index7-8.1 { + CREATE TABLE t1(x INTEGER PRIMARY KEY, y); + CREATE INDEX t1y ON t1(y) WHERE y IS NOT NULL; + INSERT INTO t1(x) VALUES(1),(2); + ANALYZE; + EXPLAIN QUERY PLAN SELECT 1 FROM t1 WHERE y=5; +} {/SEARCH TABLE t1 USING COVERING INDEX t1y/} + finish_test From c683573fd4530567b11f224fad7b209349d9e84e Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 28 May 2020 20:37:17 +0000 Subject: [PATCH 111/224] Enhance the ".quote" mode in the shell so that it honors .separator. FossilOrigin-Name: b5e33ed537e7d7dcabc9f6dc91d6838e0d1657f323440e09e2e24ffa2ba6141a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 10 ++++++---- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 43afb8af6e..b57275c70f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sthe\ssqlite_stat1\sdata\sis\smissing\sfor\ssome\sindexes\sof\sa\stable\sbut\sis\npresent\sfor\sthe\stable\sitself\sor\sfor\sother\sindexes\sin\sthe\ssame\stable,\sthen\sdo\nnot\slet\sthe\sestimated\snumber\sof\srows\sin\sthat\stable\sget\stoo\ssmall,\sas\ndoing\sso\scan\sdeceive\sthe\squery\splanner\sinto\signoring\sa\sperfectly\sgood\sindex. -D 2020-05-28T00:45:16.053 +C Enhance\sthe\s".quote"\smode\sin\sthe\sshell\sso\sthat\sit\shonors\s.separator. +D 2020-05-28T20:37:17.793 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 c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b6 +F src/shell.c.in 2bca5f1474b43e7c0c1bcd0537b854c2e8a0fac0de2bde473b8c1e919554dcc6 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -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 eeb53e219551d8a05a87f1de9a7cd9af295d08a296f1f435a8509ea1252ccdcc -R 3d5c5e3daaf0dbc29f6c7d64057e20af +P 98d4262018a81a9a36dd8beb4b02ff0e75cdcbb8a121d143157ffb37b228d60d +R 6e7a8027469df73da3225b0c75827874 U drh -Z e68e2bba0e62e900331d67a29c0ab0bb +Z 824af62dceaa57c3d7f60896a599839b diff --git a/manifest.uuid b/manifest.uuid index 7248988b8e..6cbf3738cf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -98d4262018a81a9a36dd8beb4b02ff0e75cdcbb8a121d143157ffb37b228d60d \ No newline at end of file +b5e33ed537e7d7dcabc9f6dc91d6838e0d1657f323440e09e2e24ffa2ba6141a \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 5858296420..9f960a745c 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -2205,14 +2205,14 @@ static int shell_callback( if( azArg==0 ) break; if( p->cnt==0 && p->showHeader ){ for(i=0; i0 ) raw_printf(p->out, ","); + if( i>0 ) fputs(p->colSeparator, p->out); output_quoted_string(p->out, azCol[i]); } - raw_printf(p->out,"\n"); + fputs(p->rowSeparator, p->out); } p->cnt++; for(i=0; i0 ) raw_printf(p->out, ","); + if( i>0 ) fputs(p->colSeparator, p->out); if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ utf8_printf(p->out,"NULL"); }else if( aiType && aiType[i]==SQLITE_TEXT ){ @@ -2234,7 +2234,7 @@ static int shell_callback( output_quoted_string(p->out, azArg[i]); } } - raw_printf(p->out,"\n"); + fputs(p->rowSeparator, p->out); break; } case MODE_Ascii: { @@ -8218,6 +8218,8 @@ static int do_meta_command(char *zLine, ShellState *p){ set_table_name(p, nArg>=3 ? azArg[2] : "table"); }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){ p->mode = MODE_Quote; + sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); + sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){ p->mode = MODE_Ascii; sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit); From 30c54a01db1666c66b7c75d37cb2f287f1a2cd00 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 28 May 2020 23:49:50 +0000 Subject: [PATCH 112/224] Progress toward adding new output modes to the CLI: json, table, and markdown. FossilOrigin-Name: 14f55fafec11491e87e6526c72cf85c689d74ba18418a1ae9646586ec206767a --- manifest | 14 ++-- manifest.uuid | 2 +- src/shell.c.in | 197 +++++++++++++++++++++++++++++++++++++++++------ test/shell1.test | 12 +-- 4 files changed, 187 insertions(+), 38 deletions(-) diff --git a/manifest b/manifest index b57275c70f..68a02ab2e3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\s".quote"\smode\sin\sthe\sshell\sso\sthat\sit\shonors\s.separator. -D 2020-05-28T20:37:17.793 +C Progress\stoward\sadding\snew\soutput\smodes\sto\sthe\sCLI:\s\sjson,\stable,\sand\nmarkdown. +D 2020-05-28T23:49:50.023 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 c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in 2bca5f1474b43e7c0c1bcd0537b854c2e8a0fac0de2bde473b8c1e919554dcc6 +F src/shell.c.in d135e500f2c84808f86e8113fd22852af4c89f69305f122d3c529cd698ccb396 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1338,7 +1338,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 5bd10014ec494744f5e966a1521334e9d612119a0afcfa5251684a4e1f2ffc66 +F test/shell1.test 1c4713ccec468f9300100d5e1419b414b8dcccc742978ad8942e8bd31d2adc9c F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b F test/shell3.test ac8c2b744014c3e9a0e26bfd829ab65f00923dc1a91ffd044863e9423cc91494 F test/shell4.test 1c6aef11daaa2d6830acaba3ac9cbec93fbc1c3d5530743a637f39b3987d08ce @@ -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 98d4262018a81a9a36dd8beb4b02ff0e75cdcbb8a121d143157ffb37b228d60d -R 6e7a8027469df73da3225b0c75827874 +P b5e33ed537e7d7dcabc9f6dc91d6838e0d1657f323440e09e2e24ffa2ba6141a +R 65dafea1aa0e6dfee5aa69ebe4f5d82f U drh -Z 824af62dceaa57c3d7f60896a599839b +Z 8f810f781bfa2ede3701aac97fce45df diff --git a/manifest.uuid b/manifest.uuid index 6cbf3738cf..7d744d62ce 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b5e33ed537e7d7dcabc9f6dc91d6838e0d1657f323440e09e2e24ffa2ba6141a \ No newline at end of file +14f55fafec11491e87e6526c72cf85c689d74ba18418a1ae9646586ec206767a \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 9f960a745c..4795b832c5 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1035,18 +1035,6 @@ struct OpenSession { }; #endif -/* -** Shell output mode information from before ".explain on", -** saved so that it can be restored by ".explain off" -*/ -typedef struct SavedModeInfo SavedModeInfo; -struct SavedModeInfo { - int valid; /* Is there legit data in here? */ - int mode; /* Mode prior to ".explain on" */ - int showHeader; /* The ".header" setting prior to ".explain on" */ - int colWidth[100]; /* Column widths prior to ".explain on" */ -}; - typedef struct ExpertInfo ExpertInfo; struct ExpertInfo { sqlite3expert *pExpert; @@ -1202,6 +1190,9 @@ struct ShellState { #define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */ #define MODE_Pretty 11 /* Pretty-print schemas */ #define MODE_EQP 12 /* Converts EXPLAIN QUERY PLAN output into a graph */ +#define MODE_Json 13 /* Output JSON */ +#define MODE_Markdown 14 /* Markdown formatting */ +#define MODE_Table 15 /* MySQL-style table formatting */ static const char *modeDescr[] = { "line", @@ -1216,7 +1207,10 @@ static const char *modeDescr[] = { "explain", "ascii", "prettyprint", - "eqp" + "eqp", + "json", + "markdown", + "table" }; /* @@ -1893,6 +1887,43 @@ static int progress_handler(void *pClientData) { } #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ +/* +** Print N dashes +*/ +static void print_dashes(FILE *out, int N){ + const char zDash[] = "--------------------------------------------------"; + const int nDash = sizeof(zDash) - 1; + while( N>nDash ){ + fputs(zDash, out); + N -= nDash; + } + raw_printf(out, "%.*s", N, zDash); +} + +/* +** Print a markdown or table-style row separator +*/ +static void print_row_separator( + ShellState *p, + int nArg, + const char *zSep +){ + int i; + for(i=0; iactualWidth) ){ + w = p->actualWidth[i]; + if( w<0 ) w = -w; + }else{ + w = 10; + } + fputs(zSep, p->out); + print_dashes(p->out, w+2); + } + fputs(zSep, p->out); + fputs("\n", p->out); +} + /* ** This is the callback routine that the shell ** invokes for each row of a query result. @@ -1923,23 +1954,38 @@ static int shell_callback( } break; } + case MODE_Table: + case MODE_Markdown: case MODE_Explain: case MODE_Column: { static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13}; const int *colWidth; int showHdr; char *rowSep; + char *colSep; + char *rowStart; int nWidth; if( p->cMode==MODE_Column ){ colWidth = p->colWidth; nWidth = ArraySize(p->colWidth); showHdr = p->showHeader; rowSep = p->rowSeparator; - }else{ + colSep = " "; + rowStart = ""; + }else if( p->cMode==MODE_Explain ){ colWidth = aExplainWidths; nWidth = ArraySize(aExplainWidths); showHdr = 1; rowSep = SEP_Row; + colSep = " "; + rowStart = ""; + }else{ + colWidth = p->colWidth; + nWidth = ArraySize(p->colWidth); + showHdr = p->showHeader; + rowSep = " |\n"; + colSep = " | "; + rowStart = "| "; } if( p->cnt++==0 ){ for(i=0; iactualWidth) ){ p->actualWidth[i] = w; } - if( showHdr ){ - utf8_width_print(p->out, w, azCol[i]); - utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " "); - } } if( showHdr ){ + if( p->cMode==MODE_Table ){ + print_row_separator(p, nArg, "+"); + } + fputs(rowStart, p->out); for(i=0; iactualWidth) ){ @@ -1972,14 +2018,34 @@ static int shell_callback( }else{ w = 10; } - utf8_printf(p->out,"%-*.*s%s",w,w, - "----------------------------------------------------------" - "----------------------------------------------------------", - i==nArg-1 ? rowSep : " "); + utf8_width_print(p->out, w, azCol[i]); + fputs(i==nArg-1 ? rowSep : colSep, p->out); + } + for(i=0; iactualWidth) ){ + w = p->actualWidth[i]; + if( w<0 ) w = -w; + }else{ + w = 10; + } + if( p->cMode==MODE_Table || p->cMode==MODE_Markdown ){ + char *zX = p->cMode==MODE_Markdown ? "|" : "+"; + fputs(zX, p->out); + print_dashes(p->out, w+2); + if( i==nArg-1 ){ + fputs(zX, p->out); + fputs("\n", p->out); + } + }else{ + print_dashes(p->out, w); + fputs(i==nArg-1 ? rowSep : colSep, p->out); + } } } } if( azArg==0 ) break; + fputs(rowStart, p->out); for(i=0; iactualWidth) ){ @@ -1997,7 +2063,7 @@ static int shell_callback( p->iIndent++; } utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue); - utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " "); + utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : colSep); } break; } @@ -2201,6 +2267,50 @@ static int shell_callback( raw_printf(p->out,");\n"); break; } + case MODE_Json: { + if( azArg==0 ) break; + if( p->cnt==0 ){ + fputs("[{", p->out); + }else{ + fputs(",\n{", p->out); + } + p->cnt++; + for(i=0; iout, azCol[i]); + putc(':', p->out); + if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ + fputs("null",p->out); + }else if( aiType && aiType[i]==SQLITE_FLOAT ){ + char z[50]; + double r = sqlite3_column_double(p->pStmt, i); + sqlite3_uint64 ur; + memcpy(&ur,&r,sizeof(r)); + if( ur==0x7ff0000000000000LL ){ + raw_printf(p->out, "1e999"); + }else if( ur==0xfff0000000000000LL ){ + raw_printf(p->out, "-1e999"); + }else{ + sqlite3_snprintf(50,z,"%!.20g", r); + raw_printf(p->out, "%s", z); + } + }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ + const void *pBlob = sqlite3_column_blob(p->pStmt, i); + int nBlob = sqlite3_column_bytes(p->pStmt, i); + putc('"', p->out); + output_hex_blob(p->out, pBlob, nBlob); + putc('"', p->out); + }else if( aiType && aiType[i]==SQLITE_TEXT ){ + output_c_string(p->out, azArg[i]); + }else{ + utf8_printf(p->out,"%s", azArg[i]); + } + if( iout); + } + } + putc('}', p->out); + break; + } case MODE_Quote: { if( azArg==0 ) break; if( p->cnt==0 && p->showHeader ){ @@ -2890,6 +3000,24 @@ static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){ sqlite3_finalize(pQ); } +#if 0 +/* +** Run a prepared statement and output the result in one of the +** table-oriented formats, either MODE_Markdown or MODE_Table. +** +** This is different from ordinary exec_prepared_stmt() in that +** it has to run the entire query and gather the results into memory +** first, in order to determine column widths, before providing +** any output. +*/ +static void exec_prepared_stmt_tablemode( + ShellState *pArg, /* Pointer to ShellState */ + sqlite3_stmt *pStmt /* Statment to run */ +){ + +} +#endif + /* ** Run a prepared statement */ @@ -2946,6 +3074,11 @@ static void exec_prepared_stmt( } } while( SQLITE_ROW == rc ); sqlite3_free(pData); + if( pArg->cMode==MODE_Table ){ + print_row_separator(pArg, nCol, "+"); + }else if( pArg->cMode==MODE_Json ){ + fputs("]\n", pArg->out); + } } } } @@ -8224,11 +8357,18 @@ static int do_meta_command(char *zLine, ShellState *p){ p->mode = MODE_Ascii; sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit); sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record); + }else if( c2=='m' && strncmp(azArg[1],"markdown",n2)==0 ){ + p->mode = MODE_Markdown; + }else if( c2=='t' && strncmp(azArg[1],"table",n2)==0 ){ + p->mode = MODE_Table; + }else if( c2=='j' && strncmp(azArg[1],"json",n2)==0 ){ + p->mode = MODE_Json; }else if( nArg==1 ){ raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]); }else{ raw_printf(stderr, "Error: mode should be one of: " - "ascii column csv html insert line list quote tabs tcl\n"); + "ascii column csv html insert json line list markdown " + "quote table tabs tcl\n"); rc = 1; } p->cMode = p->mode; @@ -10238,9 +10378,11 @@ static const char zOptions[] = " -help show this message\n" " -html set output mode to HTML\n" " -interactive force interactive I/O\n" + " -json set output mode to 'json'\n" " -line set output mode to 'line'\n" " -list set output mode to 'list'\n" " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n" + " -markdown set output mode to 'markdown'\n" #if defined(SQLITE_ENABLE_DESERIALIZE) " -maxsize N maximum size for a --deserialize database\n" #endif @@ -10260,6 +10402,7 @@ static const char zOptions[] = " -sorterref SIZE sorter references threshold size\n" #endif " -stats print memory stats before each finalize\n" + " -table set output mode to 'table'\n" " -version show SQLite version\n" " -vfs NAME use NAME as the default VFS\n" #ifdef SQLITE_ENABLE_VFSTRACE @@ -10661,6 +10804,12 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ data.mode = MODE_Line; }else if( strcmp(z,"-column")==0 ){ data.mode = MODE_Column; + }else if( strcmp(z,"-json")==0 ){ + data.mode = MODE_Json; + }else if( strcmp(z,"-markdown")==0 ){ + data.mode = MODE_Markdown; + }else if( strcmp(z,"-table")==0 ){ + data.mode = MODE_Table; }else if( strcmp(z,"-csv")==0 ){ data.mode = MODE_Csv; memcpy(data.colSeparator,",",2); diff --git a/test/shell1.test b/test/shell1.test index c142ea7241..a900dc3e1d 100644 --- a/test/shell1.test +++ b/test/shell1.test @@ -199,10 +199,10 @@ do_test shell1-2.2.4 { } {0 {}} do_test shell1-2.2.5 { catchcmd "test.db" ".mode \"insert FOO" -} {1 {Error: mode should be one of: ascii column csv html insert line list quote tabs tcl}} +} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-2.2.6 { catchcmd "test.db" ".mode \'insert FOO" -} {1 {Error: mode should be one of: ascii column csv html insert line list quote tabs tcl}} +} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} # check multiple tokens, and quoted tokens do_test shell1-2.3.1 { @@ -230,7 +230,7 @@ do_test shell1-2.3.7 { # check quoted args are unquoted do_test shell1-2.4.1 { catchcmd "test.db" ".mode FOO" -} {1 {Error: mode should be one of: ascii column csv html insert line list quote tabs tcl}} +} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-2.4.2 { catchcmd "test.db" ".mode csv" } {0 {}} @@ -430,7 +430,7 @@ do_test shell1-3.13.1 { } {0 {current output mode: list}} do_test shell1-3.13.2 { catchcmd "test.db" ".mode FOO" -} {1 {Error: mode should be one of: ascii column csv html insert line list quote tabs tcl}} +} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-3.13.3 { catchcmd "test.db" ".mode csv" } {0 {}} @@ -463,10 +463,10 @@ do_test shell1-3.13.11 { # don't allow partial mode type matches do_test shell1-3.13.12 { catchcmd "test.db" ".mode l" -} {1 {Error: mode should be one of: ascii column csv html insert line list quote tabs tcl}} +} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-3.13.13 { catchcmd "test.db" ".mode li" -} {1 {Error: mode should be one of: ascii column csv html insert line list quote tabs tcl}} +} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-3.13.14 { catchcmd "test.db" ".mode lin" } {0 {}} From 69c093da9830731a8399e7c0b6f2f870a0524136 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 29 May 2020 00:21:43 +0000 Subject: [PATCH 113/224] In the json output mode of the CLI, do correct quoting of escape characters. Also, show BLOBs as JSON strings, possibly with embedded \u0000 bytes. FossilOrigin-Name: 0278147a7d2b50bed9f59ed3d3a04ecc6d46f072eb510e463f6707df1d829020 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 42 +++++++++++++++++++++++++++++++++++++----- 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 68a02ab2e3..bfb7f0bc9c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Progress\stoward\sadding\snew\soutput\smodes\sto\sthe\sCLI:\s\sjson,\stable,\sand\nmarkdown. -D 2020-05-28T23:49:50.023 +C In\sthe\sjson\soutput\smode\sof\sthe\sCLI,\sdo\scorrect\squoting\sof\sescape\scharacters.\nAlso,\sshow\sBLOBs\sas\sJSON\sstrings,\spossibly\swith\sembedded\s\\u0000\sbytes. +D 2020-05-29T00:21:43.757 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 c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in d135e500f2c84808f86e8113fd22852af4c89f69305f122d3c529cd698ccb396 +F src/shell.c.in f545fcc628411490e986e9f4fb9418f1eb25c85fd349924e852f7aac5da4fd0b F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -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 b5e33ed537e7d7dcabc9f6dc91d6838e0d1657f323440e09e2e24ffa2ba6141a -R 65dafea1aa0e6dfee5aa69ebe4f5d82f +P 14f55fafec11491e87e6526c72cf85c689d74ba18418a1ae9646586ec206767a +R 8c9c292833e7d437405039fbac69b62c U drh -Z 8f810f781bfa2ede3701aac97fce45df +Z 9c1cf56bec8bac52da07f5875b8a7be2 diff --git a/manifest.uuid b/manifest.uuid index 7d744d62ce..c5d0dc1504 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -14f55fafec11491e87e6526c72cf85c689d74ba18418a1ae9646586ec206767a \ No newline at end of file +0278147a7d2b50bed9f59ed3d3a04ecc6d46f072eb510e463f6707df1d829020 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 4795b832c5..891dfd641b 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1578,6 +1578,40 @@ static void output_c_string(FILE *out, const char *z){ fputc('"', out); } +/* +** Output the given string as a quoted according to JSON quoting rules. +*/ +static void output_json_string(FILE *out, const char *z, int n){ + unsigned int c; + if( n<0 ) n = (int)strlen(z); + fputc('"', out); + while( n-- ){ + c = *(z++); + if( c=='\\' || c=='"' ){ + fputc('\\', out); + fputc(c, out); + }else if( c<=0x1f ){ + fputc('\\', out); + if( c=='\b' ){ + fputc('b', out); + }else if( c=='\f' ){ + fputc('f', out); + }else if( c=='\n' ){ + fputc('n', out); + }else if( c=='\r' ){ + fputc('r', out); + }else if( c=='\t' ){ + fputc('t', out); + }else{ + raw_printf(out, "u%04x",c); + } + }else{ + fputc(c, out); + } + } + fputc('"', out); +} + /* ** Output the given string with characters that are special to ** HTML escaped. @@ -2276,7 +2310,7 @@ static int shell_callback( } p->cnt++; for(i=0; iout, azCol[i]); + output_json_string(p->out, azCol[i], -1); putc(':', p->out); if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ fputs("null",p->out); @@ -2296,11 +2330,9 @@ static int shell_callback( }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ const void *pBlob = sqlite3_column_blob(p->pStmt, i); int nBlob = sqlite3_column_bytes(p->pStmt, i); - putc('"', p->out); - output_hex_blob(p->out, pBlob, nBlob); - putc('"', p->out); + output_json_string(p->out, pBlob, nBlob); }else if( aiType && aiType[i]==SQLITE_TEXT ){ - output_c_string(p->out, azArg[i]); + output_json_string(p->out, azArg[i], -1); }else{ utf8_printf(p->out,"%s", azArg[i]); } From d31fcd4751745b1fe2e263cd31792debb2e21b52 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 29 May 2020 11:07:20 +0000 Subject: [PATCH 114/224] Expand upon a comment in os_unix.c. No changes to code. FossilOrigin-Name: 77933dc4dbe0e0af3b13a14293a8bd684edc5056f4ae9291c6f95d4433bf90ce --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/os_unix.c | 5 ++++- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index bfb7f0bc9c..0dafd7b725 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sjson\soutput\smode\sof\sthe\sCLI,\sdo\scorrect\squoting\sof\sescape\scharacters.\nAlso,\sshow\sBLOBs\sas\sJSON\sstrings,\spossibly\swith\sembedded\s\\u0000\sbytes. -D 2020-05-29T00:21:43.757 +C Expand\supon\sa\scomment\sin\sos_unix.c.\sNo\schanges\sto\scode. +D 2020-05-29T11:07:20.452 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 13f983da988b6460ef3c4c22099c67ab0938291e543644ac4d99eccc8ba604f1 +F src/os_unix.c 03bad4eb1e13946cb967f3a6cc0a0d350df8ea4b8d2212d528024a5f9abc90ea F src/os_win.c e832e21e830c1f9409c9c54053939b6dcb14c1e92128b756204ce1e3e331d678 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 96436cb1920074d4ade120a1a8a9d0ae3f52df06651e21b7eccc5eae2f02b111 @@ -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 14f55fafec11491e87e6526c72cf85c689d74ba18418a1ae9646586ec206767a -R 8c9c292833e7d437405039fbac69b62c -U drh -Z 9c1cf56bec8bac52da07f5875b8a7be2 +P 0278147a7d2b50bed9f59ed3d3a04ecc6d46f072eb510e463f6707df1d829020 +R 6168b01ac7944b1dec923e20df70ebab +U dan +Z 464f9a3c62e750102957cbf88d682eca diff --git a/manifest.uuid b/manifest.uuid index c5d0dc1504..87125d956b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0278147a7d2b50bed9f59ed3d3a04ecc6d46f072eb510e463f6707df1d829020 \ No newline at end of file +77933dc4dbe0e0af3b13a14293a8bd684edc5056f4ae9291c6f95d4433bf90ce \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index d510711087..a72f0629fe 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -4836,7 +4836,10 @@ static int unixShmLock( ** ** In other words, if this is a blocking lock, none of the locks that ** occur later in the above list than the lock being obtained may be - ** held. */ + ** held. + ** + ** It is not permitted to block on the RECOVER lock. + */ #ifdef SQLITE_ENABLE_SETLK_TIMEOUT assert( (flags & SQLITE_SHM_UNLOCK) || pDbFd->iBusyTimeout==0 || ( (ofst!=2) /* not RECOVER */ From d6f252490e126360ddbd0185f450773679ae9efa Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 29 May 2020 12:31:53 +0000 Subject: [PATCH 115/224] Incremental improvements to tabular output modes in the CLI. The "markdown" and "table" modes no have headers turned on by default. FossilOrigin-Name: af28bff91ad7e2d69db0052323c9c05c75a41d4134974bd1305f1c4f579d3558 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 51 +++++++++++++++++++++++++++++--------------------- 3 files changed, 38 insertions(+), 29 deletions(-) diff --git a/manifest b/manifest index 0dafd7b725..4061939f7d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Expand\supon\sa\scomment\sin\sos_unix.c.\sNo\schanges\sto\scode. -D 2020-05-29T11:07:20.452 +C Incremental\simprovements\sto\stabular\soutput\smodes\sin\sthe\sCLI.\s\sThe\n"markdown"\sand\s"table"\smodes\sno\shave\sheaders\sturned\son\sby\sdefault. +D 2020-05-29T12:31:53.495 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 c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in f545fcc628411490e986e9f4fb9418f1eb25c85fd349924e852f7aac5da4fd0b +F src/shell.c.in 17fff6834b839d684371a436f6c863dfbb8cb82ea8e4210b6090d9e8a6829dc3 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -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 0278147a7d2b50bed9f59ed3d3a04ecc6d46f072eb510e463f6707df1d829020 -R 6168b01ac7944b1dec923e20df70ebab -U dan -Z 464f9a3c62e750102957cbf88d682eca +P 77933dc4dbe0e0af3b13a14293a8bd684edc5056f4ae9291c6f95d4433bf90ce +R dbd1cec93fc87562979dbfde2067c782 +U drh +Z 42d147ea1b5d379198ee1e0c91039dc7 diff --git a/manifest.uuid b/manifest.uuid index 87125d956b..50bd455119 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -77933dc4dbe0e0af3b13a14293a8bd684edc5056f4ae9291c6f95d4433bf90ce \ No newline at end of file +af28bff91ad7e2d69db0052323c9c05c75a41d4134974bd1305f1c4f579d3558 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 891dfd641b..517a09fc80 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1967,7 +1967,7 @@ static int shell_callback( int nArg, /* Number of result columns */ char **azArg, /* Text of each result column */ char **azCol, /* Column names */ - int *aiType /* Column types */ + int *aiType /* Column types. Might be NULL */ ){ int i; ShellState *p = (ShellState*)pArg; @@ -1992,36 +1992,43 @@ static int shell_callback( case MODE_Markdown: case MODE_Explain: case MODE_Column: { - static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13}; - const int *colWidth; int showHdr; char *rowSep; char *colSep; char *rowStart; - int nWidth; if( p->cMode==MODE_Column ){ - colWidth = p->colWidth; - nWidth = ArraySize(p->colWidth); showHdr = p->showHeader; rowSep = p->rowSeparator; colSep = " "; rowStart = ""; }else if( p->cMode==MODE_Explain ){ - colWidth = aExplainWidths; - nWidth = ArraySize(aExplainWidths); showHdr = 1; rowSep = SEP_Row; colSep = " "; rowStart = ""; }else{ - colWidth = p->colWidth; - nWidth = ArraySize(p->colWidth); - showHdr = p->showHeader; + showHdr = 1; rowSep = " |\n"; colSep = " | "; rowStart = "| "; } + if( p->cnt++==0 ){ + /* Compute column widths in p->actualWidth[] when the first row + ** is seen. The width of each column is either the defined + ** width in p->colWidth[], or if p->colWidth[i]==0, then the + ** width is the larger of the width of the first row and the + ** column name. */ + static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13}; + const int *colWidth; + int nWidth; + if( p->cMode==MODE_Explain ){ + colWidth = aExplainWidths; + nWidth = ArraySize(aExplainWidths); + }else{ + colWidth = p->colWidth; + nWidth = ArraySize(p->colWidth); + } for(i=0; iactualWidth[i] = w; } } + if( p->cMode==MODE_Table ){ + print_row_separator(p, nArg, "+"); + } if( showHdr ){ - if( p->cMode==MODE_Table ){ - print_row_separator(p, nArg, "+"); - } fputs(rowStart, p->out); for(i=0; icMode==MODE_Explain && azArg[i] && strlenChar(azArg[i])>w ){ - w = strlenChar(azArg[i]); - } - if( i==1 && p->aiIndent && p->pStmt ){ - if( p->iIndentnIndent ){ - utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], ""); + if( p->cMode==MODE_Explain ){ + if( azArg[i] && strlenChar(azArg[i])>w ){ + w = strlenChar(azArg[i]); + } + if( i==1 && p->aiIndent && p->pStmt ){ + if( p->iIndentnIndent ){ + utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], ""); + } + p->iIndent++; } - p->iIndent++; } utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue); utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : colSep); From 0285d98de74baa44617ca67694385fbfd21127c9 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 29 May 2020 14:38:43 +0000 Subject: [PATCH 116/224] Space to hold the ".width" of columns in the CLI is now obtained from malloc() and hence is not limited in the number of columns supported. FossilOrigin-Name: 445ed5dab2c26e9f4a7fb5277abdba3359d23cf5318cfd0d8322162d9616ee7a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 16 +++++++++++----- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 4061939f7d..edf9e43a80 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Incremental\simprovements\sto\stabular\soutput\smodes\sin\sthe\sCLI.\s\sThe\n"markdown"\sand\s"table"\smodes\sno\shave\sheaders\sturned\son\sby\sdefault. -D 2020-05-29T12:31:53.495 +C Space\sto\shold\sthe\s".width"\sof\scolumns\sin\sthe\sCLI\sis\snow\sobtained\sfrom\nmalloc()\sand\shence\sis\snot\slimited\sin\sthe\snumber\sof\scolumns\ssupported. +D 2020-05-29T14:38:43.840 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 c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in 17fff6834b839d684371a436f6c863dfbb8cb82ea8e4210b6090d9e8a6829dc3 +F src/shell.c.in 77530a909ab0e8e44c7797993b0f3143e95226380bc5f311158ad3e3209abf28 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -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 77933dc4dbe0e0af3b13a14293a8bd684edc5056f4ae9291c6f95d4433bf90ce -R dbd1cec93fc87562979dbfde2067c782 +P af28bff91ad7e2d69db0052323c9c05c75a41d4134974bd1305f1c4f579d3558 +R 7199cbe7bb1c2e7279bcd8d792b04d19 U drh -Z 42d147ea1b5d379198ee1e0c91039dc7 +Z e4dd532cb0e0bd045df8215b6bacef2f diff --git a/manifest.uuid b/manifest.uuid index 50bd455119..589b69c5fc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -af28bff91ad7e2d69db0052323c9c05c75a41d4134974bd1305f1c4f579d3558 \ No newline at end of file +445ed5dab2c26e9f4a7fb5277abdba3359d23cf5318cfd0d8322162d9616ee7a \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 517a09fc80..299670755d 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1104,8 +1104,9 @@ struct ShellState { char rowSeparator[20]; /* Row separator character for MODE_Ascii */ char colSepPrior[20]; /* Saved column separator */ char rowSepPrior[20]; /* Saved row separator */ - int colWidth[100]; /* Requested width of each column when in column mode*/ - int actualWidth[100]; /* Actual width of each column */ + int *colWidth; /* Requested width of each column in columnar modes */ + int *actualWidth; /* Actual width of each column */ + int nWidth; /* Number of slots in colWidth[] and actualWidth[] */ char nullValue[20]; /* The text to print when a NULL comes back from ** the database */ char outfile[FILENAME_MAX]; /* Filename for *out */ @@ -2027,7 +2028,7 @@ static int shell_callback( nWidth = ArraySize(aExplainWidths); }else{ colWidth = p->colWidth; - nWidth = ArraySize(p->colWidth); + nWidth = p->nWidth; } for(i=0; iout, "\n"); utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]); utf8_printf(p->out, "%12.12s: ", "width"); - for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) { + for (i=0;inWidth;i++) { raw_printf(p->out, "%d ", p->colWidth[i]); } raw_printf(p->out, "\n"); @@ -10059,7 +10060,11 @@ static int do_meta_command(char *zLine, ShellState *p){ if( c=='w' && strncmp(azArg[0], "width", n)==0 ){ int j; assert( nArg<=ArraySize(azArg) ); - for(j=1; jcolWidth); j++){ + p->nWidth = nArg-1; + p->colWidth = realloc(p->colWidth, p->nWidth*sizeof(int)*2); + if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory(); + if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth]; + for(j=1; jcolWidth[j-1] = (int)integerValue(azArg[j]); } }else @@ -11068,6 +11073,7 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ for(i=0; i Date: Fri, 29 May 2020 16:15:58 +0000 Subject: [PATCH 117/224] Improvements to columnar output in the CLI. Columns automatically expand to contain the largest row. FossilOrigin-Name: 4e1db8e9a9ee370a398f13fd8546a520111b8cfb84460389535b5bc5bd9f4f82 --- manifest | 12 +-- manifest.uuid | 2 +- src/shell.c.in | 234 +++++++++++++++++++++++-------------------------- 3 files changed, 119 insertions(+), 129 deletions(-) diff --git a/manifest b/manifest index edf9e43a80..d4109e2ff9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Space\sto\shold\sthe\s".width"\sof\scolumns\sin\sthe\sCLI\sis\snow\sobtained\sfrom\nmalloc()\sand\shence\sis\snot\slimited\sin\sthe\snumber\sof\scolumns\ssupported. -D 2020-05-29T14:38:43.840 +C Improvements\sto\scolumnar\soutput\sin\sthe\sCLI.\s\sColumns\sautomatically\sexpand\nto\scontain\sthe\slargest\srow. +D 2020-05-29T16:15:58.318 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 c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in 77530a909ab0e8e44c7797993b0f3143e95226380bc5f311158ad3e3209abf28 +F src/shell.c.in 9675df5f6be969309421509eef9c49a20179e5c4df8770f2d62edd41a9dee339 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -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 af28bff91ad7e2d69db0052323c9c05c75a41d4134974bd1305f1c4f579d3558 -R 7199cbe7bb1c2e7279bcd8d792b04d19 +P 445ed5dab2c26e9f4a7fb5277abdba3359d23cf5318cfd0d8322162d9616ee7a +R 5cd70920783d10744759d8e97b9aed09 U drh -Z e4dd532cb0e0bd045df8215b6bacef2f +Z 0a5f6eacc5288734a9f57cf18ebe2785 diff --git a/manifest.uuid b/manifest.uuid index 589b69c5fc..cbe0de7cd3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -445ed5dab2c26e9f4a7fb5277abdba3359d23cf5318cfd0d8322162d9616ee7a \ No newline at end of file +4e1db8e9a9ee370a398f13fd8546a520111b8cfb84460389535b5bc5bd9f4f82 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 299670755d..e4883c1474 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1945,15 +1945,8 @@ static void print_row_separator( ){ int i; for(i=0; iactualWidth) ){ - w = p->actualWidth[i]; - if( w<0 ) w = -w; - }else{ - w = 10; - } fputs(zSep, p->out); - print_dashes(p->out, w+2); + print_dashes(p->out, p->actualWidth[i]+2); } fputs(zSep, p->out); fputs("\n", p->out); @@ -1989,125 +1982,32 @@ static int shell_callback( } break; } - case MODE_Table: - case MODE_Markdown: - case MODE_Explain: - case MODE_Column: { - int showHdr; - char *rowSep; - char *colSep; - char *rowStart; - if( p->cMode==MODE_Column ){ - showHdr = p->showHeader; - rowSep = p->rowSeparator; - colSep = " "; - rowStart = ""; - }else if( p->cMode==MODE_Explain ){ - showHdr = 1; - rowSep = SEP_Row; - colSep = " "; - rowStart = ""; - }else{ - showHdr = 1; - rowSep = " |\n"; - colSep = " | "; - rowStart = "| "; + case MODE_Explain: { + static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13}; + if( nArg>ArraySize(aExplainWidth) ){ + nArg = ArraySize(aExplainWidth); } - if( p->cnt++==0 ){ - /* Compute column widths in p->actualWidth[] when the first row - ** is seen. The width of each column is either the defined - ** width in p->colWidth[], or if p->colWidth[i]==0, then the - ** width is the larger of the width of the first row and the - ** column name. */ - static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13}; - const int *colWidth; - int nWidth; - if( p->cMode==MODE_Explain ){ - colWidth = aExplainWidths; - nWidth = ArraySize(aExplainWidths); - }else{ - colWidth = p->colWidth; - nWidth = p->nWidth; - } for(i=0; inullValue); - if( wactualWidth) ){ - p->actualWidth[i] = w; - } - } - if( p->cMode==MODE_Table ){ - print_row_separator(p, nArg, "+"); - } - if( showHdr ){ - fputs(rowStart, p->out); - for(i=0; iactualWidth) ){ - w = p->actualWidth[i]; - if( w<0 ) w = -w; - }else{ - w = 10; - } - utf8_width_print(p->out, w, azCol[i]); - fputs(i==nArg-1 ? rowSep : colSep, p->out); - } - for(i=0; iactualWidth) ){ - w = p->actualWidth[i]; - if( w<0 ) w = -w; - }else{ - w = 10; - } - if( p->cMode==MODE_Table || p->cMode==MODE_Markdown ){ - char *zX = p->cMode==MODE_Markdown ? "|" : "+"; - fputs(zX, p->out); - print_dashes(p->out, w+2); - if( i==nArg-1 ){ - fputs(zX, p->out); - fputs("\n", p->out); - } - }else{ - print_dashes(p->out, w); - fputs(i==nArg-1 ? rowSep : colSep, p->out); - } - } + int w = aExplainWidth[i]; + utf8_width_print(p->out, w, azCol[i]); + fputs(i==nArg-1 ? "\n" : " ", p->out); } } if( azArg==0 ) break; - fputs(rowStart, p->out); for(i=0; iactualWidth) ){ - w = p->actualWidth[i]; - }else{ - w = 10; + int w = aExplainWidth[i]; + if( azArg[i] && strlenChar(azArg[i])>w ){ + w = strlenChar(azArg[i]); } - if( p->cMode==MODE_Explain ){ - if( azArg[i] && strlenChar(azArg[i])>w ){ - w = strlenChar(azArg[i]); - } - if( i==1 && p->aiIndent && p->pStmt ){ - if( p->iIndentnIndent ){ - utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], ""); - } - p->iIndent++; + if( i==1 && p->aiIndent && p->pStmt ){ + if( p->iIndentnIndent ){ + utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], ""); } + p->iIndent++; } utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue); - utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : colSep); + fputs(i==nArg-1 ? "\n" : " ", p->out); } break; } @@ -3042,23 +2942,105 @@ static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){ sqlite3_finalize(pQ); } -#if 0 /* ** Run a prepared statement and output the result in one of the -** table-oriented formats, either MODE_Markdown or MODE_Table. +** table-oriented formats: MODE_Column, MODE_Markdown, or MODE_Table. ** ** This is different from ordinary exec_prepared_stmt() in that ** it has to run the entire query and gather the results into memory ** first, in order to determine column widths, before providing ** any output. */ -static void exec_prepared_stmt_tablemode( - ShellState *pArg, /* Pointer to ShellState */ - sqlite3_stmt *pStmt /* Statment to run */ +static void exec_prepared_stmt_columnar( + ShellState *p, /* Pointer to ShellState */ + sqlite3_stmt *pStmt /* Statment to run */ ){ + int nRow = 0; + int nColumn = 0; + char **azData = 0; + char *zMsg = 0; + const char *z; + int rc; + int i, j, nTotal, w, n; + const char *colSep; + const char *rowSep; + rc = sqlite3_get_table(p->db, sqlite3_sql(pStmt), + &azData, &nRow, &nColumn, &zMsg); + if( rc ){ + utf8_printf(p->out, "ERROR: %s\n", zMsg); + sqlite3_free(zMsg); + sqlite3_free_table(azData); + return; + } + if( nColumn>p->nWidth ){ + p->colWidth = realloc(p->colWidth, nColumn*2*sizeof(int)); + if( p->colWidth==0 ) shell_out_of_memory(); + for(i=p->nWidth; icolWidth[i] = 0; + p->nWidth = nColumn; + p->actualWidth = &p->colWidth[nColumn]; + } + memset(p->actualWidth, 0, nColumn*sizeof(int)); + for(i=0; icolWidth[i]; + if( w<0 ) w = -w; + p->actualWidth[i] = w; + } + nTotal = nColumn*(nRow+1); + for(i=0; inullValue; + n = strlenChar(z); + j = i%nColumn; + if( n>p->actualWidth[j] ) p->actualWidth[j] = n; + } + if( p->cMode==MODE_Column ){ + colSep = " "; + rowSep = "\n"; + if( p->showHeader ){ + for(i=0; iactualWidth[i]; + if( p->colWidth[i]<0 ) w = -w; + utf8_width_print(p->out, w, azData[i]); + fputs(i==nColumn-1?"\n":" ", p->out); + } + for(i=0; iout, p->actualWidth[i]); + fputs(i==nColumn-1?"\n":" ", p->out); + } + } + }else{ + colSep = " | "; + rowSep = " |\n"; + if( p->cMode==MODE_Table ) print_row_separator(p, nColumn, "+"); + fputs("| ", p->out); + for(i=0; iactualWidth[i]; + n = strlenChar(azData[i]); + utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); + fputs(i==nColumn-1?" |\n":" | ", p->out); + } + print_row_separator(p, nColumn, p->cMode==MODE_Table ? "+" : "|"); + } + for(i=nColumn, j=0; icMode!=MODE_Column ) fputs("| ", p->out); + z = azData[i]; + if( z==0 ) z = p->nullValue; + w = p->actualWidth[j]; + if( p->colWidth[j]<0 ) w = -w; + utf8_width_print(p->out, w, z); + if( j==nColumn-1 ){ + fputs(rowSep, p->out); + j = -1; + }else{ + fputs(colSep, p->out); + } + } + if( p->cMode==MODE_Table ){ + print_row_separator(p, nColumn, "+"); + } + sqlite3_free_table(azData); } -#endif /* ** Run a prepared statement @@ -3069,6 +3051,14 @@ static void exec_prepared_stmt( ){ int rc; + if( pArg->cMode==MODE_Column + || pArg->cMode==MODE_Table + || pArg->cMode==MODE_Markdown + ){ + exec_prepared_stmt_columnar(pArg, pStmt); + return; + } + /* perform the first step. this will tell us if we ** have a result set or not and how wide it is. */ From 1d29fd85a34b6a555a39f0d01b03b20e8aa7739a Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 29 May 2020 19:03:03 +0000 Subject: [PATCH 118/224] Fix a memory leak in the CLI when an unknown or unrecognized argument is given to the ".dump" command. FossilOrigin-Name: 71bfbbcc1a8d0e02073a381a5b31a5ccd5477011b22904b9989b6129d81f02e7 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index d4109e2ff9..7ae1670e66 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\scolumnar\soutput\sin\sthe\sCLI.\s\sColumns\sautomatically\sexpand\nto\scontain\sthe\slargest\srow. -D 2020-05-29T16:15:58.318 +C Fix\sa\smemory\sleak\sin\sthe\sCLI\swhen\san\sunknown\sor\sunrecognized\nargument\sis\sgiven\sto\sthe\s".dump"\scommand. +D 2020-05-29T19:03:03.822 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 c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in 9675df5f6be969309421509eef9c49a20179e5c4df8770f2d62edd41a9dee339 +F src/shell.c.in 568398ec752c0dd2dc95fe5f2d1a41a3e2afad44fc426f29a433fb6d47682a57 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -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 445ed5dab2c26e9f4a7fb5277abdba3359d23cf5318cfd0d8322162d9616ee7a -R 5cd70920783d10744759d8e97b9aed09 +P 4e1db8e9a9ee370a398f13fd8546a520111b8cfb84460389535b5bc5bd9f4f82 +R dbf605f7d5ebb17a9b1bf4d7d1629225 U drh -Z 0a5f6eacc5288734a9f57cf18ebe2785 +Z 26823eb3679b06374331d049cd4f4495 diff --git a/manifest.uuid b/manifest.uuid index cbe0de7cd3..4be1499c5a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4e1db8e9a9ee370a398f13fd8546a520111b8cfb84460389535b5bc5bd9f4f82 \ No newline at end of file +71bfbbcc1a8d0e02073a381a5b31a5ccd5477011b22904b9989b6129d81f02e7 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index e4883c1474..1126f570b3 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -7495,6 +7495,7 @@ static int do_meta_command(char *zLine, ShellState *p){ raw_printf(stderr, "The --preserve-rowids option is not compatible" " with SQLITE_OMIT_VIRTUALTABLE\n"); rc = 1; + sqlite3_free(zLike); goto meta_command_exit; #else ShellSetFlag(p, SHFLG_PreserveRowid); @@ -7506,6 +7507,7 @@ static int do_meta_command(char *zLine, ShellState *p){ { raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]); rc = 1; + sqlite3_free(zLike); goto meta_command_exit; } }else if( zLike ){ From 7da29a3ad30ba28070f48c300633325a13b6eb8e Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 29 May 2020 19:17:20 +0000 Subject: [PATCH 119/224] Improvements to help text for the CLI. FossilOrigin-Name: 6a01e4c444b072e31a320121a6810d7c986c2c54ce45f9b11683233b1e7af8da --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 25 ++++++++++++++----------- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index 7ae1670e66..d02314c466 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\smemory\sleak\sin\sthe\sCLI\swhen\san\sunknown\sor\sunrecognized\nargument\sis\sgiven\sto\sthe\s".dump"\scommand. -D 2020-05-29T19:03:03.822 +C Improvements\sto\shelp\stext\sfor\sthe\sCLI. +D 2020-05-29T19:17:20.081 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 c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in 568398ec752c0dd2dc95fe5f2d1a41a3e2afad44fc426f29a433fb6d47682a57 +F src/shell.c.in ca45965c1eca515e4cdd78a495bbebe86b52826cce0fcbf007766dfbd29fa5a5 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -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 4e1db8e9a9ee370a398f13fd8546a520111b8cfb84460389535b5bc5bd9f4f82 -R dbf605f7d5ebb17a9b1bf4d7d1629225 +P 71bfbbcc1a8d0e02073a381a5b31a5ccd5477011b22904b9989b6129d81f02e7 +R bb1b7b61958145efdf723dd1c95331fe U drh -Z 26823eb3679b06374331d049cd4f4495 +Z 88ceb48d848b297c551cf9009c2925f8 diff --git a/manifest.uuid b/manifest.uuid index 4be1499c5a..02a3aba8db 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -71bfbbcc1a8d0e02073a381a5b31a5ccd5477011b22904b9989b6129d81f02e7 \ No newline at end of file +6a01e4c444b072e31a320121a6810d7c986c2c54ce45f9b11683233b1e7af8da \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 1126f570b3..3a59380977 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3791,16 +3791,19 @@ static const char *(azHelp[]) = { ".log FILE|off Turn logging on or off. FILE can be stderr/stdout", ".mode MODE ?TABLE? Set output mode", " MODE is one of:", - " ascii Columns/rows delimited by 0x1F and 0x1E", - " csv Comma-separated values", - " column Left-aligned columns. (See .width)", - " html HTML
    code", - " insert SQL insert statements for TABLE", - " line One value per line", - " list Values delimited by \"|\"", - " quote Escape answers as for SQL", - " tabs Tab-separated values", - " tcl TCL list elements", + " ascii Columns/rows delimited by 0x1F and 0x1E", + " csv Comma-separated values", + " column Output in columns. (See .width)", + " html HTML
    code", + " insert SQL insert statements for TABLE", + " json Results in a JSON array", + " line One value per line", + " list Values delimited by \"|\"", + " markdown Markdown table format", + " quote Escape answers as for SQL", + " table ASCII-art table", + " tabs Tab-separated values", + " tcl TCL list elements", ".nullvalue STRING Use STRING in place of NULL values", ".once ?OPTIONS? ?FILE? Output for the next SQL command only to FILE", " If FILE begins with '|' then open as a pipe", @@ -3925,7 +3928,7 @@ static const char *(azHelp[]) = { ".vfsinfo ?AUX? Information about the top-level VFS", ".vfslist List all available VFSes", ".vfsname ?AUX? Print the name of the VFS stack", - ".width NUM1 NUM2 ... Set column widths for \"column\" mode", + ".width NUM1 NUM2 ... Set minimum column widths for columnar output", " Negative values right-justify", }; From 9776784f943cafb7d836ffff6c9c6d1580f18b4f Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 29 May 2020 19:39:35 +0000 Subject: [PATCH 120/224] Fix the ".import" command of the CLI to clean up better after errors. Add the new "shelltest" makefile target on unix platforms. FossilOrigin-Name: 50d4ddf1330b88551de51439eb535f385dee6b53013802dd62f832d16b3025b6 --- Makefile.in | 3 +++ main.mk | 3 +++ manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/shell.c.in | 33 ++++++++++++++++++++------------- test/permutations.test | 6 ++++++ 6 files changed, 42 insertions(+), 23 deletions(-) diff --git a/Makefile.in b/Makefile.in index 1341dee634..01bc2541f0 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1286,6 +1286,9 @@ valgrindtest: $(TESTPROGS) valgrindfuzz smoketest: $(TESTPROGS) fuzzcheck$(TEXE) ./testfixture$(TEXE) $(TOP)/test/main.test $(TESTOPTS) +shelltest: $(TESTPROGS) + ./testfixture$(TEXT) $(TOP)/test/permutations.test shell + sqlite3_analyzer.c: sqlite3.c $(TOP)/src/tclsqlite.c $(TOP)/tool/spaceanal.tcl $(TOP)/tool/mkccode.tcl $(TOP)/tool/sqlite3_analyzer.c.in $(TCLSH_CMD) $(TOP)/tool/mkccode.tcl $(TOP)/tool/sqlite3_analyzer.c.in >sqlite3_analyzer.c diff --git a/main.mk b/main.mk index 654bd043f3..fa2c199ed5 100644 --- a/main.mk +++ b/main.mk @@ -975,6 +975,9 @@ valgrindtest: $(TESTPROGS) valgrindfuzz smoketest: $(TESTPROGS) fuzzcheck$(EXE) ./testfixture$(EXE) $(TOP)/test/main.test $(TESTOPTS) +shelltest: $(TESTPROGS) + ./testfixture$(EXT) $(TOP)/test/permutations.test shell + # The next two rules are used to support the "threadtest" target. Building # threadtest runs a few thread-safety tests that are implemented in C. This # target is invoked by the releasetest.tcl script. diff --git a/manifest b/manifest index d02314c466..0715c01cc7 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Improvements\sto\shelp\stext\sfor\sthe\sCLI. -D 2020-05-29T19:17:20.081 +C Fix\sthe\s".import"\scommand\sof\sthe\sCLI\sto\sclean\sup\sbetter\safter\serrors.\nAdd\sthe\snew\s"shelltest"\smakefile\starget\son\sunix\splatforms. +D 2020-05-29T19:39:35.710 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in 376f53999defeb32b7ad2626fd58aae8f3694c38ab7ee30c2289e0d0525a9238 +F Makefile.in 8d79d12bae1b624d32cf9a698ecc797bfa908ab7eabac5d76faf130c4d362223 F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 F Makefile.msc 8d00aeba2609bb498dded5eead2890126321f02e292573bf29bf2d18487d37bd F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a @@ -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 addd0a300e90ad090dc4a934df8a6f1b6c52c057a1aebb93682aed29fb68a345 +F main.mk 980ad4201300ca43e9db0f972c5f38776d1e78022252bf3a8c0fec7ddda540df F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -534,7 +534,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in ca45965c1eca515e4cdd78a495bbebe86b52826cce0fcbf007766dfbd29fa5a5 +F src/shell.c.in 5074277ad9469c281bc9dce86fd15aeffffffc2735ae2f912561dfcc5101d267 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1237,7 +1237,7 @@ F test/parser1.test 6ccdf5e459a5dc4673d3273dc311a7e9742ca952dd0551a6a6320d27035c F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff -F test/permutations.test c83339862d72b6272f957905205f874e6eefdbad2823380452c4f0128fd3d906 +F test/permutations.test 94bfbc9d32449fb3ef7d31962f8cdcd57dc59490681db84bd72236d4af7b5815 F test/pg_common.tcl 222a1bad1c41c308fa366313cd7b51b3be7e9b21c8736a421b974ac941693b54 F test/pragma.test 59becdfd720b80d463ab750f69f7118fde10dfd556aa5d554f3bf6b7e5ea7533 F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f @@ -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 71bfbbcc1a8d0e02073a381a5b31a5ccd5477011b22904b9989b6129d81f02e7 -R bb1b7b61958145efdf723dd1c95331fe +P 6a01e4c444b072e31a320121a6810d7c986c2c54ce45f9b11683233b1e7af8da +R d5d44835676f1e6d2a436c688d30cb21 U drh -Z 88ceb48d848b297c551cf9009c2925f8 +Z e85f70a84a25681410e513d2a789e322 diff --git a/manifest.uuid b/manifest.uuid index 02a3aba8db..3c5ea8764e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6a01e4c444b072e31a320121a6810d7c986c2c54ce45f9b11683233b1e7af8da \ No newline at end of file +50d4ddf1330b88551de51439eb535f385dee6b53013802dd62f832d16b3025b6 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 3a59380977..8208ce0856 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -4765,6 +4765,7 @@ typedef struct ImportCtx ImportCtx; struct ImportCtx { const char *zFile; /* Name of the input file */ FILE *in; /* Read the CSV text from this input stream */ + int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close in */ char *z; /* Accumulated text for a field */ int n; /* Number of bytes in z */ int nAlloc; /* Space allocated for z[] */ @@ -4777,6 +4778,16 @@ struct ImportCtx { int cRowSep; /* The row separator character. (Usually "\n") */ }; +/* Clean up resourced used by an ImportCtx */ +static void import_cleanup(ImportCtx *p){ + if( p->in!=0 &&& p->xCloser!=0 ){ + p->xCloser(p->in); + p->in = 0; + } + sqlite3_free(p->z); + p->z = 0; +} + /* Append a single byte to z[] */ static void import_append_char(ImportCtx *p, int c){ if( p->n+1>=p->nAlloc ){ @@ -7868,7 +7879,6 @@ static int do_meta_command(char *zLine, ShellState *p){ char *zSql; /* An SQL statement */ ImportCtx sCtx; /* Reader context */ char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */ - int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */ int eVerbose = 0; /* Larger for more console output */ int nSkip = 0; /* Initial lines to skip */ int useOutputMode = 1; /* Use output mode to determine separators */ @@ -7974,11 +7984,11 @@ static int do_meta_command(char *zLine, ShellState *p){ #else sCtx.in = popen(sCtx.zFile+1, "r"); sCtx.zFile = ""; - xCloser = pclose; + sCtx.xCloser = pclose; #endif }else{ sCtx.in = fopen(sCtx.zFile, "rb"); - xCloser = fclose; + sCtx.xCloser = fclose; } if( sCtx.in==0 ){ utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); @@ -8002,7 +8012,7 @@ static int do_meta_command(char *zLine, ShellState *p){ } zSql = sqlite3_mprintf("SELECT * FROM %s", zTable); if( zSql==0 ){ - xCloser(sCtx.in); + import_cleanup(&sCtx); shell_out_of_memory(); } nByte = strlen30(zSql); @@ -8018,8 +8028,7 @@ static int do_meta_command(char *zLine, ShellState *p){ } if( cSep=='(' ){ sqlite3_free(zCreate); - sqlite3_free(sCtx.z); - xCloser(sCtx.in); + import_cleanup(&sCtx); utf8_printf(stderr,"%s: empty file\n", sCtx.zFile); rc = 1; goto meta_command_exit; @@ -8033,8 +8042,7 @@ static int do_meta_command(char *zLine, ShellState *p){ if( rc ){ utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable, sqlite3_errmsg(p->db)); - sqlite3_free(sCtx.z); - xCloser(sCtx.in); + import_cleanup(&sCtx); rc = 1; goto meta_command_exit; } @@ -8044,7 +8052,7 @@ static int do_meta_command(char *zLine, ShellState *p){ if( rc ){ if (pStmt) sqlite3_finalize(pStmt); utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db)); - xCloser(sCtx.in); + import_cleanup(&sCtx); rc = 1; goto meta_command_exit; } @@ -8054,7 +8062,7 @@ static int do_meta_command(char *zLine, ShellState *p){ if( nCol==0 ) return 0; /* no columns, no error */ zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 ); if( zSql==0 ){ - xCloser(sCtx.in); + import_cleanup(&sCtx); shell_out_of_memory(); } sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable); @@ -8073,7 +8081,7 @@ static int do_meta_command(char *zLine, ShellState *p){ if( rc ){ utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); if (pStmt) sqlite3_finalize(pStmt); - xCloser(sCtx.in); + import_cleanup(&sCtx); rc = 1; goto meta_command_exit; } @@ -8125,8 +8133,7 @@ static int do_meta_command(char *zLine, ShellState *p){ } }while( sCtx.cTerm!=EOF ); - xCloser(sCtx.in); - sqlite3_free(sCtx.z); + import_cleanup(&sCtx); sqlite3_finalize(pStmt); if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0); if( eVerbose>0 ){ diff --git a/test/permutations.test b/test/permutations.test index d8ec9e4a55..ba7fa2be86 100644 --- a/test/permutations.test +++ b/test/permutations.test @@ -171,6 +171,12 @@ test_suite "veryquick" -prefix "" -description { *fts5corrupt* *fts5big* *fts5aj* ] +test_suite "shell" -prefix "" -description { + Run tests of the command-line shell +} -files [ + test_set [glob $testdir/shell*.test] +] + test_suite "extraquick" -prefix "" -description { "Extra" quick test suite. Runs in a few minutes on a workstation. This test suite is the same as the "veryquick" tests, except that From 02c17a4da7f86f7076eb2a91d1afc959df3ec0b6 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 29 May 2020 19:45:03 +0000 Subject: [PATCH 121/224] Add the "shelltest" target to the MSVC makefile as well. FossilOrigin-Name: 9924c0456bfcd2058c9620a93dfbfd4c7d960c68910ce6aed7364dff42baba5c --- Makefile.msc | 3 +++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index a5c9828901..235c7c19ac 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -2452,6 +2452,9 @@ smoketest: $(TESTPROGS) @set PATH=$(LIBTCLPATH);$(PATH) .\testfixture.exe $(TOP)\test\main.test $(TESTOPTS) +shelltest: $(TESTPROGS) + .\testfixture.exe $(TOP)\test\permutations.test shell + sqlite3_analyzer.c: $(SQLITE3C) $(SQLITE3H) $(TOP)\src\tclsqlite.c $(TOP)\tool\spaceanal.tcl $(TOP)\tool\mkccode.tcl $(TOP)\tool\sqlite3_analyzer.c.in $(SQLITE_TCL_DEP) $(TCLSH_CMD) $(TOP)\tool\mkccode.tcl $(TOP)\tool\sqlite3_analyzer.c.in > $@ diff --git a/manifest b/manifest index 0715c01cc7..5688260174 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Fix\sthe\s".import"\scommand\sof\sthe\sCLI\sto\sclean\sup\sbetter\safter\serrors.\nAdd\sthe\snew\s"shelltest"\smakefile\starget\son\sunix\splatforms. -D 2020-05-29T19:39:35.710 +C Add\sthe\s"shelltest"\starget\sto\sthe\sMSVC\smakefile\sas\swell. +D 2020-05-29T19:45:03.464 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F Makefile.in 8d79d12bae1b624d32cf9a698ecc797bfa908ab7eabac5d76faf130c4d362223 F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc 8d00aeba2609bb498dded5eead2890126321f02e292573bf29bf2d18487d37bd +F Makefile.msc 708c6032842b4fa340a6af87e124c1563da82663fb5a74d4a2f5b2c0829b51e0 F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a F VERSION 5db2ee2cfcc790af73775fa485c13b2e8ccaa5936c6e1f47aedeba7056041ca5 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -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 6a01e4c444b072e31a320121a6810d7c986c2c54ce45f9b11683233b1e7af8da -R d5d44835676f1e6d2a436c688d30cb21 +P 50d4ddf1330b88551de51439eb535f385dee6b53013802dd62f832d16b3025b6 +R f806000b80d1906a07120f53d52bf9b7 U drh -Z e85f70a84a25681410e513d2a789e322 +Z 7d0d8f75af2aa05c25ec32eee4f87b2f diff --git a/manifest.uuid b/manifest.uuid index 3c5ea8764e..3fb0d7415a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -50d4ddf1330b88551de51439eb535f385dee6b53013802dd62f832d16b3025b6 \ No newline at end of file +9924c0456bfcd2058c9620a93dfbfd4c7d960c68910ce6aed7364dff42baba5c \ No newline at end of file From 42c2a04eb70c0c6a684be8884533d4c7266dc4bf Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 29 May 2020 20:16:19 +0000 Subject: [PATCH 122/224] Remove a stray "&" character in the CLI, detected by a clang warning. FossilOrigin-Name: 5865d2f2d0333024366ecf1d919535fd4ec05c637feff16d75028ccdc8db4b50 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 5688260174..1c917dad38 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s"shelltest"\starget\sto\sthe\sMSVC\smakefile\sas\swell. -D 2020-05-29T19:45:03.464 +C Remove\sa\sstray\s"&"\scharacter\sin\sthe\sCLI,\sdetected\sby\sa\sclang\swarning. +D 2020-05-29T20:16:19.429 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 c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in 5074277ad9469c281bc9dce86fd15aeffffffc2735ae2f912561dfcc5101d267 +F src/shell.c.in 1c47af1236007851fbded02bcdca020415f35e215cb161adbe2cf06f9ca70b99 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -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 50d4ddf1330b88551de51439eb535f385dee6b53013802dd62f832d16b3025b6 -R f806000b80d1906a07120f53d52bf9b7 +P 9924c0456bfcd2058c9620a93dfbfd4c7d960c68910ce6aed7364dff42baba5c +R 85938626fdde133bf2bbed9b50812696 U drh -Z 7d0d8f75af2aa05c25ec32eee4f87b2f +Z a7ec4245396908b4263f1a81f6c6a7ec diff --git a/manifest.uuid b/manifest.uuid index 3fb0d7415a..c182cd8037 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9924c0456bfcd2058c9620a93dfbfd4c7d960c68910ce6aed7364dff42baba5c \ No newline at end of file +5865d2f2d0333024366ecf1d919535fd4ec05c637feff16d75028ccdc8db4b50 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 8208ce0856..9ed0dda713 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -4780,7 +4780,7 @@ struct ImportCtx { /* Clean up resourced used by an ImportCtx */ static void import_cleanup(ImportCtx *p){ - if( p->in!=0 &&& p->xCloser!=0 ){ + if( p->in!=0 && p->xCloser!=0 ){ p->xCloser(p->in); p->in = 0; } From 375b0b014b3f64ddb4ff705f3b7f5bc1ed08db3d Mon Sep 17 00:00:00 2001 From: mistachkin Date: Fri, 29 May 2020 21:06:52 +0000 Subject: [PATCH 123/224] Enhancements to the incremental build support for MSVC. FossilOrigin-Name: 2e25d915bcb8d6f1747f9befdef64d2e0e495cc6c5948a8eff5d0097b6613d06 --- Makefile.msc | 29 ++++++++++++++++++++--------- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index 235c7c19ac..241961e2d5 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1495,7 +1495,7 @@ SRC12 = # All source code files. # -SRC = $(SRC00) $(SRC01) $(SRC03) $(SRC04) $(SRC05) $(SRC06) $(SRC07) $(SRC08) $(SRC09) $(SRC10) $(SRC11) +SRC = $(SRC00) $(SRC01) $(SRC03) $(SRC04) $(SRC05) $(SRC06) $(SRC07) $(SRC08) $(SRC09) $(SRC10) $(SRC11) $(SRC12) # Source code to the test files. # @@ -1846,15 +1846,16 @@ mptest: mptester.exe for %i in ($(SRC11)) do copy /Y %i tsrc for %i in ($(SRC12)) do copy /Y %i tsrc copy /Y fts5.c tsrc + copy /B tsrc\fts5.c +,, copy /Y fts5.h tsrc + copy /B tsrc\fts5.h +,, del /Q tsrc\sqlite.h.in tsrc\parse.y 2>NUL $(TCLSH_CMD) $(TOP)\tool\vdbe-compress.tcl $(OPTS) < tsrc\vdbe.c > vdbe.new move vdbe.new tsrc\vdbe.c echo > .target_source -sqlite3.c: .target_source sqlite3ext.h $(MKSQLITE3C_TOOL) +sqlite3.c: .target_source sqlite3ext.h sqlite3session.h $(MKSQLITE3C_TOOL) $(TCLSH_CMD) $(MKSQLITE3C_TOOL) $(MKSQLITE3C_ARGS) - copy $(TOP)\ext\session\sqlite3session.h . sqlite3-all.c: sqlite3.c $(TOP)\tool\split-sqlite3c.tcl $(TCLSH_CMD) $(TOP)\tool\split-sqlite3c.tcl @@ -1869,7 +1870,8 @@ sqlite3.lo: $(SQLITE3C) # Rules to build the LEMON compiler generator # lempar.c: $(TOP)\tool\lempar.c - copy $(TOP)\tool\lempar.c . + copy /Y $(TOP)\tool\lempar.c . + copy /B lempar.c +,, lemon.exe: $(TOP)\tool\lemon.c lempar.c $(BCC) $(NO_WARN) -Daccess=_access \ @@ -2169,7 +2171,8 @@ parse.h: parse.c parse.c: $(TOP)\src\parse.y lemon.exe del /Q parse.y parse.h parse.h.temp 2>NUL - copy $(TOP)\src\parse.y . + copy /Y $(TOP)\src\parse.y . + copy /B parse.y +,, .\lemon.exe $(REQ_FEATURE_FLAGS) $(OPT_FEATURE_FLAGS) $(EXT_FEATURE_FLAGS) $(OPTS) -S parse.y $(SQLITE3H): $(TOP)\src\sqlite.h.in $(TOP)\manifest mksourceid.exe $(TOP)\VERSION @@ -2182,8 +2185,13 @@ sqlite3ext.h: .target_source copy /Y sqlite3ext.h tsrc\sqlite3ext.h !ELSE copy /Y tsrc\sqlite3ext.h sqlite3ext.h + copy /B sqlite3ext.h +,, !ENDIF +sqlite3session.h: $(TOP)\ext\session\sqlite3session.h + copy /Y $(TOP)\ext\session\sqlite3session.h . + copy /B sqlite3session.h +,, + mkkeywordhash.exe: $(TOP)\tool\mkkeywordhash.c $(BCC) $(NO_WARN) -Fe$@ $(REQ_FEATURE_FLAGS) $(OPT_FEATURE_FLAGS) $(EXT_FEATURE_FLAGS) $(OPTS) \ $(TOP)\tool\mkkeywordhash.c /link $(LDFLAGS) $(NLTLINKOPTS) $(NLTLIBPATHS) @@ -2198,7 +2206,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\misc\uint.c \ $(TOP)\ext\expert\sqlite3expert.c \ $(TOP)\ext\expert\sqlite3expert.h \ $(TOP)\ext\misc\memtrace.c \ @@ -2329,7 +2337,8 @@ LSM1_SRC = \ $(TOP)\ext\lsm1\lsm_win32.c fts5parse.c: $(TOP)\ext\fts5\fts5parse.y lemon.exe - copy $(TOP)\ext\fts5\fts5parse.y . + copy /Y $(TOP)\ext\fts5\fts5parse.y . + copy /B fts5parse.y +,, del /Q fts5parse.h 2>NUL .\lemon.exe $(REQ_FEATURE_FLAGS) $(OPT_FEATURE_FLAGS) $(EXT_FEATURE_FLAGS) $(OPTS) -S fts5parse.y @@ -2337,11 +2346,13 @@ fts5parse.h: fts5parse.c fts5.c: $(FTS5_SRC) $(TCLSH_CMD) $(TOP)\ext\fts5\tool\mkfts5c.tcl - copy $(TOP)\ext\fts5\fts5.h . + copy /Y $(TOP)\ext\fts5\fts5.h . + copy /B fts5.h +,, lsm1.c: $(LSM1_SRC) $(TCLSH_CMD) $(TOP)\ext\lsm1\tool\mklsm1c.tcl - copy $(TOP)\ext\lsm1\lsm.h . + copy /Y $(TOP)\ext\lsm1\lsm.h . + copy /B lsm.h +,, fts5.lo: fts5.c $(HDR) $(EXTHDR) $(LTCOMPILE) $(CORE_COMPILE_OPTS) $(NO_WARN) -DSQLITE_CORE -c fts5.c diff --git a/manifest b/manifest index 1c917dad38..996c4868f7 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Remove\sa\sstray\s"&"\scharacter\sin\sthe\sCLI,\sdetected\sby\sa\sclang\swarning. -D 2020-05-29T20:16:19.429 +C Enhancements\sto\sthe\sincremental\sbuild\ssupport\sfor\sMSVC. +D 2020-05-29T21:06:52.599 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F Makefile.in 8d79d12bae1b624d32cf9a698ecc797bfa908ab7eabac5d76faf130c4d362223 F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc 708c6032842b4fa340a6af87e124c1563da82663fb5a74d4a2f5b2c0829b51e0 +F Makefile.msc 08268b28e97fce2475c4a9bd7ba84a99827d6cf9e6b46952409821f6a12ee46d F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a F VERSION 5db2ee2cfcc790af73775fa485c13b2e8ccaa5936c6e1f47aedeba7056041ca5 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -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 9924c0456bfcd2058c9620a93dfbfd4c7d960c68910ce6aed7364dff42baba5c -R 85938626fdde133bf2bbed9b50812696 -U drh -Z a7ec4245396908b4263f1a81f6c6a7ec +P 5865d2f2d0333024366ecf1d919535fd4ec05c637feff16d75028ccdc8db4b50 +R ea1f39211518f41f5c2b12c4cd8c40f2 +U mistachkin +Z 0c710e2dd8d54ec195365654b7322b90 diff --git a/manifest.uuid b/manifest.uuid index c182cd8037..fefbf02513 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5865d2f2d0333024366ecf1d919535fd4ec05c637feff16d75028ccdc8db4b50 \ No newline at end of file +2e25d915bcb8d6f1747f9befdef64d2e0e495cc6c5948a8eff5d0097b6613d06 \ No newline at end of file From e557b0155b1f0b70f95da0b8f1225e4d22e0d5c8 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 30 May 2020 00:30:08 +0000 Subject: [PATCH 124/224] Improved VDBE comments on the ANALYZE code generator. This change also fixes a harmless use of an uninitialized integer variable as an input to the %d format on a VDBE comment. FossilOrigin-Name: 1cb248a3fc4c35c5bc3993b554edcccaa5c5e91570af67ebb99643a15221ae33 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/analyze.c | 30 +++++++++++++++++++++++++++--- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 996c4868f7..c6b550a14b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhancements\sto\sthe\sincremental\sbuild\ssupport\sfor\sMSVC. -D 2020-05-29T21:06:52.599 +C Improved\sVDBE\scomments\son\sthe\sANALYZE\scode\sgenerator.\s\sThis\schange\nalso\sfixes\sa\sharmless\suse\sof\san\suninitialized\sinteger\svariable\sas\san\sinput\nto\sthe\s%d\sformat\son\sa\sVDBE\scomment. +D 2020-05-30T00:30:08.761 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 826bc4561456094cf758f095776026f25892a2bb3a7cd86742323267dc9bdb5f -F src/analyze.c 953a6c43870ccaf080597244e1eeb4dc2ff6cb84f9501b24e46323de36970b61 +F src/analyze.c 2c77bcbb8651ccced4a8cdaf8d997663813b2967787070fa26d0360de2ee4367 F src/attach.c ff2daea0fe62080192e3f262670e4f61f5a86c1e7bea9cec34e960fe79852aa1 F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c b1c90cd4110248c8e1273ff4578d3a84c0c34725e1b96dacd4a6294a908702de @@ -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 5865d2f2d0333024366ecf1d919535fd4ec05c637feff16d75028ccdc8db4b50 -R ea1f39211518f41f5c2b12c4cd8c40f2 -U mistachkin -Z 0c710e2dd8d54ec195365654b7322b90 +P 2e25d915bcb8d6f1747f9befdef64d2e0e495cc6c5948a8eff5d0097b6613d06 +R 2675b53bd7c59c171705e1753c06ddb1 +U drh +Z 4e29343ffa9662765735989ac396bab3 diff --git a/manifest.uuid b/manifest.uuid index fefbf02513..d73db9e650 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2e25d915bcb8d6f1747f9befdef64d2e0e495cc6c5948a8eff5d0097b6613d06 \ No newline at end of file +1cb248a3fc4c35c5bc3993b554edcccaa5c5e91570af67ebb99643a15221ae33 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index b2f030df09..76f8f818ab 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -951,6 +951,30 @@ static void callStatGet(Parse *pParse, int regStat, int iParam, int regOut){ &statGetFuncdef, 0); } +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS +/* Add a comment to the most recent VDBE opcode that is the name +** of the k-th column of the pIdx index. +*/ +static void analyzeVdbeCommentIndexWithColumnName( + Vdbe *v, /* Prepared statement under construction */ + Index *pIdx, /* Index whose column is being loaded */ + int k /* Which column index */ +){ + int i; /* Index of column in the table */ + assert( k>=0 && knColumn ); + i = pIdx->aiColumn[k]; + if( NEVER(i==XN_ROWID) ){ + VdbeComment((v,"%s.rowid",pIdx->zName)); + }else if( i==XN_EXPR ){ + VdbeComment((v,"%s.expr(%d)",pIdx->zName, k)); + }else{ + VdbeComment((v,"%s.%s", pIdx->zName, pIdx->pTable->aCol[i].zName)); + } +} +#else +# define analyzeVdbeCommentIndexWithColumnName(a,b,c) +#endif /* SQLITE_DEBUG */ + /* ** Generate code to do an analysis of all indices associated with ** a single table. @@ -1167,7 +1191,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)); + analyzeVdbeCommentIndexWithColumnName(v,pIdx,i); aGotoChng[i] = sqlite3VdbeAddOp4(v, OP_Ne, regTemp, 0, regPrev+i, pColl, P4_COLLSEQ); sqlite3VdbeChangeP5(v, SQLITE_NULLEQ); @@ -1188,7 +1212,7 @@ static void analyzeOneTable( for(i=0; izName, i)); + analyzeVdbeCommentIndexWithColumnName(v,pIdx,i); } sqlite3VdbeResolveLabel(v, endDistinctTest); sqlite3DbFree(db, aGotoChng); @@ -1214,7 +1238,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.column(%d)", pIdx->zName, i)); + analyzeVdbeCommentIndexWithColumnName(v,pIdx,k); } sqlite3VdbeAddOp3(v, OP_MakeRecord, regKey, pPk->nKeyCol, regRowid); sqlite3ReleaseTempRange(pParse, regKey, pPk->nKeyCol); From e566cebb26bc8c5be17200a215c6aec91c277c66 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 30 May 2020 15:34:49 +0000 Subject: [PATCH 125/224] Draw the dashes below the headers in "explain" mode in the CLI. FossilOrigin-Name: c6b7833ac7d9cc75cb45d5e8041367ebd6f197f776766e6143535c227fc72a20 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 5 +++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index c6b550a14b..59cc8715a6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sVDBE\scomments\son\sthe\sANALYZE\scode\sgenerator.\s\sThis\schange\nalso\sfixes\sa\sharmless\suse\sof\san\suninitialized\sinteger\svariable\sas\san\sinput\nto\sthe\s%d\sformat\son\sa\sVDBE\scomment. -D 2020-05-30T00:30:08.761 +C Draw\sthe\sdashes\sbelow\sthe\sheaders\sin\s"explain"\smode\sin\sthe\sCLI. +D 2020-05-30T15:34:49.222 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 c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in 1c47af1236007851fbded02bcdca020415f35e215cb161adbe2cf06f9ca70b99 +F src/shell.c.in 9c0e886561b9a9644a4134e29e4b7d08eb16690da47a9de6bea082183d527adf F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -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 2e25d915bcb8d6f1747f9befdef64d2e0e495cc6c5948a8eff5d0097b6613d06 -R 2675b53bd7c59c171705e1753c06ddb1 +P 1cb248a3fc4c35c5bc3993b554edcccaa5c5e91570af67ebb99643a15221ae33 +R 8b6d070d9470292acffd6f600425ba3f U drh -Z 4e29343ffa9662765735989ac396bab3 +Z 86932043c882c09459de0bf040004fa9 diff --git a/manifest.uuid b/manifest.uuid index d73db9e650..7a5d2249dd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1cb248a3fc4c35c5bc3993b554edcccaa5c5e91570af67ebb99643a15221ae33 \ No newline at end of file +c6b7833ac7d9cc75cb45d5e8041367ebd6f197f776766e6143535c227fc72a20 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 9ed0dda713..ca2b408e58 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1993,6 +1993,11 @@ static int shell_callback( utf8_width_print(p->out, w, azCol[i]); fputs(i==nArg-1 ? "\n" : " ", p->out); } + for(i=0; iout, w); + fputs(i==nArg-1 ? "\n" : " ", p->out); + } } if( azArg==0 ) break; for(i=0; i Date: Wed, 3 Jun 2020 03:00:09 +0000 Subject: [PATCH 126/224] Improve the query planner so that it is better able to find full index scan plan when there is an INDEXED BY clause. FossilOrigin-Name: d901837fea1ed54de43ad59eb47c02cbfd2eb215fc57317b5ea8c22a7df947c4 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/where.c | 2 ++ test/indexedby.test | 26 +++++++++++++------------- test/where9.test | 14 +++++++------- 5 files changed, 31 insertions(+), 29 deletions(-) diff --git a/manifest b/manifest index 59cc8715a6..c774d96b07 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Draw\sthe\sdashes\sbelow\sthe\sheaders\sin\s"explain"\smode\sin\sthe\sCLI. -D 2020-05-30T15:34:49.222 +C Improve\sthe\squery\splanner\sso\sthat\sit\sis\sbetter\sable\sto\sfind\sfull\nindex\sscan\splan\swhen\sthere\sis\san\sINDEXED\sBY\sclause. +D 2020-06-03T03:00:09.331 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -620,7 +620,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 04c3d2a673192016a671eb051a1900945a8c7331f4378636a8bfb70e8e596c84 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 3df26a33dc4f54e8771600fb7fdebe1ece0896c2ad68c30ab40b017aa4395049 -F src/where.c 9546c82056e8cdb27291f98cf1adca5d271240b399bb97b32f77fc2bea6146c9 +F src/where.c 7bcc07ff56d03d73308245135d96de46d2faeaee628bd4badf0bae60ae6a31fe F src/whereInt.h 6b874aa15f94e43a2cec1080be64d955b04deeafeac90ffb5d6975c0d511be3c F src/wherecode.c 7b939de85d65cc4b4bfa197513136b9e0ae03167e3b82842ca5a0ba1055ba65d F src/whereexpr.c 264d58971eaf8256eb5b0917bcd7fc7a1f1109fdda183a8382308a1b18a2dce7 @@ -1070,7 +1070,7 @@ F test/index6.test f172653b35b20233e59200e8b92a76db61bf7285437bf777b93b306ba26a4 F test/index7.test b8a0ba2110fd517bb48c4e76d26d60f1ab2ed9e257b18d71f820d7e71e9f8570 F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 -F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e +F test/indexedby.test f54aac21c06948872010a956fd02de5178c362c7785a9887cf0b8616be17883b F test/indexexpr1.test 284e119999d132cc8bf37735a928c9859b28e8e295d02b7a6a4f93977c7f9ba5 F test/indexexpr2.test dba11dbb0a58fcba4cd694f46b4004976123b81b0501f525d43c9be59f0207b1 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 @@ -1706,7 +1706,7 @@ F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2 F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b F test/where7.test 75722434c486ac9e74718caa6cce234f45ba34c0b6c0f9555b29eb8bb5f6ade1 F test/where8.test 461ca40265ed996a6305da99bb024b0e41602bb586acf544c08f95922358e49f -F test/where9.test 2c554b97bbdb2fdf26c57099f60db8a52bfcf7c147f2c256f9798fa0e267ca85 +F test/where9.test 8e3e0ff42cc17156f52361a1c012281550d0d632912fec92d1d6df74db7a8e6d F test/whereA.test 6c6a420ca7d313242f9b1bd471dc80e4d0f8323700ba9c78df0bb843d4daa3b4 F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5 F test/whereC.test cae295158703cb3fc23bf1a108a9ab730efff0f6 @@ -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 1cb248a3fc4c35c5bc3993b554edcccaa5c5e91570af67ebb99643a15221ae33 -R 8b6d070d9470292acffd6f600425ba3f +P c6b7833ac7d9cc75cb45d5e8041367ebd6f197f776766e6143535c227fc72a20 +R 952d1a55f39aa3fb3430db1783a8d16a U drh -Z 86932043c882c09459de0bf040004fa9 +Z 7e892dc73a9c345df1500a78da6d8191 diff --git a/manifest.uuid b/manifest.uuid index 7a5d2249dd..6e6181dfcb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c6b7833ac7d9cc75cb45d5e8041367ebd6f197f776766e6143535c227fc72a20 \ No newline at end of file +d901837fea1ed54de43ad59eb47c02cbfd2eb215fc57317b5ea8c22a7df947c4 \ No newline at end of file diff --git a/src/where.c b/src/where.c index ad309006d1..a7df4b9b80 100644 --- a/src/where.c +++ b/src/where.c @@ -3028,6 +3028,7 @@ static int whereLoopAddBtree( pNew->nOut = rSize; pNew->u.btree.pIndex = pProbe; b = indexMightHelpWithOrderBy(pBuilder, pProbe, pSrc->iCursor); + /* The ONEPASS_DESIRED flags never occurs together with ORDER BY */ assert( (pWInfo->wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || b==0 ); if( pProbe->idxType==SQLITE_IDXTYPE_IPK ){ @@ -3057,6 +3058,7 @@ static int whereLoopAddBtree( if( b || !HasRowid(pTab) || pProbe->pPartIdxWhere!=0 + || pSrc->fg.isIndexedBy || ( m==0 && pProbe->bUnordered==0 && (pProbe->szIdxRowszTabRow) diff --git a/test/indexedby.test b/test/indexedby.test index 8624b10c75..18f7bb8fa3 100644 --- a/test/indexedby.test +++ b/test/indexedby.test @@ -95,7 +95,7 @@ do_test indexedby-2.4 { # an error. do_test indexedby-2.4.1 { catchsql { SELECT b FROM t1 INDEXED BY i1 WHERE b = 'two' } -} {1 {no query solution}} +} {0 {}} do_test indexedby-2.5 { catchsql { SELECT * FROM t1 INDEXED BY i5 WHERE a = 'one' AND b = 'two'} @@ -135,10 +135,10 @@ do_eqp_test indexedby-3.3 { } {SEARCH TABLE t1 USING INDEX i2 (b=?)} do_test indexedby-3.4 { catchsql { SELECT * FROM t1 INDEXED BY i2 WHERE a = 'one' } -} {1 {no query solution}} +} {0 {}} do_test indexedby-3.5 { catchsql { SELECT * FROM t1 INDEXED BY i2 ORDER BY a } -} {1 {no query solution}} +} {0 {}} do_test indexedby-3.6 { catchsql { SELECT * FROM t1 INDEXED BY i1 WHERE a = 'one' } } {0 {}} @@ -154,7 +154,7 @@ do_eqp_test indexedby-3.9 { } {SEARCH TABLE t3 USING INDEX sqlite_autoindex_t3_1 (e=?)} do_test indexedby-3.10 { catchsql { SELECT * FROM t3 INDEXED BY sqlite_autoindex_t3_1 WHERE f = 10 } -} {1 {no query solution}} +} {0 {}} do_test indexedby-3.11 { catchsql { SELECT * FROM t3 INDEXED BY sqlite_autoindex_t3_2 WHERE f = 10 } } {1 {no such index: sqlite_autoindex_t3_2}} @@ -172,19 +172,19 @@ do_eqp_test indexedby-4.2 { SELECT * FROM t1 INDEXED BY i1, t2 WHERE a = c } { QUERY PLAN - |--SCAN TABLE t2 - `--SEARCH TABLE t1 USING INDEX i1 (a=?) + |--SCAN TABLE t1 USING INDEX i1 + `--SEARCH TABLE t2 USING INDEX i3 (c=?) } do_test indexedby-4.3 { catchsql { SELECT * FROM t1 INDEXED BY i1, t2 INDEXED BY i3 WHERE a=c } -} {1 {no query solution}} +} {0 {}} do_test indexedby-4.4 { catchsql { SELECT * FROM t2 INDEXED BY i3, t1 INDEXED BY i1 WHERE a=c } -} {1 {no query solution}} +} {0 {}} # Test embedding an INDEXED BY in a CREATE VIEW statement. This block # also tests that nothing bad happens if an index refered to by @@ -205,7 +205,7 @@ do_test indexedby-5.4 { # Recreate index i1 in such a way as it cannot be used by the view query. execsql { CREATE INDEX i1 ON t1(b) } catchsql { SELECT * FROM v2 } -} {1 {no query solution}} +} {0 {}} do_test indexedby-5.5 { # Drop and recreate index i1 again. This time, create it so that it can # be used by the query. @@ -245,7 +245,7 @@ do_eqp_test indexedby-7.5 { } {SEARCH TABLE t1 USING INDEX i2 (b=?)} do_test indexedby-7.6 { catchsql { DELETE FROM t1 INDEXED BY i2 WHERE a = 5} -} {1 {no query solution}} +} {0 {}} # Test that "INDEXED BY" can be used in an UPDATE statement. # @@ -266,7 +266,7 @@ do_eqp_test indexedby-8.5 { } {SEARCH TABLE t1 USING INDEX i2 (b=?)} do_test indexedby-8.6 { catchsql { UPDATE t1 INDEXED BY i2 SET rowid=rowid+1 WHERE a = 5} -} {1 {no query solution}} +} {0 {}} # Test that bug #3560 is fixed. # @@ -284,10 +284,10 @@ do_test indexedby-9.2 { joinme as j indexed by joinme_id_text_idx on ( m.id = j.id_int) } -} {1 {no query solution}} +} {0 {}} do_test indexedby-9.3 { catchsql { select * from maintable, joinme INDEXED by joinme_id_text_idx } -} {1 {no query solution}} +} {0 {}} # Make sure we can still create tables, indices, and columns whose name # is "indexed". diff --git a/test/where9.test b/test/where9.test index b274609364..0f770dfee8 100644 --- a/test/where9.test +++ b/test/where9.test @@ -426,7 +426,7 @@ do_test where9-4.5 { AND (c=31031 OR d IS NULL) ORDER BY +a } -} {1 {no query solution}} +} {0 {92 93 97}} do_test where9-4.6 { count_steps { SELECT a FROM t1 NOT INDEXED @@ -442,7 +442,7 @@ do_test where9-4.7 { AND (c=31031 OR d IS NULL) ORDER BY +a } -} {1 {no query solution}} +} {0 {92 93 97}} do_test where9-4.8 { catchsql { SELECT a FROM t1 INDEXED BY t1d @@ -450,7 +450,7 @@ do_test where9-4.8 { AND (c=31031 OR d IS NULL) ORDER BY +a } -} {1 {no query solution}} +} {0 {92 93 97}} # The (c=31031 OR d IS NULL) clause is preferred over b>1000 because # the former is an equality test which is expected to return fewer rows. @@ -776,7 +776,7 @@ do_test where9-6.8.1 { OR (b NOT NULL AND c IS NULL AND d NOT NULL) OR (b NOT NULL AND c NOT NULL AND d IS NULL) } -} {1 {no query solution}} +} {0 {}} do_test where9-6.8.2 { catchsql { UPDATE t1 INDEXED BY t1b SET a=a+100 @@ -784,7 +784,7 @@ do_test where9-6.8.2 { OR (b NOT NULL AND c IS NULL AND d NOT NULL) OR (b NOT NULL AND c NOT NULL AND d IS NULL) } -} {1 {no query solution}} +} {0 {}} set solution_possible 0 ifcapable stat4 { @@ -818,7 +818,7 @@ if $solution_possible { OR (b NOT NULL AND c IS NULL AND d NOT NULL) OR (b NOT NULL AND c NOT NULL AND d IS NULL) } - } {1 {no query solution}} + } {0 {}} do_test where9-6.8.4 { catchsql { DELETE FROM t1 INDEXED BY t1b @@ -826,7 +826,7 @@ if $solution_possible { OR (b NOT NULL AND c IS NULL AND d NOT NULL) OR (b NOT NULL AND c NOT NULL AND d IS NULL) } - } {1 {no query solution}} + } {0 {}} } ############################################################################ # Test cases where terms inside an OR series are combined with AND terms From 56f1873d10c220ab17b147b424afafbca04cae2c Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 3 Jun 2020 15:59:22 +0000 Subject: [PATCH 127/224] Simplification to the interrupt handling logic in sqlite3VdbeExec() saves a few bytes of code space. FossilOrigin-Name: 43e0e59bd4e34c6e88c004ea951c0d76ff1cf0a034389f490495a5d12e239382 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 4 +--- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index c774d96b07..b492a8f95b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\sthe\squery\splanner\sso\sthat\sit\sis\sbetter\sable\sto\sfind\sfull\nindex\sscan\splan\swhen\sthere\sis\san\sINDEXED\sBY\sclause. -D 2020-06-03T03:00:09.331 +C Simplification\sto\sthe\sinterrupt\shandling\slogic\sin\ssqlite3VdbeExec()\ssaves\na\sfew\sbytes\sof\scode\sspace. +D 2020-06-03T15:59:22.719 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -605,7 +605,7 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c d7a61c1dfdac3eb091d43341a674032dca5a34e122f78ef0b5bd2d5a31967dde F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 F src/vacuum.c de9780b89fa4ee74c3534f60b94820e3179aca759ffc1338ee53cb4ea7693dd3 -F src/vdbe.c e3dba0dee25bc92e871c13cac655260912b3be4abcc85b439259c9934b208da3 +F src/vdbe.c 0b58285c791c7a7e6131b83197c9d80b08d2c4492519b14bd582f40ff951d095 F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 F src/vdbeInt.h 571413068b5ac07e2ed8ca7a02fa529622fd5455ae6981498376e5e492d2e5ef F src/vdbeapi.c e467b75a710ea099f8d2d022abf601d2ccd05e28f63b44b12d93000b6a75f4a8 @@ -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 c6b7833ac7d9cc75cb45d5e8041367ebd6f197f776766e6143535c227fc72a20 -R 952d1a55f39aa3fb3430db1783a8d16a +P d901837fea1ed54de43ad59eb47c02cbfd2eb215fc57317b5ea8c22a7df947c4 +R 9a59f637e16d1db55166e5242085c5d1 U drh -Z 7e892dc73a9c345df1500a78da6d8191 +Z fa34faa1c48883dc3f1dada85dfce7a8 diff --git a/manifest.uuid b/manifest.uuid index 6e6181dfcb..787ee9eaf9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d901837fea1ed54de43ad59eb47c02cbfd2eb215fc57317b5ea8c22a7df947c4 \ No newline at end of file +43e0e59bd4e34c6e88c004ea951c0d76ff1cf0a034389f490495a5d12e239382 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index ce96439d1e..276c7979be 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -8015,8 +8015,6 @@ no_mem: */ abort_due_to_interrupt: assert( AtomicLoad(&db->u1.isInterrupted) ); - rc = db->mallocFailed ? SQLITE_NOMEM_BKPT : SQLITE_INTERRUPT; - p->rc = rc; - sqlite3VdbeError(p, "%s", sqlite3ErrStr(rc)); + rc = SQLITE_INTERRUPT; goto abort_due_to_error; } From a5f3fb3015e5195b7c124878adcc4439eca98236 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 3 Jun 2020 19:28:10 +0000 Subject: [PATCH 128/224] Fix for ticket [810dc8038872e212]. Thank to user "Maxulite" for tracking down the problem! FossilOrigin-Name: 89af93d77fa7959a4ee7364bae6c02c40963a3cdf80b0a4a8af9c9764d5c7bb5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index b492a8f95b..ce42902a3c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplification\sto\sthe\sinterrupt\shandling\slogic\sin\ssqlite3VdbeExec()\ssaves\na\sfew\sbytes\sof\scode\sspace. -D 2020-06-03T15:59:22.719 +C Fix\sfor\sticket\s[810dc8038872e212].\s\sThank\sto\suser\s"Maxulite"\sfor\stracking\ndown\sthe\sproblem! +D 2020-06-03T19:28:10.752 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -605,7 +605,7 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c d7a61c1dfdac3eb091d43341a674032dca5a34e122f78ef0b5bd2d5a31967dde F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 F src/vacuum.c de9780b89fa4ee74c3534f60b94820e3179aca759ffc1338ee53cb4ea7693dd3 -F src/vdbe.c 0b58285c791c7a7e6131b83197c9d80b08d2c4492519b14bd582f40ff951d095 +F src/vdbe.c a154f2785fbe4a1205944c647026445552ca3fa04ed1f313b05e614be205c061 F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 F src/vdbeInt.h 571413068b5ac07e2ed8ca7a02fa529622fd5455ae6981498376e5e492d2e5ef F src/vdbeapi.c e467b75a710ea099f8d2d022abf601d2ccd05e28f63b44b12d93000b6a75f4a8 @@ -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 d901837fea1ed54de43ad59eb47c02cbfd2eb215fc57317b5ea8c22a7df947c4 -R 9a59f637e16d1db55166e5242085c5d1 +P 43e0e59bd4e34c6e88c004ea951c0d76ff1cf0a034389f490495a5d12e239382 +R d117a58d0c795ef2086dc59d9f0ad01c U drh -Z fa34faa1c48883dc3f1dada85dfce7a8 +Z 631114b7aaeb4e0342cd2238d03bd056 diff --git a/manifest.uuid b/manifest.uuid index 787ee9eaf9..51a4ca0c33 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -43e0e59bd4e34c6e88c004ea951c0d76ff1cf0a034389f490495a5d12e239382 \ No newline at end of file +89af93d77fa7959a4ee7364bae6c02c40963a3cdf80b0a4a8af9c9764d5c7bb5 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 276c7979be..f26b64680b 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -702,6 +702,8 @@ int sqlite3VdbeExec( goto no_mem; } assert( p->rc==SQLITE_OK || (p->rc&0xff)==SQLITE_BUSY ); + testcase( p->rc!=SQLITE_OK ); + p->rc = SQLITE_OK; assert( p->bIsReader || p->readOnly!=0 ); p->iCurrentTime = 0; assert( p->explain==0 ); From 21b473de781e05c32cf609d3e7472730bca0aa08 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 4 Jun 2020 02:50:47 +0000 Subject: [PATCH 129/224] Work around a bug in clang-11.0.0. FossilOrigin-Name: 3c2bf8042ec46195c67dfd91df084f5bc19162fd26389920e716b310c80deea6 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/utf.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index ce42902a3c..755b3d647c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sfor\sticket\s[810dc8038872e212].\s\sThank\sto\suser\s"Maxulite"\sfor\stracking\ndown\sthe\sproblem! -D 2020-06-03T19:28:10.752 +C Work\saround\sa\sbug\sin\sclang-11.0.0. +D 2020-06-04T02:50:47.244 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -602,7 +602,7 @@ F src/treeview.c 9df54af6e5830fd527496e62ae0148e1ba33197205d8e232c2826537d42d406 F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04 F src/update.c 3199098455830fc2d8c8fc4ae3ec2ea513eef64339ae9a7048db62b21169bc7a F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 -F src/utf.c d7a61c1dfdac3eb091d43341a674032dca5a34e122f78ef0b5bd2d5a31967dde +F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 F src/vacuum.c de9780b89fa4ee74c3534f60b94820e3179aca759ffc1338ee53cb4ea7693dd3 F src/vdbe.c a154f2785fbe4a1205944c647026445552ca3fa04ed1f313b05e614be205c061 @@ -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 43e0e59bd4e34c6e88c004ea951c0d76ff1cf0a034389f490495a5d12e239382 -R d117a58d0c795ef2086dc59d9f0ad01c +P 89af93d77fa7959a4ee7364bae6c02c40963a3cdf80b0a4a8af9c9764d5c7bb5 +R 015d7b0bbb01693da2e969fcd700008e U drh -Z 631114b7aaeb4e0342cd2238d03bd056 +Z e60d8b817ea3e4ea751ceb5512848057 diff --git a/manifest.uuid b/manifest.uuid index 51a4ca0c33..d498a3e122 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -89af93d77fa7959a4ee7364bae6c02c40963a3cdf80b0a4a8af9c9764d5c7bb5 \ No newline at end of file +3c2bf8042ec46195c67dfd91df084f5bc19162fd26389920e716b310c80deea6 \ No newline at end of file diff --git a/src/utf.c b/src/utf.c index 3a2becfbcc..5f27babdfc 100644 --- a/src/utf.c +++ b/src/utf.c @@ -342,9 +342,9 @@ SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){ *z = 0; assert( (pMem->n+(desiredEnc==SQLITE_UTF8?1:2))<=len ); - c = pMem->flags; + c = MEM_Str|MEM_Term|(pMem->flags&(MEM_AffMask|MEM_Subtype)); sqlite3VdbeMemRelease(pMem); - pMem->flags = MEM_Str|MEM_Term|(c&(MEM_AffMask|MEM_Subtype)); + pMem->flags = c; pMem->enc = desiredEnc; pMem->z = (char*)zOut; pMem->zMalloc = pMem->z; From ec206a7d34c7fc36c71087d0eb3ac9cb8cb4a59b Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 4 Jun 2020 16:07:51 +0000 Subject: [PATCH 130/224] Use AtomicStore() to set values in the wal-index hash table. FossilOrigin-Name: 1ab30c75f2fe14d1ee77d0eace4e29ba8f805d63e2da0897b111ea1311f409aa --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wal.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 755b3d647c..352bef62bf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Work\saround\sa\sbug\sin\sclang-11.0.0. -D 2020-06-04T02:50:47.244 +C Use\sAtomicStore()\sto\sset\svalues\sin\sthe\swal-index\shash\stable. +D 2020-06-04T16:07:51.338 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 ee5b4c902fdda2230f9503ac7b84c6d614c91e8f6f4dc1633e2e8dfef8ffb144 F src/vtab.c 7b452592ed2ee95dedb1f323d557cebede5a6f3b4558b21a5dca527e6ae9b12c F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 04c3d2a673192016a671eb051a1900945a8c7331f4378636a8bfb70e8e596c84 +F src/wal.c 231044ecf7d5d78bc705af9dcec6c10ec59e891366362b6be54bb6a0bc7c17db F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 3df26a33dc4f54e8771600fb7fdebe1ece0896c2ad68c30ab40b017aa4395049 F src/where.c 7bcc07ff56d03d73308245135d96de46d2faeaee628bd4badf0bae60ae6a31fe @@ -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 89af93d77fa7959a4ee7364bae6c02c40963a3cdf80b0a4a8af9c9764d5c7bb5 -R 015d7b0bbb01693da2e969fcd700008e -U drh -Z e60d8b817ea3e4ea751ceb5512848057 +P 3c2bf8042ec46195c67dfd91df084f5bc19162fd26389920e716b310c80deea6 +R abb5e2a6f69eedf6a5a3f76fdbc7fd1a +U dan +Z ec12bc606d4dba66db05b4caac700c1f diff --git a/manifest.uuid b/manifest.uuid index d498a3e122..3e9e59cbde 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3c2bf8042ec46195c67dfd91df084f5bc19162fd26389920e716b310c80deea6 \ No newline at end of file +1ab30c75f2fe14d1ee77d0eace4e29ba8f805d63e2da0897b111ea1311f409aa \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index 52087e1296..c6d4476e7b 100644 --- a/src/wal.c +++ b/src/wal.c @@ -1096,7 +1096,7 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){ if( (nCollide--)==0 ) return SQLITE_CORRUPT_BKPT; } sLoc.aPgno[idx] = iPage; - sLoc.aHash[iKey] = (ht_slot)idx; + AtomicStore(&sLoc.aHash[iKey], (ht_slot)idx); #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT /* Verify that the number of entries in the hash table exactly equals From b55389412fbce88965cc897ff25630527fa8db30 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 4 Jun 2020 16:34:49 +0000 Subject: [PATCH 131/224] Use __has_extension(c_atomic) instead of __has_feature(c_atomic) to detect support for atomic load and store operations with clang. FossilOrigin-Name: 362255791f8801e0d9869e36239b8b2cb29c38bf0b86894bd2d159ce46d8447e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqliteInt.h | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 352bef62bf..7e6a1fc4d7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sAtomicStore()\sto\sset\svalues\sin\sthe\swal-index\shash\stable. -D 2020-06-04T16:07:51.338 +C Use\s__has_extension(c_atomic)\sinstead\sof\s__has_feature(c_atomic)\sto\sdetect\ssupport\sfor\satomic\sload\sand\sstore\soperations\swith\sclang. +D 2020-06-04T16:34:49.514 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -538,7 +538,7 @@ F src/shell.c.in 9c0e886561b9a9644a4134e29e4b7d08eb16690da47a9de6bea082183d527ad F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h 37f74544c8e2f59a16d1b13e6847bc02fb3fcbbfae4d6e6342c7a94c3a3984a5 +F src/sqliteInt.h f5e422635c089adf60260e1947ecfaf68dd333bda20c2afdd60323357d8540a0 F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -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 3c2bf8042ec46195c67dfd91df084f5bc19162fd26389920e716b310c80deea6 -R abb5e2a6f69eedf6a5a3f76fdbc7fd1a +P 1ab30c75f2fe14d1ee77d0eace4e29ba8f805d63e2da0897b111ea1311f409aa +R 2523b78414a8ebd8b46ab8adc56999f4 U dan -Z ec12bc606d4dba66db05b4caac700c1f +Z 865312b054fec1ad1eb5fd8a39501f1b diff --git a/manifest.uuid b/manifest.uuid index 3e9e59cbde..b99e055ff3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1ab30c75f2fe14d1ee77d0eace4e29ba8f805d63e2da0897b111ea1311f409aa \ No newline at end of file +362255791f8801e0d9869e36239b8b2cb29c38bf0b86894bd2d159ce46d8447e \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 122e26ad73..e37ed673af 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -190,10 +190,10 @@ ** WAL mode depends on atomic aligned 32-bit loads and stores in a few ** places. The following macros try to make this explicit. */ -#ifndef __has_feature -# define __has_feature(x) 0 /* compatibility with non-clang compilers */ +#ifndef __has_extension +# define __has_extension(x) 0 /* compatibility with non-clang compilers */ #endif -#if GCC_VERSION>=4007000 || __has_feature(c_atomic) +#if GCC_VERSION>=4007000 || __has_extension(c_atomic) # define AtomicLoad(PTR) __atomic_load_n((PTR),__ATOMIC_RELAXED) # define AtomicStore(PTR,VAL) __atomic_store_n((PTR),(VAL),__ATOMIC_RELAXED) #else From 634af38115702866491380736bcebc571c623507 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 4 Jun 2020 16:54:10 +0000 Subject: [PATCH 132/224] Improved display of ".mode table" output for empty result sets. FossilOrigin-Name: 7efabd683b79743b407ad71dda56db00fb0d668828bdc342145816b4f1c3bf3a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 4 ++++ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 7e6a1fc4d7..d3d3f40fed 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\s__has_extension(c_atomic)\sinstead\sof\s__has_feature(c_atomic)\sto\sdetect\ssupport\sfor\satomic\sload\sand\sstore\soperations\swith\sclang. -D 2020-06-04T16:34:49.514 +C Improved\sdisplay\sof\s".mode\stable"\soutput\sfor\sempty\sresult\ssets. +D 2020-06-04T16:54:10.263 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 c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in 9c0e886561b9a9644a4134e29e4b7d08eb16690da47a9de6bea082183d527adf +F src/shell.c.in b8fd54e80021c9aed59c4f8ef7d8a68167aea3b2c5f8cc80e6ca373fb146cdba F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -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 1ab30c75f2fe14d1ee77d0eace4e29ba8f805d63e2da0897b111ea1311f409aa -R 2523b78414a8ebd8b46ab8adc56999f4 -U dan -Z 865312b054fec1ad1eb5fd8a39501f1b +P 362255791f8801e0d9869e36239b8b2cb29c38bf0b86894bd2d159ce46d8447e +R e25e15e7d406e657ad2786c9bbcb9942 +U drh +Z acf5bed5cb288b39151d44a020264134 diff --git a/manifest.uuid b/manifest.uuid index b99e055ff3..ba2429e47f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -362255791f8801e0d9869e36239b8b2cb29c38bf0b86894bd2d159ce46d8447e \ No newline at end of file +7efabd683b79743b407ad71dda56db00fb0d668828bdc342145816b4f1c3bf3a \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index ca2b408e58..bd78165e6b 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -2978,6 +2978,10 @@ static void exec_prepared_stmt_columnar( sqlite3_free_table(azData); return; } + if( nRow==0 || nColumn==0 ){ + sqlite3_free_table(azData); + return; + } if( nColumn>p->nWidth ){ p->colWidth = realloc(p->colWidth, nColumn*2*sizeof(int)); if( p->colWidth==0 ) shell_out_of_memory(); From 0908e3853675b41f3070bb8178e51a7b4f2f844e Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 4 Jun 2020 18:05:39 +0000 Subject: [PATCH 133/224] Add support for "box" mode in the CLI: Like "table" except that it uses unicode box-drawing characters instead of ascii-art. FossilOrigin-Name: 6da784c9e174744d6deeb76c553b515b96c1fcb80c55a281e476959ec680fb72 --- manifest | 14 ++-- manifest.uuid | 2 +- src/shell.c.in | 185 ++++++++++++++++++++++++++++++++++++++--------- test/shell1.test | 12 +-- 4 files changed, 164 insertions(+), 49 deletions(-) diff --git a/manifest b/manifest index d3d3f40fed..e3723f551c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sdisplay\sof\s".mode\stable"\soutput\sfor\sempty\sresult\ssets. -D 2020-06-04T16:54:10.263 +C Add\ssupport\sfor\s"box"\smode\sin\sthe\sCLI:\s\sLike\s"table"\sexcept\sthat\sit\suses\nunicode\sbox-drawing\scharacters\sinstead\sof\sascii-art. +D 2020-06-04T18:05:39.066 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 c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in b8fd54e80021c9aed59c4f8ef7d8a68167aea3b2c5f8cc80e6ca373fb146cdba +F src/shell.c.in 6f7ea57d3f15e7e6a1f7049b6b7e39589dd5fe114e8de034ae9a68bf7722fd40 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1338,7 +1338,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 1c4713ccec468f9300100d5e1419b414b8dcccc742978ad8942e8bd31d2adc9c +F test/shell1.test fabf21eea2c6bb04dd86dfc7441c7c14841b25e2540c1fffeae815e718625bcc F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b F test/shell3.test ac8c2b744014c3e9a0e26bfd829ab65f00923dc1a91ffd044863e9423cc91494 F test/shell4.test 1c6aef11daaa2d6830acaba3ac9cbec93fbc1c3d5530743a637f39b3987d08ce @@ -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 362255791f8801e0d9869e36239b8b2cb29c38bf0b86894bd2d159ce46d8447e -R e25e15e7d406e657ad2786c9bbcb9942 +P 7efabd683b79743b407ad71dda56db00fb0d668828bdc342145816b4f1c3bf3a +R 3dac6f750121e41150b03b7c089ed222 U drh -Z acf5bed5cb288b39151d44a020264134 +Z e00f940b0330d0b11d881b13cbeefb56 diff --git a/manifest.uuid b/manifest.uuid index ba2429e47f..93e7eee675 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7efabd683b79743b407ad71dda56db00fb0d668828bdc342145816b4f1c3bf3a \ No newline at end of file +6da784c9e174744d6deeb76c553b515b96c1fcb80c55a281e476959ec680fb72 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index bd78165e6b..e46188e4ec 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1194,6 +1194,7 @@ struct ShellState { #define MODE_Json 13 /* Output JSON */ #define MODE_Markdown 14 /* Markdown formatting */ #define MODE_Table 15 /* MySQL-style table formatting */ +#define MODE_Box 16 /* Unicode box-drawing characters */ static const char *modeDescr[] = { "line", @@ -1211,7 +1212,8 @@ static const char *modeDescr[] = { "eqp", "json", "markdown", - "table" + "table", + "box" }; /* @@ -1936,7 +1938,7 @@ static void print_dashes(FILE *out, int N){ } /* -** Print a markdown or table-style row separator +** Print a markdown or table-style row separator using ascii-art */ static void print_row_separator( ShellState *p, @@ -1944,11 +1946,15 @@ static void print_row_separator( const char *zSep ){ int i; - for(i=0; i0 ){ + fputs(zSep, p->out); + print_dashes(p->out, p->actualWidth[0]+2); + for(i=1; iout); + print_dashes(p->out, p->actualWidth[i]+2); + } fputs(zSep, p->out); - print_dashes(p->out, p->actualWidth[i]+2); } - fputs(zSep, p->out); fputs("\n", p->out); } @@ -2947,9 +2953,76 @@ static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){ sqlite3_finalize(pQ); } +/* +** UTF8 box-drawing characters. Imagine box lines like this: +** +** 1 +** | +** 4 --+-- 2 +** | +** 3 +** +** Each box characters has between 2 and 4 of the lines leading from +** the center. The characters are here identified by the numbers of +** their corresponding lines. +*/ +#define BOX_24 "\342\224\200" /* U+2500 --- */ +#define BOX_13 "\342\224\202" /* U+2502 | */ +#define BOX_23 "\342\224\214" /* U+250c ,- */ +#define BOX_34 "\342\224\220" /* U+2510 -, */ +#define BOX_12 "\342\224\224" /* U+2514 '- */ +#define BOX_14 "\342\224\230" /* U+2518 -' */ +#define BOX_123 "\342\224\234" /* U+251c |- */ +#define BOX_134 "\342\224\244" /* U+2524 -| */ +#define BOX_234 "\342\224\254" /* U+252c -,- */ +#define BOX_124 "\342\224\264" /* U+2534 -'- */ +#define BOX_1234 "\342\224\274" /* U+253c -|- */ + +/* Draw horizontal line N characters long using unicode box +** characters +*/ +static void print_box_line(FILE *out, int N){ + const char zDash[] = + BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 + BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24; + const int nDash = sizeof(zDash) - 1; + N *= 3; + while( N>nDash ){ + utf8_printf(out, zDash); + N -= nDash; + } + utf8_printf(out, "%.*s", N, zDash); +} + +/* +** Draw a horizontal separator for a MODE_Box table. +*/ +static void print_box_row_separator( + ShellState *p, + int nArg, + const char *zSep1, + const char *zSep2, + const char *zSep3 +){ + int i; + if( nArg>0 ){ + utf8_printf(p->out, "%s", zSep1); + print_box_line(p->out, p->actualWidth[0]+2); + for(i=1; iout, "%s", zSep2); + print_box_line(p->out, p->actualWidth[i]+2); + } + utf8_printf(p->out, "%s", zSep3); + } + fputs("\n", p->out); +} + + + /* ** Run a prepared statement and output the result in one of the -** table-oriented formats: MODE_Column, MODE_Markdown, or MODE_Table. +** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table, +** or MODE_Box. ** ** This is different from ordinary exec_prepared_stmt() in that ** it has to run the entire query and gather the results into memory @@ -2967,8 +3040,8 @@ static void exec_prepared_stmt_columnar( const char *z; int rc; int i, j, nTotal, w, n; - const char *colSep; - const char *rowSep; + const char *colSep = 0; + const char *rowSep = 0; rc = sqlite3_get_table(p->db, sqlite3_sql(pStmt), &azData, &nRow, &nColumn, &zMsg); @@ -3003,50 +3076,87 @@ static void exec_prepared_stmt_columnar( j = i%nColumn; if( n>p->actualWidth[j] ) p->actualWidth[j] = n; } - if( p->cMode==MODE_Column ){ - colSep = " "; - rowSep = "\n"; - if( p->showHeader ){ + switch( p->cMode ){ + case MODE_Column: { + colSep = " "; + rowSep = "\n"; + if( p->showHeader ){ + for(i=0; iactualWidth[i]; + if( p->colWidth[i]<0 ) w = -w; + utf8_width_print(p->out, w, azData[i]); + fputs(i==nColumn-1?"\n":" ", p->out); + } + for(i=0; iout, p->actualWidth[i]); + fputs(i==nColumn-1?"\n":" ", p->out); + } + } + break; + } + case MODE_Table: { + colSep = " | "; + rowSep = " |\n"; + print_row_separator(p, nColumn, "+"); + fputs("| ", p->out); for(i=0; iactualWidth[i]; - if( p->colWidth[i]<0 ) w = -w; - utf8_width_print(p->out, w, azData[i]); - fputs(i==nColumn-1?"\n":" ", p->out); + n = strlenChar(azData[i]); + utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); + fputs(i==nColumn-1?" |\n":" | ", p->out); } + print_row_separator(p, nColumn, "+"); + break; + } + case MODE_Markdown: { + colSep = " | "; + rowSep = " |\n"; + fputs("| ", p->out); for(i=0; iout, p->actualWidth[i]); - fputs(i==nColumn-1?"\n":" ", p->out); + w = p->actualWidth[i]; + n = strlenChar(azData[i]); + utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); + fputs(i==nColumn-1?" |\n":" | ", p->out); } + print_row_separator(p, nColumn, "|"); + break; } - }else{ - colSep = " | "; - rowSep = " |\n"; - if( p->cMode==MODE_Table ) print_row_separator(p, nColumn, "+"); - fputs("| ", p->out); - for(i=0; iactualWidth[i]; - n = strlenChar(azData[i]); - utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); - fputs(i==nColumn-1?" |\n":" | ", p->out); + case MODE_Box: { + colSep = " " BOX_13 " "; + rowSep = " " BOX_13 "\n"; + print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34); + utf8_printf(p->out, BOX_13 " "); + for(i=0; iactualWidth[i]; + n = strlenChar(azData[i]); + utf8_printf(p->out, "%*s%s%*s%s", + (w-n)/2, "", azData[i], (w-n+1)/2, "", + i==nColumn-1?" "BOX_13"\n":" "BOX_13" "); + } + print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134); + break; } - print_row_separator(p, nColumn, p->cMode==MODE_Table ? "+" : "|"); } for(i=nColumn, j=0; icMode!=MODE_Column ) fputs("| ", p->out); + if( j==0 && p->cMode!=MODE_Column ){ + utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| "); + } z = azData[i]; if( z==0 ) z = p->nullValue; w = p->actualWidth[j]; if( p->colWidth[j]<0 ) w = -w; utf8_width_print(p->out, w, z); if( j==nColumn-1 ){ - fputs(rowSep, p->out); + utf8_printf(p->out, "%s", rowSep); j = -1; }else{ - fputs(colSep, p->out); + utf8_printf(p->out, "%s", colSep); } } if( p->cMode==MODE_Table ){ print_row_separator(p, nColumn, "+"); + }else if( p->cMode==MODE_Box ){ + print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14); } sqlite3_free_table(azData); } @@ -3062,6 +3172,7 @@ static void exec_prepared_stmt( if( pArg->cMode==MODE_Column || pArg->cMode==MODE_Table + || pArg->cMode==MODE_Box || pArg->cMode==MODE_Markdown ){ exec_prepared_stmt_columnar(pArg, pStmt); @@ -3115,9 +3226,7 @@ static void exec_prepared_stmt( } } while( SQLITE_ROW == rc ); sqlite3_free(pData); - if( pArg->cMode==MODE_Table ){ - print_row_separator(pArg, nCol, "+"); - }else if( pArg->cMode==MODE_Json ){ + if( pArg->cMode==MODE_Json ){ fputs("]\n", pArg->out); } } @@ -3801,6 +3910,7 @@ static const char *(azHelp[]) = { ".mode MODE ?TABLE? Set output mode", " MODE is one of:", " ascii Columns/rows delimited by 0x1F and 0x1E", + " box Tables using unicode box-drawing characters", " csv Comma-separated values", " column Output in columns. (See .width)", " html HTML
    code", @@ -8414,13 +8524,15 @@ static int do_meta_command(char *zLine, ShellState *p){ p->mode = MODE_Markdown; }else if( c2=='t' && strncmp(azArg[1],"table",n2)==0 ){ p->mode = MODE_Table; + }else if( c2=='b' && strncmp(azArg[1],"box",n2)==0 ){ + p->mode = MODE_Box; }else if( c2=='j' && strncmp(azArg[1],"json",n2)==0 ){ p->mode = MODE_Json; }else if( nArg==1 ){ raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]); }else{ raw_printf(stderr, "Error: mode should be one of: " - "ascii column csv html insert json line list markdown " + "ascii box column csv html insert json line list markdown " "quote table tabs tcl\n"); rc = 1; } @@ -10420,6 +10532,7 @@ static const char zOptions[] = " -ascii set output mode to 'ascii'\n" " -bail stop after hitting an error\n" " -batch force batch I/O\n" + " -box set output mode to 'box'\n" " -column set output mode to 'column'\n" " -cmd COMMAND run \"COMMAND\" before reading stdin\n" " -csv set output mode to 'csv'\n" @@ -10867,6 +10980,8 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ data.mode = MODE_Markdown; }else if( strcmp(z,"-table")==0 ){ data.mode = MODE_Table; + }else if( strcmp(z,"-box")==0 ){ + data.mode = MODE_Box; }else if( strcmp(z,"-csv")==0 ){ data.mode = MODE_Csv; memcpy(data.colSeparator,",",2); diff --git a/test/shell1.test b/test/shell1.test index a900dc3e1d..b08e111804 100644 --- a/test/shell1.test +++ b/test/shell1.test @@ -199,10 +199,10 @@ do_test shell1-2.2.4 { } {0 {}} do_test shell1-2.2.5 { catchcmd "test.db" ".mode \"insert FOO" -} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} +} {1 {Error: mode should be one of: ascii box column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-2.2.6 { catchcmd "test.db" ".mode \'insert FOO" -} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} +} {1 {Error: mode should be one of: ascii box column csv html insert json line list markdown quote table tabs tcl}} # check multiple tokens, and quoted tokens do_test shell1-2.3.1 { @@ -230,7 +230,7 @@ do_test shell1-2.3.7 { # check quoted args are unquoted do_test shell1-2.4.1 { catchcmd "test.db" ".mode FOO" -} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} +} {1 {Error: mode should be one of: ascii box column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-2.4.2 { catchcmd "test.db" ".mode csv" } {0 {}} @@ -430,7 +430,7 @@ do_test shell1-3.13.1 { } {0 {current output mode: list}} do_test shell1-3.13.2 { catchcmd "test.db" ".mode FOO" -} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} +} {1 {Error: mode should be one of: ascii box column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-3.13.3 { catchcmd "test.db" ".mode csv" } {0 {}} @@ -463,10 +463,10 @@ do_test shell1-3.13.11 { # don't allow partial mode type matches do_test shell1-3.13.12 { catchcmd "test.db" ".mode l" -} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} +} {1 {Error: mode should be one of: ascii box column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-3.13.13 { catchcmd "test.db" ".mode li" -} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} +} {1 {Error: mode should be one of: ascii box column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-3.13.14 { catchcmd "test.db" ".mode lin" } {0 {}} From c06050844565a59ca3c11f09c3ffecf1d609fd9b Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 5 Jun 2020 00:54:27 +0000 Subject: [PATCH 134/224] Always use ?...? to indicate optional arguments in the output of ".help" in the CLI. Change ".mode column" so that it automatically activates ".headers on" if headers have not been previously turned on or off. FossilOrigin-Name: 2827c0a186596299e43eb3e7378eea462d2b060b2c3388ce5cb2bc8e0b43999e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 7 ++++++- test/shell1.test | 4 ++-- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index e3723f551c..c60045179c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\ssupport\sfor\s"box"\smode\sin\sthe\sCLI:\s\sLike\s"table"\sexcept\sthat\sit\suses\nunicode\sbox-drawing\scharacters\sinstead\sof\sascii-art. -D 2020-06-04T18:05:39.066 +C Always\suse\s?...?\sto\sindicate\soptional\sarguments\sin\sthe\soutput\sof\s".help"\nin\sthe\sCLI.\s\sChange\s".mode\scolumn"\sso\sthat\sit\sautomatically\sactivates\n".headers\son"\sif\sheaders\shave\snot\sbeen\spreviously\sturned\son\sor\soff. +D 2020-06-05T00:54:27.575 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 c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in 6f7ea57d3f15e7e6a1f7049b6b7e39589dd5fe114e8de034ae9a68bf7722fd40 +F src/shell.c.in c6e26593f2738eefded08a39204bf6b48db135cdfaa458c26ffe57055b4fe365 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1338,7 +1338,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 fabf21eea2c6bb04dd86dfc7441c7c14841b25e2540c1fffeae815e718625bcc +F test/shell1.test a1cf47c5e110560ff25a714570bfd53bfaceeb61db5cad3072a4064f17ebd10e F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b F test/shell3.test ac8c2b744014c3e9a0e26bfd829ab65f00923dc1a91ffd044863e9423cc91494 F test/shell4.test 1c6aef11daaa2d6830acaba3ac9cbec93fbc1c3d5530743a637f39b3987d08ce @@ -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 7efabd683b79743b407ad71dda56db00fb0d668828bdc342145816b4f1c3bf3a -R 3dac6f750121e41150b03b7c089ed222 +P 6da784c9e174744d6deeb76c553b515b96c1fcb80c55a281e476959ec680fb72 +R 969ac1a40c6ff55758c13b258f83a246 U drh -Z e00f940b0330d0b11d881b13cbeefb56 +Z 0d6660a390bea97335acfad3a03d0eb7 diff --git a/manifest.uuid b/manifest.uuid index 93e7eee675..dd798eb824 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6da784c9e174744d6deeb76c553b515b96c1fcb80c55a281e476959ec680fb72 \ No newline at end of file +2827c0a186596299e43eb3e7378eea462d2b060b2c3388ce5cb2bc8e0b43999e \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index e46188e4ec..d1b1203ebe 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1167,6 +1167,7 @@ struct ShellState { #define SHFLG_Newlines 0x00000010 /* .dump --newline flag */ #define SHFLG_CountChanges 0x00000020 /* .changes setting */ #define SHFLG_Echo 0x00000040 /* .echo or --echo setting */ +#define SHFLG_HeaderSet 0x00000080 /* .header has been used */ /* ** Macros for testing and setting shellFlgs @@ -3930,7 +3931,7 @@ static const char *(azHelp[]) = { " -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", + ".oom ?--repeat M? ?N? Simulate an OOM error on the N-th allocation", #endif ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE", " Options:", @@ -7969,6 +7970,7 @@ static int do_meta_command(char *zLine, ShellState *p){ if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){ if( nArg==2 ){ p->showHeader = booleanValue(azArg[1]); + p->shellFlgs |= SHFLG_HeaderSet; }else{ raw_printf(stderr, "Usage: .headers on|off\n"); rc = 1; @@ -8491,6 +8493,9 @@ static int do_meta_command(char *zLine, ShellState *p){ sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){ p->mode = MODE_Column; + if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){ + p->showHeader = 1; + } sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){ p->mode = MODE_List; diff --git a/test/shell1.test b/test/shell1.test index b08e111804..49af3aa35d 100644 --- a/test/shell1.test +++ b/test/shell1.test @@ -709,11 +709,11 @@ do_test shell1-3.26.4 { # this should be treated the same as a '1' width for col 1 and 2 } {0 {}} do_test shell1-3.26.5 { - catchcmd "test.db" ".mode column\n.width 10 -10\nSELECT 'abcdefg', 123456;" + catchcmd "test.db" ".mode column\n.header off\n.width 10 -10\nSELECT 'abcdefg', 123456;" # this should be treated the same as a '1' width for col 1 and 2 } {0 {abcdefg 123456}} do_test shell1-3.26.6 { - catchcmd "test.db" ".mode column\n.width -10 10\nSELECT 'abcdefg', 123456;" + catchcmd "test.db" ".mode column\n.header off\n.width -10 10\nSELECT 'abcdefg', 123456;" # this should be treated the same as a '1' width for col 1 and 2 } {0 { abcdefg 123456 }} From a0365c487c1267af6d3ab101399c6fa35f5184a3 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 5 Jun 2020 04:01:50 +0000 Subject: [PATCH 135/224] In the debugging treeview output, change the name of "SELECT-expr" expression nodes to be "subquery-expr", so as to not confuse them with actual SELECT nodes. FossilOrigin-Name: c1c8937a30feff6aa4385b0c264fd8e70d54422a0629c2ce38082d85d3334a57 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/treeview.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c60045179c..ca4608031d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Always\suse\s?...?\sto\sindicate\soptional\sarguments\sin\sthe\soutput\sof\s".help"\nin\sthe\sCLI.\s\sChange\s".mode\scolumn"\sso\sthat\sit\sautomatically\sactivates\n".headers\son"\sif\sheaders\shave\snot\sbeen\spreviously\sturned\son\sor\soff. -D 2020-06-05T00:54:27.575 +C In\sthe\sdebugging\streeview\soutput,\schange\sthe\sname\sof\s"SELECT-expr"\sexpression\nnodes\sto\sbe\s"subquery-expr",\sso\sas\sto\snot\sconfuse\sthem\swith\sactual\sSELECT\nnodes. +D 2020-06-05T04:01:50.831 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -598,7 +598,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c eee7bae3ec0bc4abee951554bf46a8ba567c0f7752ac90c820ed8afff4c612dc -F src/treeview.c 9df54af6e5830fd527496e62ae0148e1ba33197205d8e232c2826537d42d4063 +F src/treeview.c c5691babcd558baa136474b57a4aede45cf68daa3ed6637b981dde4b256e5b67 F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04 F src/update.c 3199098455830fc2d8c8fc4ae3ec2ea513eef64339ae9a7048db62b21169bc7a F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 @@ -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 6da784c9e174744d6deeb76c553b515b96c1fcb80c55a281e476959ec680fb72 -R 969ac1a40c6ff55758c13b258f83a246 +P 2827c0a186596299e43eb3e7378eea462d2b060b2c3388ce5cb2bc8e0b43999e +R ee30fc3f51275fe44c86656d5c06c7d7 U drh -Z 0d6660a390bea97335acfad3a03d0eb7 +Z bb7b42e3c07b2ab8975730fed03b093c diff --git a/manifest.uuid b/manifest.uuid index dd798eb824..5c9bd2c32c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2827c0a186596299e43eb3e7378eea462d2b060b2c3388ce5cb2bc8e0b43999e \ No newline at end of file +c1c8937a30feff6aa4385b0c264fd8e70d54422a0629c2ce38082d85d3334a57 \ No newline at end of file diff --git a/src/treeview.c b/src/treeview.c index f167e588cd..8ae06261ea 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -616,7 +616,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ break; } case TK_SELECT: { - sqlite3TreeViewLine(pView, "SELECT-expr flags=0x%x", pExpr->flags); + sqlite3TreeViewLine(pView, "subquery-expr flags=0x%x", pExpr->flags); sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); break; } From 896366282dae3789fb277c2dad8660784a0895a3 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 7 Jun 2020 17:33:18 +0000 Subject: [PATCH 136/224] Alternative fix to ticket [c8d3b9f0a750a529]: Prior to deleting or modifying an Expr not that is referenced by an AggInfo, modify the AggInfo to get its own copy of the original Expr. FossilOrigin-Name: 7682d8a768fbccfe0cc956e9f6481637146e1ab9763b248ff11052761ce32e32 --- manifest | 27 +++++---- manifest.uuid | 2 +- src/build.c | 13 ++++- src/expr.c | 62 ++++++++++++++++++++- src/select.c | 37 ++++++++++++- src/sqliteInt.h | 17 ++++-- src/window.c | 5 +- test/fuzzdata8.db | Bin 1492992 -> 1495040 bytes test/window1.test | 136 ++++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 276 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index ca4608031d..5c9f7982ab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sdebugging\streeview\soutput,\schange\sthe\sname\sof\s"SELECT-expr"\sexpression\nnodes\sto\sbe\s"subquery-expr",\sso\sas\sto\snot\sconfuse\sthem\swith\sactual\sSELECT\nnodes. -D 2020-06-05T04:01:50.831 +C Alternative\sfix\sto\sticket\s[c8d3b9f0a750a529]:\s\sPrior\sto\sdeleting\sor\smodifying\nan\sExpr\snot\sthat\sis\sreferenced\sby\san\sAggInfo,\smodify\sthe\sAggInfo\sto\sget\sits\nown\scopy\sof\sthe\soriginal\sExpr. +D 2020-06-07T17:33:18.737 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 1c3dec6d36ddc697dbc1df04100687cdbbed65aacfda067d1e9632e4102e9999 +F src/build.c 02cff9bb5b3eaf437cbad3f0e1b6c9612e4d4f355c9a766b8ebf121d95cee6d2 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 4750c6b63419eefb24c8a6158b9287dea2a9714b4e6e297e25805505c9f73b6c +F src/expr.c 23434d32b9bf92638a61ea6a95845e163f388d6cfd4931b7774f8ad7561b7cfd F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -533,12 +533,12 @@ F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 +F src/select.c 6eb5d0c524ed986107bbcb5b5c5d177c705155bc5284b3006bbec9af66361f47 F src/shell.c.in c6e26593f2738eefded08a39204bf6b48db135cdfaa458c26ffe57055b4fe365 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h f5e422635c089adf60260e1947ecfaf68dd333bda20c2afdd60323357d8540a0 +F src/sqliteInt.h dda913aa727b7c01cae68259cafe6d26b5d8704c114d128585c1610d324d4d41 F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -624,7 +624,7 @@ F src/where.c 7bcc07ff56d03d73308245135d96de46d2faeaee628bd4badf0bae60ae6a31fe F src/whereInt.h 6b874aa15f94e43a2cec1080be64d955b04deeafeac90ffb5d6975c0d511be3c F src/wherecode.c 7b939de85d65cc4b4bfa197513136b9e0ae03167e3b82842ca5a0ba1055ba65d F src/whereexpr.c 264d58971eaf8256eb5b0917bcd7fc7a1f1109fdda183a8382308a1b18a2dce7 -F src/window.c 66c5fd1e48af7581cf90b97700268294f4da4037f120f367715f912e1148d3f9 +F src/window.c 7d19c08b62b70d5dc2ef4c098cc5ba611fac246a111fa36ebb39505415124b90 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1029,7 +1029,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 209623791b0ad72ab39110c867af2080a79004e493c4da14ad661e790b5d1ed8 +F test/fuzzdata8.db 6acee588a3311994b57b226c9eac9e9e69f135cb8b000bd48fdb924e32041312 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1727,7 +1727,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 4baffc3acb2e5188a5e3a895b2b543ed09e62f7c72d713c1feebf76222fe9976 F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 502a3e72fce895aaaa633bbe709f6de3c24eed3ecb8098ab9fb8b47584b4452c +F test/window1.test 30ec5cc344f5ad07bd50742a5dda580d3c6954d60879a440fecaee2ded27700a F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1866,7 +1866,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 2827c0a186596299e43eb3e7378eea462d2b060b2c3388ce5cb2bc8e0b43999e -R ee30fc3f51275fe44c86656d5c06c7d7 +P c1c8937a30feff6aa4385b0c264fd8e70d54422a0629c2ce38082d85d3334a57 +R 3e4eafa96401be2af64b22062bf801bb +T *branch * persist-agginfo +T *sym-persist-agginfo * +T -sym-trunk * U drh -Z bb7b42e3c07b2ab8975730fed03b093c +Z 6c6c52ade97d07f6efb7096e79fdc901 diff --git a/manifest.uuid b/manifest.uuid index 5c9bd2c32c..b331efaa0b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c1c8937a30feff6aa4385b0c264fd8e70d54422a0629c2ce38082d85d3334a57 \ No newline at end of file +7682d8a768fbccfe0cc956e9f6481637146e1ab9763b248ff11052761ce32e32 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 877db05084..03081b9654 100644 --- a/src/build.c +++ b/src/build.c @@ -207,12 +207,21 @@ void sqlite3FinishCoding(Parse *pParse){ */ sqlite3AutoincrementBegin(pParse); - /* Code constant expressions that where factored out of inner loops */ + /* Code constant expressions that where factored out of inner loops. + ** + ** The pConstExpr list might also contain expressions that we simply + ** want to keep around until the Parse object is deleted. Such + ** expressions have iConstExprReg==0. Do not generate code for + ** those expressions, of course. + */ if( pParse->pConstExpr ){ ExprList *pEL = pParse->pConstExpr; pParse->okConstFactor = 0; for(i=0; inExpr; i++){ - sqlite3ExprCode(pParse, pEL->a[i].pExpr, pEL->a[i].u.iConstExprReg); + int iReg = pEL->a[i].u.iConstExprReg; + if( iReg>0 ){ + sqlite3ExprCode(pParse, pEL->a[i].pExpr, iReg); + } } } diff --git a/src/expr.c b/src/expr.c index 496177a5c7..631d715685 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5709,6 +5709,66 @@ int sqlite3FunctionUsesThisSrc(Expr *pExpr, SrcList *pSrcList){ return cnt.nThis>0 || cnt.nOther==0; } +/* +** This is a Walker expression node callback. +** +** For Expr nodes that contain pAggInfo pointers, make sure the AggInfo +** object that is referenced does not refer directly to the Expr. If +** it does, make a copy. This is done because the pExpr argument is +** subject to change. +** +** The copy is stored on pParse->pConstExpr with a register number of 0. +** This will cause the expression to be deleted automatically when the +** Parse object is destroyed, but the zero register number means that it +** will not generate any code in the preamble. +*/ +static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){ + if( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) + && pExpr->pAggInfo!=0 + ){ + AggInfo *pAggInfo = pExpr->pAggInfo; + int iAgg = pExpr->iAgg; + Parse *pParse = pWalker->pParse; + sqlite3 *db = pParse->db; + assert( pAggInfo->iAggMagic==AggInfoMagic ); + assert( pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN + || pExpr->op==TK_FUNCTION || pExpr->op==TK_AGG_FUNCTION ); + if( pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN ){ + assert( iAgg>=0 && iAggnColumn ); + if( pAggInfo->aCol[iAgg].pExpr==pExpr ){ + pExpr = sqlite3ExprDup(db, pExpr, 0); + if( pExpr ){ + pAggInfo->aCol[iAgg].pExpr = pExpr; + pParse->pConstExpr = + sqlite3ExprListAppend(pParse, pParse->pConstExpr, pExpr); + } + } + }else{ + assert( iAgg>=0 && iAggnFunc ); + if( pAggInfo->aFunc[iAgg].pExpr==pExpr ){ + pExpr = sqlite3ExprDup(db, pExpr, 0); + if( pExpr ){ + pAggInfo->aFunc[iAgg].pExpr = pExpr; + pParse->pConstExpr = + sqlite3ExprListAppend(pParse, pParse->pConstExpr, pExpr); + } + } + } + } + return WRC_Continue; +} + +/* +** Initialize a Walker object so that will persist AggInfo entries referenced +** by the tree that is walked. +*/ +void sqlite3AggInfoPersistWalkerInit(Walker *pWalker, Parse *pParse){ + memset(pWalker, 0, sizeof(*pWalker)); + pWalker->pParse = pParse; + pWalker->xExprCallback = agginfoPersistExprCb; + pWalker->xSelectCallback = sqlite3SelectWalkNoop; +} + /* ** Add a new element to the pAggInfo->aCol[] array. Return the index of ** the new element. Return a negative number if malloc fails. @@ -5739,7 +5799,7 @@ static int addAggInfoFunc(sqlite3 *db, AggInfo *pInfo){ &i ); return i; -} +} /* ** This is the xExprCallback for a tree walker. It is used to diff --git a/src/select.c b/src/select.c index 7ff2b5d347..0e7a6ecd0f 100644 --- a/src/select.c +++ b/src/select.c @@ -3791,6 +3791,7 @@ static int flattenSubquery( Expr *pWhere; /* The WHERE clause */ struct SrcList_item *pSubitem; /* The subquery */ sqlite3 *db = pParse->db; + Walker w; /* Walker to persist agginfo data */ /* Check to see if flattening is permitted. Return 0 if not. */ @@ -4165,6 +4166,8 @@ static int flattenSubquery( /* Finially, delete what is left of the subquery and return ** success. */ + sqlite3AggInfoPersistWalkerInit(&w, pParse); + sqlite3WalkSelect(&w,pSub1); sqlite3SelectDelete(db, pSub1); #if SELECTTRACE_ENABLED @@ -5765,6 +5768,9 @@ int sqlite3Select( } if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1; memset(&sAggInfo, 0, sizeof(sAggInfo)); +#ifdef SQLITE_DEBUG + sAggInfo.iAggMagic = AggInfoMagic; +#endif #if SELECTTRACE_ENABLED SELECTTRACE(1,pParse,p, ("begin processing:\n", pParse->addrExplain)); if( sqlite3SelectTrace & 0x100 ){ @@ -5917,6 +5923,7 @@ int sqlite3Select( } #endif if( p->pNext==0 ) ExplainQueryPlanPop(pParse); + assert( sAggInfo.nFunc==0 && sAggInfo.nColumn==0 ); return rc; } #endif @@ -6789,8 +6796,34 @@ int sqlite3Select( */ select_end: sqlite3ExprListDelete(db, pMinMaxOrderBy); - sqlite3DbFree(db, sAggInfo.aCol); - sqlite3DbFree(db, sAggInfo.aFunc); + if( sAggInfo.aCol ){ +#ifdef SQLITE_DEBUG + for(i=0; idb->mallocFailed ); + if( pExpr==0 ) continue; + assert( pExpr->pAggInfo==&sAggInfo ); + assert( pExpr->iAgg==i ); + } +#endif + sqlite3DbFree(db, sAggInfo.aCol); + } + if( sAggInfo.aFunc ){ +#ifdef SQLITE_DEBUG + for(i=0; idb->mallocFailed ); + if( pExpr==0 ) continue; + assert( pExpr->pAggInfo==&sAggInfo ); + assert( pExpr->iAgg==i ); + } +#endif + sqlite3DbFree(db, sAggInfo.aFunc); + } +#ifdef SQLITE_DEBUG + sAggInfo.iAggMagic = 0; +#endif + #if SELECTTRACE_ENABLED SELECTTRACE(0x1,pParse,p,("end processing\n")); if( (sqlite3SelectTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index e37ed673af..52ff846966 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2506,11 +2506,11 @@ struct AggInfo { ExprList *pGroupBy; /* The group by clause */ struct AggInfo_col { /* For each column used in source tables */ Table *pTab; /* Source table */ - int iTable; /* Cursor number of the source table */ - int iColumn; /* Column number within the source table */ - int iSorterColumn; /* Column number in the sorting index */ - int iMem; /* Memory location that acts as accumulator */ Expr *pExpr; /* The original expression */ + int iTable; /* Cursor number of the source table */ + int iMem; /* Memory location that acts as accumulator */ + i16 iColumn; /* Column number within the source table */ + i16 iSorterColumn; /* Column number in the sorting index */ } *aCol; int nColumn; /* Number of used entries in aCol[] */ int nAccumulator; /* Number of columns that show through to the output. @@ -2523,8 +2523,16 @@ struct AggInfo { int iDistinct; /* Ephemeral table used to enforce DISTINCT */ } *aFunc; int nFunc; /* Number of entries in aFunc[] */ +#ifdef SQLITE_DEBUG + int iAggMagic; /* Magic number when valid */ +#endif }; +/* +** Value for AggInfo.iAggMagic when the structure is valid +*/ +#define AggInfoMagic 0x2059e99e + /* ** The datatype ynVar is a signed integer, either 16-bit or 32-bit. ** Usually it is 16-bits. But if SQLITE_MAX_VARIABLE_NUMBER is greater @@ -4287,6 +4295,7 @@ int sqlite3ExprCompareSkip(Expr*, Expr*, int); int sqlite3ExprListCompare(ExprList*, ExprList*, int); int sqlite3ExprImpliesExpr(Parse*,Expr*, Expr*, int); int sqlite3ExprImpliesNonNullRow(Expr*,int); +void sqlite3AggInfoPersistWalkerInit(Walker*,Parse*); void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*); void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*); int sqlite3ExprCoveredByIndex(Expr*, int iCur, Index *pIdx); diff --git a/src/window.c b/src/window.c index 77ec8a02e0..8046e46274 100644 --- a/src/window.c +++ b/src/window.c @@ -956,12 +956,16 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ Window *pMWin = p->pWin; /* Master window object */ Window *pWin; /* Window object iterator */ Table *pTab; + Walker w; + u32 selFlags = p->selFlags; pTab = sqlite3DbMallocZero(db, sizeof(Table)); if( pTab==0 ){ return sqlite3ErrorToParser(db, SQLITE_NOMEM); } + sqlite3AggInfoPersistWalkerInit(&w, pParse); + sqlite3WalkSelect(&w, p); p->pSrc = 0; p->pWhere = 0; @@ -1042,7 +1046,6 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ p->pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( p->pSrc ){ Table *pTab2; - Walker w; p->pSrc->a[0].pSelect = pSub; sqlite3SrcListAssignCursors(pParse, p->pSrc); pSub->selFlags |= SF_Expanded; diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 350ffa26312c32b3452ebf103c8b7bb90ec69ce0..b1837460297bbe7aea0ea95aa6946c523c946fa4 100644 GIT binary patch delta 24027 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 diff --git a/test/window1.test b/test/window1.test index 677297fc89..97c3cdd79a 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1743,5 +1743,141 @@ do_execsql_test 53.0 { WHERE a.c); } {4 4 4 4} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 54.1 { + CREATE TABLE t1(a VARCHAR(20), b FLOAT); + INSERT INTO t1 VALUES('1',10.0); +} + +do_catchsql_test 54.2 { + SELECT * FROM ( + SELECT sum(b) OVER() AS c FROM t1 + UNION + SELECT b AS c FROM t1 + ) WHERE c>10; +} {1 {misuse of window function sum()}} + +do_execsql_test 54.3 { + INSERT INTO t1 VALUES('2',5.0); + INSERT INTO t1 VALUES('3',15.0); +} + +do_catchsql_test 54.4 { + SELECT * FROM ( + SELECT sum(b) OVER() AS c FROM t1 + UNION + SELECT b AS c FROM t1 + ) WHERE c>10; +} {1 {misuse of window function sum()}} + +# 2020-06-05 ticket c8d3b9f0a750a529 +reset_db +do_execsql_test 55.1 { + CREATE TABLE a(b); + SELECT + (SELECT b FROM a + GROUP BY b + HAVING (SELECT COUNT()OVER() + lead(b)OVER(ORDER BY SUM(DISTINCT b) + b)) + ) + FROM a + UNION + SELECT 99 + ORDER BY 1; +} {99} + +#------------------------------------------------------------------------ +reset_db +do_execsql_test 56.1 { + CREATE TABLE t1(a, b INTEGER); + CREATE TABLE t2(c, d); +} +do_catchsql_test 56.2 { + SELECT avg(b) FROM t1 + UNION ALL + SELECT min(c) OVER () FROM t2 + ORDER BY nosuchcolumn; +} {1 {1st ORDER BY term does not match any column in the result set}} + +reset_db +do_execsql_test 57.1 { + CREATE TABLE t4(a, b, c, d, e); +} + +do_catchsql_test 57.2 { + SELECT b FROM t4 + UNION + SELECT a FROM t4 + ORDER BY ( + SELECT sum(x) OVER() FROM ( + SELECT c AS x FROM t4 + UNION + SELECT d FROM t4 + ORDER BY (SELECT e FROM t4) + ) + ); +} {1 {1st ORDER BY term does not match any column in the result set}} + +# 2020-06-06 various dbsqlfuzz finds and +# ticket 0899cf62f597d7e7 +# +reset_db +do_execsql_test 57.1 { + CREATE TABLE t1(a, b, c); + INSERT INTO t1 VALUES(NULL,NULL,NULL); + SELECT + sum(a), + min(b) OVER (), + count(c) OVER (ORDER BY b) + FROM t1; +} {{} {} 0} +do_execsql_test 57.2 { + CREATE TABLE v0 ( v1 INTEGER PRIMARY KEY ) ; + INSERT INTO v0 VALUES ( 10 ) ; + SELECT DISTINCT v1, lead(v1) OVER() FROM v0 GROUP BY v1 ORDER BY 2; +} {10 {}} +do_catchsql_test 57.3 { + DROP TABLE t1; + CREATE TABLE t1(a); + INSERT INTO t1(a) VALUES(22); + CREATE TABLE t3(y); + INSERT INTO t3(y) VALUES(5),(11),(-9); + SELECT ( + SELECT max(y) OVER( ORDER BY (SELECT x FROM (SELECT sum(y) AS x FROM t1))) + ) + FROM t3; +} {1 {misuse of aggregate: sum()}} + +# 2020-06-06 ticket 1f6f353b684fc708 +reset_db +do_execsql_test 58.1 { + CREATE TABLE a(a, b, c); + INSERT INTO a VALUES(1, 2, 3); + INSERT INTO a VALUES(4, 5, 6); + SELECT sum(345+b) OVER (ORDER BY b), + sum(avg(678)) OVER (ORDER BY c) FROM a; +} {347 678.0} + +# 2020-06-06 ticket e5504e987e419fb0 +do_catchsql_test 59.1 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(x INTEGER PRIMARY KEY); + INSERT INTO t1 VALUES (123); + SELECT + ntile( (SELECT sum(x)) ) OVER(ORDER BY x), + min(x) OVER(ORDER BY x) + FROM t1; +} {1 {misuse of aggregate: sum()}} + +# 2020-06-07 ticket f7d890858f361402 +do_execsql_test 60.1 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1 (x INTEGER PRIMARY KEY); + INSERT INTO t1 VALUES (99); + SELECT EXISTS(SELECT count(*) OVER() FROM t1 ORDER BY sum(x) OVER()); +} {1} + +reset_db + finish_test From bf7909734a351c68f852a0ecb11f1c41738e96bf Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 7 Jun 2020 20:18:07 +0000 Subject: [PATCH 137/224] AggInfo objects might be referenced even after the sqlite3Select() function that created them has exited. So AggInfo cannot be a stack variable. And it must not be freed until the Parse object is destroyed. FossilOrigin-Name: 3c840b4df306e2db1da08673e9ede973b4cb6d2b3f9eeeab5835e39452ee3056 --- manifest | 23 ++++---- manifest.uuid | 2 +- src/expr.c | 1 - src/prepare.c | 15 ++++++ src/select.c | 133 ++++++++++++++++++++++------------------------ src/sqliteInt.h | 2 + test/window1.test | 11 +++- 7 files changed, 103 insertions(+), 84 deletions(-) diff --git a/manifest b/manifest index 5c9f7982ab..ad5a11efd3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Alternative\sfix\sto\sticket\s[c8d3b9f0a750a529]:\s\sPrior\sto\sdeleting\sor\smodifying\nan\sExpr\snot\sthat\sis\sreferenced\sby\san\sAggInfo,\smodify\sthe\sAggInfo\sto\sget\sits\nown\scopy\sof\sthe\soriginal\sExpr. -D 2020-06-07T17:33:18.737 +C AggInfo\sobjects\smight\sbe\sreferenced\seven\safter\sthe\ssqlite3Select()\sfunction\nthat\screated\sthem\shas\sexited.\s\sSo\sAggInfo\scannot\sbe\sa\sstack\svariable.\s\sAnd\sit\nmust\snot\sbe\sfreed\suntil\sthe\sParse\sobject\sis\sdestroyed. +D 2020-06-07T20:18:07.068 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -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 23434d32b9bf92638a61ea6a95845e163f388d6cfd4931b7774f8ad7561b7cfd +F src/expr.c 3ee54650bbf8cf1003bee34bbeca354c9c7bddab3ef66ba618f806a1c7c51b4b F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -528,17 +528,17 @@ F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a F src/pragma.c 1b0db48177e52b256c003b8dc6ac708b1079a82cded944a23820574586a4731f F src/pragma.h 8168e588536bffd95319451f34e9a754dc37d205ebe433031a7813c5b286beae -F src/prepare.c aeb3ba661e2666dab15c4b5c55f6eb816f01d20e35fa860bb807e4a3b36e1e27 +F src/prepare.c bb996921a85590418f951f27566216646fad2d6856ba131b21594862055b1bd7 F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 6eb5d0c524ed986107bbcb5b5c5d177c705155bc5284b3006bbec9af66361f47 +F src/select.c fb79ed71f8b8bbe9fefaba9b844f80700dea4f175ccac34c64a7b5cd75abc362 F src/shell.c.in c6e26593f2738eefded08a39204bf6b48db135cdfaa458c26ffe57055b4fe365 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h dda913aa727b7c01cae68259cafe6d26b5d8704c114d128585c1610d324d4d41 +F src/sqliteInt.h 04621e8c61c2bf4578d07e99cc5b5909b16d5e34600ed8297a8fd4d1a95afc4e F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1727,7 +1727,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 4baffc3acb2e5188a5e3a895b2b543ed09e62f7c72d713c1feebf76222fe9976 F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 30ec5cc344f5ad07bd50742a5dda580d3c6954d60879a440fecaee2ded27700a +F test/window1.test 49f81c25c065fd65b64cd2aaa96f20199fd5d8f847dd1c8151cfccae2aeae83f F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1866,10 +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 c1c8937a30feff6aa4385b0c264fd8e70d54422a0629c2ce38082d85d3334a57 -R 3e4eafa96401be2af64b22062bf801bb -T *branch * persist-agginfo -T *sym-persist-agginfo * -T -sym-trunk * +P 7682d8a768fbccfe0cc956e9f6481637146e1ab9763b248ff11052761ce32e32 +R aa0e843c27b9cda2c788e9652bc81696 U drh -Z 6c6c52ade97d07f6efb7096e79fdc901 +Z e618df7dc043f3b81d6494dff0ad5e1b diff --git a/manifest.uuid b/manifest.uuid index b331efaa0b..01928527e0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7682d8a768fbccfe0cc956e9f6481637146e1ab9763b248ff11052761ce32e32 \ No newline at end of file +3c840b4df306e2db1da08673e9ede973b4cb6d2b3f9eeeab5835e39452ee3056 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 631d715685..b1beb2e3eb 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5730,7 +5730,6 @@ static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){ int iAgg = pExpr->iAgg; Parse *pParse = pWalker->pParse; sqlite3 *db = pParse->db; - assert( pAggInfo->iAggMagic==AggInfoMagic ); assert( pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN || pExpr->op==TK_FUNCTION || pExpr->op==TK_AGG_FUNCTION ); if( pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN ){ diff --git a/src/prepare.c b/src/prepare.c index 2599546760..c63c0a8353 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -530,11 +530,26 @@ int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){ return i; } +/* +** Deallocate a single AggInfo object +*/ +static void agginfoFree(sqlite3 *db, AggInfo *p){ + sqlite3DbFree(db, p->aCol); + sqlite3DbFree(db, p->aFunc); + sqlite3DbFree(db, p); +} + /* ** Free all memory allocations in the pParse object */ void sqlite3ParserReset(Parse *pParse){ sqlite3 *db = pParse->db; + AggInfo *pThis = pParse->pAggList; + while( pThis ){ + AggInfo *pNext = pThis->pNext; + agginfoFree(db, pThis); + pThis = pNext; + } sqlite3DbFree(db, pParse->aLabel); sqlite3ExprListDelete(db, pParse->pConstExpr); if( db ){ diff --git a/src/select.c b/src/select.c index 0e7a6ecd0f..9e8af0cb17 100644 --- a/src/select.c +++ b/src/select.c @@ -5752,10 +5752,10 @@ int sqlite3Select( Expr *pWhere; /* The WHERE clause. May be NULL */ ExprList *pGroupBy; /* The GROUP BY clause. May be NULL */ Expr *pHaving; /* The HAVING clause. May be NULL */ + AggInfo *pAggInfo = 0; /* Aggregate information */ int rc = 1; /* Value to return from this function */ DistinctCtx sDistinct; /* Info on how to code the DISTINCT keyword */ SortCtx sSort; /* Info on how to code the ORDER BY clause */ - AggInfo sAggInfo; /* Information used by aggregate queries */ int iEnd; /* Address of the end of the query */ sqlite3 *db; /* The database connection */ ExprList *pMinMaxOrderBy = 0; /* Added ORDER BY for min/max queries */ @@ -5767,10 +5767,6 @@ int sqlite3Select( return 1; } if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1; - memset(&sAggInfo, 0, sizeof(sAggInfo)); -#ifdef SQLITE_DEBUG - sAggInfo.iAggMagic = AggInfoMagic; -#endif #if SELECTTRACE_ENABLED SELECTTRACE(1,pParse,p, ("begin processing:\n", pParse->addrExplain)); if( sqlite3SelectTrace & 0x100 ){ @@ -5923,7 +5919,6 @@ int sqlite3Select( } #endif if( p->pNext==0 ) ExplainQueryPlanPop(pParse); - assert( sAggInfo.nFunc==0 && sAggInfo.nColumn==0 ); return rc; } #endif @@ -6361,14 +6356,20 @@ int sqlite3Select( ** sAggInfo for all TK_AGG_FUNCTION nodes in expressions of the ** SELECT statement. */ + pAggInfo = sqlite3DbMallocZero(db, sizeof(*pAggInfo) ); + if( pAggInfo==0 ){ + goto select_end; + } + pAggInfo->pNext = pParse->pAggList; + pParse->pAggList = pAggInfo; memset(&sNC, 0, sizeof(sNC)); sNC.pParse = pParse; sNC.pSrcList = pTabList; - sNC.uNC.pAggInfo = &sAggInfo; + sNC.uNC.pAggInfo = pAggInfo; VVA_ONLY( sNC.ncFlags = NC_UAggInfo; ) - sAggInfo.mnReg = pParse->nMem+1; - sAggInfo.nSortingColumn = pGroupBy ? pGroupBy->nExpr : 0; - sAggInfo.pGroupBy = pGroupBy; + pAggInfo->mnReg = pParse->nMem+1; + pAggInfo->nSortingColumn = pGroupBy ? pGroupBy->nExpr : 0; + pAggInfo->pGroupBy = pGroupBy; sqlite3ExprAnalyzeAggList(&sNC, pEList); sqlite3ExprAnalyzeAggList(&sNC, sSort.pOrderBy); if( pHaving ){ @@ -6381,14 +6382,14 @@ int sqlite3Select( } sqlite3ExprAnalyzeAggregates(&sNC, pHaving); } - sAggInfo.nAccumulator = sAggInfo.nColumn; - if( p->pGroupBy==0 && p->pHaving==0 && sAggInfo.nFunc==1 ){ - minMaxFlag = minMaxQuery(db, sAggInfo.aFunc[0].pExpr, &pMinMaxOrderBy); + pAggInfo->nAccumulator = pAggInfo->nColumn; + if( p->pGroupBy==0 && p->pHaving==0 && pAggInfo->nFunc==1 ){ + minMaxFlag = minMaxQuery(db, pAggInfo->aFunc[0].pExpr, &pMinMaxOrderBy); }else{ minMaxFlag = WHERE_ORDERBY_NORMAL; } - for(i=0; inFunc; i++){ + Expr *pExpr = pAggInfo->aFunc[i].pExpr; assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); sNC.ncFlags |= NC_InAggFunc; sqlite3ExprAnalyzeAggList(&sNC, pExpr->x.pList); @@ -6400,22 +6401,22 @@ int sqlite3Select( #endif sNC.ncFlags &= ~NC_InAggFunc; } - sAggInfo.mxReg = pParse->nMem; + pAggInfo->mxReg = pParse->nMem; if( db->mallocFailed ) goto select_end; #if SELECTTRACE_ENABLED if( sqlite3SelectTrace & 0x400 ){ int ii; - SELECTTRACE(0x400,pParse,p,("After aggregate analysis %p:\n", &sAggInfo)); + SELECTTRACE(0x400,pParse,p,("After aggregate analysis %p:\n", pAggInfo)); sqlite3TreeViewSelect(0, p, 0); - for(ii=0; iinColumn; ii++){ sqlite3DebugPrintf("agg-column[%d] iMem=%d\n", - ii, sAggInfo.aCol[ii].iMem); - sqlite3TreeViewExpr(0, sAggInfo.aCol[ii].pExpr, 0); + ii, pAggInfo->aCol[ii].iMem); + sqlite3TreeViewExpr(0, pAggInfo->aCol[ii].pExpr, 0); } - for(ii=0; iinFunc; ii++){ sqlite3DebugPrintf("agg-func[%d]: iMem=%d\n", - ii, sAggInfo.aFunc[ii].iMem); - sqlite3TreeViewExpr(0, sAggInfo.aFunc[ii].pExpr, 0); + ii, pAggInfo->aFunc[ii].iMem); + sqlite3TreeViewExpr(0, pAggInfo->aFunc[ii].pExpr, 0); } } #endif @@ -6440,10 +6441,11 @@ int sqlite3Select( ** that we do not need it after all, the OP_SorterOpen instruction ** will be converted into a Noop. */ - sAggInfo.sortingIdx = pParse->nTab++; - pKeyInfo = sqlite3KeyInfoFromExprList(pParse,pGroupBy,0,sAggInfo.nColumn); + pAggInfo->sortingIdx = pParse->nTab++; + pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pGroupBy, + 0, pAggInfo->nColumn); addrSortingIdx = sqlite3VdbeAddOp4(v, OP_SorterOpen, - sAggInfo.sortingIdx, sAggInfo.nSortingColumn, + pAggInfo->sortingIdx, pAggInfo->nSortingColumn, 0, (char*)pKeyInfo, P4_KEYINFO); /* Initialize memory locations used by GROUP BY aggregate processing @@ -6498,8 +6500,8 @@ int sqlite3Select( nGroupBy = pGroupBy->nExpr; nCol = nGroupBy; j = nGroupBy; - for(i=0; i=j ){ + for(i=0; inColumn; i++){ + if( pAggInfo->aCol[i].iSorterColumn>=j ){ nCol++; j++; } @@ -6507,8 +6509,8 @@ int sqlite3Select( regBase = sqlite3GetTempRange(pParse, nCol); sqlite3ExprCodeExprList(pParse, pGroupBy, regBase, 0, 0); j = nGroupBy; - for(i=0; inColumn; i++){ + struct AggInfo_col *pCol = &pAggInfo->aCol[i]; if( pCol->iSorterColumn>=j ){ int r1 = j + regBase; sqlite3ExprCodeGetColumnOfTable(v, @@ -6518,16 +6520,16 @@ int sqlite3Select( } regRecord = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regRecord); - sqlite3VdbeAddOp2(v, OP_SorterInsert, sAggInfo.sortingIdx, regRecord); + sqlite3VdbeAddOp2(v, OP_SorterInsert, pAggInfo->sortingIdx, regRecord); sqlite3ReleaseTempReg(pParse, regRecord); sqlite3ReleaseTempRange(pParse, regBase, nCol); sqlite3WhereEnd(pWInfo); - sAggInfo.sortingIdxPTab = sortPTab = pParse->nTab++; + pAggInfo->sortingIdxPTab = sortPTab = pParse->nTab++; sortOut = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_OpenPseudo, sortPTab, sortOut, nCol); - sqlite3VdbeAddOp2(v, OP_SorterSort, sAggInfo.sortingIdx, addrEnd); + sqlite3VdbeAddOp2(v, OP_SorterSort, pAggInfo->sortingIdx, addrEnd); VdbeComment((v, "GROUP BY sort")); VdbeCoverage(v); - sAggInfo.useSortingIdx = 1; + pAggInfo->useSortingIdx = 1; } /* If the index or temporary table used by the GROUP BY sort @@ -6551,14 +6553,14 @@ int sqlite3Select( */ addrTopOfLoop = sqlite3VdbeCurrentAddr(v); if( groupBySort ){ - sqlite3VdbeAddOp3(v, OP_SorterData, sAggInfo.sortingIdx, + sqlite3VdbeAddOp3(v, OP_SorterData, pAggInfo->sortingIdx, sortOut, sortPTab); } for(j=0; jnExpr; j++){ if( groupBySort ){ sqlite3VdbeAddOp3(v, OP_Column, sortPTab, j, iBMem+j); }else{ - sAggInfo.directMode = 1; + pAggInfo->directMode = 1; sqlite3ExprCode(pParse, pGroupBy->a[j].pExpr, iBMem+j); } } @@ -6588,14 +6590,14 @@ int sqlite3Select( ** the current row */ sqlite3VdbeJumpHere(v, addr1); - updateAccumulator(pParse, iUseFlag, &sAggInfo); + updateAccumulator(pParse, iUseFlag, pAggInfo); sqlite3VdbeAddOp2(v, OP_Integer, 1, iUseFlag); VdbeComment((v, "indicate data in accumulator")); /* End of the loop */ if( groupBySort ){ - sqlite3VdbeAddOp2(v, OP_SorterNext, sAggInfo.sortingIdx, addrTopOfLoop); + sqlite3VdbeAddOp2(v, OP_SorterNext, pAggInfo->sortingIdx, addrTopOfLoop); VdbeCoverage(v); }else{ sqlite3WhereEnd(pWInfo); @@ -6628,7 +6630,7 @@ int sqlite3Select( VdbeCoverage(v); VdbeComment((v, "Groupby result generator entry point")); sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); - finalizeAggFunctions(pParse, &sAggInfo); + finalizeAggFunctions(pParse, pAggInfo); sqlite3ExprIfFalse(pParse, pHaving, addrOutputRow+1, SQLITE_JUMPIFNULL); selectInnerLoop(pParse, p, -1, &sSort, &sDistinct, pDest, @@ -6639,7 +6641,7 @@ int sqlite3Select( /* Generate a subroutine that will reset the group-by accumulator */ sqlite3VdbeResolveLabel(v, addrReset); - resetAccumulator(pParse, &sAggInfo); + resetAccumulator(pParse, pAggInfo); sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag); VdbeComment((v, "indicate accumulator empty")); sqlite3VdbeAddOp1(v, OP_Return, regReset); @@ -6647,7 +6649,7 @@ int sqlite3Select( } /* endif pGroupBy. Begin aggregate queries without GROUP BY: */ else { Table *pTab; - if( (pTab = isSimpleCount(p, &sAggInfo))!=0 ){ + if( (pTab = isSimpleCount(p, pAggInfo))!=0 ){ /* If isSimpleCount() returns a pointer to a Table structure, then ** the SQL statement is of the form: ** @@ -6702,7 +6704,7 @@ int sqlite3Select( if( pKeyInfo ){ sqlite3VdbeChangeP4(v, -1, (char *)pKeyInfo, P4_KEYINFO); } - sqlite3VdbeAddOp2(v, OP_Count, iCsr, sAggInfo.aFunc[0].iMem); + sqlite3VdbeAddOp2(v, OP_Count, iCsr, pAggInfo->aFunc[0].iMem); sqlite3VdbeAddOp1(v, OP_Close, iCsr); explainSimpleCount(pParse, pTab, pBest); }else{ @@ -6717,12 +6719,16 @@ int sqlite3Select( ** first row visited by the aggregate, so that they are updated at ** least once even if the FILTER clause means the min() or max() ** function visits zero rows. */ - if( sAggInfo.nAccumulator ){ - for(i=0; ifuncFlags&SQLITE_FUNC_NEEDCOLL ) break; + if( pAggInfo->nAccumulator ){ + for(i=0; inFunc; i++){ + if( ExprHasProperty(pAggInfo->aFunc[i].pExpr, EP_WinFunc) ){ + continue; + } + if( pAggInfo->aFunc[i].pFunc->funcFlags&SQLITE_FUNC_NEEDCOLL ){ + break; + } } - if( i==sAggInfo.nFunc ){ + if( i==pAggInfo->nFunc ){ regAcc = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_Integer, 0, regAcc); } @@ -6733,7 +6739,7 @@ int sqlite3Select( ** of output. */ assert( p->pGroupBy==0 ); - resetAccumulator(pParse, &sAggInfo); + resetAccumulator(pParse, pAggInfo); /* If this query is a candidate for the min/max optimization, then ** minMaxFlag will have been previously set to either @@ -6749,7 +6755,7 @@ int sqlite3Select( if( pWInfo==0 ){ goto select_end; } - updateAccumulator(pParse, regAcc, &sAggInfo); + updateAccumulator(pParse, regAcc, pAggInfo); if( regAcc ) sqlite3VdbeAddOp2(v, OP_Integer, 1, regAcc); if( sqlite3WhereIsOrdered(pWInfo)>0 ){ sqlite3VdbeGoto(v, sqlite3WhereBreakLabel(pWInfo)); @@ -6757,7 +6763,7 @@ int sqlite3Select( (minMaxFlag==WHERE_ORDERBY_MIN?"min":"max"))); } sqlite3WhereEnd(pWInfo); - finalizeAggFunctions(pParse, &sAggInfo); + finalizeAggFunctions(pParse, pAggInfo); } sSort.pOrderBy = 0; @@ -6796,32 +6802,23 @@ int sqlite3Select( */ select_end: sqlite3ExprListDelete(db, pMinMaxOrderBy); - if( sAggInfo.aCol ){ #ifdef SQLITE_DEBUG - for(i=0; idb->mallocFailed ); + if( pAggInfo ){ + for(i=0; inColumn; i++){ + Expr *pExpr = pAggInfo->aCol[i].pExpr; + assert( pExpr!=0 || db->mallocFailed ); if( pExpr==0 ) continue; - assert( pExpr->pAggInfo==&sAggInfo ); + assert( pExpr->pAggInfo==pAggInfo ); assert( pExpr->iAgg==i ); } -#endif - sqlite3DbFree(db, sAggInfo.aCol); - } - if( sAggInfo.aFunc ){ -#ifdef SQLITE_DEBUG - for(i=0; idb->mallocFailed ); + for(i=0; inFunc; i++){ + Expr *pExpr = pAggInfo->aFunc[i].pExpr; + assert( pExpr!=0 || db->mallocFailed ); if( pExpr==0 ) continue; - assert( pExpr->pAggInfo==&sAggInfo ); + assert( pExpr->pAggInfo==pAggInfo ); assert( pExpr->iAgg==i ); } -#endif - sqlite3DbFree(db, sAggInfo.aFunc); } -#ifdef SQLITE_DEBUG - sAggInfo.iAggMagic = 0; #endif #if SELECTTRACE_ENABLED diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 52ff846966..0b71ef42bb 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2526,6 +2526,7 @@ struct AggInfo { #ifdef SQLITE_DEBUG int iAggMagic; /* Magic number when valid */ #endif + AggInfo *pNext; /* Next in list of them all */ }; /* @@ -3329,6 +3330,7 @@ struct Parse { Parse *pToplevel; /* Parse structure for main program (or NULL) */ Table *pTriggerTab; /* Table triggers are being coded for */ Parse *pParentParse; /* Parent parser if this parser is nested */ + AggInfo *pAggList; /* List of all AggInfo objects */ int addrCrTab; /* Address of OP_CreateBtree opcode on CREATE TABLE */ u32 nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ u32 oldmask; /* Mask of old.* columns referenced */ diff --git a/test/window1.test b/test/window1.test index 97c3cdd79a..3336a613ab 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1877,7 +1877,16 @@ do_execsql_test 60.1 { SELECT EXISTS(SELECT count(*) OVER() FROM t1 ORDER BY sum(x) OVER()); } {1} +# 2020-06-07 test case generated by dbsqlfuzz showing how an AggInfo +# object might be referenced after the sqlite3Select() call that created +# it returns. This proves the need to persist all AggInfo objects until +# the Parse object is destroyed. +# reset_db - +do_execsql_test 61.1 { +CREATE TABLE t1(a); +INSERT INTO t1 VALUES(5),(NULL),('seventeen'); +SELECT (SELECT max(x)OVER(ORDER BY x) % min(x)OVER(ORDER BY CASE x WHEN 889 THEN x WHEN x THEN x END)) FROM (SELECT (SELECT sum(CAST(a IN(SELECT (SELECT max(x)OVER(ORDER BY CASE x WHEN 889 THEN 299 WHEN 863 THEN 863 END)) FROM (SELECT (SELECT sum(CAST((SELECT (SELECT max(x)OVER(ORDER BY x) / min(x)OVER(ORDER BY CASE x WHEN 889 THEN 299 WHEN -true THEN 863 END)) FROM (SELECT (SELECT sum(CAST(a IN(SELECT (SELECT max(x) & sum ( a )OVER(ORDER BY CASE x WHEN -8 THEN 299 WHEN 863 THEN 863 END)) FROM (SELECT (SELECT sum(CAST(a AS )) FROM t1) AS x FROM t1)) AS t1 )) FROM t1) AS x FROM t1)) AS x )) FROM t1) AS x FROM t1)) AS real)) FROM t1) AS x FROM t1); +} {{} {} {}} finish_test From 2f82acc036c5f286fda6ef815bfc3469acd402e2 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 7 Jun 2020 22:44:23 +0000 Subject: [PATCH 138/224] Fix minor OOM problems. FossilOrigin-Name: 8b23d80271aab38abe42ee8b3ca4b746572ecef26c2a37b094b01560e6be9d45 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 14 +++++++++----- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index ad5a11efd3..5adab9d6c4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C AggInfo\sobjects\smight\sbe\sreferenced\seven\safter\sthe\ssqlite3Select()\sfunction\nthat\screated\sthem\shas\sexited.\s\sSo\sAggInfo\scannot\sbe\sa\sstack\svariable.\s\sAnd\sit\nmust\snot\sbe\sfreed\suntil\sthe\sParse\sobject\sis\sdestroyed. -D 2020-06-07T20:18:07.068 +C Fix\sminor\sOOM\sproblems. +D 2020-06-07T22:44:23.371 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -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 3ee54650bbf8cf1003bee34bbeca354c9c7bddab3ef66ba618f806a1c7c51b4b +F src/expr.c 217bee94b696a061fec28526c5d5ef3049536ace5c10a0a3ff7d15b0d3a9cd11 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -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 7682d8a768fbccfe0cc956e9f6481637146e1ab9763b248ff11052761ce32e32 -R aa0e843c27b9cda2c788e9652bc81696 +P 3c840b4df306e2db1da08673e9ede973b4cb6d2b3f9eeeab5835e39452ee3056 +R 5a67d9ba1d91119ad620e46132adbad1 U drh -Z e618df7dc043f3b81d6494dff0ad5e1b +Z 23a540eb57cb09221e33c4eabdced32a diff --git a/manifest.uuid b/manifest.uuid index 01928527e0..5b9f0ff1f4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3c840b4df306e2db1da08673e9ede973b4cb6d2b3f9eeeab5835e39452ee3056 \ No newline at end of file +8b23d80271aab38abe42ee8b3ca4b746572ecef26c2a37b094b01560e6be9d45 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index b1beb2e3eb..6fbc8bb49c 100644 --- a/src/expr.c +++ b/src/expr.c @@ -52,7 +52,12 @@ char sqlite3ExprAffinity(const Expr *pExpr){ op = pExpr->op; if( op==TK_SELECT ){ assert( pExpr->flags&EP_xIsSelect ); - return sqlite3ExprAffinity(pExpr->x.pSelect->pEList->a[0].pExpr); + if( ALWAYS(pExpr->x.pSelect) + && pExpr->x.pSelect->pEList + && ALWAYS(pExpr->x.pSelect->pEList->a[0].pExpr) + ){ + return sqlite3ExprAffinity(pExpr->x.pSelect->pEList->a[0].pExpr); + } } if( op==TK_REGISTER ) op = pExpr->op2; #ifndef SQLITE_OMIT_CAST @@ -5723,16 +5728,15 @@ int sqlite3FunctionUsesThisSrc(Expr *pExpr, SrcList *pSrcList){ ** will not generate any code in the preamble. */ static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){ - if( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) + if( ALWAYS(!ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced)) && pExpr->pAggInfo!=0 ){ AggInfo *pAggInfo = pExpr->pAggInfo; int iAgg = pExpr->iAgg; Parse *pParse = pWalker->pParse; sqlite3 *db = pParse->db; - assert( pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN - || pExpr->op==TK_FUNCTION || pExpr->op==TK_AGG_FUNCTION ); - if( pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN ){ + assert( pExpr->op==TK_AGG_COLUMN || pExpr->op==TK_AGG_FUNCTION ); + if( pExpr->op==TK_AGG_COLUMN ){ assert( iAgg>=0 && iAggnColumn ); if( pAggInfo->aCol[iAgg].pExpr==pExpr ){ pExpr = sqlite3ExprDup(db, pExpr, 0); From 5c10930fa9df10de8bc50859cf4289bf3ddb4d97 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 8 Jun 2020 14:43:41 +0000 Subject: [PATCH 139/224] Fix a case where a corrupted fts3 record could cause an assert() failure, or spurious SQLITE_NOMEM error in builds with assert() disabled. FossilOrigin-Name: d48af4d2cfff3d5f4ccc3db5d658e8b503255b577e6e62b5c2b4a4437875b895 --- ext/fts3/fts3.c | 5 +++- manifest | 16 +++++------ manifest.uuid | 2 +- test/fts3corrupt6.test | 60 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 10 deletions(-) create mode 100644 test/fts3corrupt6.test diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index e6092a215e..88ff0ee2c5 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -5560,7 +5560,10 @@ static int fts3EvalTestExpr( }else #endif { - bHit = (pExpr->bEof==0 && pExpr->iDocid==pCsr->iPrevId); + bHit = ( + pExpr->bEof==0 && pExpr->iDocid==pCsr->iPrevId + && pExpr->pPhrase->doclist.nList>0 + ); } break; } diff --git a/manifest b/manifest index ae3141103a..6be90cfd3a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\san\sExpr\sobject\sis\schanged\sand\sthat\sExpr\sis\sreferenced\sby\san\sAggInfo,\sthen\nalso\supdate\sthe\sAggInfo.\s\sAlso,\spersist\sall\sAggInfo\sobjects\suntil\sthe\sParse\nobject\sis\sdestroyed.\s\sThis\sis\sa\snew\sfix\sfor\sticket\s[c8d3b9f0a750a529]\sthat\navoids\sthe\sfollow-on\sproblems\sidentified\sby\stickets\n[0899cf62f597d7e7],\s[1f6f353b684fc708],\s[e5504e987e419fb0],\sand\n[f7d890858f361402]. -D 2020-06-08T11:34:40.204 +C Fix\sa\scase\swhere\sa\scorrupted\sfts3\srecord\scould\scause\san\sassert()\sfailure,\sor\sspurious\sSQLITE_NOMEM\serror\sin\sbuilds\swith\sassert()\sdisabled. +D 2020-06-08T14:43:41.880 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 45f5774987a68d36355799503b6d02dbff5286ffb42bec14d928b295d2b93c1b +F ext/fts3/fts3.c 7a12745b024dfb26c7b87f9a5e30241b1b8c8f049ecd5c228454757b500a0595 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 2c59cc46aefde134c1782e89a6a5384710ddcd4e783071337aa5d43d07269be3 F ext/fts3/fts3_aux.c 96708c8b3a7d9b8ca1b68ea2b7e503e283f20e95f145becadedfad096dbd0f34 @@ -950,6 +950,7 @@ F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999f F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f F test/fts3corrupt4.test fde292a4712753c7ef235a199273c5d196e18a56bd2c4d2db7ccaf59b7027a0a F test/fts3corrupt5.test 0549f85ec4bd22e992f645f13c59b99d652f2f5e643dac75568bfd23a6db7ed5 +F test/fts3corrupt6.test b6c55218b704b0cef224b284c756f9c55d0afd0b3c3837618bffeaa8c31e0d8e F test/fts3cov.test 7eacdbefd756cfa4dc2241974e3db2834e9b372ca215880e00032222f32194cf F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1866,8 +1867,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 c1c8937a30feff6aa4385b0c264fd8e70d54422a0629c2ce38082d85d3334a57 8b23d80271aab38abe42ee8b3ca4b746572ecef26c2a37b094b01560e6be9d45 -R 5a67d9ba1d91119ad620e46132adbad1 -T +closed 8b23d80271aab38abe42ee8b3ca4b746572ecef26c2a37b094b01560e6be9d45 -U drh -Z 6f53567ca5c0a8bbc47fb39a7dc9415b +P 6e6b3729e0549de028f6c5bf494b2d69d621c81b61a1dc0a329d3950039342fb +R 501a6f582df48fcb778cb04d0dbc67e9 +U dan +Z 59d7d89d08b1863cb68d3606c4f1b730 diff --git a/manifest.uuid b/manifest.uuid index af887204a7..1ae45ab99b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6e6b3729e0549de028f6c5bf494b2d69d621c81b61a1dc0a329d3950039342fb \ No newline at end of file +d48af4d2cfff3d5f4ccc3db5d658e8b503255b577e6e62b5c2b4a4437875b895 \ No newline at end of file diff --git a/test/fts3corrupt6.test b/test/fts3corrupt6.test new file mode 100644 index 0000000000..9e22bdf68a --- /dev/null +++ b/test/fts3corrupt6.test @@ -0,0 +1,60 @@ +# 2020 June 8 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#************************************************************************* +# This file implements regression tests for SQLite library. The +# focus of this script is testing the FTS3 module. +# +# $Id: fts3aa.test,v 1.1 2007/08/20 17:38:42 shess Exp $ +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/fts3_common.tcl +set testprefix fts3corrupt6 + +# If SQLITE_ENABLE_FTS3 is defined, omit this file. +ifcapable !fts3 { + finish_test + return +} + +set ::saved_sqlite_fts3_enable_parentheses $::sqlite_fts3_enable_parentheses +set sqlite_fts3_enable_parentheses 1 +sqlite3_fts3_may_be_corrupt 1 +database_may_be_corrupt + +do_execsql_test 1.0 { + BEGIN TRANSACTION; + CREATE TABLE t_content(col0 INTEGER); + PRAGMA writable_schema=ON; + CREATE VIRTUAL TABLE t0 USING fts3(col0 INTEGER PRIMARY KEY,col1 VARCHAR(8),col2 BINARY,col3 BINARY); + INSERT INTO t0_content VALUES(0,NULL,NULL,NULL,NULL); + INSERT INTO t0_segdir VALUES(0,0,0,0,'0 42',X'000131030102000103323334050101010200000461616161050101020200000462626262050101030200'); + COMMIT; +} + +do_execsql_test 1.1 { + SELECT 0+matchinfo(t0,'yxyyxy') FROM t0 WHERE t0 MATCH CAST( x'2b0a312b0a312a312a2a0b5d0a0b0b0a312a0a0b0b0a312a0b310a392a0b0a27312a2a0b5d0a312a0b310a31315d0b310a312a316d2a0b313b15bceaa50a312a0b0a27312a2a0b5d0a312a0b310a312b0b2a310a312a0b2a0b2a0b2e5d0a0bff313336e34a2a312a0b0a3c310b0a0b4b4b0b4b2a4bec40322b2a0b310a0a312a0a0a0a0a0a0a0a0a0b310a312a2a2a0b5d0a0b0b0a312a0b310a312a0b0a4e4541530b310a5df5ced70a0a0a0a0a4f520a0a0a0a0a0a0a312a0b0a4e4541520b310a5d616161610a0a0a0a4f520a0a0a0a0a0a312b0a312a312a0a0a0a0a0a0a004a0b0a310b220a0b0a310a4a22310a0b0a7e6fe0e0e030e0e0e0e0e01176e02000e0e0e0e0e01131320226310a0b0a310a4a22310a0b0a310a766f8b8b4ee0e0300ae0090909090909090909090909090909090909090909090909090909090909090947aaaa540b09090909090909090909090909090909090909090909090909090909090909fae0e0f2f22164e0e0f273e07fefefef7d6dfafafafa6d6d6d6d' AS TEXT); +} {0} + +do_execsql_test 1.2 { + CREATE VIRTUAL TABLE t1 USING fts3(col0 INTEGER PRIMARY KEY,col1 VARCHAR(8),col2 BINARY,col3 BINARY); + INSERT INTO t1_content VALUES(0,NULL,NULL,NULL,NULL); + INSERT INTO t1_segdir VALUES(0,0,0,0,'0 42',X'000131030102000103323334050101010200000461616161050101020200000462626262050101030200'); +} + +do_execsql_test 1.3 { + SELECT 42+matchinfo(t1,'yxyyxy') FROM t1 WHERE t1 MATCH x'2b0a312b0a312a312a2a0b5d0a0b0b0a312a0a0b0b0a312a0b310a392a0b0a27312a2a0b5d0a312a0b310a31315d0b310a312a316d2a0b313b15bceaa50a312a0b0a27312a2a0b5d0a312a0b310a312b0b2a310a312a0b2a0b2a0b2e5d0a0bff313336e34a2a312a0b0a3c310b0a0b4b4b0b4b2a4bec40322b2a0b310a0a312a0a0a0a0a0a0a0a0a0b310a312a2a2a0b5d0a0b0b0a312a0b310a312a0b0a4e4541530b310a5df5ced70a0a0a0a0a4f520a0a0a0a0a0a0a312a0b0a4e4541520b310a5d616161610a0a0a0a4f520a0a0a0a0a0a312b0a312a312a0a0a0a0a0a0a004a0b0a310b220a0b0a310a4a22310a0b0a7e6fe0e0e030e0e0e0e0e01176e02000e0e0e0e0e01131320226310a0b0a310a4a22310a0b0a310a766f8b8b4ee0e0300ae0090909090909090909090909090909090909090909090909090909090909090947aaaa540b09090909090909090909090909090909090909090909090909090909090909fae0e0f2f22164e0e0f273e07fefefef7d6dfafafafa6d6d6d6d'; +} {42} + +set sqlite_fts3_enable_parentheses $saved_sqlite_fts3_enable_parentheses +finish_test + + From e26d428a5900bb0cbfbb4e3857ff6343e7664cfe Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 9 Jun 2020 11:59:15 +0000 Subject: [PATCH 140/224] Improved tree-view debugging output for aggregate functions. FossilOrigin-Name: b5711b4eead10ef4b0b61f2e2c54768d215a4105f6d47d2ea78991b6e53a6831 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/select.c | 1 + src/sqliteInt.h | 4 +--- src/treeview.c | 3 ++- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 6be90cfd3a..5e72cbd1e9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scase\swhere\sa\scorrupted\sfts3\srecord\scould\scause\san\sassert()\sfailure,\sor\sspurious\sSQLITE_NOMEM\serror\sin\sbuilds\swith\sassert()\sdisabled. -D 2020-06-08T14:43:41.880 +C Improved\stree-view\sdebugging\soutput\sfor\saggregate\sfunctions. +D 2020-06-09T11:59:15.991 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,12 +533,12 @@ F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c fb79ed71f8b8bbe9fefaba9b844f80700dea4f175ccac34c64a7b5cd75abc362 +F src/select.c 1301808307645b008ba7a33647c0ca19f97240c426addd2e0dad2a2867d8b2b5 F src/shell.c.in c6e26593f2738eefded08a39204bf6b48db135cdfaa458c26ffe57055b4fe365 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h 04621e8c61c2bf4578d07e99cc5b5909b16d5e34600ed8297a8fd4d1a95afc4e +F src/sqliteInt.h 73968c25461d9edf3b15d5d8f1468c4dd0677cbcb5a0be606e04e19e0d4a6863 F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -598,7 +598,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c eee7bae3ec0bc4abee951554bf46a8ba567c0f7752ac90c820ed8afff4c612dc -F src/treeview.c c5691babcd558baa136474b57a4aede45cf68daa3ed6637b981dde4b256e5b67 +F src/treeview.c 4b92992176fb2caefbe06ba5bd06e0e0ebcde3d5564758da672631f17aa51cda F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04 F src/update.c 3199098455830fc2d8c8fc4ae3ec2ea513eef64339ae9a7048db62b21169bc7a F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 @@ -1867,7 +1867,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 6e6b3729e0549de028f6c5bf494b2d69d621c81b61a1dc0a329d3950039342fb -R 501a6f582df48fcb778cb04d0dbc67e9 -U dan -Z 59d7d89d08b1863cb68d3606c4f1b730 +P d48af4d2cfff3d5f4ccc3db5d658e8b503255b577e6e62b5c2b4a4437875b895 +R 7f4e9a8ad02c966f79b46556c8deb165 +U drh +Z 7160527ec9944aa7c5f24e9bdb594d2d diff --git a/manifest.uuid b/manifest.uuid index 1ae45ab99b..8ee67f7f22 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d48af4d2cfff3d5f4ccc3db5d658e8b503255b577e6e62b5c2b4a4437875b895 \ No newline at end of file +b5711b4eead10ef4b0b61f2e2c54768d215a4105f6d47d2ea78991b6e53a6831 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 9e8af0cb17..96e44225fa 100644 --- a/src/select.c +++ b/src/select.c @@ -6362,6 +6362,7 @@ int sqlite3Select( } pAggInfo->pNext = pParse->pAggList; pParse->pAggList = pAggInfo; + pAggInfo->selId = p->selId; memset(&sNC, 0, sizeof(sNC)); sNC.pParse = pParse; sNC.pSrcList = pTabList; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 0b71ef42bb..0cd33baa08 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2523,9 +2523,7 @@ struct AggInfo { int iDistinct; /* Ephemeral table used to enforce DISTINCT */ } *aFunc; int nFunc; /* Number of entries in aFunc[] */ -#ifdef SQLITE_DEBUG - int iAggMagic; /* Magic number when valid */ -#endif + u32 selId; /* Select to which this AggInfo belongs */ AggInfo *pNext; /* Next in list of them all */ }; diff --git a/src/treeview.c b/src/treeview.c index 8ae06261ea..187f1a07d1 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -582,8 +582,9 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ #endif } if( pExpr->op==TK_AGG_FUNCTION ){ - sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q%s iAgg=%d agg=%p", + sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q%s agg=%d[%d]/%p", pExpr->op2, pExpr->u.zToken, zFlgs, + pExpr->pAggInfo ? pExpr->pAggInfo->selId : 0, pExpr->iAgg, pExpr->pAggInfo); }else if( pExpr->op2!=0 ){ const char *zOp2; From 81185a5138577baf2b32112fa3c6f931667c23f9 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 9 Jun 2020 13:38:12 +0000 Subject: [PATCH 141/224] Give the expression pointer fields of AggInfo distinctive names in order to simplify tracking of all their uses. FossilOrigin-Name: a53bdd311c4154fd5e1131efbb9665362f79db5a35ce9f7b1547f74b8ee2d8ba --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 14 +++++++------- src/select.c | 32 ++++++++++++++++---------------- src/sqliteInt.h | 4 ++-- 5 files changed, 34 insertions(+), 34 deletions(-) diff --git a/manifest b/manifest index 5e72cbd1e9..330b564652 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\stree-view\sdebugging\soutput\sfor\saggregate\sfunctions. -D 2020-06-09T11:59:15.991 +C Give\sthe\sexpression\spointer\sfields\sof\sAggInfo\sdistinctive\snames\sin\sorder\sto\nsimplify\stracking\sof\sall\stheir\suses. +D 2020-06-09T13:38:12.505 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -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 217bee94b696a061fec28526c5d5ef3049536ace5c10a0a3ff7d15b0d3a9cd11 +F src/expr.c 5afb8dd59d5617e0eb25f91143ed042b6cd99c006352bdbd441cb9638d2602d8 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -533,12 +533,12 @@ F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 1301808307645b008ba7a33647c0ca19f97240c426addd2e0dad2a2867d8b2b5 +F src/select.c a1f5efdbbfae1f73746242b43daedc974a4ae702d62c305219da650ec10fb08f F src/shell.c.in c6e26593f2738eefded08a39204bf6b48db135cdfaa458c26ffe57055b4fe365 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h 73968c25461d9edf3b15d5d8f1468c4dd0677cbcb5a0be606e04e19e0d4a6863 +F src/sqliteInt.h 8fddd3ff00bb5983c45fbe891c9c4134b5d4799d8816a1e97cba38dc66aca4c2 F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1867,7 +1867,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 d48af4d2cfff3d5f4ccc3db5d658e8b503255b577e6e62b5c2b4a4437875b895 -R 7f4e9a8ad02c966f79b46556c8deb165 +P b5711b4eead10ef4b0b61f2e2c54768d215a4105f6d47d2ea78991b6e53a6831 +R 45115571336eb976de1e3114a0d3911d U drh -Z 7160527ec9944aa7c5f24e9bdb594d2d +Z b9fb75855deff6080f9952a1c1c95794 diff --git a/manifest.uuid b/manifest.uuid index 8ee67f7f22..2406f422d1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b5711b4eead10ef4b0b61f2e2c54768d215a4105f6d47d2ea78991b6e53a6831 \ No newline at end of file +a53bdd311c4154fd5e1131efbb9665362f79db5a35ce9f7b1547f74b8ee2d8ba \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 6fbc8bb49c..555b2a8d82 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5738,20 +5738,20 @@ static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){ assert( pExpr->op==TK_AGG_COLUMN || pExpr->op==TK_AGG_FUNCTION ); if( pExpr->op==TK_AGG_COLUMN ){ assert( iAgg>=0 && iAggnColumn ); - if( pAggInfo->aCol[iAgg].pExpr==pExpr ){ + if( pAggInfo->aCol[iAgg].pCExpr==pExpr ){ pExpr = sqlite3ExprDup(db, pExpr, 0); if( pExpr ){ - pAggInfo->aCol[iAgg].pExpr = pExpr; + pAggInfo->aCol[iAgg].pCExpr = pExpr; pParse->pConstExpr = sqlite3ExprListAppend(pParse, pParse->pConstExpr, pExpr); } } }else{ assert( iAgg>=0 && iAggnFunc ); - if( pAggInfo->aFunc[iAgg].pExpr==pExpr ){ + if( pAggInfo->aFunc[iAgg].pFExpr==pExpr ){ pExpr = sqlite3ExprDup(db, pExpr, 0); if( pExpr ){ - pAggInfo->aFunc[iAgg].pExpr = pExpr; + pAggInfo->aFunc[iAgg].pFExpr = pExpr; pParse->pConstExpr = sqlite3ExprListAppend(pParse, pParse->pConstExpr, pExpr); } @@ -5853,7 +5853,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ pCol->iColumn = pExpr->iColumn; pCol->iMem = ++pParse->nMem; pCol->iSorterColumn = -1; - pCol->pExpr = pExpr; + pCol->pCExpr = pExpr; if( pAggInfo->pGroupBy ){ int j, n; ExprList *pGB = pAggInfo->pGroupBy; @@ -5896,7 +5896,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ */ struct AggInfo_func *pItem = pAggInfo->aFunc; for(i=0; inFunc; i++, pItem++){ - if( sqlite3ExprCompare(0, pItem->pExpr, pExpr, -1)==0 ){ + if( sqlite3ExprCompare(0, pItem->pFExpr, pExpr, -1)==0 ){ break; } } @@ -5908,7 +5908,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ if( i>=0 ){ assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); pItem = &pAggInfo->aFunc[i]; - pItem->pExpr = pExpr; + pItem->pFExpr = pExpr; pItem->iMem = ++pParse->nMem; assert( !ExprHasProperty(pExpr, EP_IntValue) ); pItem->pFunc = sqlite3FindFunction(pParse->db, diff --git a/src/select.c b/src/select.c index 96e44225fa..cd242bb1fd 100644 --- a/src/select.c +++ b/src/select.c @@ -5389,7 +5389,7 @@ static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){ sqlite3VdbeAddOp3(v, OP_Null, 0, pAggInfo->mnReg, pAggInfo->mxReg); for(pFunc=pAggInfo->aFunc, i=0; inFunc; i++, pFunc++){ if( pFunc->iDistinct>=0 ){ - Expr *pE = pFunc->pExpr; + Expr *pE = pFunc->pFExpr; assert( !ExprHasProperty(pE, EP_xIsSelect) ); if( pE->x.pList==0 || pE->x.pList->nExpr!=1 ){ sqlite3ErrorMsg(pParse, "DISTINCT aggregates must have exactly one " @@ -5413,8 +5413,8 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){ int i; struct AggInfo_func *pF; for(i=0, pF=pAggInfo->aFunc; inFunc; i++, pF++){ - ExprList *pList = pF->pExpr->x.pList; - assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) ); + ExprList *pList = pF->pFExpr->x.pList; + assert( !ExprHasProperty(pF->pFExpr, EP_xIsSelect) ); sqlite3VdbeAddOp2(v, OP_AggFinal, pF->iMem, pList ? pList->nExpr : 0); sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF); } @@ -5443,11 +5443,11 @@ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ int nArg; int addrNext = 0; int regAgg; - ExprList *pList = pF->pExpr->x.pList; - assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) ); - assert( !IsWindowFunc(pF->pExpr) ); - if( ExprHasProperty(pF->pExpr, EP_WinFunc) ){ - Expr *pFilter = pF->pExpr->y.pWin->pFilter; + ExprList *pList = pF->pFExpr->x.pList; + assert( !ExprHasProperty(pF->pFExpr, EP_xIsSelect) ); + assert( !IsWindowFunc(pF->pFExpr) ); + if( ExprHasProperty(pF->pFExpr, EP_WinFunc) ){ + Expr *pFilter = pF->pFExpr->y.pWin->pFilter; if( pAggInfo->nAccumulator && (pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL) ){ @@ -5509,7 +5509,7 @@ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ addrHitTest = sqlite3VdbeAddOp1(v, OP_If, regHit); VdbeCoverage(v); } for(i=0, pC=pAggInfo->aCol; inAccumulator; i++, pC++){ - sqlite3ExprCode(pParse, pC->pExpr, pC->iMem); + sqlite3ExprCode(pParse, pC->pCExpr, pC->iMem); } pAggInfo->directMode = 0; @@ -6385,12 +6385,12 @@ int sqlite3Select( } pAggInfo->nAccumulator = pAggInfo->nColumn; if( p->pGroupBy==0 && p->pHaving==0 && pAggInfo->nFunc==1 ){ - minMaxFlag = minMaxQuery(db, pAggInfo->aFunc[0].pExpr, &pMinMaxOrderBy); + minMaxFlag = minMaxQuery(db, pAggInfo->aFunc[0].pFExpr, &pMinMaxOrderBy); }else{ minMaxFlag = WHERE_ORDERBY_NORMAL; } for(i=0; inFunc; i++){ - Expr *pExpr = pAggInfo->aFunc[i].pExpr; + Expr *pExpr = pAggInfo->aFunc[i].pFExpr; assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); sNC.ncFlags |= NC_InAggFunc; sqlite3ExprAnalyzeAggList(&sNC, pExpr->x.pList); @@ -6412,12 +6412,12 @@ int sqlite3Select( for(ii=0; iinColumn; ii++){ sqlite3DebugPrintf("agg-column[%d] iMem=%d\n", ii, pAggInfo->aCol[ii].iMem); - sqlite3TreeViewExpr(0, pAggInfo->aCol[ii].pExpr, 0); + sqlite3TreeViewExpr(0, pAggInfo->aCol[ii].pCExpr, 0); } for(ii=0; iinFunc; ii++){ sqlite3DebugPrintf("agg-func[%d]: iMem=%d\n", ii, pAggInfo->aFunc[ii].iMem); - sqlite3TreeViewExpr(0, pAggInfo->aFunc[ii].pExpr, 0); + sqlite3TreeViewExpr(0, pAggInfo->aFunc[ii].pFExpr, 0); } } #endif @@ -6722,7 +6722,7 @@ int sqlite3Select( ** function visits zero rows. */ if( pAggInfo->nAccumulator ){ for(i=0; inFunc; i++){ - if( ExprHasProperty(pAggInfo->aFunc[i].pExpr, EP_WinFunc) ){ + if( ExprHasProperty(pAggInfo->aFunc[i].pFExpr, EP_WinFunc) ){ continue; } if( pAggInfo->aFunc[i].pFunc->funcFlags&SQLITE_FUNC_NEEDCOLL ){ @@ -6806,14 +6806,14 @@ select_end: #ifdef SQLITE_DEBUG if( pAggInfo ){ for(i=0; inColumn; i++){ - Expr *pExpr = pAggInfo->aCol[i].pExpr; + Expr *pExpr = pAggInfo->aCol[i].pCExpr; assert( pExpr!=0 || db->mallocFailed ); if( pExpr==0 ) continue; assert( pExpr->pAggInfo==pAggInfo ); assert( pExpr->iAgg==i ); } for(i=0; inFunc; i++){ - Expr *pExpr = pAggInfo->aFunc[i].pExpr; + Expr *pExpr = pAggInfo->aFunc[i].pFExpr; assert( pExpr!=0 || db->mallocFailed ); if( pExpr==0 ) continue; assert( pExpr->pAggInfo==pAggInfo ); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 0cd33baa08..7231856423 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2506,7 +2506,7 @@ struct AggInfo { ExprList *pGroupBy; /* The group by clause */ struct AggInfo_col { /* For each column used in source tables */ Table *pTab; /* Source table */ - Expr *pExpr; /* The original expression */ + Expr *pCExpr; /* The original expression */ int iTable; /* Cursor number of the source table */ int iMem; /* Memory location that acts as accumulator */ i16 iColumn; /* Column number within the source table */ @@ -2517,7 +2517,7 @@ struct AggInfo { ** Additional columns are used only as parameters to ** aggregate functions */ struct AggInfo_func { /* For each aggregate function */ - Expr *pExpr; /* Expression encoding the function */ + Expr *pFExpr; /* Expression encoding the function */ FuncDef *pFunc; /* The aggregate function implementation */ int iMem; /* Memory location that acts as accumulator */ int iDistinct; /* Ephemeral table used to enforce DISTINCT */ From cfb8bf6a501ccc5f67b9ae84ad1b6aa40bc1a374 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 9 Jun 2020 13:53:56 +0000 Subject: [PATCH 142/224] Modify a test file to avoid causing Tcl to allocate too much memory. FossilOrigin-Name: 232431f32ef77a9dfc4eeb7765dca24af72051fd5460f648d0c5ba318c8a01fc --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/printf.test | 8 +++++--- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 330b564652..b8ba79ee60 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Give\sthe\sexpression\spointer\sfields\sof\sAggInfo\sdistinctive\snames\sin\sorder\sto\nsimplify\stracking\sof\sall\stheir\suses. -D 2020-06-09T13:38:12.505 +C Modify\sa\stest\sfile\sto\savoid\scausing\sTcl\sto\sallocate\stoo\smuch\smemory. +D 2020-06-09T13:53:56.924 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1247,7 +1247,7 @@ F test/pragma4.test 10c624e45a83c0096a82a7579a5ff658542391d3b77355192da6572c8c17 F test/pragma5.test 7b33fc43e2e41abf17f35fb73f71b49671a380ea92a6c94b6ce530a25f8d9102 F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8 F test/prefixes.test b524a1c44bffec225b9aec98bd728480352aa8532ac4c15771fb85e8beef65d9 -F test/printf.test 1e0e469f5f8a09afa8a182f34647e3d9b8c01978cbbe2313a194ccc3a8471506 +F test/printf.test 390d0d7fcffc3c4ea3c1bb4cbb267444e32b33b048ae21895f23a291844fe1da F test/printf2.test 30b5dd0b4b992dc5626496846ecce17ff592cacbcb11c3e589f3ac4d7e129dae F test/progress.test ebab27f670bd0d4eb9d20d49cef96e68141d92fb F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc @@ -1867,7 +1867,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 b5711b4eead10ef4b0b61f2e2c54768d215a4105f6d47d2ea78991b6e53a6831 -R 45115571336eb976de1e3114a0d3911d -U drh -Z b9fb75855deff6080f9952a1c1c95794 +P a53bdd311c4154fd5e1131efbb9665362f79db5a35ce9f7b1547f74b8ee2d8ba +R 8d5a1a9f2ed9a4fff418950bdfdce962 +U dan +Z f464d78ab773b9580c31ba7ad2e586ff diff --git a/manifest.uuid b/manifest.uuid index 2406f422d1..3aa4f6d091 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a53bdd311c4154fd5e1131efbb9665362f79db5a35ce9f7b1547f74b8ee2d8ba \ No newline at end of file +232431f32ef77a9dfc4eeb7765dca24af72051fd5460f648d0c5ba318c8a01fc \ No newline at end of file diff --git a/test/printf.test b/test/printf.test index d6acacb0f0..445470fc07 100644 --- a/test/printf.test +++ b/test/printf.test @@ -538,9 +538,11 @@ do_test printf-2.1.2.8 { do_test printf-2.1.2.9 { sqlite3_mprintf_double {abc: %d %d (%1.1g) :xyz} 1 1 1.0e-20 } {abc: 1 1 (1e-20) :xyz} -do_test printf-2.1.2.10 { - sqlite3_mprintf_double {abc: %*.*f} 2000000000 1000000000 1.0e-20 -} {} +if {$SQLITE_MAX_LENGTH<=[expr 1000*1000*1000]} { + do_test printf-2.1.2.10 { + sqlite3_mprintf_double {abc: %*.*f} 2000000000 1000000000 1.0e-20 + } {} +} do_test printf-2.1.3.1 { sqlite3_mprintf_double {abc: (%*.*f) :xyz} 1 1 1.0 } {abc: (1.0) :xyz} From ed41a96bc1e3a6eb011330b0a109ae4fc703a14c Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 9 Jun 2020 17:45:48 +0000 Subject: [PATCH 143/224] Ensure that aggregate functions that (a) are part of SELECT statements with no FROM clause and (b) have one or more scalar sub-selects as arguments are assigned to the correct aggregate context. FossilOrigin-Name: 16a41fa8c4c74bba4e908a9c19e6cf5a927cac140e2070c9abf303158be7257b --- manifest | 19 ++++++++++-------- manifest.uuid | 2 +- src/expr.c | 20 +++++++++++++++++-- test/aggnested.test | 47 +++++++++++++++++++++++++++++++++++++++++++++ test/window9.test | 4 ++-- 5 files changed, 79 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index b8ba79ee60..cb430643e5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Modify\sa\stest\sfile\sto\savoid\scausing\sTcl\sto\sallocate\stoo\smuch\smemory. -D 2020-06-09T13:53:56.924 +C Ensure\sthat\saggregate\sfunctions\sthat\s(a)\sare\spart\sof\sSELECT\sstatements\swith\sno\sFROM\sclause\sand\s(b)\shave\sone\sor\smore\sscalar\ssub-selects\sas\sarguments\sare\sassigned\sto\sthe\scorrect\saggregate\scontext. +D 2020-06-09T17:45:48.153 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -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 5afb8dd59d5617e0eb25f91143ed042b6cd99c006352bdbd441cb9638d2602d8 +F src/expr.c a72ee44af014cade90746871e90f57a16f97ce5e5d1502e29a556490fd267a15 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -629,7 +629,7 @@ F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 -F test/aggnested.test 12106f0748e8e9bfc1a8e6840e203e051eae06a26ed13fc9fd5db108a8d6db54 +F test/aggnested.test 2f65ec8132e0ca896de550b9908094d49ad65a99116a9d79deeb6017604ad4f6 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13 F test/alter.test 25e109787dc5e631e117eb6e1c57f96a572bb51228db3b4f8b5f41d665e2ccaa @@ -1741,7 +1741,7 @@ F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d761 F test/window7.test 1d31276961ae7801edc72173edaf7593e3cbc79c06d1f1f09e20d8418af403cd F test/window8.tcl f2711aa3571e4e6b0dad98db8d95fd6cb8d9db0c92bbdf535f153b07606a1ce2 F test/window8.test c4331b27a6f66d69fa8f8bab10cc731db1a81d293ae108a68f7c3487fa94e65b -F test/window9.test c22c25377c820613e1842fe7ad4af7c03df625f6a7caee99e6fdb4fcd52e0a8b +F test/window9.test 4d8c875b73febdbac9b8f2b52ec132b98f48261cdafd6b08db62bc6d8ff913fc F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be F test/windowB.test 7a983ea1cc1cf72be7f378e4b32f6cb2d73014c5cd8b25aaee825164cd4269e5 F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 @@ -1867,7 +1867,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 a53bdd311c4154fd5e1131efbb9665362f79db5a35ce9f7b1547f74b8ee2d8ba -R 8d5a1a9f2ed9a4fff418950bdfdce962 +P 232431f32ef77a9dfc4eeb7765dca24af72051fd5460f648d0c5ba318c8a01fc +R 0227801129ea01db7bd6b8fdef42c443 +T *branch * agg-context-fix +T *sym-agg-context-fix * +T -sym-trunk * U dan -Z f464d78ab773b9580c31ba7ad2e586ff +Z b0984ce04348fe30b8ef7dbc168a8647 diff --git a/manifest.uuid b/manifest.uuid index 3aa4f6d091..0f7761b1d4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -232431f32ef77a9dfc4eeb7765dca24af72051fd5460f648d0c5ba318c8a01fc \ No newline at end of file +16a41fa8c4c74bba4e908a9c19e6cf5a927cac140e2070c9abf303158be7257b \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 555b2a8d82..87dbe617ac 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5654,10 +5654,25 @@ int sqlite3ExprCoveredByIndex( */ struct SrcCount { SrcList *pSrc; /* One particular FROM clause in a nested query */ + int iSrcInner; /* Smallest cursor number in this context */ int nThis; /* Number of references to columns in pSrcList */ int nOther; /* Number of references to columns in other FROM clauses */ }; +/* +** xSelect callback for sqlite3FunctionUsesThisSrc(). If this is the first +** SELECT with a FROM clause encountered during this iteration, set +** SrcCount.iSrcInner to the cursor number of the leftmost object in +** the FROM cause. +*/ +static int selectSrcCount(Walker *pWalker, Select *pSel){ + struct SrcCount *p = pWalker->u.pSrcCount; + if( p->iSrcInner==0x7FFFFFFF && pSel->pSrc && pSel->pSrc->nSrc ){ + pWalker->u.pSrcCount->iSrcInner = pSel->pSrc->a[0].iCursor; + } + return WRC_Continue; +} + /* ** Count the number of references to columns. */ @@ -5678,7 +5693,7 @@ static int exprSrcCount(Walker *pWalker, Expr *pExpr){ } if( inThis++; - }else if( nSrc==0 || pExpr->iTablea[0].iCursor ){ + }else if( pExpr->iTableiSrcInner ){ /* In a well-formed parse tree (no name resolution errors), ** TK_COLUMN nodes with smaller Expr.iTable values are in an ** outer context. Those are the only ones to count as "other" */ @@ -5700,9 +5715,10 @@ int sqlite3FunctionUsesThisSrc(Expr *pExpr, SrcList *pSrcList){ assert( pExpr->op==TK_AGG_FUNCTION ); memset(&w, 0, sizeof(w)); w.xExprCallback = exprSrcCount; - w.xSelectCallback = sqlite3SelectWalkNoop; + w.xSelectCallback = selectSrcCount; w.u.pSrcCount = &cnt; cnt.pSrc = pSrcList; + cnt.iSrcInner = (pSrcList&&pSrcList->nSrc)?pSrcList->a[0].iCursor:0x7FFFFFFF; cnt.nThis = 0; cnt.nOther = 0; sqlite3WalkExprList(&w, pExpr->x.pList); diff --git a/test/aggnested.test b/test/aggnested.test index d712c840f1..dcb1f95c99 100644 --- a/test/aggnested.test +++ b/test/aggnested.test @@ -17,6 +17,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +set testprefix aggnested do_test aggnested-1.1 { db eval { @@ -259,6 +260,52 @@ do_execsql_test aggnested-4.4 { SELECT max((SELECT a FROM (SELECT count(*) AS a FROM ty) AS s)) FROM tx; } {3} +#-------------------------------------------------------------------------- +# +reset_db +do_execsql_test 5.0 { + CREATE TABLE x1(a, b); + INSERT INTO x1 VALUES(1, 2); + CREATE TABLE x2(x); + INSERT INTO x2 VALUES(NULL), (NULL), (NULL); +} + +# At one point, aggregate "total()" in the query below was being processed +# as part of the outer SELECT, not as part of the sub-select with no FROM +# clause. +do_execsql_test 5.1 { + SELECT ( SELECT total( (SELECT b FROM x1) ) ) FROM x2; +} {2.0 2.0 2.0} + +do_execsql_test 5.2 { + SELECT ( SELECT total( (SELECT 2 FROM x1) ) ) FROM x2; +} {2.0 2.0 2.0} + +do_execsql_test 5.3 { + CREATE TABLE t1(a); + CREATE TABLE t2(b); +} + +do_execsql_test 5.4 { + SELECT( + SELECT max(b) LIMIT ( + SELECT total( (SELECT a FROM t1) ) + ) + ) + FROM t2; +} {{}} + +do_execsql_test 5.5 { + CREATE TABLE a(b); + WITH c AS(SELECT a) + SELECT(SELECT(SELECT group_concat(b, b) + LIMIT(SELECT 0.100000 * + AVG(DISTINCT(SELECT 0 FROM a ORDER BY b, b, b)))) + FROM a GROUP BY b, + b, b) FROM a EXCEPT SELECT b FROM a ORDER BY b, + b, b; +} + diff --git a/test/window9.test b/test/window9.test index 46d746c4ff..c342a4d790 100644 --- a/test/window9.test +++ b/test/window9.test @@ -255,7 +255,7 @@ do_execsql_test 8.2 { do_catchsql_test 8.3 { SELECT min( max((SELECT x FROM v1)) ) OVER() -} {1 {misuse of aggregate: max()}} +} {0 0} do_execsql_test 8.4 { SELECT( @@ -263,6 +263,6 @@ do_execsql_test 8.4 { SELECT sum( avg((SELECT x FROM v1)) ) OVER() ) FROM v1; -} {0.0} +} {0.0 0.0} finish_test From bc050b8f2720ca110c6a9db8cd1b15bcfcc6968c Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 9 Jun 2020 22:11:06 +0000 Subject: [PATCH 144/224] Mark an always-true conditional with ALWAYS(). FossilOrigin-Name: 35a236841764a10cdcda63f34e1a8e7ffa43933bc89cb32f675454327834d7bf --- manifest | 17 +++++++---------- manifest.uuid | 2 +- src/expr.c | 2 +- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index cb430643e5..f1c071e2ea 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\saggregate\sfunctions\sthat\s(a)\sare\spart\sof\sSELECT\sstatements\swith\sno\sFROM\sclause\sand\s(b)\shave\sone\sor\smore\sscalar\ssub-selects\sas\sarguments\sare\sassigned\sto\sthe\scorrect\saggregate\scontext. -D 2020-06-09T17:45:48.153 +C Mark\san\salways-true\sconditional\swith\sALWAYS(). +D 2020-06-09T22:11:06.772 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -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 a72ee44af014cade90746871e90f57a16f97ce5e5d1502e29a556490fd267a15 +F src/expr.c 54c0e48fdafb60c54efd786434a56eccbea7d887b7f84ed3568233de35ca81a8 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -1867,10 +1867,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 232431f32ef77a9dfc4eeb7765dca24af72051fd5460f648d0c5ba318c8a01fc -R 0227801129ea01db7bd6b8fdef42c443 -T *branch * agg-context-fix -T *sym-agg-context-fix * -T -sym-trunk * -U dan -Z b0984ce04348fe30b8ef7dbc168a8647 +P 16a41fa8c4c74bba4e908a9c19e6cf5a927cac140e2070c9abf303158be7257b +R c0708f727fdcc95b477a18221a965825 +U drh +Z f79254b70a5e081e8abefb3c222e5de7 diff --git a/manifest.uuid b/manifest.uuid index 0f7761b1d4..9d6237b1f8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -16a41fa8c4c74bba4e908a9c19e6cf5a927cac140e2070c9abf303158be7257b \ No newline at end of file +35a236841764a10cdcda63f34e1a8e7ffa43933bc89cb32f675454327834d7bf \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 87dbe617ac..79d57454c9 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5667,7 +5667,7 @@ struct SrcCount { */ static int selectSrcCount(Walker *pWalker, Select *pSel){ struct SrcCount *p = pWalker->u.pSrcCount; - if( p->iSrcInner==0x7FFFFFFF && pSel->pSrc && pSel->pSrc->nSrc ){ + if( p->iSrcInner==0x7FFFFFFF && ALWAYS(pSel->pSrc) && pSel->pSrc->nSrc ){ pWalker->u.pSrcCount->iSrcInner = pSel->pSrc->a[0].iCursor; } return WRC_Continue; From 7b4c4d4a674efe176437e5586cb55839ba43d499 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 10 Jun 2020 03:07:26 +0000 Subject: [PATCH 145/224] Disable AggInfo consistency checks when unwinding after an OOM. FossilOrigin-Name: 65179814aa0ae5927bae97c10ef20f290535399b889d96d5b88931f62635f212 --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/select.c | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 9bbc9d0223..bb9d8a086e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\saggregate\sfunctions\sthat\s(a)\sare\spart\sof\sSELECT\sstatements\swith\s\nno\sFROM\sclause\sand\s(b)\shave\sone\sor\smore\sscalar\ssub-selects\sas\sarguments\sare\nassigned\sto\sthe\scorrect\saggregate\scontext.\nFix\sfor\sticket\s[7c6d876f84e6e7e2] -D 2020-06-09T23:50:13.182 +C Disable\sAggInfo\sconsistency\schecks\swhen\sunwinding\safter\san\sOOM. +D 2020-06-10T03:07:26.868 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c a1f5efdbbfae1f73746242b43daedc974a4ae702d62c305219da650ec10fb08f +F src/select.c 4daa7ac63367e88a970da434299463dac00ea59f68545e58f2c676c41c3df509 F src/shell.c.in c6e26593f2738eefded08a39204bf6b48db135cdfaa458c26ffe57055b4fe365 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1867,8 +1867,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 232431f32ef77a9dfc4eeb7765dca24af72051fd5460f648d0c5ba318c8a01fc 35a236841764a10cdcda63f34e1a8e7ffa43933bc89cb32f675454327834d7bf -R c0708f727fdcc95b477a18221a965825 -T +closed 35a236841764a10cdcda63f34e1a8e7ffa43933bc89cb32f675454327834d7bf +P c29a9e484e1dd245962afbbf511b183462af5e86c511261ccf018345e773f940 +R 440ef9b1055344c4df3ee1e29cdb0f73 U drh -Z ee07ca7203f666ac689e6e704d547cda +Z 72d82f473bff3f7dd22efa1accdf2ed0 diff --git a/manifest.uuid b/manifest.uuid index fb49b9cf82..8765d3aaf0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c29a9e484e1dd245962afbbf511b183462af5e86c511261ccf018345e773f940 \ No newline at end of file +65179814aa0ae5927bae97c10ef20f290535399b889d96d5b88931f62635f212 \ No newline at end of file diff --git a/src/select.c b/src/select.c index cd242bb1fd..093178f43d 100644 --- a/src/select.c +++ b/src/select.c @@ -6804,7 +6804,7 @@ int sqlite3Select( select_end: sqlite3ExprListDelete(db, pMinMaxOrderBy); #ifdef SQLITE_DEBUG - if( pAggInfo ){ + if( pAggInfo && !db->mallocFailed ){ for(i=0; inColumn; i++){ Expr *pExpr = pAggInfo->aCol[i].pCExpr; assert( pExpr!=0 || db->mallocFailed ); From f65e3799191b44f5db21f7d49b7f289bd4c5508f Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 10 Jun 2020 10:58:15 +0000 Subject: [PATCH 146/224] Ensure that the "push-down" optimization does not push constraints down into compound queries if any of the component queries uses window functions. FossilOrigin-Name: 094dcfe779613301521e8bb990432df187b3686add75a3420b4a193f02f3467f --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/select.c | 5 ++++- test/window1.test | 32 ++++++++++++++++++++++++++++++-- 4 files changed, 43 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index bb9d8a086e..229488da3e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disable\sAggInfo\sconsistency\schecks\swhen\sunwinding\safter\san\sOOM. -D 2020-06-10T03:07:26.868 +C Ensure\sthat\sthe\s"push-down"\soptimization\sdoes\snot\spush\sconstraints\sdown\sinto\scompound\squeries\sif\sany\sof\sthe\scomponent\squeries\suses\swindow\sfunctions. +D 2020-06-10T10:58:15.548 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 4daa7ac63367e88a970da434299463dac00ea59f68545e58f2c676c41c3df509 +F src/select.c b7bbec203c2a00e542dfea72ddfad92df349a4e3565aa666c3157fc85afe30b3 F src/shell.c.in c6e26593f2738eefded08a39204bf6b48db135cdfaa458c26ffe57055b4fe365 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1728,7 +1728,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 4baffc3acb2e5188a5e3a895b2b543ed09e62f7c72d713c1feebf76222fe9976 F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 49f81c25c065fd65b64cd2aaa96f20199fd5d8f847dd1c8151cfccae2aeae83f +F test/window1.test 486f0e01310fc7d98e626cdcb3806582c17cb0afaf1f3ec0f58ba8619c38f5ae F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1867,7 +1867,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 c29a9e484e1dd245962afbbf511b183462af5e86c511261ccf018345e773f940 -R 440ef9b1055344c4df3ee1e29cdb0f73 -U drh -Z 72d82f473bff3f7dd22efa1accdf2ed0 +P 65179814aa0ae5927bae97c10ef20f290535399b889d96d5b88931f62635f212 +R 9433b47fb24e72f9850aa4e3904d3746 +U dan +Z 349135e37e95a5cec7419bf8785fcd64 diff --git a/manifest.uuid b/manifest.uuid index 8765d3aaf0..fc1873d631 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -65179814aa0ae5927bae97c10ef20f290535399b889d96d5b88931f62635f212 \ No newline at end of file +094dcfe779613301521e8bb990432df187b3686add75a3420b4a193f02f3467f \ No newline at end of file diff --git a/src/select.c b/src/select.c index 093178f43d..465aab1ef1 100644 --- a/src/select.c +++ b/src/select.c @@ -4428,11 +4428,14 @@ static int pushDownWhereTerms( ){ Expr *pNew; int nChng = 0; + Select *pSel; if( pWhere==0 ) return 0; if( pSubq->selFlags & SF_Recursive ) return 0; /* restriction (2) */ #ifndef SQLITE_OMIT_WINDOWFUNC - if( pSubq->pWin ) return 0; /* restriction (6) */ + for(pSel=pSubq; pSel; pSel=pSel->pPrior){ + if( pSel->pWin ) return 0; /* restriction (6) */ + } #endif #ifdef SQLITE_DEBUG diff --git a/test/window1.test b/test/window1.test index 3336a613ab..ea5b66459e 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1756,7 +1756,7 @@ do_catchsql_test 54.2 { UNION SELECT b AS c FROM t1 ) WHERE c>10; -} {1 {misuse of window function sum()}} +} {0 {}} do_execsql_test 54.3 { INSERT INTO t1 VALUES('2',5.0); @@ -1769,7 +1769,7 @@ do_catchsql_test 54.4 { UNION SELECT b AS c FROM t1 ) WHERE c>10; -} {1 {misuse of window function sum()}} +} {0 {15.0 30.0}} # 2020-06-05 ticket c8d3b9f0a750a529 reset_db @@ -1889,4 +1889,32 @@ INSERT INTO t1 VALUES(5),(NULL),('seventeen'); SELECT (SELECT max(x)OVER(ORDER BY x) % min(x)OVER(ORDER BY CASE x WHEN 889 THEN x WHEN x THEN x END)) FROM (SELECT (SELECT sum(CAST(a IN(SELECT (SELECT max(x)OVER(ORDER BY CASE x WHEN 889 THEN 299 WHEN 863 THEN 863 END)) FROM (SELECT (SELECT sum(CAST((SELECT (SELECT max(x)OVER(ORDER BY x) / min(x)OVER(ORDER BY CASE x WHEN 889 THEN 299 WHEN -true THEN 863 END)) FROM (SELECT (SELECT sum(CAST(a IN(SELECT (SELECT max(x) & sum ( a )OVER(ORDER BY CASE x WHEN -8 THEN 299 WHEN 863 THEN 863 END)) FROM (SELECT (SELECT sum(CAST(a AS )) FROM t1) AS x FROM t1)) AS t1 )) FROM t1) AS x FROM t1)) AS x )) FROM t1) AS x FROM t1)) AS real)) FROM t1) AS x FROM t1); } {{} {} {}} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 62.1 { + CREATE TABLE t1(a VARCHAR(20), b FLOAT); + INSERT INTO t1 VALUES('1',10.0); +} + +do_execsql_test 62.2 { + SELECT * FROM ( + SELECT sum(b) OVER() AS c FROM t1 + UNION + SELECT b AS c FROM t1 + ) WHERE c>10; +} + +do_execsql_test 62.3 { + INSERT INTO t1 VALUES('2',5.0); + INSERT INTO t1 VALUES('3',15.0); +} + +do_execsql_test 62.4 { + SELECT * FROM ( + SELECT sum(b) OVER() AS c FROM t1 + UNION + SELECT b AS c FROM t1 + ) WHERE c>10; +} {15.0 30.0} + finish_test From ac4f7cf8d33cd751b150625560e53821f81375d8 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 10 Jun 2020 14:30:15 +0000 Subject: [PATCH 147/224] Make sure the bbox object is fully initialized in geopoly, even if reading a corrupted database. FossilOrigin-Name: fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 --- ext/rtree/geopoly.c | 2 ++ manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/ext/rtree/geopoly.c b/ext/rtree/geopoly.c index 14facad534..35294c8d85 100644 --- a/ext/rtree/geopoly.c +++ b/ext/rtree/geopoly.c @@ -683,6 +683,8 @@ static GeoPoly *geopolyBBox( aCoord[2].f = mnY; aCoord[3].f = mxY; } + }else{ + memset(aCoord, 0, sizeof(RtreeCoord)*4); } return pOut; } diff --git a/manifest b/manifest index 229488da3e..e36a442250 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\s"push-down"\soptimization\sdoes\snot\spush\sconstraints\sdown\sinto\scompound\squeries\sif\sany\sof\sthe\scomponent\squeries\suses\swindow\sfunctions. -D 2020-06-10T10:58:15.548 +C Make\ssure\sthe\sbbox\sobject\sis\sfully\sinitialized\sin\sgeopoly,\seven\sif\sreading\na\scorrupted\sdatabase. +D 2020-06-10T14:30:15.355 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -385,7 +385,7 @@ F ext/repair/test/checkfreelist01.test 3e8aa6aeb4007680c94a8d07b41c339aa635cc782 F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c335096108c12c01bddbadcec F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 -F ext/rtree/geopoly.c cac70b5502742bd0ba8877a1329a74e86a379c78567546a2a18cf5f9c3787f73 +F ext/rtree/geopoly.c f15cc6845d64a629035627d863cbe3eadc9cb30f9ca77bd823b0ca8a5a3f8b00 F ext/rtree/rtree.c 0ee39cc787b95aa03a012e09e6090b0fa452154fa812af9a379898560fd6c00f F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e @@ -1867,7 +1867,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 65179814aa0ae5927bae97c10ef20f290535399b889d96d5b88931f62635f212 -R 9433b47fb24e72f9850aa4e3904d3746 -U dan -Z 349135e37e95a5cec7419bf8785fcd64 +P 094dcfe779613301521e8bb990432df187b3686add75a3420b4a193f02f3467f +R fe50fdd9252d03af57c53593afdee806 +U drh +Z 9cfa3eb1061d3d10530f069bf73f5151 diff --git a/manifest.uuid b/manifest.uuid index fc1873d631..93b32e7733 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -094dcfe779613301521e8bb990432df187b3686add75a3420b4a193f02f3467f \ No newline at end of file +fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 \ No newline at end of file From 9216de8a230b001fd9841bcab5407c941b89ffb0 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 11 Jun 2020 00:57:09 +0000 Subject: [PATCH 148/224] Provide the ability to use the SELECTTRACE() debugging macro outside of the select.c source file. Use this to add a new SELECTTRACE() entry in window.c for improved tracing of window-function parse-tree rewriting. FossilOrigin-Name: 30c6d895b573d5f2a53487b3b7a0d20be7e382c7a0bc87336bd43fbd2fa89bf4 --- manifest | 1883 +---------------------------------------------- manifest.uuid | 2 +- src/global.c | 5 + src/select.c | 16 +- src/sqliteInt.h | 13 +- src/test1.c | 2 +- src/window.c | 3 + 7 files changed, 34 insertions(+), 1890 deletions(-) diff --git a/manifest b/manifest index e36a442250..09e432bfe3 100644 --- a/manifest +++ b/manifest @@ -1,1873 +1,12 @@ -C Make\ssure\sthe\sbbox\sobject\sis\sfully\sinitialized\sin\sgeopoly,\seven\sif\sreading\na\scorrupted\sdatabase. -D 2020-06-10T14:30:15.355 -F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 -F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea -F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in 8d79d12bae1b624d32cf9a698ecc797bfa908ab7eabac5d76faf130c4d362223 -F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc 08268b28e97fce2475c4a9bd7ba84a99827d6cf9e6b46952409821f6a12ee46d -F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a -F VERSION 5db2ee2cfcc790af73775fa485c13b2e8ccaa5936c6e1f47aedeba7056041ca5 -F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 -F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 -F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 -F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 -F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 -F autoconf/Makefile.am e14b629addaa1ce372b72043f28f40de2e32b7e211b6e0fc18dbb87989197e40 -F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.msc e0f1dafc48d000fd6ddfdb01815271528db55cbc7299ca888df5b93367f0d5a4 -F autoconf/README.first 6c4f34fe115ff55d4e8dbfa3cecf04a0188292f7 -F autoconf/README.txt 4f04b0819303aabaa35fff5f7b257fb0c1ef95f1 -F autoconf/configure.ac 3cd933b959fe514eebd1ca1717dfddbf2c9b825b6bc2c5f744deaf5d63af9288 -F autoconf/tea/Makefile.in b438a7020446c8a8156e8d97c8914a04833da6fd -F autoconf/tea/README 3e9a3c060f29a44344ab50aec506f4db903fb873 -F autoconf/tea/aclocal.m4 52c47aac44ce0ddb1f918b6993e8beb8eee88f43 -F autoconf/tea/configure.ac ea61e07340d97e4a79a081f0b8977198a6073edd060738dbb3ae5cb8d5e96f1c -F autoconf/tea/doc/sqlite3.n e1fe45d4f5286ee3d0ccc877aca2a0def488e9bb -F autoconf/tea/license.terms 13bd403c9610fd2b76ece0ab50c4c5eda933d523 -F autoconf/tea/pkgIndex.tcl.in 3ef61715cf1c7bdcff56947ffadb26bc991ca39d -F autoconf/tea/tclconfig/install-sh bdd5e293591621ae60d9824d86a4b1c5f22c3d00 -F autoconf/tea/tclconfig/tcl.m4 66ddf0a5d5e4b1d29bff472c0985fd7fa89d0fb5 -F autoconf/tea/win/makefile.vc 71915591c07cd5137711dc40ba3e127deb3f4531b9aad220b724cf5b451362bd -F autoconf/tea/win/nmakehlp.c 247538ad8e8c508f33c03ec1fbd67d3a07ef6291 -F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 -F config.guess 883205ddf25b46f10c181818bf42c09da9888884af96f79e1719264345053bd6 -F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc -F config.sub c2d0260f17f3e4bc0b6808fccf1b291cb5e9126c14fc5890efc77b9fd0175559 -F configure 5a2d453f527dcf969eecaac335d8261b3f1a8a6bd2c693a00dd7d18c29ccc7e4 x -F configure.ac 798a24cee2879325ca5b688a618199eb32cc77ed8136edbaa43d9137b470d54e -F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad -F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd -F doc/lemon.html 857495c0ce060a4e2f2ad7111135ad7e28041a32c10612279ab398eddf678f58 -F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 -F doc/trusted-schema.md 33625008620e879c7bcfbbfa079587612c434fa094d338b08242288d358c3e8a -F doc/vfs-shm.txt e101f27ea02a8387ce46a05be2b1a902a021d37a -F ext/README.md fd5f78013b0a2bc6f0067afb19e6ad040e89a10179b4f6f03eee58fac5f169bd -F ext/async/README.txt e12275968f6fde133a80e04387d0e839b0c51f91 -F ext/async/sqlite3async.c 0f3070cc3f5ede78f2b9361fb3b629ce200d7d74 -F ext/async/sqlite3async.h f489b080af7e72aec0e1ee6f1d98ab6cf2e4dcef -F ext/expert/README.md b321c2762bb93c18ea102d5a5f7753a4b8bac646cb392b3b437f633caf2020c3 -F ext/expert/expert.c d548d603a4cc9e61f446cc179c120c6713511c413f82a4a32b1e1e69d3f086a4 -F ext/expert/expert1.test 2e10ff875c31c9e6fc5e324767624181273859771fe34c5daeeadf3f2974a4f7 -F ext/expert/sqlite3expert.c ac008c72c00e6ded0f5116914d22ebd57f415fc0a7ea04738f4e9766dbdd3117 -F ext/expert/sqlite3expert.h ca81efc2679a92373a13a3e76a6138d0310e32be53d6c3bfaedabd158ea8969b -F ext/expert/test_expert.c d56c194b769bdc90cf829a14c9ecbc1edca9c850b837a4d0b13be14095c32a72 -F ext/fts1/README.txt 20ac73b006a70bcfd80069bdaf59214b6cf1db5e -F ext/fts1/ft_hash.c 3927bd880e65329bdc6f506555b228b28924921b -F ext/fts1/ft_hash.h 06df7bba40dadd19597aa400a875dbc2fed705ea -F ext/fts1/fts1.c a39f7d21c2994d27c959ef9c3505c81542c81432 -F ext/fts1/fts1.h 6060b8f62c1d925ea8356cb1a6598073eb9159a6 -F ext/fts1/fts1_hash.c 3196cee866edbebb1c0521e21672e6d599965114 -F ext/fts1/fts1_hash.h e7f0d761353996a8175eda351104acfde23afcb0 -F ext/fts1/fts1_porter.c b1c7304b8988ba3f764a147cdd32043b4913ea7b -F ext/fts1/fts1_tokenizer.h fdea722c38a9f82ed921642981234f666e47919c -F ext/fts1/fts1_tokenizer1.c fd00d1fe4dc30dfc5c64cba695ce34f4af20d2fa -F ext/fts1/fulltext.c 37698e1909584f6d8ea67d1485e3ad39dbf42d19 -F ext/fts1/fulltext.h 08525a47852d1d62a0be81d3fc3fe2d23b094efd -F ext/fts1/simple_tokenizer.c bbfa4e3b2a26ef17d4edc6d98cd4a3f5396d998a -F ext/fts1/tokenizer.h 0c53421b832366d20d720d21ea3e1f6e66a36ef9 -F ext/fts2/README.tokenizers 21e3684ea5a095b55d70f6878b4ce6af5932dfb7 -F ext/fts2/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts2/fts2.c 72c816a9ae448049fbbe8f18a85698765fc7956c -F ext/fts2/fts2.h da5f76c65163301d1068a971fd32f4119e3c95fa -F ext/fts2/fts2_hash.c 011a1d32de45bb1b519a1fd0048e857d6a843558 -F ext/fts2/fts2_hash.h 1824b99dfd8d0225facbdb26a2c87289b2e7dcf8 -F ext/fts2/fts2_icu.c 51c5cd3c04954badd329fa738c95fcdb717b5188 -F ext/fts2/fts2_porter.c 2cd4a507bf3c3085fe66f59b0f2a325f65aaacf5 -F ext/fts2/fts2_tokenizer.c b529493d55e55497213c37e1f31680a77746be26 -F ext/fts2/fts2_tokenizer.h 27a1a99ca2d615cf7e142839b8d79e8751b4529e -F ext/fts2/fts2_tokenizer1.c 07e223eecb483d448313b5f1553a4f299a7fb7a1 -F ext/fts2/mkfts2amal.tcl 974d5d438cb3f7c4a652639262f82418c1e4cff0 -F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 -F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a -F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d -F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 7a12745b024dfb26c7b87f9a5e30241b1b8c8f049ecd5c228454757b500a0595 -F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h 2c59cc46aefde134c1782e89a6a5384710ddcd4e783071337aa5d43d07269be3 -F ext/fts3/fts3_aux.c 96708c8b3a7d9b8ca1b68ea2b7e503e283f20e95f145becadedfad096dbd0f34 -F ext/fts3/fts3_expr.c f081e38da641724cd72c20e23b71db2bf4d0c9517c14637442f6910259f11a34 -F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6bdb48b7 -F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf -F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 -F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 -F ext/fts3/fts3_snippet.c 86e7e947a176f0f005720b3ca17631aca2fd2f9daa6729d4adbf2d16ab1b9613 -F ext/fts3/fts3_term.c f45a1e7c6ef464abb1231245d123dae12266b69e05cc56e14045b76591ae92d1 -F ext/fts3/fts3_test.c 73b16e229e517c1b1f0fb8e1046182a4e5dbc8dbe6eea8a5d4353fcce7dbbf39 -F ext/fts3/fts3_tokenize_vtab.c cb792f59212f7799bf2891c7d4579bbf568f124ce8fbb0a9902aa5bd577e8b75 -F ext/fts3/fts3_tokenizer.c 6d8fc150c48238955d5182bf661498db0dd473c8a2a80e00c16994a646fa96e7 -F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 -F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 -F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d -F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c ed869b24d074f2498bdbef915d6db1f88c604ca5811502112061932a0bed5133 -F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 -F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 -F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 -F ext/fts3/tool/fts3view.c 202801a2056995b763864d60c2dee744d46f1677 -F ext/fts3/unicode/CaseFolding.txt 8c678ca52ecc95e16bc7afc2dbf6fc9ffa05db8c -F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7 -F ext/fts3/unicode/mkunicode.tcl bf7fcaa6d68e6d38223467983785d054f1cff4d9e3905dd51f6ed8801bb590d5 -F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb -F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 -F ext/fts5/fts5.h c132a9323f22a972c4c93a8d5a3d901113a6e612faf30ca8e695788438c5ca2a -F ext/fts5/fts5Int.h d7cbc214ee167496f70905667e18f73ea0402f7ef09236ce305e117e0efc866a -F ext/fts5/fts5_aux.c dcc627d8b6e3fc773db528ff67b39955dab7b51628f9dba8e15849e5bedfd7fa -F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6dc8aaca70 -F ext/fts5/fts5_config.c b447948f35ad3354e8fe5e242e0a7e7b5b941555400b9404259944e3aa570037 -F ext/fts5/fts5_expr.c 2be456484786333d559dc2987a00f2750981fab91d52db8452a8046278c5f22e -F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 -F ext/fts5/fts5_index.c f25bec3c00bf050fa2d702d97b773d0706692661172026ddac8df1f164b8b198 -F ext/fts5/fts5_main.c e881a2ea0bf01b3a3ff0bc1b31373c58fd54b6c9f3c43ea3d431bea4e5d4025e -F ext/fts5/fts5_storage.c 3ecda8edadc1f62a355d6789776be0da609f8658c50d72e422674093ab7e1528 -F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 -F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee -F ext/fts5/fts5_test_tok.c f96c6e193c466711d6d7828d5f190407fe7ab897062d371426dd3036f01258e7 -F ext/fts5/fts5_tokenize.c 2e508c6a3bd8ee56c48e98a38052e1a650e49b32a484cce9b189984114bc3b88 -F ext/fts5/fts5_unicode2.c 8bd0cd07396b74c1a05590e4070d635bccfc849812c305619f109e6c0485e250 -F ext/fts5/fts5_varint.c e64d2113f6e1bfee0032972cffc1207b77af63319746951bf1d09885d1dadf80 -F ext/fts5/fts5_vocab.c 7a071833064dc8bca236c3c323e56aac36f583aa2c46ce916d52e31ce87462c9 -F ext/fts5/fts5parse.y eb526940f892ade5693f22ffd6c4f2702543a9059942772526eac1fde256bb05 -F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba -F ext/fts5/test/fts5_common.tcl b01c584144b5064f30e6c648145a2dd6bc440841 -F ext/fts5/test/fts5aa.test 5bd43427b7d08ce2e19c488a26534be450538b9232d4d5305049e8de236e9aa9 -F ext/fts5/test/fts5ab.test 9205c839332c908aaad2b01ab8670ece8b161e8f2ec8a9fabf18ca9385880bb7 -F ext/fts5/test/fts5ac.test a7aa7e1fefc6e1918aa4d3111d5c44a09177168e962c5fd2cca9620de8a7ed6d -F ext/fts5/test/fts5ad.test e8cf959dfcd57c8e46d6f5f25665686f3b6627130a9a981371dafdf6482790de -F ext/fts5/test/fts5ae.test 1142d16d9cc193894dc13cc8f9c7a8a21411ac61b5567a878514df6f9f0d7bb7 -F ext/fts5/test/fts5af.test 724247405b13f8f06cc6ce464dc4f152dc5dd4e86b12c2099685d8f19747bf7b -F ext/fts5/test/fts5ag.test 7816f25a0707578f08145ab539fc0ca025f8951e788b28a6a18a06b2099469dd -F ext/fts5/test/fts5ah.test 27b5a33bfd0363ca8a4dc659e6e2a5df3dea1c3c5b04bc51ca6aeb1277bd9b21 -F ext/fts5/test/fts5ai.test bc97e4758cc93e06bf851d61c98fdf4e8b8f8315ee28a84fb15f916360856414 -F ext/fts5/test/fts5aj.test 745020852d85f5dd49d11cb7ad11d3cc6dafc4fe6d6d24bc0875ac8f43ee4149 -F ext/fts5/test/fts5ak.test fc3595f8e6873bb86d70c9bd4b67d0413ce577bd4793c39a2b60a7b8825b60a6 -F ext/fts5/test/fts5al.test 00c4c1c6a1366b73aa48ce2068c634520867c3cf7f5d1676ebbb775ee1f35734 -F ext/fts5/test/fts5alter.test 5565f7e4605512b69171ac18ca84398603f9f6456dbe377beeca97e83cc242cd -F ext/fts5/test/fts5auto.test 78989e6527ce69c9eddbef7392fea5c10b0010cd2b2ae68eec7bc869c471e691 -F ext/fts5/test/fts5aux.test ebf6f2ff7cb556e83f66991b7f12bff016d3c83d4eab36704b649dd6b1437318 -F ext/fts5/test/fts5auxdata.test eacc97ff04892f1a5f3d4df5a73f8bcbc3955ea1d12c9f24137eb1fc079e7611 -F ext/fts5/test/fts5bigpl.test 6466c89b38439f0aba26ac09e232a6b963f29b1cbe1304f6a664fe1e7a8f5fd3 -F ext/fts5/test/fts5bigtok.test 541119e616c637caea925a8c028c37c2c29e94383e00aa2f9198d530724b6e36 -F ext/fts5/test/fts5cat.test daba0b80659460b0cb60bd1f40b402478a761fe7ea414c3c94c2be25568cc33a -F ext/fts5/test/fts5circref.test f880dfd0d99f6fb73b88ccacb0927d18e833672fd906cc47d6b4e529419eaa62 -F ext/fts5/test/fts5colset.test a30473451321bbf0b6218af62e96b4ae5fa99931cfdb210b5ecc804623b30f75 -F ext/fts5/test/fts5columnsize.test 45459ce4dd9fd853b6044cdc9674921bff89e3d840f348ca8c1630f9edbf5482 -F ext/fts5/test/fts5config.test 60094712debc59286c59aef0e6cf511c37d866802776a825ce437d26afe0817f -F ext/fts5/test/fts5conflict.test 655925678e630d3cdf145d18725a558971806416f453ac8410ca8c04d934238d -F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c073e19b3ae9126b2f4 -F ext/fts5/test/fts5content.test 213506436fb2c87567b8e31f6d43ab30aab99354cec74ed679f22aad0cdbf283 -F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe -F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test fab4ea761b2df254fb3909423989320772a3a757de4d151ddcfa2a40a3b93328 -F ext/fts5/test/fts5corrupt4.test ea805c4d7c68b5f185b9db5d2060a7ae5875339738dd48203c92162f41e7ca91 -F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 -F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e -F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 -F ext/fts5/test/fts5dlidx.test b90852c55881b29dbac6380b274de27beae623ac4b6d567c6c8fb9cdc315a86e -F ext/fts5/test/fts5doclist.test e39a6001495f1dc68e20323586ac965787986c2bf6f515b9b0285627b089d9e6 -F ext/fts5/test/fts5ea.test b01e3a18cdfabbff8104a96a5242a06a68a998a0 -F ext/fts5/test/fts5eb.test 239bb2f02571f8cccfc7018d08f502df1cd8cc6a69b65ed1dde5f6a070e3f669 -F ext/fts5/test/fts5fault1.test d28a65caee75db6897c3cf1358c5230d3bb2a3bf7fb31062c19c7e5382b3d2bd -F ext/fts5/test/fts5fault2.test 69c8fdbef830cd0d450908d4504d5bb86609e255af99c421c20a0756251fe344 -F ext/fts5/test/fts5fault3.test da2f9e3e56ff5740d68ebdd6877c97089e7ed28ddff28a0da87a6afea27e5522 -F ext/fts5/test/fts5fault4.test 1c1db5fcfe59401e7833146100f1d8de284a0a686fac31ddac9fb56c459f725b -F ext/fts5/test/fts5fault5.test a336e4e11847de24c9497f80cce18e00bb3fab7fb11f97d04eb9af898900a762 -F ext/fts5/test/fts5fault6.test a0fc0a8f99e4b16500c31dfc7e38e1defe0f1693ac47650517ac7b723b1956f8 -F ext/fts5/test/fts5fault7.test 0acbec416edb24b8881f154e99c31e9ccf73f539cfcd164090be139e9e97ed4c -F ext/fts5/test/fts5fault8.test 318238659d35f82ad215ecb57ca4c87486ea85d45dbeedaee42f148ff5105ee2 -F ext/fts5/test/fts5fault9.test 098e6b894bbdf9b2192f994a30f4043673fb3f338b6b8ab1624c704422f39119 -F ext/fts5/test/fts5faultA.test be4487576bff8c22cee6597d1893b312f306504a8c6ccd3c53ca85af12290c8c -F ext/fts5/test/fts5faultB.test d606bdb8e81aaeb6f41de3fc9fc7ae315733f0903fbff05cf54f5b045b729ab5 -F ext/fts5/test/fts5faultD.test cc5d1225556e356615e719c612e845d41bff7d5a -F ext/fts5/test/fts5first.test 3fcf2365c00a15fc9704233674789a3b95131d12de18a9b996159f6909dc8079 -F ext/fts5/test/fts5full.test e1701a112354e0ff9a1fdffb0c940c576530c33732ee20ac5e8361777070d717 -F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e -F ext/fts5/test/fts5hash.test a4cf51acad99bfc43c16fb74f9d22495dc221ae0701fc5e908ca963a9b26a02b -F ext/fts5/test/fts5integrity.test 8ffabcd91b058d812aba3e3e0a06f76ce165ba402a18cca20e34204a7feec92e -F ext/fts5/test/fts5interrupt.test 09613247b273a99889808ef852898177e671406fe71fdde7ea00e78ea283d227 -F ext/fts5/test/fts5lastrowid.test be98fe3e03235296585b72daad7aed5717ba0062bae5e5c18dd6e04e194c6b28 -F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc2782680740513c4d1fc114b43d4ad -F ext/fts5/test/fts5matchinfo.test 10c9a6f7fe61fb132299c4183c012770b10c4d5c2f2edb6df0b6607f683d737a -F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6 -F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 -F ext/fts5/test/fts5misc.test 088ac5f0f5de1ad45b0f83197ab5263bcae8130156cdc901bff2375ff2b8af86 -F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581 -F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 -F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd -F ext/fts5/test/fts5onepass.test f9b7d9b2c334900c6542a869760290e2ab5382af8fbd618834bf1fcc3e7b84da -F ext/fts5/test/fts5optimize.test 36a752d24c818792032e4ff502936fc9cc5ef938721696396fdc79214b2717f1 -F ext/fts5/test/fts5phrase.test 13e5d8e9083077b3d9c74315b3c92ec723cc6eb37c8155e0bfe1bba00559f07b -F ext/fts5/test/fts5plan.test 771b999d161e24fd803ce0290adb7c6e7c9b9cc2c6a0adb344813fb89473aa32 -F ext/fts5/test/fts5porter.test 8d08010c28527db66bc3feebd2b8767504aaeb9b101a986342fa7833d49d0d15 -F ext/fts5/test/fts5porter2.test 0d251a673f02fa13ca7f011654873b3add20745f7402f108600a23e52d8c7457 -F ext/fts5/test/fts5prefix.test a0fa67b06650f2deaa7bf27745899d94e0fb547ad9ecbd08bfad98c04912c056 -F ext/fts5/test/fts5query.test ac363b17a442620bb0780e93c24f16a5f963dfe2f23dc85647b869efcfada728 -F ext/fts5/test/fts5rank.test c9fd4a1e36b4fa92d572ec13d846469b97da249d1c2f7fd3ee7e017ce46f2416 -F ext/fts5/test/fts5rebuild.test 55d6f17715cddbf825680dd6551efbc72ed916d8cf1cde40a46fc5d785b451e7 -F ext/fts5/test/fts5restart.test 835ecc8f449e3919f72509ab58056d0cedca40d1fe04108ccf8ac4c2ba41f415 -F ext/fts5/test/fts5rowid.test b8790ec170a8dc1942a15aef3db926a5f3061b1ff171013003d8297203a20ad6 -F ext/fts5/test/fts5savepoint.test fc02929f238d02a22df4172625704e029f7c1e0e92e332d654375690f8e6e43f -F ext/fts5/test/fts5simple.test a298670508c1458b88ce6030440f26a30673931884eb5f4094ac1773b3ba217b -F ext/fts5/test/fts5simple2.test 258a1b0c590409bfa5271e872c79572b319d2a56554d0585f68f146a0da603f0 -F ext/fts5/test/fts5simple3.test d5c74a9d3ca71bd5dd5cacb7c55b86ea12cdddfc8b1910e3de2995206898380f -F ext/fts5/test/fts5synonym.test 1651815b8008de170e8e600dcacc17521d765482ea8f074ae82cfa870d8bb7fb -F ext/fts5/test/fts5synonym2.test b54cce5c34ec08ed616f646635538ae82e34a0e28f947ec60b6fadbc4b3fb17a -F ext/fts5/test/fts5tok1.test ce6551e41ff56f30b69963577324624733bed0d1753589f06120d664d9cd45c9 -F ext/fts5/test/fts5tok2.test dcacb32d4a2a3f0dd3215d4a3987f78ae4be21a2 -F ext/fts5/test/fts5tokenizer.test ac3c9112b263a639fb0508ae73a3ee886bf4866d2153771a8e8a20c721305a43 -F ext/fts5/test/fts5umlaut.test a42fe2fe6387c40c49ab27ccbd070e1ae38e07f38d05926482cc0bccac9ad602 -F ext/fts5/test/fts5unicode.test 17056f4efe6b0a5d4f41fdf7a7dc9af2873004562eaa899d40633b93dc95f5a9 -F ext/fts5/test/fts5unicode2.test 9b3df486de05fb4bde4aa7ee8de2e6dae1df6eb90e3f2e242c9383b95d314e3e -F ext/fts5/test/fts5unicode3.test 590c72e18195bda2446133f9d82d04a4e89d094bba58c75ae10f4afc6faa0744 -F ext/fts5/test/fts5unicode4.test 6463301d669f963c83988017aa354108be0b947d325aef58d3abddf27147b687 -F ext/fts5/test/fts5unindexed.test 9021af86a0fb9fc616f7a69a996db0116e7936d0db63892db6bafabbec21af4d -F ext/fts5/test/fts5update.test b8affd796e45c94a4d19ad5c26606ea06065a0f162a9562d9f005b5a80ccf0bc -F ext/fts5/test/fts5version.test c8f2cc105f0abf0224965f93e584633dee3e06c91478bc67e468f7cfdf97fd6a -F ext/fts5/test/fts5vocab.test 7ed80d9af1ddaaa1637da05e406327b5aac250848bc604c1c1cc667908b87760 -F ext/fts5/test/fts5vocab2.test e0fdc3a3095f6eda68ac9bf9a443ff929a124d46f00af19933604085712e9d47 -F ext/fts5/tool/fts5speed.tcl b0056f91a55b2d1a3684ec05729de92b042e2f85 -F ext/fts5/tool/fts5txt2db.tcl 526a9979c963f1c54fd50976a05a502e533a4c59 -F ext/fts5/tool/loadfts5.tcl 95b03429ee6b138645703c6ca192c3ac96eaf093 -F ext/fts5/tool/mkfts5c.tcl d1c2a9ab8e0ec690a52316f33dd9b1d379942f45 -F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c -F ext/icu/README.txt 1c48ffaf7f255bd73d00a35f68f6de357c2a6594f16cb00506a151be23694706 -F ext/icu/icu.c 91c021c7e3e8bbba286960810fa303295c622e323567b2e6def4ce58e4466e60 -F ext/icu/sqliteicu.h 728867a802baa5a96de7495e9689a8e01715ef37 -F ext/lsm1/Makefile a553b728bba6c11201b795188c5708915cc4290f02b7df6ba7e8c4c943fd5cd9 -F ext/lsm1/Makefile.msc f8c878b467232226de288da320e1ac71c131f5ec91e08b21f502303347260013 -F ext/lsm1/lsm-test/README 87ea529d2abe615e856d4714bfe8bb185e6c2771b8612aa6298588b7b43e6f86 -F ext/lsm1/lsm-test/lsmtest.h cf58528ffe0cfe535e91b44584e2ec5fb1caacdabecef0d8dcf83bf83168bf28 -F ext/lsm1/lsm-test/lsmtest1.c ae6ba48a0851b39be69a7d0eb220bfb9521a526e926223d5014bd385df10abb3 -F ext/lsm1/lsm-test/lsmtest2.c 188b09aec776516aeedcfd13b9c6faf85ba16b3671a0897a2c740ee00a5dc4f8 -F ext/lsm1/lsm-test/lsmtest3.c 9ab87528a36dbf4a61d7c8ad954f5ee368c0878c127b84b942b2e2abe522de26 -F ext/lsm1/lsm-test/lsmtest4.c d258d6a245db5d8eaede096e2368d23f859c5e92c80ab9122463f708514fe10c -F ext/lsm1/lsm-test/lsmtest5.c 8d5242a0f870d65eeada191c8945781fed9cb8ece3886573790ebd373b62dac5 -F ext/lsm1/lsm-test/lsmtest6.c 869cb4a172cd07d1a75b3aeaecd61d0a477787b3b8668bad0d3ff0f43b642b7c -F ext/lsm1/lsm-test/lsmtest7.c 7a917455a0f956a8ed3f44f5c9387ec0ea6627714874464cc3fa5c5a9cabb2f2 -F ext/lsm1/lsm-test/lsmtest8.c 589b68c44531a0f04d5e879bb1e211be5f7100f48eed7e8631e07ed5cbd68f94 -F ext/lsm1/lsm-test/lsmtest9.c dd1a0ebf41134933a744d1e00e60429a2a21fc50d587ae7dd6bdb6e96d805bdc -F ext/lsm1/lsm-test/lsmtest_bt.c d70d9a9be5eef9360af1251dd083948d74fd30137a08f61bef995f7ac04e037f -F ext/lsm1/lsm-test/lsmtest_datasource.c 5d770be191d0ca51315926723009b2c25c0b4b8136840494ef710ac324aa916c -F ext/lsm1/lsm-test/lsmtest_func.c 159aa401bc8032bfa3d8cf2977bd687abebab880255895a5eb45770d626fa38d -F ext/lsm1/lsm-test/lsmtest_io.c cf11b27b129c6bd5818fa1d440176502dc27229f0db892b4479118d61993ea20 -F ext/lsm1/lsm-test/lsmtest_main.c a9bc647738c0dcaebf205d6d194b3ce4a6ef3925801cd2d919f0a4ea33a15aeb -F ext/lsm1/lsm-test/lsmtest_mem.c 4e63c764345ab1df59d4f13a77980c6f3643798210b10d6cdbd785b4b888fda5 -F ext/lsm1/lsm-test/lsmtest_tdb.c 618a8619183fda4f5540fcde15f9068293c5e3180e1a246e34409b0c148758b3 -F ext/lsm1/lsm-test/lsmtest_tdb.h 8733eee249b12956a9df8322994b43d19bd8c02ad2e8b0bb5164db4d6ccc1735 -F ext/lsm1/lsm-test/lsmtest_tdb2.cc 99ea7f2dd9c7536c8fb9bdd329e4cfeb76899f3ddf6f48bdd3926e016922b715 -F ext/lsm1/lsm-test/lsmtest_tdb3.c 7a7ccae189f5bb25bcd1ec3bbd740529706eded7f6729a5a0a9eeaeb57785320 -F ext/lsm1/lsm-test/lsmtest_tdb4.c 47e8bb5eba266472d690fb8264f1855ebdba0ae5a0e541e35fcda61ebf1d277f -F ext/lsm1/lsm-test/lsmtest_util.c 241622db5a332a09c8e6e7606b617d288a37b557f7d3bce0bb97809f67cc2806 -F ext/lsm1/lsm-test/lsmtest_win32.c 0e0a224674c4d3170631c41b026b56c7e1672b151f5261e1b4cc19068641da2d -F ext/lsm1/lsm.h 0f6f64ff071471cb87bf98beb8386566f30ea001 -F ext/lsm1/lsmInt.h 5983690e05e83653cc01ba9d8fbf8455e534ddf8349ed9adedbf46a7549760b0 -F ext/lsm1/lsm_ckpt.c 0eabfaf812ddb4ea43add38f05e430694cd054eb622c3e35af4c43118a2d5321 -F ext/lsm1/lsm_file.c 3c51841d5b3e7da162693cbac9a9f47eeedf6bcbbe2969a4d25e30c428c9fe36 -F ext/lsm1/lsm_log.c a8bf334532109bba05b09a504ee45fc393828b0d034ca61ab45e3940709d9a7c -F ext/lsm1/lsm_main.c b5703f8042e71d3a2d65e671f6832e077e79e89e9975818f67f969922618db63 -F ext/lsm1/lsm_mem.c 4c51ea9fa285ee6e35301b33491642d071740a0a -F ext/lsm1/lsm_mutex.c 378edf0a2b142b4f7640ee982df06d50b98788ea -F ext/lsm1/lsm_shared.c 76adfc1ed9ffebaf92746dde4b370ccc48143ca8b05b563816eadd2aadf1c525 -F ext/lsm1/lsm_sorted.c 6f7d8cf7a7d3d3f1ab5d9ba6347e8f39f3d73c00ec48afcd0c4bcbefd806f9b8 -F ext/lsm1/lsm_str.c 65e361b488c87b10bf3e5c0070b14ffc602cf84f094880bece77bbf6678bca82 -F ext/lsm1/lsm_tree.c 682679d7ef2b8b6f2fe77aeb532c8d29695bca671c220b0abac77069de5fb9fb -F ext/lsm1/lsm_unix.c 57361bcf5b1a1a028f5d66571ee490e9064d2cfb145a2cc9e5ddade467bb551b -F ext/lsm1/lsm_varint.c 43f954af668a66c7928b81597c14d6ad4be9fedbc276bbd80f52fa28a02fdb62 -F ext/lsm1/lsm_vtab.c 169bfe7ef8e6c9de9c77e17c4c50c9ae55fb0167d80be3d1be82c991184b6f35 -F ext/lsm1/lsm_win32.c 0a4acbd7e8d136dd3a5753f0a9e7a9802263a9d96cef3278cf120bcaa724db7c -F ext/lsm1/test/lsm1_common.tcl 5ed4bab07c93be2e4f300ebe46007ecf4b3e20bc5fbe1dedaf04a8774a6d8d82 -F ext/lsm1/test/lsm1_simple.test a04d08e8661ae6fc53786c67f0bd102c6692f003e859dde03ed9ac3f12e066e5 -F ext/lsm1/tool/mklsm1c.tcl f31561bbee5349f0a554d1ad7236ac1991fc09176626f529f6078e07335398b0 -F ext/misc/README.md d6dd0fe1d8af77040216798a6a2b0c46c73054d2f0ea544fbbcdccf6f238c240 -F ext/misc/amatch.c e3ad5532799cee9a97647f483f67f43b38796b84b5a8c60594fe782a4338f358 -F ext/misc/anycollseq.c 5ffdfde9829eeac52219136ad6aa7cd9a4edb3b15f4f2532de52f4a22525eddb -F ext/misc/appendvfs.c 3777f22ec1057dc4e5fd89f2fbddcc7a29fbeef1ad038c736c54411bb1967af7 -F ext/misc/blobio.c a867c4c4617f6ec223a307ebfe0eabb45e0992f74dd47722b96f3e631c0edb2a -F ext/misc/btreeinfo.c 26004b7a6be320ec08fc20ca8d0f01fccb00a98cbe0f3197446794ff2a506aa3 -F ext/misc/carray.c 91e9a7f512fda934894bed30464552fffa7d3073b5be04189ae0bd0c59f26bfd -F ext/misc/cksumvfs.c a3271f5cc3f87d80897cca76d54220380aeae3448efd23fefe47853443ef1185 -F ext/misc/closure.c dbfd8543b2a017ae6b1a5843986b22ddf99ff126ec9634a2f4047cd14c85c243 -F ext/misc/completion.c a0efe03edfdc4f717c61e6c9b0bfe2708ff7878010dae3174980a68fdf76aabc -F ext/misc/compress.c 3354c77a7c8e86e07d849916000cdac451ed96500bfb5bd83b20eb61eee012c9 -F ext/misc/csv.c 3ed979c1eb35e35a98b30ef545a2facf62994594217681d9138b4b75faf6b0d7 -F ext/misc/dbdata.c e316fba936571584e55abd5b974a32a191727a6b746053a0c9d439bd2cf93940 -F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287c336 -F ext/misc/eval.c 04bc9aada78c888394204b4ed996ab834b99726fb59603b0ee3ed6e049755dc1 -F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f -F ext/misc/fileio.c 9b69e25da3b51d4a1d905a464ccb96709792ad627a742ba09215bc0d1447e7bd -F ext/misc/fossildelta.c 1240b2d3e52eab1d50c160c7fe1902a9bd210e052dc209200a750bbf885402d5 -F ext/misc/fuzzer.c eae560134f66333e9e1ca4c8ffea75df42056e2ce8456734565dbe1c2a92bf3d -F ext/misc/ieee754.c eaffd9b364d7c8371727e9c43fc8bec38cdacc4d11fc26beffaa3ca05a0ea9d6 -F ext/misc/json1.c 3a42e3231d716516a8ae33b0a052d3ed5f52943e3d627b68744a427a6e552ae3 -F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d -F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b -F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567 -F ext/misc/mmapwarm.c 8c5fe90d807a23e44a8b93e96e8b812b19b300d5fd8c1d40a4fd1d8224e33f46 -F ext/misc/nextchar.c 7877914c2a80c2f181dd04c3dbef550dfb54c93495dc03da2403b5dd58f34edd -F ext/misc/noop.c 81efe4cad9ec740e64388b14281cb983e6e2c223fed43eb77ab3e34946e0c1ab -F ext/misc/normalize.c b4290464f542bae7a97b43f15bd197949b833ffd668b7c313631bd5d4610212c -F ext/misc/percentile.c b9086e223d583bdaf8cb73c98a6539d501a2fc4282654adbfea576453d82e691 -F ext/misc/prefixes.c 0f4f8cff5aebc00a7e3ac4021fd59cfe1a8e17c800ceaf592859ecb9cbc38196 -F ext/misc/regexp.c 246244c714267f303df76acf73dcf110cf2eaf076896aaaba8db6d6d21a129db -F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c -F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c -F ext/misc/scrub.c db9fff56fed322ca587d73727c6021b11ae79ce3f31b389e1d82891d144f22ad -F ext/misc/series.c 4057dda3579b38ff88b2d3b13b4dd92dbd9d6f90dac2b55c19b0a8ed87ee4959 -F ext/misc/sha1.c c8f2253c8792ffab9517695ea7d88c079f0395a5505eefef5c8198fe184ed5ac -F ext/misc/shathree.c 135b7c145db4a09b1650c3e7aff9cb538763a9a361e834c015dd1aaf8d5c9a00 -F ext/misc/showauth.c 732578f0fe4ce42d577e1c86dc89dd14a006ab52 -F ext/misc/spellfix.c 94df9bbfa514a563c1484f684a2df3d128a2f7209a84ca3ca100c68a0163e29f -F ext/misc/sqlar.c 0ace5d3c10fe736dc584bf1159a36b8e2e60fab309d310cd8a0eecd9036621b6 -F ext/misc/stmt.c 35063044a388ead95557e4b84b89c1b93accc2f1c6ddea3f9710e8486a7af94a -F ext/misc/templatevtab.c 8a16a91a5ceaccfcbd6aaaa56d46828806e460dd194965b3f77bf38f14b942c4 -F ext/misc/totype.c fa4aedeb07f66169005dffa8de3b0a2b621779fd44f85c103228a42afa71853b -F ext/misc/uint.c 053fed3bce2e89583afcd4bf804d75d659879bbcedac74d0fa9ed548839a030b -F ext/misc/unionvtab.c 36237f0607ca954ac13a4a0e2d2ac40c33bc6e032a5f55f431713061ef1625f9 -F ext/misc/urifuncs.c f71360d14fa9e7626b563f1f781c6148109462741c5235ac63ae0f8917b9c751 -F ext/misc/uuid.c 5bb2264c1b64d163efa46509544fd7500cb8769cb7c16dd52052da8d961505cf -F ext/misc/vfslog.c 3b25c2f56ba60788db247287be6ab024b53c4afffd412b4876db563389be0d35 -F ext/misc/vfsstat.c 389ea13983d3af926504c314f06a83cc858d5adc24b40af74aaed1fece00c118 -F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae -F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd -F ext/misc/wholenumber.c 520f34c3099e5b7d546f13708607dc2fa173c46b68952eecf0d19cd675fec85e -F ext/misc/zipfile.c d1be54ea83ac9ad71b8b6ffc4b60db8946ce2ceacdf6bff063fcd9489f41bb49 -F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64 -F ext/rbu/rbu.c 8681f6157db6adc82c34af24b14ea8a3be0146ad2a3b6c1d5da6cb8a5796c8ce -F ext/rbu/rbu1.test 221d9c18a5e600ac9ac6b1810d99d9f99163a7909ba61597876ab6e4d4beb3d6 -F ext/rbu/rbu10.test 0a201c32202143f23c81c0144503da339786fc20acb7a2fda11601b65659f314 -F ext/rbu/rbu11.test 5c834cf491086b45e071eabf71f708febc143e86a384a92de69e0b1a4cace144 -F ext/rbu/rbu12.test 29f8b2118f6c96fac3755bd6d2b55c2db24f878b1f11fbfbe294f3a230a3dcdc -F ext/rbu/rbu13.test 1285298e3360ec74511764841b3c174dcfe21da2f618c22febf1a20abd0365c2 -F ext/rbu/rbu14.test 4a7bf0b3a4516d3ab0bc0ba4ceb53eb7e3324147ccda152e561060f659dbba31 -F ext/rbu/rbu3.test d6c6cc7a1326e8e23b9820f30bd3054f22092e503fadfd2a660ae006653f6d80 -F ext/rbu/rbu5.test 724b38ea5f722e3d22dc76343860bd998bb676c3f78c4bc8175df5c5d7720e23 -F ext/rbu/rbu6.test 401064236d3cf86b7edc01c586d7c5554f48553946fbfa1a3af35d7e47dce9e3 -F ext/rbu/rbu7.test ae25f47b56f178197fc1098537a35a39176cc73d1629b03dc9d795929fc36ec2 -F ext/rbu/rbu8.test b98a6fc58ead84a0e6ddee775b9702cd981f318d5d4fd1d4df0fa0c40db7251b -F ext/rbu/rbu9.test 0e4d985e25620d61920597e8ea69c871c9e8c1f5a0be2ae9fa70bb641d74378c -F ext/rbu/rbuA.test b34a90cb495682c25b5fc03a9d5e7a4fc99541c29256f25e2e2a4f6542b4f5b3 -F ext/rbu/rbuB.test 52b07158824c6927b7e25554ace92a695cdebfc296ae3d308ac386984aded9bc -F ext/rbu/rbuC.test 80f1cc2fb74f44b1128fd0ed8eedab3a76fefeb72a947860e2869ef76fc8dc6b -F ext/rbu/rbu_common.tcl 60d904133ff843fe72cc0514e9dd2486707181e6e0fbab20979da28c48d21de9 -F ext/rbu/rbucollate.test cac528a9a46318cba42e61258bb42660bbbf4fdb9a8c863de5a54ad0c658d197 -F ext/rbu/rbucrash.test 000981a1fe8a6e4d9a684232f6a129e66a3ef595f5ed74655e2f9c68ffa613b4 -F ext/rbu/rbucrash2.test efa143cc94228eb0266d3f1abfbee60a5838a84cef7cc3fcb8c145b74d96fd41 -F ext/rbu/rbudiff.test 156957851136b63c143478518dc1bda6c832103cdbe8ac1d7cdd47edb3cbe0a3 -F ext/rbu/rbudor.test e3e8623926012f43eebe51fedf06a102df2640750d971596b052495f2536db20 -F ext/rbu/rbuexpr.test 10d0420537c3bc7666e576d72adeffe7e86cfbb00dcc30aa9ce096c042415190 -F ext/rbu/rbufault.test 2d7f567b79d558f6e093c58808cab4354f8a174e3802f69e7790a9689b3c09f8 -F ext/rbu/rbufault2.test c81327a3ac2c385b9b954db3644d4e0df93eeebfc3de9f1f29975a1e73fd3d0c -F ext/rbu/rbufault3.test b2fcc9db5c982b869f67d1d4688d8cb515d5b92f58011fff95665f2e62cec179 -F ext/rbu/rbufault4.test 03d2849c3df7d7bd14a622e789ff049e5080edd34a79cd432e01204db2a5930a -F ext/rbu/rbufts.test 0ae8d1da191c75bd776b86e24456db0fb6e97b7c944259fae5407ea55d23c31d -F ext/rbu/rbumisc.test 329986cf5dd51890c4eb906c2f960ebb773a79a64bed90f506b7c417825b37eb -F ext/rbu/rbumulti.test 5fb139058f37ddc5a113c5b93238de915b769b7792de41b44c983bc7c18cf5b9 -F ext/rbu/rbupartial.test f25df014b8dbe3c5345851fba6e66f79ab237f57dc201b2d5f0dbae658ae5a4c -F ext/rbu/rbuprogress.test 857cf1f8166c83ef977edb9ef4fc42d80f71fbd798652b46ae2f3a7031870f8d -F ext/rbu/rburesume.test dbdc4ca504e9c76375a69e5f0d91205db967dcc509a5166ca80231f8fda49eb1 -F ext/rbu/rbusave.test f4190a1a86fccf84f723af5c93813365ae33feda35845ba107b59683d1cdd926 -F ext/rbu/rbusplit.test b37e7b40b38760881dc9c854bd40b4744c6b6cd74990754eca3bda0f407051e8 -F ext/rbu/rbutemplimit.test 05ceefa90a2e26a99f40dd48282ed63a00df5e59c1f2bfd479c143e201a1b0ba -F ext/rbu/rbuvacuum.test 55e101e90168c2b31df6c9638fe73dc7f7cc666b6142266d1563697d79f73534 -F ext/rbu/rbuvacuum2.test b8e5b51dc8b2c0153373d024c0936be3f66f9234acbd6d0baab0869d56b14e6b -F ext/rbu/rbuvacuum3.test 8addd82e4b83b4c93fa47428eae4fd0dbf410f8512c186f38e348feb49ba03dc -F ext/rbu/rbuvacuum4.test a78898e438a44803eb2bc897ba3323373c9f277418e2d6d76e90f2f1dbccfd10 -F ext/rbu/sqlite3rbu.c 77a47f3231f5f363b2c584dba3e310a7efdaf073ad8c18728ab846b38de2879c -F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812 -F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a -F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15 -F ext/repair/checkfreelist.c 0dbae18c1b552f58d64f8969e4fb1e7f11930c60a8c2a9a8d50b7f15bdfd54bd -F ext/repair/checkindex.c 7d28c01a2e012ac64257d230fc452b2cafb78311a91a343633d01d95220f66f3 -F ext/repair/sqlite3_checker.c.in 4a5a3af3f450fe503e5a2985e98516dc2a6b9ad247449e284c1cf140fc91720f -F ext/repair/sqlite3_checker.tcl a9a2caa9660567257c177a91124d8c0dccdfa341e25c51e6da7f1fd9e601eafa -F ext/repair/test/README.md 34b2f542cf5be7bffe479242b33ee3492cea30711e447cc4a1a86cb5915f419e -F ext/repair/test/checkfreelist01.test 3e8aa6aeb4007680c94a8d07b41c339aa635cc78249442da72ff3f8297398a69 -F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c335096108c12c01bddbadcec -F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c -F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 -F ext/rtree/geopoly.c f15cc6845d64a629035627d863cbe3eadc9cb30f9ca77bd823b0ca8a5a3f8b00 -F ext/rtree/rtree.c 0ee39cc787b95aa03a012e09e6090b0fa452154fa812af9a379898560fd6c00f -F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 -F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e -F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d -F ext/rtree/rtree3.test 4ee5d7df86040efe3d8d84f141f2962a7745452200a7cba1db06f86d97050499 -F ext/rtree/rtree4.test 304de65d484540111b896827e4261815e5dca4ce28eeecd58be648cd73452c4b -F ext/rtree/rtree5.test 49c9041d713d54560b315c2c7ef7207ee287eba1b20f8266968a06f2e55d3142 -F ext/rtree/rtree6.test 1252a0439da01d2f1f5cbbdeeb80455a2d68b9bae2a9787937b167a5e3957828 -F ext/rtree/rtree7.test c8fb2e555b128dd0f0bdb520c61380014f497f8a23c40f2e820acc9f9e4fdce5 -F ext/rtree/rtree8.test 2d99006a1386663978c9e1df167554671e4f711c419175b39f332719deb1ce0e -F ext/rtree/rtree9.test c646f12c8c1c68ef015c6c043d86a0c42488e2e68ed1bb1b0771a7ca246cbabf -F ext/rtree/rtreeA.test ed2f1be9c06dde0b1ab93a95dd9e87eeaa02db2d30bcb4b9179b69ee3dc3319b -F ext/rtree/rtreeB.test 4cec297f8e5c588654bbf3c6ed0903f10612be8a2878055dd25faf8c71758bc9 -F ext/rtree/rtreeC.test 6aa87eba4d9a3003b941a1ba77db259c5cabc3fd92fc5a6360f5369520eb9a4d -F ext/rtree/rtreeD.test fe46aa7f012e137bd58294409b16c0d43976c3bb92c8f710481e577c4a1100dc -F ext/rtree/rtreeE.test e65d3fc625da1800b412fc8785817327d43ccfec5f5973912d8c9e471928caa9 -F ext/rtree/rtreeF.test 81ffa7ef51c4e4618d497a57328c265bf576990c7070633b623b23cd450ed331 -F ext/rtree/rtreeG.test 1b9ca6e3effb48f4161edaa463ddeaa8fca4b2526d084f9cbf5dbe4e0184939c -F ext/rtree/rtreeH.test 0885151ee8429242625600ae47142cca935332c70a06737f35af53a7bd7aaf90 -F ext/rtree/rtreeI.test 608e77f7fde9be5a12eae316baef640fffaafcfa90a3d67443e78123e19c4ca4 -F ext/rtree/rtree_perf.tcl 6c18c1f23cd48e0f948930c98dfdd37dfccb5195 -F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b587936f5f6bceed -F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 -F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e -F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/rtreefuzz001.test eef1ed593bb15886cd5d5367a2f2492f81e315848896cdf7afb6e21454978827 -F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 -F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de -F ext/rtree/util/randomshape.tcl 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff -F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 -F ext/rtree/visual01.txt e9c2564083bcd30ec51b07f881bffbf0e12b50a3f6fced0c222c5c1d2f94ac66 -F ext/session/changeset.c 7a1e6a14c7e92d36ca177e92e88b5281acd709f3b726298dc34ec0fb58869cb5 -F ext/session/changesetfuzz.c 227076ab0ae4447d742c01ee88a564da6478bbf26b65108bf8fac9cd8b0b24aa -F ext/session/changesetfuzz1.test 2e1b90d888fbf0eea5e1bd2f1e527a48cc85f8e0ff75df1ec4e320b21f580b3a -F ext/session/session1.test 0b2f88995832ea040ae8e83a1ad4afa99c00b85c779d213da73a95ea4113233e -F ext/session/session2.test 284de45abae4cc1082bc52012ee81521d5ac58e0 -F ext/session/session3.test ce9ce3dfa489473987f899e9f6a0f2db9bde3479 -F ext/session/session4.test 6778997065b44d99c51ff9cece047ff9244a32856b328735ae27ddef68979c40 -F ext/session/session5.test 716bc6fafd625ce60dfa62ae128971628c1a1169 -F ext/session/session6.test 443789bc2fca12e4f7075cf692c60b8a2bea1a26 -F ext/session/session8.test 8e194b3f655d861ca36de5d4de53f702751bab3b -F ext/session/session9.test 5409d90d8141881d08285ed1c2c0d8d10fb92069 -F ext/session/sessionA.test 1feeab0b8e03527f08f2f1defb442da25480138f -F ext/session/sessionB.test c4fb7f8a688787111606e123a555f18ee04f65bb9f2a4bb2aa71d55ce4e6d02c -F ext/session/sessionC.test f8a5508bc059ae646e5ec9bdbca66ad24bc92fe99fda5790ac57e1f59fce2fdf -F ext/session/sessionD.test 4f91d0ca8afc4c3969c72c9f0b5ea9527e21de29039937d0d973f821e8470724 -F ext/session/sessionE.test b2010949c9d7415306f64e3c2072ddabc4b8250c98478d3c0c4d064bce83111d -F ext/session/sessionF.test d37ed800881e742c208df443537bf29aa49fd56eac520d0f0c6df3e6320f3401 -F ext/session/sessionG.test 3828b944cd1285f4379340fd36f8b64c464fc84df6ff3ccbc95578fd87140b9c -F ext/session/sessionH.test b17afdbd3b8f17e9bab91e235acf167cf35485db2ab2df0ea8893fbb914741a4 -F ext/session/session_common.tcl 29ec9910aca1e996ca1c8531b8cecabf96eb576aa53de65a8ff03d848b9a2a8b -F ext/session/session_speed_test.c dcf0ef58d76b70c8fbd9eab3be77cf9deb8bc1638fed8be518b62d6cbdef88b3 -F ext/session/sessionat.test efe88965e74ff1bc2af9c310b28358c02d420c1fb2705cc7a28f0c1cc142c3ec -F ext/session/sessiondiff.test ad13dd65664bae26744e1f18eb3cbd5588349b7e9118851d8f9364248d67bcec -F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7 -F ext/session/sessionfault2.test dd593f80b6b4786f7adfe83c5939620bc505559770cc181332da26f29cddd7bb -F ext/session/sessioninvert.test ae1a003a9ab1f8d64227dbb5c3a4c97e65b561b01e7b2953cf48683fb2724169 -F ext/session/sessionrebase.test ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2f05e82363b9142810 -F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5 -F ext/session/sessionwor.test 67b5ab91d4f93ce65ff1f58240ac5ddf73f8670facc1ffa49cef56293d52818d -F ext/session/sqlite3session.c e25b345896fa3646ff8b6c4058b3d9e365dc7eab4afe80b110808681098551c8 -F ext/session/sqlite3session.h a2db5b72b938d12c727b4b4ec632254ca493670a9c0de597af3271a7f774fc57 -F ext/session/test_session.c 98797aba475a799376c9a42214f2d1debf2d0c3cb657d9c8bbf4f70bf3fb4aec -F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3 -F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04 -F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865f002fc80cb -F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x -F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 -F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 980ad4201300ca43e9db0f972c5f38776d1e78022252bf3a8c0fec7ddda540df -F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 -F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 -F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 -F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421 -F mptest/crash02.subtest f4ef05adcd15d60e5d2bd654204f2c008b519df8 -F mptest/mptest.c aa41ace6dbc5050d76b02548d3521e6bbccae4f0 -F mptest/multiwrite01.test dab5c5f8f9534971efce679152c5146da265222d -F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca -F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b -F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 -F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 826bc4561456094cf758f095776026f25892a2bb3a7cd86742323267dc9bdb5f -F src/analyze.c 2c77bcbb8651ccced4a8cdaf8d997663813b2967787070fa26d0360de2ee4367 -F src/attach.c ff2daea0fe62080192e3f262670e4f61f5a86c1e7bea9cec34e960fe79852aa1 -F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 -F src/backup.c b1c90cd4110248c8e1273ff4578d3a84c0c34725e1b96dacd4a6294a908702de -F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 -F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c f14e415fcfd0b52b4e4ebd193ba5fadac5e8252c30f023389af682813af44025 -F src/btree.h 989ef3c33413549e3e148f3dcb46c030f317dac130dc86809ba6b9aa4b16c72a -F src/btreeInt.h 5c8b8749805787313ecf49eb5be3ced1e94bbf8ef54bb01470ce6bd0d5185c67 -F src/build.c 02cff9bb5b3eaf437cbad3f0e1b6c9612e4d4f355c9a766b8ebf121d95cee6d2 -F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c -F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e -F src/ctime.c e98518d2d3d4029a13c805e07313fb60c877be56db76e90dd5f3af73085d0ce6 -F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384 -F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a -F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f -F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4 -F src/expr.c 54c0e48fdafb60c54efd786434a56eccbea7d887b7f84ed3568233de35ca81a8 -F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 -F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 -F src/global.c 79a988b56b06ce2d08ebefe1d35da9aa25b3851faa47ea5233361c4827185a64 -F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 -F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 -F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 -F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 92b07a7f7e682114948ce59fd6511ffec7672b508cc343a804ef6afee21b6c11 -F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa -F src/loadext.c 421310045bd78afefb772294a99e50f37d87ae578786a6169074e6291e30d969 -F src/main.c 97d962ab1f830540043042e41085c5b85636a60e6ed95002c1a56b64f7eb6a0b -F src/malloc.c d0400b0366e1a3a2414ca4534b4a7406df34732835f37a15cb4642eb7df1a363 -F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 -F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de -F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 -F src/mem3.c 8768ac94694f31ffaf8b4d0ea5dc08af7010a35a -F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memdb.c 252137ca122acb8f54a99b48cf9f96a31d5130f19d174381a53294446d8b64a3 -F src/memjournal.c 7561c01c90958f3ba9bc6cb2d857123d932bdfa5539ea34427a0957b2e35154d -F src/msvc.h 3a15918220367a8876be3fa4f2abe423a861491e84b864fb2b7426bf022a28f8 -F src/mutex.c 5e3409715552348732e97b9194abe92fdfcd934cfb681df4ba0ab87ac6c18d25 -F src/mutex.h a7b2293c48db5f27007c3bdb21d438873637d12658f5a0bf8ad025bb96803c4a -F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4 -F src/mutex_unix.c aaf9ebc3f89df28483c52208497a99a02cc3650011422fc9d4c57e4392f7fe58 -F src/mutex_w32.c 7670d770c94bbfe8289bec9d7f1394c5a00a57c37f892aab6b6612d085255235 -F src/notify.c 9711a7575036f0d3040ba61bc6e217f13a9888e7 -F src/os.c 669cc3839cc35d20f81faf0be1ab6d4581cea35e9d8f3a9d48a98d6571f7c285 -F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 -F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 -F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c 03bad4eb1e13946cb967f3a6cc0a0d350df8ea4b8d2212d528024a5f9abc90ea -F src/os_win.c e832e21e830c1f9409c9c54053939b6dcb14c1e92128b756204ce1e3e331d678 -F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -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 -F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a -F src/pragma.c 1b0db48177e52b256c003b8dc6ac708b1079a82cded944a23820574586a4731f -F src/pragma.h 8168e588536bffd95319451f34e9a754dc37d205ebe433031a7813c5b286beae -F src/prepare.c bb996921a85590418f951f27566216646fad2d6856ba131b21594862055b1bd7 -F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 -F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d -F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c b7bbec203c2a00e542dfea72ddfad92df349a4e3565aa666c3157fc85afe30b3 -F src/shell.c.in c6e26593f2738eefded08a39204bf6b48db135cdfaa458c26ffe57055b4fe365 -F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 -F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 -F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h 8fddd3ff00bb5983c45fbe891c9c4134b5d4799d8816a1e97cba38dc66aca4c2 -F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 -F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 -F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 -F src/tclsqlite.c 986b6391f02cd9b53c1d688be55899f6ffddeb8e8014cd83c1b73ff912579a71 -F src/test1.c 5e8b8cc54e8c88906ea8a084387aa79bad245e539f4cee73149e5c0527e1db16 -F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 -F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 -F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb -F src/test5.c 328aae2c010c57a9829d255dc099d6899311672d -F src/test6.c e8d839fbc552ce044bec8234561a2d5b8819b48e29548ad0ba400471697946a8 -F src/test7.c 5612e9aecf934d6df7bba6ce861fdf5ba5456010 -F src/test8.c 3f7d0cc4e12e06832ba3db4455cb16867ccadafa602eb6ff5fcf097bffce56ed -F src/test9.c 12e5ba554d2d1cbe0158f6ab3f7ffcd7a86ee4e5 -F src/test_async.c 195ab49da082053fdb0f949c114b806a49ca770a -F src/test_autoext.c 915d245e736652a219a907909bb6710f0d587871 -F src/test_backup.c bf5da90c9926df0a4b941f2d92825a01bbe090a0 -F src/test_bestindex.c 78809f11026f18a93fcfd798d9479cba37e1201c830260bf1edc674b2fa9b857 -F src/test_blob.c ae4a0620b478548afb67963095a7417cd06a4ec0a56adb453542203bfdcb31ce -F src/test_btree.c 8b2dc8b8848cf3a4db93f11578f075e82252a274 -F src/test_config.c 5ea19bf0972a9d91728518b4d30e91477acce80496003ecbef3a7fb18d0bd081 -F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f -F src/test_demovfs.c 86142ba864d4297d54c5b2e972e74f3141ae4b30f05b3a95824184ed2d3d7f91 -F src/test_devsym.c 6109b45c3db3ef7b002320947ed448c027356ab8b885156ff535fd8684d4a571 -F src/test_fs.c ba1e1dc18fd3159fdba0b9c4256f14032159785320dfbd6776eb9973cb75d480 -F src/test_func.c 181f992e5495644434c4f0e3cc72362a78c295eb2cf3ff4d02498b8bde7aa276 -F src/test_hexio.c d170d0e1a6431afdeac086a250d2595078288c2257615d37949355361399bcaa -F src/test_init.c 4413c211a94b62157ca4c145b3f27c497f03c664 -F src/test_intarray.c 39b4181662a0f33a427748d87218e7578d913e683dc27eab7098bb41617cac71 -F src/test_intarray.h d57ae92f420cda25e22790dac474d60961bd0c500cbaa3338a05152d4a669ef7 -F src/test_journal.c a0b9709b2f12b1ec819eea8a1176f283bca6d688a6d4a502bd6fd79786f4e287 -F src/test_loadext.c 337056bae59f80b9eb00ba82088b39d0f4fe6dfd -F src/test_malloc.c dec0aa821b230773aeb3dd11d652c1193f7cedb18a20b25659bc672288115242 -F src/test_md5.c 7268e1e8c399d4a5e181b64ac20e1e6f3bc4dd9fc87abac02db145a3d951fa8c -F src/test_multiplex.c 46e278397bef99b10530c1a695b4f6f23823fde6d6589b182f14e9bd43440b57 -F src/test_multiplex.h 5436d03f2d0501d04f3ed50a75819e190495b635 -F src/test_mutex.c 7f4337ba23ee6b1d2ec81c189653608cb069926a -F src/test_onefile.c f31e52e891c5fef6709b9fcef54ce660648a34172423a9cbdf4cbce3ba0049f4 -F src/test_osinst.c 98ef31ff03d55497829ca0f6c74a9f4e1aa48690 -F src/test_pcache.c a5cd24730cb43c5b18629043314548c9169abb00 -F src/test_quota.c 6cb9297115b551f433a9ad1741817a9831abed99 -F src/test_quota.h 2a8ad1952d1d2ca9af0ce0465e56e6c023b5e15d -F src/test_rtree.c 671f3fae50ff116ef2e32a3bf1fe21b5615b4b7b -F src/test_schema.c f575932cb6274d12147a77e13ea4b49d52408513 -F src/test_server.c a2615049954cbb9cfb4a62e18e2f0616e4dc38fe -F src/test_sqllog.c 11e6ce7575f489155c604ac4b439f2ac1d3d5aef -F src/test_superlock.c 4839644b9201da822f181c5bc406c0b2385f672e -F src/test_syscall.c 1073306ba2e9bfc886771871a13d3de281ed3939 -F src/test_tclsh.c eeafce33ad2136d57e5dec10f1e9a4347447eb72ffd504a1c7b9c6bfe2e71578 -F src/test_tclvar.c 33ff42149494a39c5fbb0df3d25d6fafb2f668888e41c0688d07273dcb268dfc -F src/test_thread.c 269ea9e1fa5828dba550eb26f619aa18aedbc29fd92f8a5f6b93521fbb74a61c -F src/test_vdbecov.c f60c6f135ec42c0de013a1d5136777aa328a776d33277f92abac648930453d43 -F src/test_vfs.c 36822d696789535bdd0260f07d2c9a46546082fea8bb1d0a7354c7f9366e37ea -F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698 -F src/test_windirent.c a895e2c068a06644eef91a7f0a32182445a893b9a0f33d0cdb4283dca2486ac1 -F src/test_windirent.h 90dfbe95442c9762357fe128dc7ae3dc199d006de93eb33ba3972e0a90484215 -F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f -F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 -F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c -F src/tokenize.c eee7bae3ec0bc4abee951554bf46a8ba567c0f7752ac90c820ed8afff4c612dc -F src/treeview.c 4b92992176fb2caefbe06ba5bd06e0e0ebcde3d5564758da672631f17aa51cda -F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04 -F src/update.c 3199098455830fc2d8c8fc4ae3ec2ea513eef64339ae9a7048db62b21169bc7a -F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 -F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 -F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 -F src/vacuum.c de9780b89fa4ee74c3534f60b94820e3179aca759ffc1338ee53cb4ea7693dd3 -F src/vdbe.c a154f2785fbe4a1205944c647026445552ca3fa04ed1f313b05e614be205c061 -F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 -F src/vdbeInt.h 571413068b5ac07e2ed8ca7a02fa529622fd5455ae6981498376e5e492d2e5ef -F src/vdbeapi.c e467b75a710ea099f8d2d022abf601d2ccd05e28f63b44b12d93000b6a75f4a8 -F src/vdbeaux.c 00746a04b3a1e917bab5e3846f0931820a5ded53cbe1648ba1ad57c0869c1ba3 -F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 -F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 -F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df -F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vdbevtab.c ee5b4c902fdda2230f9503ac7b84c6d614c91e8f6f4dc1633e2e8dfef8ffb144 -F src/vtab.c 7b452592ed2ee95dedb1f323d557cebede5a6f3b4558b21a5dca527e6ae9b12c -F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 231044ecf7d5d78bc705af9dcec6c10ec59e891366362b6be54bb6a0bc7c17db -F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a -F src/walker.c 3df26a33dc4f54e8771600fb7fdebe1ece0896c2ad68c30ab40b017aa4395049 -F src/where.c 7bcc07ff56d03d73308245135d96de46d2faeaee628bd4badf0bae60ae6a31fe -F src/whereInt.h 6b874aa15f94e43a2cec1080be64d955b04deeafeac90ffb5d6975c0d511be3c -F src/wherecode.c 7b939de85d65cc4b4bfa197513136b9e0ae03167e3b82842ca5a0ba1055ba65d -F src/whereexpr.c 264d58971eaf8256eb5b0917bcd7fc7a1f1109fdda183a8382308a1b18a2dce7 -F src/window.c 7d19c08b62b70d5dc2ef4c098cc5ba611fac246a111fa36ebb39505415124b90 -F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 -F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 -F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d -F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 -F test/aggnested.test 2f65ec8132e0ca896de550b9908094d49ad65a99116a9d79deeb6017604ad4f6 -F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 -F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13 -F test/alter.test 25e109787dc5e631e117eb6e1c57f96a572bb51228db3b4f8b5f41d665e2ccaa -F test/alter2.test a966ccfcddf9ce0a4e0e6ff1aca9e6e7948e0e242cd7e43fc091948521807687 -F test/alter3.test e487958dec7932453e0b83baf21d6b1e71d5e7d9a55bc20eadfa62a51ddffc29 -F test/alter4.test dfd6086faf461b27ca2d2999848dcd207edf23352fc1592d0005c0844f3f08cf -F test/alterauth.test 63442ba61ceb0c1eeb63aac1f4f5cebfa509d352276059d27106ae256bafc959 -F test/alterauth2.test c0a1ddf5b93d93cb0d15ba7acaf0c5c6fb515bbe861ede75b2d3fabad33b6499 -F test/altercol.test 1d6a6fe698b81e626baea4881f5717f9bc53d7d07f1cd23ee7ad1b931f117ddf -F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3eab2f44b -F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 -F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b -F test/altertab.test 523ba6368e0da19f462f7c05563c569675736d946724cac1c4ae848f76783434 -F test/altertab2.test b0d62f323ca5dab42b0bc028c52e310ebdd13e655e8fac070fe622bad7852c2b -F test/altertab3.test 155b8dc225ce484454a7fb4c8ba745680b6fa0fc3e08919cbbc19f9309d128ff -F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f -F test/analyze.test 547bb700f903107b38611b014ca645d6b5bb819f5210d7bf39c40802aafeb7d7 -F test/analyze3.test 01f0b122e3e54ad2544f14f7cc7dcb4c2cb8753cad5e88c6b8d49615b3fd6a2b -F test/analyze4.test cdf88f3f72b0f0643a1ff6c730fc5af1e42464d47478d9fbac84c333f72c014e -F test/analyze5.test fa5131952303ac4146aba101b116b9c8cb89e2637531c334a6df7f7d19dddc0d -F test/analyze6.test 6c3f7df2996cb6872f355a6ac1eb6d5de00a5a9288214bad7ef25c97d9cc72dc -F test/analyze7.test 6ef0b12369f61ddeadc7d8a705c40e6b52cb29f63de3a4c56581b510b46b5783 -F test/analyze8.test 36ce54947710bd44e4f9484e1ad07e725ef01a9d7078b417c1bc884356febe4d -F test/analyze9.test 9fbf0e0101eef4f5dc149769aa14e10b76ee06e7c28598264b32173cd1999a54 -F test/analyzeC.test 489fe2ea3be3f17548e8dd895f1b41c9669b52de1b0861f5bffe6eec46eac710 -F test/analyzeD.test e50cd0b3e6063216cc0c88a1776e8645dc0bd65a6bb275769cbee33b7fd8d90c -F test/analyzeE.test 8684e8ac5722fb97c251887ad97e5d496a98af1d -F test/analyzeF.test 9e1a0537949eb5483642b1140a5c39e5b4025939024b935398471fa552f4dabb -F test/analyzeG.test a48c0f324dd14de9a40d52abe5ca2637f682b9a791d2523dd619f6efa14e345b -F test/analyzer1.test 459fa02c445ddbf0101a3bad47b34290a35f2e49 -F test/async.test 1d0e056ba1bb9729283a0f22718d3a25e82c277b -F test/async2.test c0a9bd20816d7d6a2ceca7b8c03d3d69c28ffb8b -F test/async3.test d73a062002376d7edc1fe3edff493edbec1fc2f7 -F test/async4.test 1787e3952128aa10238bf39945126de7ca23685a -F test/async5.test 383ab533fdb9f7ad228cc99ee66e1acb34cc0dc0 -F test/atof1.test 1ccfc96a6888566597b83d882c81b3c04258dc39317e8c1cec89ba481eaa2fba -F test/atomic.test 065a453dde33c77ff586d91ccaa6ed419829d492dbb1a5694b8a09f3f9d7d061 -F test/atomic2.test b6863b4aa552543874f80b42fb3063f1c8c2e3d8e56b6562f00a3cc347b5c1da -F test/atrc.c ec92d56d8fbed9eb3e11aaf1ab98cf7dd59e69dae31f128013f1d97e54e7dfed -F test/attach.test d42862c72fef3d54367d962d41dcfb5363442a4a1bd898c22ae950cea1aa0dd3 -F test/attach2.test 256bd240da1835fb8408dd59fb7ef71f8358c7a756c46662434d11d07ba3a0ce -F test/attach3.test c59d92791070c59272e00183b7353eeb94915976 -F test/attach4.test aa05b1d8218b24eba5a7cccf4f224f514ba57ba705c9267f09d2bb63fed0eea1 -F test/attachmalloc.test 12c4f028e570acf9e0a4b0b7fe6f536e21f3d5ebddcece423603d0569beaf438 -F test/auth.test 2154625c05bc79f0e0ea72cb2358395a8041243caa0fd7ce7617d50da4331794 -F test/auth2.test 9eb7fce9f34bf1f50d3f366fb3e606be5a2000a1 -F test/auth3.test db21405b95257c24d29273b6b31d0efc59e1d337e3d5804ba2d1fd4897b1ae49 -F test/autoanalyze1.test b9cc3f32a990fa56669b668d237c6d53e983554ae80c0604992e18869a0b2dec -F test/autoinc.test 997d6f185f138229dc4251583a1d04816423dddc2fc034871a01aeb1d728cb39 -F test/autoindex1.test 96185415f5faacd5b8d7a7f505efddd5abb1f111d58338e9c0b1dc40b87cd3cc -F test/autoindex2.test 12ef578928102baaa0dc23ad397601a2f4ecb0df -F test/autoindex3.test 2dd997d6590438b53e4f715f9278aa91c9299cf3f81246a0915269c35beb790e -F test/autoindex4.test 49d3cd791a9baa16fb461d7ea3de80d019a819cf -F test/autoindex5.test a5d72fe8c217cc0ea356dc6fa06a282a8a3fc53aa807709d79dba07a8f248102 -F test/autovacuum.test 0831cd34e14695d297187f7f6519265e3121c5b0a1720e548e86829e796129e9 -F test/autovacuum_ioerr2.test 8a367b224183ad801e0e24dcb7d1501f45f244b4 -F test/avtrans.test b7dc25459ecbd86c6fa9c606ee3068f59d81e225118617dcf2bbb6ded2ade89e -F test/backcompat.test 3e64cedda754c778ef6bbe417b6e7a295e662a4d -F test/backup.test dd4a5ff756e3df3931dacb1791db0584d4bad989 -F test/backup2.test 1fd1ad8c5b3d2d5b9c0cce4143a4fc610d51ddc6ae16a7a122973d43e6b50bbd -F test/backup4.test 8f6fd48e0dfde77b9a3bb26dc471ede3e101df32 -F test/backup5.test ee5da6d7fe5082f5b9b0bbfa31d016f52412a2e4 -F test/backup_ioerr.test 4c3c7147cee85b024ecf6e150e090c32fdbb5135 -F test/backup_malloc.test 0c9abdf74c51e7bedb66d504cd684f28d4bd4027 -F test/badutf.test d5360fc31f643d37a973ab0d8b4fb85799c3169f -F test/badutf2.test f310fd3b24a491b6b77bccdf14923b85d6ebcce751068c180d93a6b8ff854399 -F test/bc_common.tcl b5e42d80305be95697e6370e015af571e5333a1c -F test/bestindex1.test 705b57d7f51d53ee5fd043dd9666236e1fc18f4d59abf51da0ea5ea1b4804947 -F test/bestindex2.test 9a0ccd320b6525eec3a706aae6cdab7e1b7b5abca75027e39f39f755e76e5928 -F test/bestindex3.test 7622e792ff2da16d262d3cea6ad914591ac4806d57ed128e6c940b7920b47b84 -F test/bestindex4.test 038e3d0789332f3f1d61474f9bbc9c6d08c6bd1783a978f31f38ad82688de601 -F test/bestindex5.test 67c1166131bb59f9e47c00118f7d432ca5491e6cae6ca3f87ca9db20103a78f9 -F test/bestindex6.test d856a9bb63d927493575823eed44053bc36251e241aa364e54d0f2a2d302e1d4 -F test/bestindex7.test f36ada201973d3022cf7afffffe08de9e58341996020e7a2df9a1d2f2be20132 -F test/between.test 68137a6e941c221417c15b6fe2d55f27bb1b6ab48bdf9e2aa51efdd85bc53802 -F test/bigfile.test aa74f4e5db51c8e54a1d9de9fa65d01d1eb20b59 -F test/bigfile2.test 1b489a3a39ae90c7f027b79110d6b4e1dbc71bfc -F test/bigmmap.test 31dad31573638bd32de866cdefd11843f75685be4ba6aec1a47918f098f1899b -F test/bigrow.test f0aeb7573dcb8caaafea76454be3ade29b7fc747 -F test/bigsort.test 8299fa9298f4f1e02fc7d2712e8b77d6cd60e5a2 -F test/bind.test 1e136709b306f7ed3192d349c2930d89df6ab621654ad6f1a72381d3fe76f483 -F test/bindxfer.test efecd12c580c14df5f4ad3b3e83c667744a4f7e0 -F test/bitvec.test 75894a880520164d73b1305c1c3f96882615e142 -F test/blob.test e7ac6c7d3a985cc4678c64f325292529a69ae252 -F test/boundary1.tcl 6421b2d920d8b09539503a8673339d32f7609eb1 -F test/boundary1.test 66d7f4706ccdb42d58eafdb081de07b0eb42d77b -F test/boundary2.tcl e34ef4e930cf1083150d4d2c603e146bd3b76bcb -F test/boundary2.test 9ae758d7dab7e882c8b6cc4a6a10278385bff8fa -F test/boundary3.tcl 23361e108a125dca9c4080c2feb884fe54d69243 -F test/boundary3.test 56ef82096b4329aca2be74fa1e2b0f762ea0eb45 -F test/boundary4.tcl 0bb4b1a94f4fc5ae59b79b9a2b7a140c405e2983 -F test/boundary4.test 89e02fa66397b8a325d5eb102b5806f961f8ec4b -F test/btree01.test e08b3613540145b353f20c81cb18ead54ff12e0f -F test/btree02.test 7555a5440453d900410160a52554fe6478af4faf53098f7235f1f443d5a1d6cc -F test/btreefault.test c2bcb542685eea44621275cfedbd8a13f65201e3 -F test/busy.test 510dc6daaad18bcbbc085bcc6217d6dc418def5e73f72ce1475eea0cb7834727 -F test/cache.test 13bc046b26210471ca6f2889aceb1ea52dc717de -F test/cacheflush.test af25bb1509df04c1da10e38d8f322d66eceedf61 -F test/cachespill.test 895997f84a25b323b166aecb69baab2d6380ea98f9e0bcc688c4493c535cfab9 -F test/capi2.test 34a1a9a96d543a2ec2c209696b11b164444f57253b1f2cba1c2e53fadede6c7b -F test/capi3.test 3910a73c38ac76d69778dd9eb481ab7cd6ed59117fc047b4f6056a5c72529de1 -F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 -F test/capi3c.test 54e2dc0c8fd7c34ad1590d1be6864397da2438c95a9f5aee2f8fbc60c112e44b -F test/capi3d.test aba917805573a03deed961a21f07a5a84505ad0a616f7e3fc1508844a15bccc4 -F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe -F test/cast.test 2906ccab6a3ebd147ffa63304b635be903ce58264110d0a0eb4fd9939422bb53 -F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef -F test/check.test 9776af795bb5d0f197b7f8fe248052e3ca2ed35304d863efcdbf8b1316e11f65 -F test/checkfault.test da6cb3d50247169efcb20bdf57863a3ccfa1d27d9e55cd324f0680096970f014 -F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760 -F test/close.test eccbad8ecd611d974cbf47278c3d4e5874faf02d811338d5d348af42d56d647c -F test/closure01.test 9905883f1b171a4638f98fc764879f154e214a306d3d8daf412a15e7f3a9b1e0 -F test/coalesce.test cee0dccb9fbd2d494b77234bccf9dc6c6786eb91 -F test/collate1.test 532b4992f78e91dd80c2e3c7bd944fada8cbe3d6c0ded0b20f7182b4dfca0006 -F test/collate2.test 9aaa410a00734e48bcb27f3872617d6f69b2a621 -F test/collate3.test 89defc49983ddfbf0a0555aca8c0521a676f56a5 -F test/collate4.test c953715fb498b87163e3e73dd94356bff1f317bd -F test/collate5.test 65d928034d30d2d263a80f6359f7549ee1598ec6 -F test/collate6.test 8be65a182abaac8011a622131486dafb8076e907 -F test/collate7.test 8ec29d98f3ee4ccebce6e16ce3863fb6b8c7b868 -F test/collate8.test cd9b3d3f999b8520ffaa7cc1647061fc5bab1334 -F test/collate9.test 3adcc799229545940df2f25308dd1ad65869145a -F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6 -F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151ecac0b95 -F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 -F test/colname.test 87ad5458bb8709312dac0d6755fd30e8e4ca83298d0a9ef6e5c24277a3c3390e -F test/conflict.test 58857e2533fb9f2e0358ea7cb191215657846be1dd9da3b3d6df3e750c02ae03 -F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c -F test/conflict3.test 81865d9599609aca394fb3b9cd5f561d4729ea5b176bece3644f6ecb540f88ac -F test/contrib01.test 2a1cbc0f2f48955d7d073f725765da6fbceda6b4 -F test/corrupt.test d7cb0300e4a297147b6a05e92a1684bc8973635c3bcaa3d66e983c9cbdbf47a3 -F test/corrupt2.test bb50042cf9a1f1023d73af325d47eb02a6bb11e3c52f8812644b220c5d4bca35 -F test/corrupt3.test f95d7bf78109e0b84eb285a787ce91a3fd6a2dd7d0cb55882abff3bdc081a57e -F test/corrupt4.test 8d1d86b850fcc43e417450454f2044e52d55778a -F test/corrupt5.test 387be3250795e2a86e6234745558b80efb248a357d0cd8e53bce75c7463f545d -F test/corrupt6.test fc6a891716139665dae0073b6945e3670bf92568 -F test/corrupt7.test b036f94bda4b0b23a2919bf717046ce9ecca4543 -F test/corrupt8.test 2399dfe40d2c0c63af86706e30f3e6302a8d0516 -F test/corrupt9.test 730a3db08d4ab9aa43392ea30d9c2b4879cbff85 -F test/corruptA.test 112f4b2ae0b95ebf3ea63718642fb969a93acea557ace3a307234d19c245989b -F test/corruptB.test 73a8d6c0b9833697ecf16b63e3c5c05c945b5dec -F test/corruptC.test 74d4498fd25759618b393f1e9cde111de828b88c1848ab320f6c179fd52b5a60 -F test/corruptD.test 33a37ce3ed56a20093ceee778cd2d7109c7085a59f3213d2baede11d952e8e50 -F test/corruptE.test 4143791f2dfb443aec5b7fabfa5821e6063eccc3b49b06f212c2f014715fd476 -F test/corruptF.test be9fde98e4c93648f1ba52b74e5318edc8f59fe4 -F test/corruptG.test adf79b669cbfd19e28c8191a610d083ae53a6d51 -F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 -F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b -F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 -F test/corruptK.test 5b4212fe346699831c5ad559a62c54e11c0611bdde1ea8423a091f9c01aa32af -F test/corruptL.test 13ef74a93223af25015d223add0df4c2d375f0b958b546a2a72033f2fdab7a70 -F test/corruptM.test 7d574320e08c1b36caa3e47262061f186367d593a7e305d35f15289cc2c3e067 -F test/cost.test 1d156ce9858780a966c062694687afe0343a0ed12d081d071fb57027e726bafc -F test/count.test e0699a15712bc2a4679d60e408921c2cce7f6365a30340e790c98e0f334a9c77 -F test/countofview.test e17d6e6688cf74f22783c9ec6e788c0790ee4fbbaee713affd00b1ac0bb39b86 -F test/coveridxscan.test 5ec98719a2e2914e8908dc75f7247d9b54a26df04625f846ac7900d5483f7296 -F test/crash.test fb9dc4a02dcba30d4aa5c2c226f98b220b2b959f -F test/crash2.test 5b14d4eb58b880e231361d3b609b216acda86651 -F test/crash3.test 8f5de9d32ab9ab95475a9efe7f47a940aa889418 -F test/crash4.test fe2821baf37168dc59dd733dcf7dba2a401487bc -F test/crash5.test f14ff37eddc41991be4eb63568f86caa306fd9962a0ae3750db8836777bb7aae -F test/crash6.test 4c56f1e40d0291e1110790a99807aa875b1647ba -F test/crash7.test 1a194c4900a255258cf94b7fcbfd29536db572df -F test/crash8.test 64366e459c28dd62edfb7ad87253a409c7533b92d16fcc479a6a8131bdcc3100 -F test/crashM.test d95f59046fa749b0d0822edf18a717788c8f318d -F test/crashtest1.c 09c1c7d728ccf4feb9e481671e29dda5669bbcc2 -F test/createtab.test 85cdfdae5c3de331cd888d6c66e1aba575b47c2e3c3cc4a1d6f54140699f5165 -F test/cse.test 00b3aea44b16828833c94fbe92475fd6977583fcb064ae0bc590986812b38d0c -F test/csv01.test c9c3af0d58c34e9ac970c5875a77939edb958762c8aafb95409e19a3f088b6cd -F test/ctime.test 78749e6c9a5f0010d67985be80788f841e3cd2da18114e2ed6010399a7d807f3 -F test/cursorhint.test 0175e4404181ace3ceca8b114eb0a98eae600d565aa4e2705abbe6614c7fe201 -F test/cursorhint2.test 6f3aa9cb19e7418967a10ec6905209bcbb5968054da855fc36c8beee9ae9c42f -F test/dataversion1.test 6e5e86ac681f0782e766ebcb56c019ae001522d114e0e111e5ebf68ccf2a7bb8 -F test/date.test 9b73bbeb1b82d9c1f44dec5cf563bf7da58d2373 -F test/date2.test 5ef8265c71460cda6b1698bf18f4bb0ffb40ac08c5092f6afe84d398c2feb5be -F test/dbdata.test 042f49acff3438f940eeba5868d3af080ae64ddf26ae78f80c92bec3ca7d8603 -F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e -F test/dbfuzz001.test 42aad1dcef6219fbee86a9b7d08832c9bbb2e41508f6f128ae91745927276292 -F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c c2c9cb40082a77b7e95ffb8b2da1e93322efadfb1c8c1e0001c95a0af1e156c2 -F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 -F test/dbstatus.test 4a4221a883025ffd39696b3d1b3910b928fb097d77e671351acb35f3aed42759 -F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef -F test/default.test 9687cfb16717e4b8238c191697c98be88c0b16e568dd5368cd9284154097ef50 -F test/delete.test 31832b0c45ecb51a54348c68db173be462985901e6ed7f403d6d7a8f70ab4ef0 -F test/delete2.test 3a03f2cca1f9a67ec469915cb8babd6485db43fa -F test/delete3.test 555e84a00a99230b7d049d477a324a631126a6ab -F test/delete4.test 6aa279f459f4aa792cc251435c3809415c1ecaf9f27dce91675e26f05b503db3 -F test/delete_db.test 096d828493c7907f9ea11a7098ea6a0f73edba89406487d5d6cc2228dc4ab8b0 -F test/descidx1.test edc8adee58d491b06c7157c50364eaf1c3605c9c19f8093cb1ea2b6184f3ac13 -F test/descidx2.test a0ba347037ff3b811f4c6ceca5fd0f9d5d72e74e59f2d9de346a9d2f6ad78298 -F test/descidx3.test 953c831df7ea219c73826dfbf2f6ee02d95040725aa88ccb4fa43d1a1999b926 -F test/diskfull.test 106391384780753ea6896b7b4f005d10e9866b6e -F test/distinct.test e7d0cf371944dd0cbedff86420744e2f1ea2b528156451c97eb6ff41a99b9236 -F test/distinct2.test 11b0594c932098e969d084ba45ab81d5040f4d4e766db65d49146705a305ed98 -F test/distinctagg.test 1a6ef9c87a58669438fc771450d7a72577417376 -F test/e_blobbytes.test 439a945953b35cb6948a552edaec4dc31fd70a05 -F test/e_blobclose.test 4b3c8c60c2171164d472059c73e9f3c1844bb66d -F test/e_blobopen.test e95e1d40f995056f6f322cd5e1a1b83a27e1a145 -F test/e_blobwrite.test f87ff598b67af5b3ec002a8d83e804dc8d23808e88cf0080c176612fc9ffce14 -F test/e_changes.test fd66105385153dbf21fdb35eb8ef6c3e1eade579 -F test/e_createtable.test ea27082d6f84df61e1d9e383f3fd79220418856a4a8afc41af75d458b8e7ac33 -F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e -F test/e_droptrigger.test 3cd080807622c13e5bbb61fc9a57bd7754da2412 -F test/e_dropview.test 74e405df7fa0f762e0c9445b166fe03955856532e2bb234c372f7c51228d75e7 -F test/e_expr.test 62000e6675d5bcf4b09276fe011a27779629ff8f6678ba5937fb6f1b78d645ff -F test/e_fkey.test b497feb7c436693e16a36cdaba8d81ffe12f23659d139ee71dfa57c0c52d1e5b -F test/e_fts3.test 17ba7c373aba4d4f5696ba147ee23fd1a1ef70782af050e03e262ca187c5ee07 -F test/e_insert.test f02f7f17852b2163732c6611d193f84fc67bc641fb4882c77a464076e5eba80e -F test/e_reindex.test 2b0e29344497d9a8a999453a003cb476b6b1d2eef2d6c120f83c2d3a429f3164 -F test/e_resolve.test a61751c368b109db73df0f20fc75fb47e166b1d8 -F test/e_select.test f9474205669a7736ef725b29cc7ae9e8601919a3d0ffc0ab30745a028f2a4b61 -F test/e_select2.test aceb80ab927d46fba5ce7586ebabf23e2bb0604f -F test/e_totalchanges.test b12ee5809d3e63aeb83238dd501a7bca7fd72c10 -F test/e_update.test f46c2554d915c9197548681e8d8c33a267e84528 -F test/e_uri.test 47eeb2960e74613f0f8722b2f13aef08fde69daa16e5380ac93df84dac8b1f72 -F test/e_vacuum.test 0d8832a2ce92350db0d0cff47b419465fd9772562e1f77ff7d9478c07a4980d2 -F test/e_wal.test ae9a593207a77d711443ee69ffe081fda9243625 -F test/e_walauto.test 248af31e73c98df23476a22bdb815524c9dc3ba8 -F test/e_walckpt.test 28c371a6bb5e5fe7f31679c1df1763a19d19e8a0 -F test/e_walhook.test 01b494287ba9e60b70f6ebf3c6c62e0ffe01788e344a4846b08e5de0b344cb66 -F test/emptytable.test a38110becbdfa6325cd65cb588dca658cd885f62 -F test/enc.test 9a7be5479da985381d740b15f432800f65e2c87029ee57a318f42cb2eb43763a -F test/enc2.test 848bf05f15b011719f478dddb7b5e9aea35e39e457493cba4c4eef75d849a5ec -F test/enc3.test 6807f7a7740a00361ca8d0ccd66bc60c8dc5f2b6 -F test/enc4.test c8f1ce3618508fd0909945beb8b8831feef2c020 -F test/eqp.test 84879b63e3110552bf8ce648a3507dc3ceb72109ecec83c2aef0db37a27f6382 -F test/errmsg.test eae9f091eb39ce7e20305de45d8e5d115b68fa856fba4ea6757b6ca3705ff7f9 -F test/eval.test a64c9105d6ff163df7cf09d6ac29cdad5922078c -F test/exclusive.test 7ff63be7503990921838d5c9f77f6e33e68e48ed1a9d48cd28745bf650bf0747 -F test/exclusive2.test 984090e8e9d1b331d2e8111daf6e5d61dda0bef7 -F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7 -F test/exists.test 79a75323c78f02bbe9c251ea502a092f9ef63dac -F test/expr.test 26cd01e8485bc48c8aa6a1add598e9ce1e706b4eb4f3f554e0b0223022e8c2cf -F test/expr2.test c27327ae9c017a7ff6280123f67aff496f912da74d78c888926d68b46ec75fd8 -F test/extension01.test 00d13cec817f331a687a243e0e5a2d87b0e358c9 -F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 -F test/fallocate.test 37a62e396a68eeede8f8d2ecf23573a80faceb630788d314d0a073d862616717 -F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3 -F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4 -F test/filter1.test 8a6f047a000ef391db2ca17b6beecc0006f4e0f9ca8bbe272b2443c7316e66b1 -F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f93393e8 -F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a -F test/filterfault.test c08fb491d698e8df6c122c98f7db1c65ffcfcad2c1ab0e07fa8a5be1b34eaa8b -F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768 -F test/fkey2.test b1b6a8c5556dc0ccf31291b1fed8aa57e404b38f3236110e19ab4dc6aa93edf2 -F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49 -F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d -F test/fkey5.test 24dd28eb3d9f1b5a174f47e9899ace5facb08373a4223593c8c631e6cf9f7d5a -F test/fkey6.test d078a1e323a740062bed38df32b8a736fd320dc0 -F test/fkey7.test 64fb28da03da5dfe3cdef5967aa7e832c2507bf7fb8f0780cacbca1f2338d031 -F test/fkey8.test 48ef829d63f5f7b37aabd4df9363ac05f65539d1da8c4a44251631769d920579 -F test/fkey_malloc.test 594a7ea1fbab553c036c70813cd8bd9407d63749 -F test/fordelete.test ba98f14446b310f9c9d935b97ec748753d0144a28b356ba30d1f4f6958fdde5c -F test/format4.test eeae341953db8b6bda7f549044797c3278a6cc345d11ada81471671b654f8ef4 -F test/fts-9fd058691.test 78b887e30ae6816df0e1fed6259de4b5a64ad33c -F test/fts1a.test 46090311f85da51bb33bd5ce84f7948359c6d8d7 -F test/fts1b.test 5d8a01aefbecc8b7442b36c94c05eb7a845462d5 -F test/fts1c.test 85a525ce7428907469b4cce13d5563ce542ce64c -F test/fts1d.test a73deace5c18df4a549b12908bade4f05dcf1a2f -F test/fts1e.test 77244843e925560b5a0b70069c3e7ab62f181ed2 -F test/fts1f.test 2d6cb10d8b7a4e6edc321bbdb3982f1f48774714 -F test/fts1i.test 6bfe08cdfdced063a39a50c8601da65e6274d879 -F test/fts1j.test e3797475796043a161e348c46a309664cac83f7f -F test/fts1k.test 65d3b41487b9f738d11b0f00eca375c0ca6bd970 -F test/fts1l.test 15c119ed2362b2b28d5300c0540a6a43eab66c36 -F test/fts1m.test 2d9ca67b095d49f037a914087cc0a61e89da4f0c -F test/fts1n.test a2317dcd27b1d087ee3878b30e0a59c593c98b7a -F test/fts1o.test d1554caede42bba2c82fe613bcc921856c196b752449ead0470fac52a20fd3b8 -F test/fts1porter.test d86e9c3e0c7f8ff95add6582b4b585fb4e02b96d -F test/fts2.test e3fb95f96a650411574efc136f3fb10eef479ed7 -F test/fts2a.test 473a5c8b473a4e21a8e3fddaed1e59666e0c6ab7 -F test/fts2b.test 964abc0236c849c07ca1ae496bb25c268ae94816 -F test/fts2c.test ffb5a35230ac72c4354535c547965ce6824537c0 -F test/fts2d.test b7eaa671ca9a16997f3e5b158ee777ae21052b0b -F test/fts2e.test 2da13dbc2d009105f42196845c1e1ce136c03d38 -F test/fts2f.test cf84096235991709c1e61caa389632aa0a4f976d -F test/fts2g.test 3d26fe171bda6133ebf5a380731d70eaa2ef2f6f73d79769cf8946e622b6d597 -F test/fts2h.test 223af921323b409d4b5b18ff4e51619541b174bb -F test/fts2i.test 1b22451d1f13f7c509baec620dc3a4a754885dd6 -F test/fts2j.test 298fa1670aa21cd445b282d139b70c72e7ade12b -F test/fts2k.test c7ebf4a4937594aa07459e3e1bca1251c1be8659 -F test/fts2l.test 3333336621524cf7d60bb62d6ef6ab69647866ed -F test/fts2m.test 4b30142ead6f3ed076e880a2a464064c5ad58c51 -F test/fts2n.test 12b9c5352128cebd1c6b8395e43788d4b09087c2 -F test/fts2o.test 4054ac7433eb5440f1b1d200cfa449342dc4aabd991759139813e17c73e5bf9a -F test/fts2p.test 4b48c35c91e6a7dbf5ac8d1e5691823cc999aafb -F test/fts2q.test b2fbbe038b7a31a52a6079b215e71226d8c6a682 -F test/fts2r.test b154c30b63061d8725e320fba1a39e2201cadd5e -F test/fts2token.test d8070b241a15ff13592a9ae4a8b7c171af6f445a -F test/fts3.test 672a040ea57036fb4b6fdc09027c18d7d24ab654 -F test/fts3_common.tcl dffad248f9ce090800e272017d2898005c28ee6314fc1dd5550643a02666907a -F test/fts3aa.test 814d60a1ba30b4a71d8f9306a6564bc7b636dd6efacd2ad80306f9b23ef3ebee -F test/fts3ab.test 7f6cf260ae80dda064023df8e8e503e9a412b91f -F test/fts3ac.test 636ed7486043055d4f126a0e385f2d5a82ebbf63 -F test/fts3ad.test e40570cb6f74f059129ad48bcef3d7cbc20dda49 -F test/fts3ae.test ce32a13b34b0260928e4213b4481acf801533bda -F test/fts3af.test d394978c534eabf22dd0837e718b913fd66b499c -F test/fts3ag.test c003672a215124df7fc6000036d896f498b26b53 -F test/fts3ah.test dc9f66c32c296f1bc8bcc4535126bddfeca62894 -F test/fts3ai.test 24058fdc6e9e5102c1fd8459591b114b6a85d285 -F test/fts3aj.test 0ed71e1dd9b03b843a857dc3eb9b15630e0104fc -F test/fts3ak.test bd14deafe9d1586e8e9bf032411026ac4f8c925d -F test/fts3al.test 07d64326e79bbdbab20ee87fc3328fbf01641c9f -F test/fts3am.test 218aa6ba0dfc50c7c16b2022aac5c6be593d08d8 -F test/fts3an.test a49ccadc07a2f7d646ec1b81bc09da2d85a85b18 -F test/fts3ao.test 266989148fec6d9f1bb6c5382f7aa3dcea0e9cd444576e28dd2b9287ac7dd220 -F test/fts3atoken.test dc2078ce464914efe3a8dfc545dd034a0fc14f2ab425c240471d5a5f1c721400 -F test/fts3auto.test 649aa4c198d7acc5cd6355e19ee073d051c40d9e88a43fc3d88af46bdf3e99d5 -F test/fts3aux1.test 7a170e172afdbceb67f5baa05941fd4fbf56af42f61daa3d140f4b4bf4cb68f6 -F test/fts3aux2.test 2459e7fa3e22734aed237d1e2ae192f5541c4d8b218956ad2d90754977bf907f -F test/fts3b.test c15c4a9d04e210d0be67e54ce6a87b927168fbf9c1e3faec8c1a732c366fd491 -F test/fts3c.test fc723a9cf10b397fdfc2b32e73c53c8b1ec02958 -F test/fts3comp1.test a0f5b16a2df44dd0b15751787130af2183167c0c -F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f5a76b -F test/fts3corrupt.test 79a32ffdcd5254e2f7fa121d9656e61949ad049c3c6554229911b7ceac37c9c6 -F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 -F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test fde292a4712753c7ef235a199273c5d196e18a56bd2c4d2db7ccaf59b7027a0a -F test/fts3corrupt5.test 0549f85ec4bd22e992f645f13c59b99d652f2f5e643dac75568bfd23a6db7ed5 -F test/fts3corrupt6.test b6c55218b704b0cef224b284c756f9c55d0afd0b3c3837618bffeaa8c31e0d8e -F test/fts3cov.test 7eacdbefd756cfa4dc2241974e3db2834e9b372ca215880e00032222f32194cf -F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f -F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de -F test/fts3defer2.test 3da52ca2114e300e9971eee2f0cc1a2e5f27e6a9ee67957d49e63e41fdfcc0e7 -F test/fts3defer3.test dd53fc13223c6d8264a98244e9b19abd35ed71cd -F test/fts3drop.test 1b906e293d6773812587b3dc458cb9e8f3f0c297 -F test/fts3e.test 1f6c6ac9cc8b772ca256e6b22aaeed50c9350851 -F test/fts3expr.test ebae205a7a89446c32583bcd492dcb817b9f6b31819bb4dde2583bb99c77e526 -F test/fts3expr2.test 18da930352e5693eaa163a3eacf96233b7290d1a -F test/fts3expr3.test c4d4a7d6327418428c96e0a3a1137c251b8dfbf8 -F test/fts3expr4.test f5b2832549f01b1f7f73389fa21d4b875499bc95bf7c8b36271844888c6a0938 -F test/fts3expr5.test a5b9a053becbdb8e973fbf4d6d3abaabeb42d511d1848bd57931f3e0a1cf983e -F test/fts3fault.test 798e45af84be7978ca33d5bdc94246eb44724db24174b5d8e9b1ac46c57fb08d -F test/fts3fault2.test 6a17a11d8034b1c4eca9f3091649273d56c49ff049e2173df8060f94341e9da0 -F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641 -F test/fts3fuzz001.test e3c7b0ce9b04cc02281dcc96812a277f02df03cd7dc082055d87e11eb18aaf56 -F test/fts3join.test 949b4f5ae3ae9cc2423cb865d711e32476bdb205ab2be923fdf48246e4a44166 -F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6 -F test/fts3matchinfo.test aa66cc50615578b30f6df9984819ae5b702511cf8a94251ec7c594096a703a4a -F test/fts3matchinfo2.test 00144e841704b8debfcdf6097969cd9f2a1cf759e2203cda42583648f2e6bf58 -F test/fts3misc.test 9ec15e7c0b5831a6353bd4c46bf3acdf1360eda5d9f396f667db4d05bcf92ecf -F test/fts3near.test 7e3354d46f155a822b59c0e957fd2a70c1d7e905 -F test/fts3offsets.test b85fd382abdc78ebce721d8117bd552dfb75094c -F test/fts3prefix.test fa794eaab0bdae466494947b0b153d7844478ab2 -F test/fts3prefix2.test e1f0a822ca661dced7f12ce392e14eaf65609dce -F test/fts3query.test ca033ff2ebcc22c69d89032fb0bc1850997d31e7e60ecd26440796ba1654e78f -F test/fts3rank.test cd99bc83a3c923c8d52afd90d86979cf05fc41849f892faeac3988055ef37b99 -F test/fts3rnd.test 1320d8826a845e38a96e769562bf83d7a92a15d0 -F test/fts3shared.test 57e26a801f21027b7530da77db54286a6fe4997e -F test/fts3snippet.test 0887196d67cffbe365edde535b95ecc642a532ce8551ccd9a73aab5999c3ffae -F test/fts3snippet2.test 2dabb5889eda4c9980aad325e688b470781f97ce7c0fca0db125616fae0a2cdd -F test/fts3sort.test ed34c716a11cc2009a35210e84ad5f9c102362ca -F test/fts3tok1.test a663f4cac22a9505400bc22aacb818d7055240409c28729669ea7d4cc2120d15 -F test/fts3tok_err.test 52273cd193b9036282f7bacb43da78c6be87418d -F test/fts3varint.test 0b84a3fd4eba8a39f3687523804d18f3b322e6d4539a55bf342079c3614f2ada -F test/fts4aa.test 0e6bfd6a81695a39b23e448dda25d864e63dda75bde6949c45ddc95426c6c3f5 -F test/fts4check.test 6259f856604445d7b684c9b306b2efb6346834c3f50e8fc4a59a2ca6d5319ad0 -F test/fts4content.test 73bbb123420d2c46ef2fb3b24761e9acdb78b0877179d3a5d7d57aada08066f6 -F test/fts4docid.test e33c383cfbdff0284685604d256f347a18fdbf01 -F test/fts4growth.test 289833c34ad45a5e6e6133b53b6a71647231fb89d36ddcb8d9c87211b6721d7f -F test/fts4growth2.test 13ad4e76451af6e6906c95cdc725d01b00044269 -F test/fts4incr.test 4e353a0bd886ea984e56fce9e77724fc923b8d0d -F test/fts4langid.test 89e623218935507bca69d076ca254a7a8969dfc681c282b6374feaea8c7de784 -F test/fts4lastrowid.test 185835895948d5325c7710649824042373b2203149abe8024a9319d25234dfd7 -F test/fts4merge.test e2b2ec21e287d54ec09824ccfb41e66896eeca568fc818ba0e0eb2efd94c35d2 -F test/fts4merge2.test 5faa558d1b672f82b847d2a337465fa745e46891 -F test/fts4merge3.test 8d9ccb4a3d41c4c617a149d6c4b13ad02de797d0 -F test/fts4merge4.test d895b1057a7798b67e03455d0fa50e9ea836c47b -F test/fts4merge5.test 69932d85cda8a1c4dcfb742865900ed8fbda51724b8cf9a45bbe226dfd06c596 -F test/fts4min.test 1c11e4bde16674a0c795953509cbc3731a7d9cbd1ddc7f35467bf39d632d749f -F test/fts4noti.test 5553d7bb2e20bf4a06b23e849352efc022ce6309 -F test/fts4onepass.test d69ddc4ee3415e40b0c5d1d0408488a87614d4f63ba9c44f3e52db541d6b7cc7 -F test/fts4opt.test 0fd0cc84000743ff2a883b9b84b4a5be07249f0ba790c8848a757164cdd46b2a -F test/fts4record.test a48508f69a84c9287c8019d3a1ae712f5730d8335ffaf8e2101e691d078950bb -F test/fts4rename.test 15fd9985c2bce6dea20da2245b22029ec89bd4710ed317c4c53abbe3cfd0c880 -F test/fts4umlaut.test fcaca4471de7e78c9d1f7e8976e3e8704d7d8ad979d57a739d00f3f757380429 -F test/fts4unicode.test ceca76422abc251818cb25dabe33d3c3970da5f7c90e1540f190824e6b3a7c95 -F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d -F test/func.test f673822636fb8ed618dd2b80230d16e495d19c8f2e2e7d6c22e93e2b3de097ad -F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f -F test/func3.test 2bb0f31ab7baaed690b962a88544d7be6b34fa389364bc36a44e441ed3e3f1e6 -F test/func4.test a94858a8c1f10a408b0b3db439c990b59dbb2349411d503de011ac4e2b5f27a6 -F test/func5.test 863e6d1bd0013d09c17236f8a13ea34008dd857d87d85a13a673960e4c25d82a -F test/func6.test 90e42b64c4f9fb6f04f44cb8a1da586c8542502e926b19c76504fe74ff2a9b7c -F test/fuzz-oss1.test e58330d01cbbd8215ee636b17a03fe220b37dbfa -F test/fuzz.test 96083052bf5765e4518c1ba686ce2bab785670d1 -F test/fuzz2.test 76dc35b32b6d6f965259508508abce75a6c4d7e1 -F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c31 -F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 -F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 -F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 656ee850f331872a784e7d6a10649efe2af123bdaacb728b5a03e4faee8b959c -F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f -F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f -F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba -F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e42ed2 -F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 -F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 -F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 6acee588a3311994b57b226c9eac9e9e69f135cb8b000bd48fdb924e32041312 -F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 -F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 -F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 -F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test e89eafdf03245e2609ddf6e9b0add37a17ce229095836c409131764c3a5282a5 -F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 -F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 -F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 -F test/hidden.test 23c1393a79e846d68fd902d72c85d5e5dcf98711 -F test/hook.test 1604b3b2f5931430087540404555c1b6be3618600b81558657c66b533ed70b13 -F test/hook2.test b9ff3b8c6519fb67f33192f1afe86e7782ee4ac8 -F test/icu.test 716a6b89fbabe5cc63e0cd4c260befb08fd7b9d761f04d43669233292f0753b1 -F test/ieee754.test 806fc0ce7f305f57e3331eaceeddcfec9339e607 -F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 -F test/in.test ae4ba0fe3232fdd84ef1090a68c5cd6ccd93f1f8774d5c967dd0c1b301492eed -F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 -F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 -F test/in4.test 65460600d48933adba4283c6ebd089aae173d16136ab9d01f74c89089090c5a5 -F test/in5.test b32ce7f4a93f44c5dee94af16886d922cc16ebe33c8e1765c73d4049d0f4b40f -F test/in6.test 8562d0945195cab3cc4ab3794e9118e72cb44c43f785c2b04d48a9d06ca6b4ec -F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822 -F test/incrblob2.test a494c9e848560039a23974b9119cfc2cf3ad3bd15cc2694ee6367ae537ef8f1f -F test/incrblob3.test d8d036fde015d4a159cd3cbae9d29003b37227a4 -F test/incrblob4.test 21a52a6843a56cdcce968c6a86b72a7066d0e6ba -F test/incrblob_err.test 89372a28f1d98254f03fed705f9efcd34ef61a674df16d2dbb4726944a2de5e9 -F test/incrblobfault.test 74dd8ac108304cea0b4a0df6df63a1567e558758 -F test/incrcorrupt.test 6c567fbf870aa9e91866fe52ce6f200cd548939a -F test/incrvacuum.test 2aaee202b1f230e55779f70d155f6ba67bbdff8481d650214d256ab0f97d4a2b -F test/incrvacuum2.test 7d26cfda66c7e55898d196de54ac4ec7d86a4e3d -F test/incrvacuum3.test 75256fb1377e7c39ef2de62bfc42bbff67be295a -F test/incrvacuum_ioerr.test 6ae2f783424e47a0033304808fe27789cf93e635 -F test/index.test a2e948ed949e575487b5c1d521767d4584ac42d352f2dcd8e48004638e7bc7dc -F test/index2.test f835d5e13ca163bd78c4459ca15fd2e4ed487407 -F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473ade0 -F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 -F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 -F test/index6.test f172653b35b20233e59200e8b92a76db61bf7285437bf777b93b306ba26a47e7 -F test/index7.test b8a0ba2110fd517bb48c4e76d26d60f1ab2ed9e257b18d71f820d7e71e9f8570 -F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 -F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 -F test/indexedby.test f54aac21c06948872010a956fd02de5178c362c7785a9887cf0b8616be17883b -F test/indexexpr1.test 284e119999d132cc8bf37735a928c9859b28e8e295d02b7a6a4f93977c7f9ba5 -F test/indexexpr2.test dba11dbb0a58fcba4cd694f46b4004976123b81b0501f525d43c9be59f0207b1 -F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 -F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 -F test/insert.test 4e3f0de67aac3c5be1f4aaedbcea11638f1b5cdc9a3115be14d19aa9db7623c6 -F test/insert2.test 4d14b8f1b810a41995f6286b64a6943215d52208 -F test/insert3.test 1b7db95a03ad9c5013fdf7d6722b6cd66ee55e30 -F test/insert4.test fb9e0f752c75f453555990250b449f6d123ae6a3ebf054d14e4470de4498dce3 -F test/insert5.test 394f96728d1258f406fe5f5aeb0aaf29487c39a6 -F test/insertfault.test ac63d14ea3b49c573673a572f4014b9117383a03e497c58f308b5c776e4a7f74 -F test/instr.test 107df2b9b74a4b59315916b575590a08f2a714de0754abe541f10a0971d0a2a4 -F test/instrfault.test 95e28efade652e6d51ae11b377088fe523a581a07ec428009e152a4dd0e0f44c -F test/intarray.test bb976b0b3df0ebb6a2eddfb61768280440e672beba5460ed49679ea984ccf440 -F test/interrupt.test 16ea879ec728cb76414c148c5f24afd5d1f91054 -F test/interrupt2.test e4408ca770a6feafbadb0801e54a0dcd1a8d108d -F test/intpkey.test ac71107a49a06492b69b82aafaf225400598d3c8 -F test/intreal.test 2a87e85a5949bd55e41ef04c58f5800587c5380bdbc559ff1c79b614b0e6a533 -F test/io.test f95bca1783b01ea7761671560d023360d2dfa4cc -F test/ioerr.test 470fcc78e9cd352d162baf782fe301ea807d764241f58a48fc58109c2dfcdb6b -F test/ioerr2.test 2593563599e2cc6b6b4fcf5878b177bdd5d8df26 -F test/ioerr3.test d3cec5e1a11ad6d27527d0d38573fbff14c71bdd -F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c -F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 -F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b -F test/istrue.test 75327829744e65cc8700e69340b8e6c192e10e39dfae7ccb0e970d3c4f49090a -F test/join.test bca044589e94bb466e4c1e91fb6fecdc3f3326ca6b3f590f555f1958156eb321 -F test/join2.test 7d24d095ab88d3910228d53a3b548b7baf2e0e7d8aac6731a273e300e1b34b61 -F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 -F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 -F test/join5.test 3a96dc62f0b45402d7207e22d1993fe0c2fce1c57644a11439891dd62b990eb7 -F test/join6.test cfe6503791ceb0cbb509966740286ec423cbf10b -F test/journal1.test c7b768041b7f494471531e17abc2f4f5ebf9e5096984f43ed17c4eb80ba34497 -F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4 -F test/journal3.test 7c3cf23ffc77db06601c1fcfc9743de8441cb77db9d1aa931863d94f5ffa140e -F test/jrnlmode.test 9b5bc01dac22223cb60ec2d5f97acf568d73820794386de5634dcadbea9e1946 -F test/jrnlmode2.test 8759a1d4657c064637f8b079592651530db738419e1d649c6df7048cd724363d -F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa -F test/json101.test bb71538005f2d9e18620bdd3b76839a93ca0be61903eb8d751a64e78cf99b8fb -F test/json102.test eeb54efa221e50b74a2d6fb9259963b48d7414dca3ce2fdfdeed45cb28487bc1 -F test/json103.test aff6b7a4c17d5a20b487a7bc1a274bfdc63b829413bdfb83bedac42ec7f67e3b -F test/json104.test 317f4ec4b2d87afbba4d2460cf5be297aea76f2285eb618d276dbcd40a50950f -F test/json105.test 45f7d6a9a54c85f8a9589b68d3e7a1f42d02f2359911a8cdbad1f9988f571173 -F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff -F test/kvtest.c 94da54bb66aae7a54e47cf7e4ea4acecc0f217560f79ad3abfcc0361d6d557ba -F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63 -F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200 -F test/lemon-test01.y 58b764610fd934e189ffbb0bbfa33d171b9cb06019b55bdc04d090d6767e11d7 -F test/like.test 47b81d5de2ff19d996d49a65d50ec9754246aacbe0e950b48d186d9d8171eaf0 -F test/like2.test 3b2ee13149ba4a8a60b59756f4e5d345573852da -F test/like3.test 03d1bdf848483b78d2cfd1db283d75c4ec2e37c8b8eccc006813f3978d78fbbd -F test/limit.test 0c99a27a87b14c646a9d583c7c89fd06c352663e -F test/limit2.test 9409b033284642a859fafc95f29a5a6a557bd57c1f0d7c3f554bd64ed69df77e -F test/loadext.test faa4f6eed07a5aac35d57fdd7bc07f8fc82464cfd327567c10cf0ba3c86cde04 -F test/loadext2.test 0408380b57adca04004247179837a18e866a74f7 -F test/lock.test be4fe08118fb988fed741f429b7dd5d65e1c90db -F test/lock2.test 5242d8ac4e2d59c403aebff606af449b455aceff -F test/lock3.test f271375930711ae044080f4fe6d6eda930870d00 -F test/lock4.test 27143363eda1622f03c133efc8db808fc331afd973486cb571ea71cd717d37b8 -F test/lock5.test c6c5e0ebcb21c61a572870cc86c0cb9f14cede38 -F test/lock6.test ad5b387a3a8096afd3c68a55b9535056431b0cf5 -F test/lock7.test 49f1eaff1cdc491cc5dee3669f3c671d9f172431 -F test/lock_common.tcl 2f3f7f2e9637f93ccf609df48ef5b27a50278b6b1cd752b445d52262e5841413 -F test/lookaside.test 5a828e7256f1ee4da8e1bdaa03373a3ccdb0f1ff98dfa82e9b76cb41a45b1083 -F test/main.test 6bbb3999fd461eb8fb335cbab97409a3d7f91bbb8da60635e8be3e4a04a77772 -F test/make-where7.tcl 05c16b5d4f5d6512881dfec560cb793915932ef9 -F test/malloc.test 18dd1c4188c81ca79cf123527c71b19ee0c31feb9947fdffb0dc6ceb1436816a -F test/malloc3.test 6e88bae6312854a4adb4ecc2a6a5ea8c59b4db778b724ba718e1c43fc8c3c136 -F test/malloc4.test 957337613002b7058a85116493a262f679f3a261 -F test/malloc5.test 2e4ad7684a13389a44a840499cd47173a8d05f22f082d7d083eece433a7a64eb -F test/malloc6.test 2f039d9821927eacae43e1831f815e157659a151 -F test/malloc7.test 7c68a32942858bc715284856c5507446bba88c3a -F test/malloc8.test 9b7a3f8cb9cf0b12fff566e80a980b1767bd961d -F test/malloc9.test 2307c6ee3703b0a21391f3ea92388b4b73f9105e -F test/mallocA.test aea76f2dd8bcc2d19748f6b911e876cefda74a563753bf26af046e9d34bb97e6 -F test/mallocAll.test 98f1be74bc9f49a858bc4f361fc58e26486798be -F test/mallocB.test bc475ab850cda896142ab935bbfbc74c24e51ed6 -F test/mallocC.test 3dffe16532f109293ce1ccecd0c31dca55ef08c4 -F test/mallocD.test f78c295e8e18ea3029e65ca08278690e00c22100 -F test/mallocE.test db1ed69d7eded1b080952e2a7c37f364ad241b08 -F test/mallocF.test 2d5c590ebc2fc7f0dcebdf5aa8498b9aed69107e -F test/mallocG.test 0ff91b65c50bdaba680fb75d87fe4ad35bb7934f -F test/mallocH.test 79b65aed612c9b3ed2dcdaa727c85895fd1bfbdb -F test/mallocI.test 6c23a71df077fa5d387be90e7e669c5b368ca38a -F test/mallocJ.test b5d1839da331d96223e5f458856f8ffe1366f62e -F test/mallocK.test 1f4b5efbf61715ab79b20b38739ff4b3d110ceb53f54e5db6da1f01c083707ab -F test/mallocL.test fb311ff80afddf3b1a75e52289081f4754d901dc -F test/mallocM.test 78bbe9d3da84a5c679123cdb40d7b2010b18fc46e13897e4f253c6ba6fbff134 -F test/malloc_common.tcl aac62499b76be719fac31e7a3e54a7fd53272e7f -F test/malloctraceviewer.tcl b7a54595270c1d201abf1c3f3d461f27eaf24cdef623ad08a0fe5e411264c8a9 -F test/manydb.test 28385ae2087967aa05c38624cec7d96ec74feb3e -F test/mem5.test c6460fba403c5703141348cd90de1c294188c68f -F test/memdb.test c1f2a343ad14398d5d6debda6ea33e80d0dafcc7 -F test/memdb1.test 58d92c2bf622cc5f0f41461e1b35cf64f3f787199544c2c1dada37d88753f9d4 -F test/memleak.test 10b9c6c57e19fc68c32941495e9ba1c50123f6e2 -F test/memsubsys1.test 9e7555a22173b8f1c96c281ce289b338fcba2abe8b157f8798ca195bbf1d347e -F test/memsubsys2.test 3e4a8d0c05fd3e5fa92017c64666730a520c7e08 -F test/minmax.test 6751e87b409fe11b02e70a306d846fa544e25a41 -F test/minmax2.test 1edf66901ddfab26ae1e04165e8da834c8d3284e2b20aefb26b80ef217962eab -F test/minmax3.test cc1e8b010136db0d01a6f2a29ba5a9f321034354 -F test/minmax4.test 272ca395257f05937dc96441c9dde4bc9fbf116a8d4fa02baeb0d13d50e36c87 -F test/misc1.test 7ce84b25df9872e7d7878613a96815d2ba5bc974ac4e15a50118dde8f3917599 -F test/misc2.test 00d7de54eda90e237fc9a38b9e5ccc769ebf6d4d -F test/misc3.test cf3dda47d5dda3e53fc5804a100d3c82be736c9d -F test/misc4.test 10cd6addb2fa9093df4751a1b92b50440175dd5468a6ec84d0386e78f087db0e -F test/misc5.test c4aeaa0fa28faa08f2485309c38db4719e6cd1364215d5687a5b96d340a3fa58 -F test/misc6.test 953cc693924d88e6117aeba16f46f0bf5abede91 -F test/misc7.test 4f21954012e4eb0a923c54a311f38c81bf6798ccdd7b51584db46d4007f63daa -F test/misc8.test 8782708f4c8a459591c3e8fe1215bd2048bffb4024b3df249e9b9ed407dc61ed -F test/misuse.test 9e7f78402005e833af71dcab32d048003869eca5abcaccc985d4f8dc1d86bcc7 -F test/mjournal.test 28a08d5cb5fb5b5702a46e19176e45e964e0800d1f894677169e79f34030e152 -F test/mmap1.test fb04e0c10492455007624ade884ca0c8852ff3e4e11d95408f9709ca2ef7f626 -F test/mmap2.test 9d6dd9ddb4ad2379f29cc78f38ce1e63ed418022 -F test/mmap3.test b3c297e78e6a8520aafcc1a8f140535594c9086e -F test/mmap4.test 2e2b4e32555b58da15176e6fe750f17c9dcf7f93 -F test/mmapfault.test d4c9eff9cd8c2dc14bc43e71e042f175b0a26fe3 -F test/mmapwarm.test 2272005969cd17a910077bd5082f70bc1fefad9a875afec7fc9af483898ecaf3 -F test/multiplex.test dc0d67b66f84b484a83cb8bbdf3f0a7f49562ccd -F test/multiplex2.test 580ca5817c7edbe4cc68fa150609c9473393003a -F test/multiplex3.test d228f59eac91839a977eac19f21d053f03e4d101 -F test/multiplex4.test e8ae4c4bd70606a5727743241f13b5701990abe4 -F test/mutex1.test ea2cc74d97f077b9e74c84cbd024f14d79a8126f -F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660 -F test/nan.test 437d40e6d0778b050d7750726c0cbd2c9936b81962926e8f8c48ca698f00f4d1 -F test/nockpt.test 8c43b25af63b0bd620cf1b003529e37b6f1dc53bd22690e96a1bd73f78dde53a -F test/nolock.test f196cf8b8fbea4e2ca345140a2b3f3b0da45c76e -F test/normalize.test f23b6c5926c59548635fcf39678ac613e726121e073dd902a3062fbb83903b72 -F test/notify1.test 669b2b743618efdc18ca4b02f45423d5d2304abf -F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 -F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 -F test/notnull.test a37b663d5bb728d66fc182016613fb8e4a0a4bbf3d75b8876a7527f7d4ed3f18 -F test/null.test 0dcce4f04284ec66108c503327ad6d224c0752b3 -F test/nulls1.test 82c5bc33148405f21205865abf13c786084438d573a4ac4e87e11b6091cde526 -F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1 -F test/numindex1.test 20a5450d4b056e48cd5db30e659f13347a099823 -F test/offset1.test f06b83657bcf26f9ce805e67450e189e282143b2 -F test/openv2.test 0d3040974bf402e19b7df4b783e447289d7ab394 -F test/optfuzz-db01.c a0c256905c8ac79f9a5de2f374a3d9f757bef0dca2a238dc7c10cc8a38031834 -F test/optfuzz-db01.txt 21f6bdeadc701cf11528276e2a55c70bfcb846ba42df327f979bd9e7b6ce7041 -F test/optfuzz.c 50e330304eb1992e15ddd11f3daaad9bcc0d9aaad09cb2bcc77f9515df2e88b1 -F test/orderby1.test 6bf0ce45cbfb1cf4779dd418ac5e8cf66abfa04de2c1d2edf1e0e85f1520d8f3 -F test/orderby2.test bc11009f7cd99d96b1b11e57b199b00633eb5b04 -F test/orderby3.test 8619d06a3debdcd80a27c0fdea5c40b468854b99 -F test/orderby4.test 4d39bfbaaa3ae64d026ca2ff166353d2edca4ba4 -F test/orderby5.test bd7d9e3380e87e5dcf6ea817ebaab6d15da213c7804b38767e1b3e695e85650b -F test/orderby6.test 8b38138ab0972588240b3fca0985d2e400432859 -F test/orderby7.test 3d1383d52ade5b9eb3a173b3147fdd296f0202da -F test/orderby8.test 23ef1a5d72bd3adcc2f65561c654295d1b8047bd -F test/orderby9.test 87fb9548debcc2cd141c5299002dd94672fa76a3 -F test/orderbyA.test df608e59efc2ef50c1eddf1a773b272de3252e9401bfec86d04b52fd973866d5 -F test/oserror.test 1fc9746b83d778e70d115049747ba19c7fba154afce7cc165b09feb6ca6abbc5 -F test/ossfuzz.c 9636dad2092a05a32110df0ca06713038dd0c43dd89a77dabe4b8b0d71096715 -F test/ossshell.c f125c5bd16e537a2549aa579b328dd1c59905e7ab1338dfc210e755bb7b69f17 -F test/ovfl.test 199c482696defceacee8c8e0e0ef36da62726b2f -F test/pager1.test 1e9ee778bdeaf4f7f09997d029cdaca6a42dfc2092edafe4f5e590acbf1eab13 -F test/pager2.test 67b8f40ae98112bcdba1f2b2d03ea83266418c71 -F test/pager3.test 4e9a83d6ca0838d7c602c9eb93d1357562d9059c1e02ffb138a8271020838370 -F test/pager4.test a122e9e6925d5b23b31e3dfef8c6a44bbf19590e -F test/pagerfault.test 63c5da625562c66345ab4528790327ca63db2f6f9cbae2aba8cb7c51de3d1628 -F test/pagerfault2.test caf4c7facb914fd3b03a17b31ae2b180c8d6ca1f -F test/pagerfault3.test 1003fcda009bf48a8e22a516e193b6ef0dd1bbd8 -F test/pageropt.test 84e4cc5cbca285357f7906e99b21be4f2bf5abc0 -F test/pagesize.test 5769fc62d8c890a83a503f67d47508dfdc543305 -F test/parser1.test 6ccdf5e459a5dc4673d3273dc311a7e9742ca952dd0551a6a6320d27035ce4b3 -F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b -F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 -F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff -F test/permutations.test 94bfbc9d32449fb3ef7d31962f8cdcd57dc59490681db84bd72236d4af7b5815 -F test/pg_common.tcl 222a1bad1c41c308fa366313cd7b51b3be7e9b21c8736a421b974ac941693b54 -F test/pragma.test 59becdfd720b80d463ab750f69f7118fde10dfd556aa5d554f3bf6b7e5ea7533 -F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f -F test/pragma3.test 92a46bbea12322dd94a404f49edcfbfc913a2c98115f0d030a7459bb4712ef31 -F test/pragma4.test 10c624e45a83c0096a82a7579a5ff658542391d3b77355192da6572c8c17c00b -F test/pragma5.test 7b33fc43e2e41abf17f35fb73f71b49671a380ea92a6c94b6ce530a25f8d9102 -F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8 -F test/prefixes.test b524a1c44bffec225b9aec98bd728480352aa8532ac4c15771fb85e8beef65d9 -F test/printf.test 390d0d7fcffc3c4ea3c1bb4cbb267444e32b33b048ae21895f23a291844fe1da -F test/printf2.test 30b5dd0b4b992dc5626496846ecce17ff592cacbcb11c3e589f3ac4d7e129dae -F test/progress.test ebab27f670bd0d4eb9d20d49cef96e68141d92fb -F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc -F test/pushdown.test 5e72c51c5e33253ed639ccee1e01ce62d62b6eee5ca893cd82334e4ee7b1d7fc -F test/queryonly.test 5f653159e0f552f0552d43259890c1089391dcca -F test/quick.test 1681febc928d686362d50057c642f77a02c62e57 -F test/quota-glob.test 32901e9eed6705d68ca3faee2a06b73b57cb3c26 -F test/quota.test bfb269ce81ea52f593f9648316cd5013d766dd2a -F test/quota2.test 7dc12e08b11cbc4c16c9ba2aa2e040ea8d8ab4b8 -F test/quote.test 626149eda89ee64d81a3790de370f9f0211921b11568a49c28c861f394330508 -F test/randexpr1.tcl 40dec52119ed3a2b8b2a773bce24b63a3a746459 -F test/randexpr1.test eda062a97e60f9c38ae8d806b03b0ddf23d796df -F test/rbu.test 168573d353cd0fd10196b87b0caa322c144ef736 -F test/rdonly.test 64e2696c322e3538df0b1ed624e21f9a23ed9ff8 -F test/recover.test ccb8c2623902a92ebb76770edd075cb4f75a4760bb7afde38026572c6e79070d -F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 -F test/regexp2.test 40e894223b3d6672655481493f1be12012f2b33c -F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2118d -F test/releasetest.tcl fb76d8fcc95ac29d6356cd9e52b726ab9e43a24082897618dfbcb7c2b0049153 x -F test/releasetest_data.tcl 9919fc6ac5bc92f8878fecfd1840db15999f660a6c9f609240b41aa62b885c88 -F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b -F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb -F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa -F test/rollback2.test bc868d57899dc6972e2b4483faae0e03365a0556941474eec487ae21d8d38bb6 -F test/rollbackfault.test 0e646aeab8840c399cfbfa43daab46fd609cf04a -F test/round1.test 768018b04522ca420b1aba8a24bd76091d269f3bce3902af3ec6ebcee41ab21e -F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc -F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81 -F test/rowid.test bfbd7b97d9267660be3c8f28507c4ed7f205196b8877c0db42df347c2e8845e3 -F test/rowvalue.test 8964f95b253d3b5cc8dc1cfd0cdb7529bce3ecc6b6259e23c5f829f80f4d51cd -F test/rowvalue2.test 060d238b7e5639a7c5630cb5e63e311b44efef2b -F test/rowvalue3.test 3068f508753af69884b12125995f023da0dbb256 -F test/rowvalue4.test 02e35f7762371c2f57ebd856aa056eac56cb27ef7715a0bb31eac1895a745356 -F test/rowvalue5.test c81c7d8cf36711ab37675ad7376084ae2a359cb6 -F test/rowvalue6.test d19b54feb604d5601f8614b15e214e0774c01087 -F test/rowvalue7.test c1cbdbf407029db01f87764097c6ac02a1c5a37efd2776eff32a9cdfdf6f2dba -F test/rowvalue8.test 5900eddad9e2c3c2e26f1a95f74aafc1232ee5e0 -F test/rowvalue9.test d8dd2c6ecac432dadaa79e41dc2434f007be1b6b -F test/rowvaluefault.test 7cd9ccc6c2fbdd881672984087aad0491bb75504 -F test/rowvaluevtab.test cd9747bb3f308086944c07968f547ad6b05022e698d80b9ffbdfe09ce0b8da6f -F test/rtree.test 0c8d9dd458d6824e59683c19ab2ffa9ef946f798 -F test/run-wordcount.sh 891e89c4c2d16e629cd45951d4ed899ad12afc09 -F test/savepoint.test 1f8a6b1aea9a0d05837adc463d4bf47bd9d0f1c842f1c2a9caccd639baf34bf9 -F test/savepoint2.test 9b8543940572a2f01a18298c3135ad0c9f4f67d7 -F test/savepoint4.test c8f8159ade6d2acd9128be61e1230f1c1edc6cc0 -F test/savepoint5.test 0735db177e0ebbaedc39812c8d065075d563c4fd -F test/savepoint6.test f41279c5e137139fa5c21485773332c7adb98cd7 -F test/savepoint7.test cde525ea3075283eb950cdcdefe23ead4f700daa -F test/savepointfault.test f044eac64b59f09746c7020ee261734de82bf9b2 -F test/scanstatus.test 874e35011779b07725a47dbf1dd6282b0ca04af7e028fb0b534ee544b571be42 -F test/schema.test 5dd11c96ba64744de955315d2e4f8992e447533690153b93377dffb2a5ef5431 -F test/schema2.test 906408621ea881fdb496d878b1822572a34e32c5 -F test/schema3.test 1bc1008e1f8cb5654b248c55f27249366eb7ed38 -F test/schema4.test 3b26c9fa916abb6dadf894137adcf41b7796f7b9 -F test/schema5.test 29699b4421f183c8f0e88bd28ce7d75d13ea653e -F test/schema6.test e4bd1f23d368695eb9e7b51ef6e02ca0642ea2ab4a52579959826b5e7dce1f9b -F test/schemafault.test 1936bceca55ac82c5efbcc9fc91a1933e45c8d1e1d106b9a7e56c972a5a2a51e -F test/securedel.test 2f70b2449186a1921bd01ec9da407fbfa98c3a7a5521854c300c194b2ff09384 -F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5 -F test/select1.test 009a6d8eacd9684d046302b8d13b50846a87e39d6f08e92178aa13e95ea29a2d -F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56 -F test/select3.test ddd1bc6d0c8dece136321c11bd26d0d8ad17f2b27c72935fdd6574d8cb99d1d4 -F test/select4.test e8a2502e3623f3058871030599a48abb35789d2244d5b380ecf3696873fdd4a4 -F test/select5.test df9ec0d218cedceb4fe7b63262025b547b50a55e59148c6f40b60ca25f1d4546 -F test/select6.test 319d45e414cdd321bf17cfacedaf19e3935ad64dac357c53f1492338c6e9b801 -F test/select7.test f659f231489349e8c5734e610803d7654207318f -F test/select8.test 8c8f5ae43894c891efc5755ed905467d1d67ad5d -F test/select9.test aebc2bb0c3bc44606125033cbcaac2c8d1f33a95 -F test/selectA.test b8a590f6493cad5b0bb4dfe1709bf7dcda0b6c40bb4caf32d1e36a89eebc8fc5 -F test/selectB.test 954e4e49cf1f896d61794e440669e03a27ceea25 -F test/selectC.test e25243f8ca503e06f252eb0218976d07cfeceac3 -F test/selectD.test fc20452847a01775710090383cfb4423275d2f745fed61f34fbf37573ac0d214 -F test/selectE.test a8730ca330fcf40ace158f134f4fe0eb00c7edbf -F test/selectF.test 21c94e6438f76537b72532fa9fd4710cdd455fc3 -F test/selectG.test 089f7d3d7e6db91566f00b036cb353107a2cca6220eb1cb264085a836dae8840 -F test/server1.test c2b00864514a68a0e6fd518659dc95d0050307a357a08969872bef027d785dc4 -F test/session.test 78fa2365e93d3663a6e933f86e7afc395adf18be -F test/sessionfuzz-data1.db 1f8d5def831f19b1c74571037f0d53a588ea49a6c4ca2a028fc0c27ef896dbcb -F test/sessionfuzz.c be9c4d4afd359ce80024d8b541b9b8a880510aef5cf263df56fc0e9b947727f1 -F test/shared.test 1826673eb5eb745fb91a3bdac99a7737057742ae38dcb0fe076a384d6727578b -F test/shared2.test 03eb4a8d372e290107d34b6ce1809919a698e879 -F test/shared3.test ab693f9b6e156b8bfb2a0ad94f29fe69602a5d38 -F test/shared4.test c75f476804e76e26bf6fa0e7b421fb0ca7d07558 -F test/shared6.test 866bb4982c45ce216c61ded5e8fde4e7e2f3ffa9 -F test/shared7.test a81e99f83e6c51b02ac99c96fb3a2a7b5978c956 -F test/shared8.test 933ed7d71f598bb6c7a8c192a3cd30f2562fdccf514df383798599c34ffa672f -F test/shared9.test 5f2a8f79b4d6c7d107a01ffa1ed05ae7e6333e21 -F test/sharedA.test 49d87ec54ab640fbbc3786ee3c01de94aaa482a3a9f834ad3fe92770eb69e281 -F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e -F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939 -F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 -F test/shell1.test a1cf47c5e110560ff25a714570bfd53bfaceeb61db5cad3072a4064f17ebd10e -F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b -F test/shell3.test ac8c2b744014c3e9a0e26bfd829ab65f00923dc1a91ffd044863e9423cc91494 -F test/shell4.test 1c6aef11daaa2d6830acaba3ac9cbec93fbc1c3d5530743a637f39b3987d08ce -F test/shell5.test 84a30b55722a95a5b72989e691c469a999ca7591e7aa00b7fabc783ea5c9a6fe -F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 -F test/shell7.test 115132f66d0463417f408562cc2cf534f6bbc6d83a6d50f0072a9eb171bae97f -F test/shell8.test 96be02ea0c21f05b24c1883d7b711a1fa8525a68ab7b636aacf6057876941013 -F test/shmlock.test 3dbf017d34ab0c60abe6a44e447d3552154bd0c87b41eaf5ceacd408dd13fda5 -F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 -F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5 -F test/shrink.test 1b4330b1fd9e818c04726d45cb28db73087535ce -F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329 -F test/skipscan1.test ed524bc86f27646b3a297f45d6557b55db338977b6838f8064b196b35848b31b -F test/skipscan2.test 3eb703ce794f139e7b83567911046298bcde29606116727f9b700ce34f559d2d -F test/skipscan3.test ec5bab3f81c7038b43450e7b3062e04a198bdbb5 -F test/skipscan5.test 67817a4b6857c47e0e33ba3e506da6f23ef68de2 -F test/skipscan6.test 0b4cd1b4ac9f84d91454df513c99a4932fa07e8f27b8049bea605068b3e34ac7 -F test/snapshot.test a504f2e7009f512ef66c719f0ea1c55a556bdaf1e1312c80a04d46fc1a3e9632 -F test/snapshot2.test 8d6ff5dd9cc503f6e12d408a30409c3f9c653507b24408d9cd7195931c89bc54 -F test/snapshot3.test 8744313270c55f6e18574283553d3c5c5fe4c5970585663613a0e75c151e599b -F test/snapshot4.test d4e9347ef2fcabc491fc893506c7bbaf334da3be111d6eb4f3a97cc623b78322 -F test/snapshot_fault.test f6c5ef7cb93bf92fbb4e864ecc5c87df7d3a250064838822db5b4d3a5563ede4 -F test/snapshot_up.test a0a29c4cf33475fcef07c3f8e64af795e24ab91b4cc68295863402a393cdd41c -F test/soak.test 18944cf21b94a7fe0df02016a6ee1e9632bc4e8d095a0cb49d95e15d5cca2d5c -F test/softheap1.test 843cd84db9891b2d01b9ab64cef3e9020f98d087 -F test/sort.test c2adc635c2564241fefec0b3a68391ef6868fd3b -F test/sort2.test cc23b7c19d684657559e8a55b02f7fcee03851d0 -F test/sort3.test 1480ed7c4c157682542224e05e3b75faf4a149e5 -F test/sort4.test 5c34d9623a4ae5921d956dfa2b70e77ed0fc6e5c -F test/sort5.test 6b43ae0e2169b5ceed441844492e55ba7f1ae0790528395ddf7888ab3094525d -F test/sorterref.test a13ed207a0eea3c7898f308f979bfb518f68c598ec737d2c494dfd3deaa83506 -F test/sortfault.test d4ccf606a0c77498e2beb542764fd9394acb4d66 -F test/speed1.test f2974a91d79f58507ada01864c0e323093065452 -F test/speed1p.explain d841e650a04728b39e6740296b852dccdca9b2cb -F test/speed1p.test b180e98609c7677382cf618c0ec9b69f789033a8 -F test/speed2.test 53177056baf6556dcbdcf032bbdfc41c1aa74ded -F test/speed3.test 694affeb9100526007436334cf7d08f3d74b85ef -F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 -F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa -F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c -F test/speedtest1.c d564e7689a731f691adfe2cf3f3f735d3e11f100eebb065e2a0a267fdc39fb26 -F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e -F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 -F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 -F test/spellfix4.test 51c7c26514ade169855c66bcf130bd5acfb4d7fd090cc624645ab275ae6a41fb -F test/sqldiff1.test 28cd737cf1b0078b1ec1bbf425e674c47785835e -F test/sqllimits1.test 264f4b0f941800ba139d25e33ee919c5d95fea06dfbe8ac291d6811a30984ca5 -F test/sqllog.test 6af6cb0b09f4e44e1917e06ce85be7670302517a -F test/stat.test 423257dc36e5865fb9dd1d9051ac985763b6fba1daec134932f37772d5ed1e64 -F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 -F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 -F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 -F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49 -F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f -F test/subquery2.test 90cf944b9de8204569cf656028391e4af1ccc8c0cc02d4ef38ee3be8de1ffb12 -F test/subselect.test 0966aa8e720224dbd6a5e769a3ec2a723e332303 -F test/substr.test 18f57c4ca8a598805c4d64e304c418734d843c1a -F test/subtype1.test 7fe09496352f97053af1437150751be2d0a0cae8 -F test/superlock.test ec94f0556b6488d97f71c79f9061ae08d9ab8f12 -F test/swarmvtab.test 9a3fd5ab3e9b3c976ad1b3d7646aab725114f2ac26b59395d0778b33bab6cdaf -F test/swarmvtab2.test c948cb2fdfc5b01d85e8f6d6504854202dc1a0782ab2a0ed61538f27cbd0aa5c -F test/swarmvtab3.test 247aa38b6ebd2b99db2075847ae47e789ac34f1c2ab5c720dfcffd990004c544 -F test/swarmvtabfault.test 8a67a9f27c61073a47990829e92bc0c64420a807cb642b15a25f6c788210ed95 -F test/symlink.test 72b22238d4405ba34df8e60b335d290a3b1129fd5c260835c944c1e4e77288a9 -F test/symlink2.test 9531f475a53d8781c4f81373f87faf2e2aff4f5fb2102ec6386e0c827916a670 -F test/sync.test 89539f4973c010eda5638407e71ca7fddbcd8e0594f4c9980229f804d4333092 -F test/sync2.test 8f9f7d4f6d5be8ca8941a8dadcc4299e558cb6a1ff653a9469146c7a76ef2039 -F test/syscall.test a39d9a36f852ae6e4800f861bc2f2e83f68bbc2112d9399931ecfadeabd2d69d -F test/sysfault.test c9f2b0d8d677558f74de750c75e12a5454719d04 -F test/tabfunc01.test 5ca6d004157a3e886a55a9387b960cc0db41acd88753eb597ff409ec6cfb1be0 -F test/table.test eb3463b7add9f16a5bb836badf118cf391b809d09fdccd1f79684600d07ec132 -F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f177f4 -F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 -F test/tclsqlite.test 79a473f5797e317c08f2c4f8192edb3eea6a67329b1087453328b66a7cb31070 -F test/tempdb.test 4cdaa23ddd8acb4d79cbb1b68ccdfd09b0537aaba909ca69a876157c2a2cbd08 -F test/tempdb2.test 353864e96fd3ae2f70773d0ffbf8b1fe48589b02c2ec05013b540879410c3440 -F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900 -F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 -F test/temptable2.test d2940417496e2b9548e01d09990763fbe88c316504033256d51493e1f1a5ce6a -F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637 -F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc -F test/tester.tcl fd9d134a7cc4e31b307ad028a195f51cdcf556fc620d74b680515562f0137f25 -F test/thread001.test b61a29dd87cf669f5f6ac96124a7c97d71b0c80d9012746072055877055cf9ef -F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 -F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7 -F test/thread004.test f51dfc3936184aaf73ee85f315224baad272a87f -F test/thread005.test 50d10b5684399676174bd96c94ad4250b1a2c8b6 -F test/thread1.test df115faa10a4ba1d456e9d4d9ec165016903eae4 -F test/thread2.test f35d2106452b77523b3a2b7d1dcde2e5ee8f9e46 -F test/thread_common.tcl 334639cadcb9f912bf82aa73f49efd5282e6cadd -F test/threadtest1.c 6029d9c5567db28e6dc908a0c63099c3ba6c383b -F test/threadtest2.c a70a8e94bef23339d34226eb9521015ef99f4df8 -F test/threadtest3.c 38a612ea62854349ed66372f330a40d73c5cf956 -F test/threadtest4.c c1e67136ceb6c7ec8184e56ac61db28f96bd2925 -F test/time-wordcount.sh 8e0b0f8109367827ad5d58f5cc849705731e4b90 -F test/tkt-02a8e81d44.test 6c80d9c7514e2a42d4918bf87bf6bc54f379110c -F test/tkt-18458b1a.test 6a62cb1ee50fa3c620da59e3a6f531eb38fceaf7e2166203816b724524e6f1d6 -F test/tkt-26ff0c2d1e.test c15bec890c4d226c0da2f35ff30f9e84c169cfef90e73a8cb5cec11d723dfa96 -F test/tkt-2a5629202f.test 0521bd25658428baa26665aa53ffed9367d33af2 -F test/tkt-2d1a5c67d.test be1326f3061caec85085f4c9ee4490561ca037c0 -F test/tkt-2ea2425d34.test 1cf13e6f75d149b3209a0cb32927a82d3d79fb28 -F test/tkt-31338dca7e.test 6fb8807851964da0d24e942f2e19c7c705b9fb58 -F test/tkt-313723c356.test 4b306ad45c736cedf2f5221f6155b92143244b6d -F test/tkt-385a5b56b9.test 5204a7cba0e28c99df0acbf95af5e1af4d32965a7a14de6eccebf949607618b1 -F test/tkt-38cb5df375.test f3cc8671f1eb604d4ae9cf886ed4366bec656678 -F test/tkt-3998683a16.test 6d1d04d551ed1704eb3396ca87bb9ccc8c5c1eb7 -F test/tkt-3a77c9714e.test 90e3e8455ee945a4076d4c44062b8845708af24a880355328fe7008f2047c9f0 -F test/tkt-3fe897352e.test 27e26eb0f1811aeba4d65aba43a4c52e99da5e70 -F test/tkt-4a03edc4c8.test 91c0e135888cdc3d4eea82406a44b05c8c1648d0 -F test/tkt-4c86b126f2.test cbcc611becd0396890169ab23102dd70048bbc9a -F test/tkt-4dd95f6943.test 3d0ce415d2ee15d3d564121960016b9c7be79407 -F test/tkt-4ef7e3cfca.test 3965ae11cc9cf6e334f9d7d3c1e20bf8d56254b1 -F test/tkt-54844eea3f.test a12b851128f46a695e4e378cca67409b9b8f5894 -F test/tkt-5d863f876e.test 726e76d725f6fe0eb2fc8a522b721b79807380ee -F test/tkt-5e10420e8d.test 904d1687b3c06d43e5b3555bbcf6802e7c0ffd84 -F test/tkt-5ee23731f.test 9db6e1d7209dc0794948b260d6f82b2b1de83a9f -F test/tkt-6bfb98dfc0.test 24780633627b5cfc0635a5500c2389ebfb563336 -F test/tkt-752e1646fc.test ea78d88d14fe9866bdd991c634483334639e13bf -F test/tkt-78e04e52ea.test cb44d0f5e7940223be740a39913a1b9b9b30d7e4a17ed3349141f893bae1b8f2 -F test/tkt-7a31705a7e6.test 9e9c057b6a9497c8f7ba7b16871029414ccf6550e7345d9085d6d71c9a56bb6f -F test/tkt-7bbfb7d442.test 7b2cd79c7a17ae6750e75ec1a7846712a69c9d18 -F test/tkt-80ba201079.test 105a721e6aad0ae3c5946d7615d1e4d03f6145b8 -F test/tkt-80e031a00f.test 9ee36348b761bf7c14261e002b75a4c0d5a04d4c -F test/tkt-8454a207b9.test c583a9f814a82a2b5ba95207f55001c9f0cd816c -F test/tkt-868145d012.test a5f941107ece6a64410ca4755c6329b7eb57a356 -F test/tkt-8c63ff0ec.test 258b7fc8d7e4e1cb5362c7d65c143528b9c4cbed -F test/tkt-91e2e8ba6f.test 08c4f94ae07696b05c9b822da0b4e5337a2f54c5 -F test/tkt-94c04eaadb.test f738c57c7f68ab8be1c054415af7774617cb6223 -F test/tkt-9a8b09f8e6.test b2ef151d0984b2ebf237760dbeaa50724e5a0667 -F test/tkt-9d68c883.test 16f7cb96781ba579bc2e19bb14b4ad609d9774b6 -F test/tkt-9f2eb3abac.test cb6123ac695a08b4454c3792fbe85108f67fabf8 -F test/tkt-a7b7803e.test 159ef554234fa1f9fb318c751b284bd1cf858da4 -F test/tkt-a7debbe0.test e295fa83cd4416a8ca37b354eb5fadefc5e81fb55253db538d35261fe9c95067 -F test/tkt-a8a0d2996a.test 002e1cde8fc30c39611b52cf981c88200b858765748556822da72e0d32fac73e -F test/tkt-b1d3a2e531.test 8f7576e41ca179289ee1a8fee28386fd8e4b0550 -F test/tkt-b351d95f9.test d14a503c414c5c58fdde3e80f9a3cfef986498c0 -F test/tkt-b72787b1.test a95e8cdad0b98af1853ac7f0afd4ab27b77bf5f3 -F test/tkt-b75a9ca6b0.test ade89229d853a67a21bbd5e6e1e787a8f9d21f19908d1b7fca6bf3d4d5aa0767 -F test/tkt-ba7cbfaedc.test b4c0deccc12aeb55cfdb57935b16b5d67c5a9877 -F test/tkt-bd484a090c.test 60460bf946f79a79712b71f202eda501ca99b898 -F test/tkt-bdc6bbbb38.test fc38bb09bdd440e3513a1f5f98fc60a075182d7d -F test/tkt-c48d99d690.test ba61977d62ab612fc515b3c488a6fbd6464a2447 -F test/tkt-c694113d5.test 82c461924ada5c14866c47e85535b0b0923ba16a2e907e370061a5ca77f65d77 -F test/tkt-cbd054fa6b.test 708475ef4d730a6853512c8ce363bcbd3becf0e26826e1f4cd46e2f52ff38edf -F test/tkt-d11f09d36e.test d999b548fef885d1d1afa49a0e8544ecf436869d -F test/tkt-d635236375.test 9d37e988b47d87505bc9445be0ca447002df5d09 -F test/tkt-d82e3f3721.test bcc0dfba658d15bab30fd4a9320c9e35d214ce30 -F test/tkt-f3e5abed55.test d5a0126118142d13e27f6ce9f4c47096e9321c00 -F test/tkt-f67b41381a.test a23bc124c981662db712167bacd0ed8ad11abac9 -F test/tkt-f777251dc7a.test d1a8fc3eefb7a9e64d19ff24d5c8c94c34a632fb -F test/tkt-f7b4edec.test d998a08ff2b18b7f62edce8e3044317c45efe6c7 -F test/tkt-f973c7ac31.test 28ef85c7f015477916795246d8286aeda39d4ead -F test/tkt-fa7bf5ec.test 9102dfea58aa371d78969da735f9392c57e2e035 -F test/tkt-fc62af4523.test 72825d3febdedcd5593a27989fc05accdbfc2bb4 -F test/tkt-fc7bd6358f.test 634bb4af7d661e82d6b61b80c86727bad698e08f -F test/tkt1435.test f8c52c41de6e5ca02f1845f3a46e18e25cadac00 -F test/tkt1443.test bacc311da5c96a227bf8c167e77a30c99f8e8368 -F test/tkt1444.test a9d72f9e942708bd82dde6c707da61c489e213e9 -F test/tkt1449.test 93584a449752d52b07d2cfc280a69842b6e16ed5 -F test/tkt1473.test 9d000af3e11a4450d4c596f5e58b4b0d24eb0f8b -F test/tkt1501.test 2064f98e00871848af4b2f517e46c1a7fb2e32db -F test/tkt1512.test a1df1f66caf0b9122d6220c15dcee230298c2c2f -F test/tkt1514.test ddef38e34fea72eb1ab935ded9f17a3fb71dd9df -F test/tkt1536.test 83ff7a7b6e248016f8d682d4f7a4ae114070d466 -F test/tkt1537.test e3a14332de9770be8ff14bd15c19a49cbec10808 -F test/tkt1567.test 52f329386ac77e59260d4af1c58490d61377db20 -F test/tkt1644.test 80b6a2bb17885f3cf1cb886d97cdad13232bb869 -F test/tkt1667.test 4700d931ed19ea3983e8e703becb28079250b460 -F test/tkt1873.test 0e1b8c023050a430c2525179ed4022ddc7c31264 -F test/tkt2141.test f543d96f50d5a5dc0bc744f7db74ea166720ce46 -F test/tkt2192.test ff40157e5f42e65f844255d220fc6b290470942f -F test/tkt2213.test a9702175601a57b61aba095a233b001d6f362474 -F test/tkt2251.test 5aab8c7898cd2df2a68fe19289cc29e8f5cf8c82 -F test/tkt2285.test cca17be61cf600b397188e77e7143844d2b977e9 -F test/tkt2332.test fc955609b958ca86dfa102832243370a0cc84070 -F test/tkt2339.test 73bd17818924cd2ac442e5fd9916b58565739450 -F test/tkt2391.test ab7a11be7402da8b51a5be603425367aa0684567 -F test/tkt2409.test be0d60e7d283f639dccea4b0b5e1cd3a4851fb5b -F test/tkt2450.test 77ed94863f2049c1420288ddfea2d41e5e0971d6 -F test/tkt2565.test 8be666e927cb207aae88188f31c331870878b650 -F test/tkt2640.test 28134f5d1e05658ef182520cf0b680fa3de5211b -F test/tkt2643.test 3f3ebb743da00d4fed4fcf6daed92a0e18e57813 -F test/tkt2686.test 6ee01c9b9e9c48f6d3a1fdd553b1cc4258f903d6 -F test/tkt2767.test 569000d842678f9cf2db7e0d1b27cbc9011381b0 -F test/tkt2817.test f31839e01f4243cff7399ef654d3af3558cb8d8d -F test/tkt2820.test 39940276b3436d125deb7d8ebeee053e4cf13213 -F test/tkt2822.test f391776423a7c0d0949edfce375708bfb0f3141e -F test/tkt2832.test a9b0b74a02dca166a04d9e37739c414b10929caa -F test/tkt2854.test e432965db29e27e16f539b2ba7f502eb2ccc49af -F test/tkt2920.test a8737380e4ae6424e00c0273dc12775704efbebf -F test/tkt2927.test 4752868b9eeeb07a217f7f19f4cbaac98d6d086d -F test/tkt2942.test c5c87d179799ca6d1fbe83c815510b87cd5ec7ce -F test/tkt3080.test 1bca7579260920a66b4dd7e196e807c0f25ff804 -F test/tkt3093.test fbdbc5b4969244ad11f540759003e361fcaf391f -F test/tkt3121.test 536df66a02838c26a12fe98639354ca1290ca68b -F test/tkt3201.test f1500ccecc0d578dc4cde7d3242008297c4d59b3 -F test/tkt3292.test 7bad4423cf5eb075dbb58511d66d46fe816744754c9f0050ae60157f71a4fca7 -F test/tkt3298.test 20fd8773b825cb602e033aa04f8602e1ebdcd93c -F test/tkt3334.test 9756631e3c4aa3c416362c279e3c0953a83b7ca8274cb81a13264bb56296d8b0 -F test/tkt3346.test 6f67c3ed7db94dfc5df4f5f0b63809a1f611e01a -F test/tkt3357.test 77c37c6482b526fe89941ce951c22d011f5922ed -F test/tkt3419.test 1bbf36d7ea03b638c15804251287c2391f5c1f6b -F test/tkt3424.test 61f831bd2b071bd128fa5d00fbda57e656ca5812 -F test/tkt3442.test a1fc47c669e651d16494de3ff349bcb53281456f2ca02c8bc14220b6044bbfe8 -F test/tkt3457.test 5651e2cbb94645b677ec663160b9e192b87b7d365aecdfb24e19f749575a6fc2 -F test/tkt3461.test 228ea328a5a21e8663f80ee3d212a6ad92549a19 -F test/tkt3493.test 1686cbde85f8721fc1bdc0ee72f2ef2f63139218 -F test/tkt3508.test d75704db9501625c7f7deec119fcaf1696aefb7d -F test/tkt3522.test 22ce2ebbcb04a6be56c0977d405c207967318fd6 -F test/tkt3527.test 1a6a48441b560bdc53aec581a868eb576234874d -F test/tkt3541.test 5dc257bde9bc833ab9cc6844bf170b998dbb950a -F test/tkt3554.test f599967f279077bace39220cbe76085c7b423725 -F test/tkt3581.test 1966b7193f1e3f14951cce8c66907ae69454e9a3 -F test/tkt35xx.test f38c1b03713179d414969187c941466e44945b35 -F test/tkt3630.test 9a934c58c259f89a0ae6bb6bb846c56285a6fd0f -F test/tkt3718.test 3b59dcb5c4e7754dacd91e7fd353a61492cc402a -F test/tkt3731.test 0c5f4cbffe102d43c3b2188af91a9e36348f974b -F test/tkt3757.test 10cd679a88675c880533083fc79ac04324525595 -F test/tkt3761.test b95ea9c98f21cf91325f18a984887e62caceab33 -F test/tkt3762.test 4d439ff7abdc8d9323150269d182c37c2d514576 -F test/tkt3773.test 7bca904d2a647a6a4a291bd86d7fd7c73855b789 -F test/tkt3791.test a6624b9a80b216a26cf473607f42f3e51898c267 -F test/tkt3793.test d90ffd75c52413908d15e1c44fc2ea9c80fcc449 -F test/tkt3810.test 09608d81c63a6ff3aaf7bc70717909c51f5f4048 -F test/tkt3824.test 150aa00bb6220672e5f0eb14dc8eaa36750425f0 -F test/tkt3832.test 2300d10d57562b89875b72148338ac3e14f8847d -F test/tkt3838.test 292e72489101cd1320d7278dc111c173ebf334d4 -F test/tkt3841.test 4659845bc53f809a5932c61c6ce8c5bb9d6b947f -F test/tkt3871.test d921703d07c68f4fd5312073215a17fa34b0401d -F test/tkt3879.test 2ad5bef2c87e9991ce941e054c31abe26ef7fb90 -F test/tkt3911.test 74cd324f3ba653040cc6d94cc4857b290d12d633 -F test/tkt3918.test ea78bf164e4d55cbde0d83c671ef6fbe930a0032 -F test/tkt3922.test f26be40ab4fe6c00795629bd2006d96e270d9b1a -F test/tkt3929.test cdf67acf5aa936ec4ffead81db87f8a71fe40e59 -F test/tkt3935.test e15261fedb9e30a4305a311da614a5d8e693c767 -F test/tkt3992.test f3e7d548ac26f763b47bc0f750da3d03c81071da -F test/tkt3997.test a335fa41ca3985660a139df7b734a26ef53284bd -F test/tkt4018.test 18dbc6617f7a4b90e938d1bd6d26ad18daafaf08 -F test/tokenize.test ce430a7aed48fc98301611429595883fdfcab5d7 -F test/tpch01.test 7c4eb8cdd79c568f46d344b3e789c9fdb8a766d112871352704861f3fca32a2a -F test/trace.test a659a9862957f4789e37a92b3bf6d2caf5c86b02cdeefc41e850ae53acf6992a -F test/trace2.test f5cb67ad3bc09e0c58e8cca78dfd0b5639259983 -F test/trace3.test 1dff966888773ff1bfea01c080caf15417892b3f998408fe920c4791f7337144 -F test/trans.test 6e1b4c6a42dba31bd65f8fa5e61a2708e08ddde6 -F test/trans2.test 62bd045bfc7a1c14c5ba83ba64d21ade31583f76 -F test/trans3.test 91a100e5412b488e22a655fe423a14c26403ab94 -F test/transitive1.test 293300f46916569f08875cdb2fe2134be2c27677 -F test/trigger1.test d30cd09ae8ac365a088f09daba583cc5c0b8fc7d4e1d70809d0b4be3bf6ae2ab -F test/trigger2.test d15da46f7012832faf3e0c536b47024409d5fb1722d2bb77e29c06d96d704bb1 -F test/trigger3.test aa640bb2bbb03edd5ff69c055117ea088f121945 -F test/trigger4.test 74700b76ebf3947b2f7a92405141eb2cf2a5d359 -F test/trigger5.test 619391a3e9fc194081d22cefd830d811e7badf83 -F test/trigger6.test 0e411654f122552da6590f0b4e6f781048a4a9b9 -F test/trigger7.test e7ce54bfda67a88d778aea42544e151c465547a7e617127b6914c2221a6d53c1 -F test/trigger8.test 30cb0530bd7c4728055420e3f739aa00412eafa4 -F test/trigger9.test 2226ec795a33b0460ab5cf8891e9054cc7edef41 -F test/triggerA.test 837be862d8721f903dba3f3ceff05b32e0bee5214cf6ea3da5fadf12d3650e9d -F test/triggerB.test 56780c031b454abac2340dbb3b71ac5c56c3d7fe -F test/triggerC.test 29f5a28d0fe39e6e2c01f6e1f53f08c0955170ae10a63ad023e33cb0a1682a51 -F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650 -F test/triggerE.test ede2e4bce4ba802337bd69d39447fa04a938e06d84a8bfc53c76850fc36ed86d -F test/triggerF.test 5d76f0a8c428ff87a4d5ed52da06f6096a2c787a1e21b846111dfac4123de3ad -F test/triggerG.test 2b816093c91ba73c733cfa8aedcc210ad819d72a98b1da30768a3c56505233e9 -F test/trustschema1.test 4e970aef0bfe0cee139703cc7209d0e0f07725d999b180ba50770f49edef1494 -F test/tt3_checkpoint.c 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1 -F test/tt3_index.c 39eec10a35f57672225be4d182862152896dee4a -F test/tt3_lookaside1.c 0377e202c3c2a50d688cb65ba203afeda6fafeb9 -F test/tt3_stress.c c57d804716165811d979d4a719e05baccd79277f -F test/tt3_vacuum.c 1753f45917699c9c1f66b64c717a717c9379f776 -F test/types.test bf816ce73c7dfcfe26b700c19f97ef4050d194ff -F test/types2.test 1aeb81976841a91eef292723649b5c4fe3bc3cac -F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a -F test/unionvtab.test e1704ab1b4c1bb3ffc9da4681f8e85a0b909fd80b937984fc94b27415ac8e5a4 -F test/unionvtabfault.test e8759f3d14fb938ce9657e2342db34aeac0fb9bc1692b0d1ebb0069630151d06 -F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 -F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2 -F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97 -F test/unordered.test ffeea7747d5ba962a8009a20b7e53d68cbae05b063604c68702c5998eb50c981 -F test/update.test e906ca7cb1dc6f52af1ea243e08f727edfa79f924c2691f2f9e72481f847310d -F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 -F test/upsert1.test 88f9e258c6a0eeeb85937b08831e8daad440ba41f125af48439e9d33f266fb18 -F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09 -F test/upsert3.test 88d7d590a1948a9cb6eac1b54b0642f67a9f35a1fc0f19b200e97d5d39e3179c -F test/upsert4.test 25d2a1da92f149331ae0c51ca6e3eee78189577585eab92de149900d62994fa5 -F test/upsertfault.test f21ca47740841fdb4d61acfa7b17646d773e67724fe8c185b71c018db8a94b35 -F test/uri.test 3481026f00ade6dfe8adb7acb6e1e47b04369568 -F test/uri2.test 9d3ba7a53ee167572d53a298ee4a5d38ec4a8fb7 -F test/userauth01.test e740a2697a7b40d7c5003a7d7edaee16acd349a9 -F test/utf16align.test 54cd35a27c005a9b6e7815d887718780b6a462ae -F test/vacuum-into.test 48f4cec354fb6f27c98ef58d2fe49a11b71ff131af0cd9140efacc9858b9f670 -F test/vacuum.test ce91c39f7f91a4273bf620efad21086b5aa6ef1d -F test/vacuum2.test aa048abee196c16c9ba308465494009057b79f9b -F test/vacuum3.test 77ecdd54592b45a0bcb133339f99f1ae0ae94d0d -F test/vacuum4.test 7ea76b769fffeb41f925303b04cbcf5a5bbeabe55e4c60ae754ff24eeeb7c010 -F test/vacuum5.test 263b144d537e92ad8e9ca8a73cc6e1583f41cfd0dda9432b87f7806174a2f48c -F test/vacuummem.test 7b42abb3208bd82dd23a7536588396f295a314f2 -F test/varint.test bbce22cda8fc4d135bcc2b589574be8410614e62 -F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 -F test/view.test 10ea54300a097d7c0337fd104abffe4a4786d1598b94017a37efe0e0d3e04dd5 -F test/vtab1.test c5d9e90ed02bcacd776dcbb7360199d290f7f53c26b484ddece543060c54319f -F test/vtab2.test 14d4ab26cee13ba6cf5c5601b158e4f57552d3b055cdd9406cf7f711e9c84082 -F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e -F test/vtab4.test 8e73ed268f3d596bc3590f45fc948fb40f28e9c3 -F test/vtab5.test 889f444970393c73f1e077e2bdc5d845e157a391 -F test/vtab6.test 8e789f526e6594cf7ae933d1adee0caa87dc9f78 -F test/vtab7.test 70c6f4a1d6177144a8236e4172d5fba92e683440374664ad1f04851fbb335d3c -F test/vtab8.test e19fa4a538fcd1bb66c22825fa8f71618fb13583 -F test/vtab9.test ea58d2b95d61955f87226381716b2d0b1d4e4f9b -F test/vtabA.test 1317f06a03597eee29f40a49b6c21e1aaba4285f -F test/vtabB.test 04df5dc531b9f44d9ca65b9c1b79f12b5922a796 -F test/vtabC.test 4528f459a13136f982e75614d120aef165f17292 -F test/vtabD.test 05b3f1d77117271671089e48719524b676842e96 -F test/vtabE.test 2a143fe75a11275781d1fd1988d86b66a3f69cb98f4add62e3da8fd0f637b45f -F test/vtabF.test 1918844c7c902f6a16c8dacf1ec8f84886d6e78b -F test/vtabH.test 2efb5a24b0bb50796b21eca23032cfb77abfa4b0c03938e38ce5897abac404ca -F test/vtabI.test 751b07636700dbdea328e4265b6077ccd6811a3f -F test/vtabJ.test d7b73675708cf63cfcb9d443bb451fc01a028347275b7311e51f9fdf3ca6757f -F test/vtab_alter.test 736e66fb5ec7b4fee58229aa3ada2f27ec58bc58c00edae4836890c3784c6783 -F test/vtab_err.test dcc8b7b9cb67522b3fe7a272c73856829dae4ab7fdb30399aea1b6981bda2b65 -F test/vtab_shared.test 5253bff2355a9a3f014c15337da7e177ab0ef8ad -F test/vtabdrop.test 65d4cf6722972e5499bdaf0c0d70ee3b8133944a4e4bc31862563f32a7edca12 -F test/wal.test 16180bc4becda176428ad02eaea437b4b8f5ae099314de443a4e12b2dcc007a2 -F test/wal2.test 537f59e5c5932e3b45bf3591ae3e48a2601360c2e52821b633e222fe6ebd5b09 -F test/wal3.test 2a93004bc0fb2b5c29888964024695bade278ab2 -F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c -F test/wal5.test 9c11da7aeccd83a46d79a556ad11a18d3cb15aa9 -F test/wal6.test b602704e4b066199bc89d91ca9000f335dcf4572 -F test/wal64k.test 2a525c0f45d709bae3765c71045ccec5df7d100ccbd3a7860fdba46c9addb965 -F test/wal7.test 2ae8f427d240099cc4b2dfef63cff44e2a68a1bd -F test/wal8.test d9df3fba4caad5854ed69ed673c68482514203c8 -F test/wal9.test 378e76a9ad09cd9bee06c172ad3547b0129a6750 -F test/wal_common.tcl a98f17fba96206122eff624db0ab13ec377be4fe -F test/walbak.test 018d4e5a3d45c6298d11b99f09a8ef6876527946 -F test/walbig.test f437473a16cfb314867c6b5d1dbcd519e73e3434 -F test/walblock.test be48f3a75eff0b4456209f26b3ce186c2015497d -F test/walcksum.test bb234a1bb42248b3515d992b719708015c384278 -F test/walcrash.test 21038858cc552077b0522f50b0fa87e38139306a -F test/walcrash2.test a0edab4e5390f03b99a790de89aad15d6ec70b36 -F test/walcrash3.test e426aa58122d20f2b9fbe9a507f9eb8cab85b8af -F test/walcrash4.test e7b6e7639a950a0cca8e210e248c8dad4d63bf20 -F test/walfault.test 09b8ad7e52d2f54bce50e31aa7ea51412bb9f70ac13c74e669ddcd8b48b0d98d -F test/walfault2.test e039ac66c78d5561683cacde04097213cdad3b58e2b3f3fe1112862217bfd915 -F test/walhook.test ed00a40ba7255da22d6b66433ab61fab16a63483 -F test/walmode.test cd6e7cff618eaaa5910ce57c3657aa50110397f86213886a2400afb9bfec7b7b -F test/walnoshm.test 84ca10c544632a756467336b7c3b864d493ee496 -F test/waloverwrite.test dad2f26567f1b45174e54fbf9a8dc1cb876a7f03 -F test/walpersist.test 8c6b7e3ec1ba91b5e4dc4e0921d6d3f87cd356a6 -F test/walprotocol.test a112aba0b79e3adeaa485fed09484b32c654e97df58e454aa8489ac2cd57bf84 -F test/walprotocol2.test 7d3b6b4bf0b12f8007121b1e6ef714bc99101fb3b48e46371df1db868eebc131 -F test/walro.test cb438d05ba0d191f10b688e39c4f0cd5b71569a1d1f4440e5bdf3c6880e08c20 -F test/walro2.test 0e79dd15cbdb4f482c01ea248373669c732414a726b357d04846a816afafb768 -F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cfd51af68 -F test/walsetlk.test 11f7fe792fdce54cf09874dab824e0627f2eedecfb9f7983e325606ec5184e0c -F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 -F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f -F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 -F test/walvfs.test ca81c9f427e0e5434076dfa948fd1d8e6d5ddd192b2fb6991635d81da5f3f5d4 -F test/wapp.tcl b440cd8cf57953d3a49e7ee81e6a18f18efdaf113b69f7d8482b0710a64566ec -F test/wapptest.tcl 3cca775aede0591756a1fc0da55bbb3715d8c363873fd2cfdd4d555b0a4af57d x -F test/where.test 19c709c9f0f6ed12c23f909f6592aa55fba34269d5a2898537aa27a22b9ce650 -F test/where2.test 478d2170637b9211f593120648858593bf2445a1 -F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c -F test/where4.test 4a371bfcc607f41d233701bdec33ac2972908ba8 -F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2 -F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b -F test/where7.test 75722434c486ac9e74718caa6cce234f45ba34c0b6c0f9555b29eb8bb5f6ade1 -F test/where8.test 461ca40265ed996a6305da99bb024b0e41602bb586acf544c08f95922358e49f -F test/where9.test 8e3e0ff42cc17156f52361a1c012281550d0d632912fec92d1d6df74db7a8e6d -F test/whereA.test 6c6a420ca7d313242f9b1bd471dc80e4d0f8323700ba9c78df0bb843d4daa3b4 -F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5 -F test/whereC.test cae295158703cb3fc23bf1a108a9ab730efff0f6 -F test/whereD.test c1c335e914e28b122e000e9310f02d2be83e1c9dbca2e29f46bd732703944d1b -F test/whereE.test b3a055eef928c992b0a33198a7b8dc10eea5ad2f -F test/whereF.test 3d9412b1199d3e2bed34fcb76b4c48d0bf4df95d27e3f8dd27b6f8b4716d0d89 -F test/whereG.test c9378b285828754377ef47fbece7264018c0a3743e7eb686e89917bb9df10885 -F test/whereH.test e4b07f7a3c2f5d31195cd33710054c78667573b2 -F test/whereI.test a2874062140ed4aba9ffae76e6190a3df6fc73d1373fdfa8fd632945082a5364 -F test/whereJ.test 88287550f6ee604422403b053455b1ad894eeaa5c35d348532dfa1439286cb9a -F test/whereK.test f8e3cf26a8513ecc7f514f54df9f0572c046c42b -F test/whereL.test e05cedc9389c6f09ad55bd5999a3fddccebec90672fb989433c145dcdaf26996 -F test/wherefault.test 1374c3aa198388925246475f84ad4cd5f9528864 -F test/wherelfault.test 9012e4ef5259058b771606616bd007af5d154e64cc25fa9fd4170f6411db44e3 -F test/wherelimit.test 592081800806d297dd7449b1030c863d2883d6d42901837ccd2e5a9bd962edb0 -F test/wherelimit2.test 9bf0aa56cca40ea0e4c5e2915341355a2bbc0859ec4ce1589197fe2a9d94635f -F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2aeee74 -F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 -F test/win32longpath.test 4baffc3acb2e5188a5e3a895b2b543ed09e62f7c72d713c1feebf76222fe9976 -F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 486f0e01310fc7d98e626cdcb3806582c17cb0afaf1f3ec0f58ba8619c38f5ae -F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 -F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c -F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 -F test/window3.test e9959a993c8a71e96433be8daaa1827d78b8921e4f12debd7bdbeb3c856ef3cb -F test/window4.tcl 6f85307eb67242b654d051f7da32a996a66aee039a09c5ae358541aa61720742 -F test/window4.test fbead87f681400ac07ef3555e0488b544a47d35491f8bf09a7474b6f76ce9b4e -F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652821e -F test/window6.test f8d674254b23289cc17c84d79dec7eda7caa1dfb7836c43122cfdf3640d1df32 -F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d76108f -F test/window7.test 1d31276961ae7801edc72173edaf7593e3cbc79c06d1f1f09e20d8418af403cd -F test/window8.tcl f2711aa3571e4e6b0dad98db8d95fd6cb8d9db0c92bbdf535f153b07606a1ce2 -F test/window8.test c4331b27a6f66d69fa8f8bab10cc731db1a81d293ae108a68f7c3487fa94e65b -F test/window9.test 4d8c875b73febdbac9b8f2b52ec132b98f48261cdafd6b08db62bc6d8ff913fc -F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be -F test/windowB.test 7a983ea1cc1cf72be7f378e4b32f6cb2d73014c5cd8b25aaee825164cd4269e5 -F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 -F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b -F test/windowfault.test 72375ae71031eabf96bc88d0af128c8628a091ddc99b5a394e848b3df5fc17ad -F test/with1.test 584580a5ae79868a91873863f8cb2d00040006dc1e4c332ef1d8642f2815dc6e -F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab -F test/with3.test 13b3336739da648a9e4dfa11bb04e73a920c97620041007c5f75d5d14084c346 -F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 -F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 -F test/without_rowid1.test 9cfb83705c506e3849fa7efc88a3c9a15f9a50bf9b1516b41757a7cef9bba8c3 -F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 -F test/without_rowid3.test f8e6b9f7cb32a3570bab743dd4f28d2000e2107808d57585e776f5c3eb076241 -F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a -F test/without_rowid5.test 89b1c587bd92a0590e440da33e7666bf4891572a -F test/without_rowid6.test 8463b20098e9f75a501a9f17dfb42fffc79068eac0b2775fe56ef2281d2df45e -F test/without_rowid7.test d7c59a93d726b55812d620f8f284e01904a5b85f9ee9eea8f2f68571a5e8c40e -F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912adec66 -F test/writecrash.test f1da7f7adfe8d7f09ea79b42e5ca6dcc41102f27f8e334ad71539501ddd910cc -F test/zeroblob.test 07a5b11ab591d1f26c626945fb7f228f68b993533b2ada77273edf6ee29db174 -F test/zerodamage.test 9c41628db7e8d9e8a0181e59ea5f189df311a9f6ce99cc376dc461f66db6f8dc -F test/zipfile.test 429cb81c518487fa1b644b6b04b6e9af704a4fa767bd1a110204c5f03b2e8616 -F test/zipfile2.test 9903388a602a3834189857a985106ff95c3bba6a3969e0134127df991889db5d -F test/zipfilefault.test 44d4d7a7f7cca7521d569d7f71026b241d65a6b1757aa409c1a168827edbbc2c -F tool/GetFile.cs 47852aa0d806fe47ed1ac5138bdce7f000fe87aaa7f28107d0cb1e26682aeb44 -F tool/GetTclKit.bat 8995df40c4209808b31f24de0b58f90930239a234f7591e3675d45bfbb990c5d -F tool/Replace.cs 02c67258801c2fb5f63231e0ac0f220b4b36ba91 -F tool/build-all-msvc.bat c12328d06c45fec8baada5949e3d5af54bf8c887 x -F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367 -F tool/cg_anno.tcl c1f875f5a4c9caca3d59937b16aff716f8b1883935f1b4c9ae23124705bc8099 x -F tool/checkSpacing.c 810e51703529a204fc4e1eb060e9ab663e3c06d2 -F tool/dbhash.c 19560c9a2aa2b269b6a5108259b93d26d12f8f0877c31fe9f8f61dfbd219ba63 -F tool/dbtotxt.c b2221864a20fb391c46bd31bc1fbdc4a96f5c8a89bef58f421eb9b9c36b1702c -F tool/dbtotxt.md c9a57af8739957ef36d2cfad5c4b1443ff3688ed33e4901ee200c8b651f43f3c -F tool/extract-sqlite3h.tcl 069ceab0cee26cba99952bfa08c0b23e35941c837acabe143f0c355d96c9e2eb x -F tool/extract.c 054069d81b095fbdc189a6f5d4466e40380505e2 -F tool/fast_vacuum.c 5ba0d6f5963a0a63bdc42840f678bad75b2ebce1 -F tool/fragck.tcl 5265a95126abcf6ab357f7efa544787e5963f439 -F tool/fuzzershell.c e1d90a03ca790d7c331c2aae08ca46ff435f1ae1faa6cb9cc48f4687c18fdc6e -F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4 -F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a5a4f -F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce -F tool/index_usage.c 9ec344d29cbeb03fdc0fce668eedfb7495792170de933adf95cf8d6904a166ad -F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f -F tool/lemon.c a361b85fa230560b783006ac002a6a8bad214c3b9d7fa48980aecc2b691ddcad -F tool/lempar.c e8899b28488f060d0ff931539ea6311b16b22dce068c086c788a06d5e8d01ab7 -F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 -F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 -F tool/logest.c 11346aa019e2e77a00902aa7d0cabd27bd2e8cca -F tool/max-limits.c cbb635fbb37ae4d05f240bfb5b5270bb63c54439 -F tool/mkautoconfamal.sh 422fc365358a2e92876ffc62971a0ff28ed472fc8bcf9de0df921c736fdeca5e -F tool/mkccode.tcl 86463e68ce9c15d3041610fedd285ce32a5cf7a58fc88b3202b8b76837650dbe x -F tool/mkctimec.tcl dd183b73ae1c28249669741c250525f0407e579a70482371668fd5f130d9feb3 -F tool/mkkeywordhash.c 11a3f3af8e787d0c5ca459ed66fe80fd09e661876506e7b978ec08c19477bdc2 -F tool/mkmsvcmin.tcl 6ecab9fe22c2c8de4d82d4c46797bda3d2deac8e763885f5a38d0c44a895ab33 -F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c -F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 -F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa -F tool/mkpragmatab.tcl d348a4bf71ac068bddf89326562071cbbd962273d88f9b5e5d622f3e73b78bdf -F tool/mkshellc.tcl 70a9978e363b0f3280ca9ce1c46d72563ff479c1930a12a7375e3881b7325712 -F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 -F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 -F tool/mksqlite3c-noext.tcl 4f7cfef5152b0c91920355cbfc1d608a4ad242cb819f1aea07f6d0274f584a7f -F tool/mksqlite3c.tcl 3ab95bcf7b765f9d6d99cbeb8c4f150b38b0bb1f001ffac688f2ad02ebce2123 -F tool/mksqlite3h.tcl 080873e3856eceb9d289a08a00c4b30f875ea3feadcbece796bd509b1532792c -F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b -F tool/mkvsix.tcl b9e0777a213c23156b6542842c238479e496ebf5 -F tool/offsets.c fe4262fdfa378e8f5499a42136d17bf3b98f6091 -F tool/omittest.tcl 6616fbf384f0f630113eab27d41d4530435dd94e2883307759988b45f0604a3b -F tool/opcodesum.tcl 740ed206ba8c5040018988129abbf3089a0ccf4a -F tool/pagesig.c ff0ca355fd3c2398e933da5e22439bbff89b803b -F tool/replace.tcl 60f91e8dd06ab81f74d213ecbd9c9945f32ac048 -F tool/restore_jrnl.tcl 6957a34f8f1f0f8285e07536225ec3b292a9024a -F tool/rollback-test.c 9fc98427d1e23e84429d7e6d07d9094fbdec65a5 -F tool/run-speed-test.sh f95d19fd669b68c4c38b6b475242841d47c66076 -F tool/showdb.c 9b2dbb4b7a00afaf8fc1719f0d775775effa5b135ac1a2c23f1c3f5d670c4e15 -F tool/showjournal.c 5bad7ae8784a43d2b270d953060423b8bd480818 -F tool/showlocks.c 9920bcc64f58378ff1118caead34147201f48c68 -F tool/showshm.c a0ab6ec32dd1f11218ca2a4018f8fb875b59414801ab8ceed8b2e69b7b45a809 -F tool/showstat4.c 0682ebea7abf4d3657f53c4a243f2e7eab48eab344ed36a94bb75dcd19a5c2a1 -F tool/showwal.c ad9d768f96ca6199ad3a8c9562d679680bd032dd01204ea3e5ea6fb931d81847 -F tool/soak1.tcl 8d407956e1a45b485a8e072470a3e629a27037fe -F tool/spaceanal.tcl c161d838825d0242317c7cc13b1eb2126f8cec031950ef31114d42732cb2674e -F tool/speed-check.sh 2b042d703a9472f08c3b13be27afac658426f8e4fc87cd2d575953fda86f08d1 -F tool/speedtest.tcl 06c76698485ccf597b9e7dbb1ac70706eb873355 -F tool/speedtest16.c ecb6542862151c3e6509bbc00509b234562ae81e -F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff -F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 -F tool/speedtest8inst1.c 7ce07da76b5e745783e703a834417d725b7d45fd -F tool/split-sqlite3c.tcl 3efcd4240b738f6bb2b5af0aea7e1e0ef9bc1c61654f645076cec883030b710c -F tool/sqldiff.c 7b9b7238284f02131dbb8f21a4e862409bff728045c5473139d28c67ac87580e -F tool/sqlite3_analyzer.c.in 7eeaae8b0d7577662acaabbb11107af0659d1b41bc1dfdd4d91422de27127968 -F tool/sqltclsh.c.in 1bcc2e9da58fadf17b0bf6a50e68c1159e602ce057210b655d50bad5aaaef898 -F tool/sqltclsh.tcl 862f4cf1418df5e1315b5db3b5ebe88969e2a784525af5fbf9596592f14ed848 -F tool/srcck1.c 371de5363b70154012955544f86fdee8f6e5326f -F tool/stack_usage.tcl f8e71b92cdb099a147dad572375595eae55eca43 -F tool/symbols-mingw.sh 4dbcea7e74768305384c9fd2ed2b41bbf9f0414d -F tool/symbols.sh 1612bd947750e21e7b47befad5f6b3825b06cce0705441f903bf35ced65ae9b9 -F tool/varint.c 5d94cb5003db9dbbcbcc5df08d66f16071aee003 -F tool/vdbe-compress.tcl 5926c71f9c12d2ab73ef35c29376e756eb68361c -F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f -F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 -F tool/warnings.sh 09311479bdc290e20ec8e35a3d1b14b096bbd96222277cfd6274c3a99b3d012f -F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -F vsixtest/App.xaml b76d3b48860e7454775c47ea38ffea9c4abe3e85 -F vsixtest/App.xaml.cpp c465147f50871165c60ca16955219f6c5812d6d8 -F vsixtest/App.xaml.h 4a9768e2983d05600ad1e1c2f1b00a132967da9f -F vsixtest/Assets/LockScreenLogo.scale-200.png e820c9a3deb909197081b0bf3216c06e13905f0a -F vsixtest/Assets/SplashScreen.scale-200.png cab70988ca71bebec7bfeb3b6dbafe17b9ab0b4a -F vsixtest/Assets/Square150x150Logo.scale-200.png e17b40817db7a239fc239d83efcc951fb824e3ff -F vsixtest/Assets/Square44x44Logo.scale-200.png 2f166237094dea94d952d10b9eeae81806844f1c -F vsixtest/Assets/Square44x44Logo.targetsize-24_altform-unplated.png 5f6a6d391b95a3061ccca6e6fdd6955ede63b4ed -F vsixtest/Assets/StoreLogo.png 0828b7257db74a4ecd5eeb6b7b4971f0fdc4d9d1 -F vsixtest/Assets/Wide310x150Logo.scale-200.png 04ddefe5bc5f43ae12a7433f6f236ddab101ac42 -F vsixtest/MainPage.xaml 34f49897e3ca533a7e74506ba0759b66eebce151 -F vsixtest/MainPage.xaml.cpp 7f31fc6de751b64676c0924c97a5485d950a91d7 -F vsixtest/MainPage.xaml.h cc05cca10d50a003f6c6e4448b701cdd07f52f29 -F vsixtest/Package.appxmanifest 6b6db1eb7df3a315c5d681059754d5f0e0c47a93 -F vsixtest/pch.cpp cb823cfac36f1a39a7eb0acbd7e9a0b0de8f23af -F vsixtest/pch.h 9cab7980f2ac4baa40807d8b5e52af32a21cf78c -F vsixtest/vsixtest.sln 77cadbe4e96c1fe1bf51cd77de9e9b0a12ada547 -F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 -F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc -F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e -F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 094dcfe779613301521e8bb990432df187b3686add75a3420b4a193f02f3467f -R fe50fdd9252d03af57c53593afdee806 +B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 +C Provide\sthe\sability\sto\suse\sthe\sSELECTTRACE()\sdebugging\smacro\soutside\sof\sthe\nselect.c\ssource\sfile.\s\sUse\sthis\sto\sadd\sa\snew\sSELECTTRACE()\sentry\sin\nwindow.c\sfor\simproved\stracing\sof\swindow-function\sparse-tree\srewriting. +D 2020-06-11T00:57:09.771 +F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 +F src/select.c 733ae255f1d10d95bbb8a7c13203a62eb79badc775eb2b2315e7ab4e35d45bad +F src/sqliteInt.h fe320867c4f48eeeca523062c5668508b3f9b88d65690d42610bd138a5fdb5c4 +F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 +F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c +P fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 +R b3d2143c6508e1f1efd9ec1303abeeea U drh -Z 9cfa3eb1061d3d10530f069bf73f5151 +Z 41a1b9acde17079fb4a53b14e25df793 diff --git a/manifest.uuid b/manifest.uuid index 93b32e7733..850c7896e7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 \ No newline at end of file +30c6d895b573d5f2a53487b3b7a0d20be7e382c7a0bc87336bd43fbd2fa89bf4 \ No newline at end of file diff --git a/src/global.c b/src/global.c index aeddada6f2..c6bdbad1bd 100644 --- a/src/global.c +++ b/src/global.c @@ -300,6 +300,11 @@ sqlite3_uint64 sqlite3NProfileCnt = 0; int sqlite3PendingByte = 0x40000000; #endif +/* +** Flags for select tracing and the ".selecttrace" macro of the CLI +*/ +/**/ u32 sqlite3SelectTrace = 0; + #include "opcodes.h" /* ** Properties of opcodes. The OPFLG_INITIALIZER macro is diff --git a/src/select.c b/src/select.c index 465aab1ef1..123e0fb5fc 100644 --- a/src/select.c +++ b/src/select.c @@ -14,20 +14,6 @@ */ #include "sqliteInt.h" -/* -** Trace output macros -*/ -#if SELECTTRACE_ENABLED -/***/ int sqlite3SelectTrace = 0; -# define SELECTTRACE(K,P,S,X) \ - if(sqlite3SelectTrace&(K)) \ - sqlite3DebugPrintf("%u/%d/%p: ",(S)->selId,(P)->addrExplain,(S)),\ - sqlite3DebugPrintf X -#else -# define SELECTTRACE(K,P,S,X) -#endif - - /* ** An instance of the following object is used to record information about ** how to process the DISTINCT keyword, to simplify passing that information @@ -5826,7 +5812,7 @@ int sqlite3Select( memset(&sSort, 0, sizeof(sSort)); sSort.pOrderBy = p->pOrderBy; - /* Try to various optimizations (flattening subqueries, and strength + /* Try to do various optimizations (flattening subqueries, and strength ** reduction of join operators) in the FROM clause up into the main query */ #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 7231856423..686096d4e1 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -979,6 +979,16 @@ typedef INT16_TYPE LogEst; #else # define SELECTTRACE_ENABLED 0 #endif +#if defined(SQLITE_ENABLE_SELECTTRACE) +# define SELECTTRACE_ENABLED 1 +# define SELECTTRACE(K,P,S,X) \ + if(sqlite3SelectTrace&(K)) \ + sqlite3DebugPrintf("%u/%d/%p: ",(S)->selId,(P)->addrExplain,(S)),\ + sqlite3DebugPrintf X +#else +# define SELECTTRACE(K,P,S,X) +# define SELECTTRACE_ENABLED 0 +#endif /* ** An instance of the following structure is used to store the busy-handler @@ -4555,10 +4565,11 @@ extern const unsigned char sqlite3UpperToLower[]; extern const unsigned char sqlite3CtypeMap[]; extern SQLITE_WSD struct Sqlite3Config sqlite3Config; extern FuncDefHash sqlite3BuiltinFunctions; +extern u32 sqlite3SelectTrace; #ifndef SQLITE_OMIT_WSD extern int sqlite3PendingByte; #endif -#endif +#endif /* SQLITE_AMALGAMATION */ #ifdef VDBE_PROFILE extern sqlite3_uint64 sqlite3NProfileCnt; #endif diff --git a/src/test1.c b/src/test1.c index 29207d51ac..46cc8b1acd 100644 --- a/src/test1.c +++ b/src/test1.c @@ -8164,7 +8164,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ #endif #endif #if defined(SQLITE_ENABLE_SELECTTRACE) - extern int sqlite3SelectTrace; + extern u32 sqlite3SelectTrace; #endif for(i=0; iselId, p)); p->pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( p->pSrc ){ Table *pTab2; From 46daa99b8d054d851e51e0eb5f12079b9791c491 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 11 Jun 2020 15:53:54 +0000 Subject: [PATCH 149/224] Avoid rewriting compound SELECT statements that use a different collation sequence for ORDER BY and record processing a second time if they contain window functions. Fix for [b706351c]. FossilOrigin-Name: 32a88bdd4be5acdc1b80856bf6e32724dc3a467d5050bec0fe1a3dfedcc06f34 --- manifest | 15 ++++++++------- manifest.uuid | 2 +- src/select.c | 8 ++++++++ test/window1.test | 30 ++++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 09e432bfe3..228f95ace0 100644 --- a/manifest +++ b/manifest @@ -1,12 +1,13 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Provide\sthe\sability\sto\suse\sthe\sSELECTTRACE()\sdebugging\smacro\soutside\sof\sthe\nselect.c\ssource\sfile.\s\sUse\sthis\sto\sadd\sa\snew\sSELECTTRACE()\sentry\sin\nwindow.c\sfor\simproved\stracing\sof\swindow-function\sparse-tree\srewriting. -D 2020-06-11T00:57:09.771 +C Avoid\srewriting\scompound\sSELECT\sstatements\sthat\suse\sa\sdifferent\scollation\ssequence\sfor\sORDER\sBY\sand\srecord\sprocessing\sa\ssecond\stime\sif\sthey\scontain\swindow\sfunctions.\sFix\sfor\s[b706351c]. +D 2020-06-11T15:53:54.084 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 -F src/select.c 733ae255f1d10d95bbb8a7c13203a62eb79badc775eb2b2315e7ab4e35d45bad +F src/select.c 4cf6adb522701a8f9d31b813898c0ec0b3409d343ba131a6f9659d49b76e222a F src/sqliteInt.h fe320867c4f48eeeca523062c5668508b3f9b88d65690d42610bd138a5fdb5c4 F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c -P fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -R b3d2143c6508e1f1efd9ec1303abeeea -U drh -Z 41a1b9acde17079fb4a53b14e25df793 +F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c +P 30c6d895b573d5f2a53487b3b7a0d20be7e382c7a0bc87336bd43fbd2fa89bf4 +R d77969df2abe7d3c02ea74b2057f9f3a +U dan +Z 0af3852064f40e6db0fa611ce2dd7e61 diff --git a/manifest.uuid b/manifest.uuid index 850c7896e7..3dc252ddbe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -30c6d895b573d5f2a53487b3b7a0d20be7e382c7a0bc87336bd43fbd2fa89bf4 \ No newline at end of file +32a88bdd4be5acdc1b80856bf6e32724dc3a467d5050bec0fe1a3dfedcc06f34 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 123e0fb5fc..a8af176604 100644 --- a/src/select.c +++ b/src/select.c @@ -4621,6 +4621,14 @@ static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){ for(pX=p; pX && (pX->op==TK_ALL || pX->op==TK_SELECT); pX=pX->pPrior){} if( pX==0 ) return WRC_Continue; a = p->pOrderBy->a; +#ifndef SQLITE_OMIT_WINDOWFUNC + /* If iOrderByCol is already non-zero, then it has already been matched + ** to a result column of the SELECT statement. This occurs when the + ** SELECT is rewritten for window-functions processing and then passed + ** to sqlite3SelectPrep() and similar a second time. The rewriting done + ** by this function is not required in this case. */ + if( a[0].u.x.iOrderByCol ) return WRC_Continue; +#endif for(i=p->pOrderBy->nExpr-1; i>=0; i--){ if( a[i].pExpr->flags & EP_Collate ) break; } diff --git a/test/window1.test b/test/window1.test index ea5b66459e..618d95e685 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1917,4 +1917,34 @@ do_execsql_test 62.4 { ) WHERE c>10; } {15.0 30.0} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 63.1 { + CREATE TABLE t1(b, x); + CREATE TABLE t2(c, d); + CREATE TABLE t3(e, f); +} + +do_execsql_test 63.2 { + SELECT max(b) OVER( + ORDER BY SUM( + (SELECT c FROM t2 UNION SELECT x ORDER BY c) + ) + ) FROM t1; +} {{}} + +do_execsql_test 63.3 { + SELECT sum(b) over( + ORDER BY ( + SELECT max(b) OVER( + ORDER BY sum( + (SELECT x AS c UNION SELECT 1234 ORDER BY c) + ) + ) AS e + ORDER BY e + ) + ) + FROM t1; +} {{}} + finish_test From b5aaee5e31c081b3ba5beeb563419f2d66be2656 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 11 Jun 2020 16:04:10 +0000 Subject: [PATCH 150/224] Add a new assert() to the SELECT processing. FossilOrigin-Name: 98cea4a32ba558c137d71a5e373a6803d764d34c5640907371dcf6468ffb2e64 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 5 +++++ 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 228f95ace0..4f90c0b7d1 100644 --- a/manifest +++ b/manifest @@ -1,13 +1,13 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Avoid\srewriting\scompound\sSELECT\sstatements\sthat\suse\sa\sdifferent\scollation\ssequence\sfor\sORDER\sBY\sand\srecord\sprocessing\sa\ssecond\stime\sif\sthey\scontain\swindow\sfunctions.\sFix\sfor\s[b706351c]. -D 2020-06-11T15:53:54.084 +C Add\sa\snew\sassert()\sto\sthe\sSELECT\sprocessing. +D 2020-06-11T16:04:10.746 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 -F src/select.c 4cf6adb522701a8f9d31b813898c0ec0b3409d343ba131a6f9659d49b76e222a +F src/select.c 929e1c0db3cb3d9f7d2304c6596868abcb6dfd7c2a0ac1bdf12a5a4432078ba4 F src/sqliteInt.h fe320867c4f48eeeca523062c5668508b3f9b88d65690d42610bd138a5fdb5c4 F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P 30c6d895b573d5f2a53487b3b7a0d20be7e382c7a0bc87336bd43fbd2fa89bf4 -R d77969df2abe7d3c02ea74b2057f9f3a -U dan -Z 0af3852064f40e6db0fa611ce2dd7e61 +P 32a88bdd4be5acdc1b80856bf6e32724dc3a467d5050bec0fe1a3dfedcc06f34 +R 2b3df40625e1e1ca91eabc824248dfbb +U drh +Z 5781754b9c0a637aa77d00f970b7b71b diff --git a/manifest.uuid b/manifest.uuid index 3dc252ddbe..73df9f885f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -32a88bdd4be5acdc1b80856bf6e32724dc3a467d5050bec0fe1a3dfedcc06f34 \ No newline at end of file +98cea4a32ba558c137d71a5e373a6803d764d34c5640907371dcf6468ffb2e64 \ No newline at end of file diff --git a/src/select.c b/src/select.c index a8af176604..e89db37aeb 100644 --- a/src/select.c +++ b/src/select.c @@ -5829,6 +5829,11 @@ int sqlite3Select( Select *pSub = pItem->pSelect; Table *pTab = pItem->pTab; + /* The expander should have already created transient Table objects + ** even for FROM clause elements such as subqueries that do not correspond + ** to a real table */ + assert( pTab!=0 ); + /* Convert LEFT JOIN into JOIN if there are terms of the right table ** of the LEFT JOIN used in the WHERE clause. */ From 6aa7515c46f03f5e42843864cf732fbe0a0b284d Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 12 Jun 2020 00:31:52 +0000 Subject: [PATCH 151/224] Remove a NEVER() that turns out to be reachable. FossilOrigin-Name: 44e573ecd5c2b60107133d60c51f3a04a3f904e9c1cf926e9b8ea977c7acae8d --- manifest | 12 +++++++----- manifest.uuid | 2 +- src/btree.c | 2 +- test/fuzzdata8.db | Bin 1495040 -> 1502208 bytes 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 4f90c0b7d1..55bfba8acb 100644 --- a/manifest +++ b/manifest @@ -1,13 +1,15 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Add\sa\snew\sassert()\sto\sthe\sSELECT\sprocessing. -D 2020-06-11T16:04:10.746 +C Remove\sa\sNEVER()\sthat\sturns\sout\sto\sbe\sreachable. +D 2020-06-12T00:31:52.711 +F src/btree.c fabc215bd1ebab0e48108e95e0f50531da9883156b95888f479f6c696db032ad F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 F src/select.c 929e1c0db3cb3d9f7d2304c6596868abcb6dfd7c2a0ac1bdf12a5a4432078ba4 F src/sqliteInt.h fe320867c4f48eeeca523062c5668508b3f9b88d65690d42610bd138a5fdb5c4 F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c +F test/fuzzdata8.db 9ce2e5f0d7e5e61d5f8f0817346b2a3db2aeebbaff20d04043521623ea0558be F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P 32a88bdd4be5acdc1b80856bf6e32724dc3a467d5050bec0fe1a3dfedcc06f34 -R 2b3df40625e1e1ca91eabc824248dfbb +P 98cea4a32ba558c137d71a5e373a6803d764d34c5640907371dcf6468ffb2e64 +R fe941a98130365dcc5664681cdfda93a U drh -Z 5781754b9c0a637aa77d00f970b7b71b +Z a269c334c0d41dc18dbae6d92c570372 diff --git a/manifest.uuid b/manifest.uuid index 73df9f885f..8e39176095 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -98cea4a32ba558c137d71a5e373a6803d764d34c5640907371dcf6468ffb2e64 \ No newline at end of file +44e573ecd5c2b60107133d60c51f3a04a3f904e9c1cf926e9b8ea977c7acae8d \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index f269b3deee..6ec97f2edd 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1751,7 +1751,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ nFrag = iFreeBlk - iEnd; if( iEnd>iFreeBlk ) return SQLITE_CORRUPT_PAGE(pPage); iEnd = iFreeBlk + get2byte(&data[iFreeBlk+2]); - if( NEVER(iEnd > pPage->pBt->usableSize) ){ + if( iEnd > pPage->pBt->usableSize ){ return SQLITE_CORRUPT_PAGE(pPage); } iSize = iEnd - iStart; diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index b1837460297bbe7aea0ea95aa6946c523c946fa4..b943b2a99c2a7d48e1553cc8287b06e8bc43ce44 100644 GIT binary patch delta 10236 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 From 56e38185fe26dbaeba7545bf94c5a25150e16907 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 12 Jun 2020 15:17:27 +0000 Subject: [PATCH 152/224] Fix a buffer overread in fts3 that could occur when decoding a corrupted record. FossilOrigin-Name: 9a4a40c45feb2bb89020dc7711b4753479112ceae7ce2a44521d72afeddfac83 --- ext/fts3/fts3.c | 5 ++++- manifest | 15 +++++++++------ manifest.uuid | 2 +- test/fts3corrupt2.test | 2 +- test/fts3corrupt4.test | 35 ++++++++++++++++++++++++++++++++--- 5 files changed, 47 insertions(+), 12 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 88ff0ee2c5..7e2cd79055 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -2267,6 +2267,9 @@ static int fts3PoslistMerge( */ fts3GetDeltaVarint(&p1, &i1); fts3GetDeltaVarint(&p2, &i2); + if( i1<2 || i2<2 ){ + break; + } do { fts3PutDeltaVarint(&p, &iPrev, (i1 Date: Fri, 12 Jun 2020 15:45:02 +0000 Subject: [PATCH 153/224] New test case added to test/fuzzdata8.db. FossilOrigin-Name: 14a5cbddc887e23a684fabab1a213cce261bd6cffa0663d4f138b92d0b65b9c2 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1502208 -> 1510400 bytes 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 18064f8a96..ee9f96a3ff 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Fix\sa\sbuffer\soverread\sin\sfts3\sthat\scould\soccur\swhen\sdecoding\sa\scorrupted\srecord. -D 2020-06-12T15:17:27.136 +C New\stest\scase\sadded\sto\stest/fuzzdata8.db. +D 2020-06-12T15:45:02.008 F ext/fts3/fts3.c acc51e4378dd772251b31ead0ccd19070fc1774f6f6a55b11e00cb885e0f34bc F src/btree.c fabc215bd1ebab0e48108e95e0f50531da9883156b95888f479f6c696db032ad F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 @@ -10,9 +10,9 @@ F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c7880bb0c67d0 F test/fts3corrupt4.test e77b06926348eb45b71569f9dc45e5b19c984ca1b1ef6671367f4ca9d6eaa973 -F test/fuzzdata8.db 9ce2e5f0d7e5e61d5f8f0817346b2a3db2aeebbaff20d04043521623ea0558be +F test/fuzzdata8.db b87ae726c84c3f80d457642d7650724a76eb3d7b76258959d712cc4d926ddfc7 F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P 44e573ecd5c2b60107133d60c51f3a04a3f904e9c1cf926e9b8ea977c7acae8d -R bcbd79b4c6c35d1dd8c3ebd4907c7f1d -U dan -Z ff2fe4fe3a58fa1f7eb72368a5beb544 +P 9a4a40c45feb2bb89020dc7711b4753479112ceae7ce2a44521d72afeddfac83 +R 84a32bdefc83764df15377cf4aebb49f +U drh +Z 693eb51b87f57815e5f55c632a3ec02d diff --git a/manifest.uuid b/manifest.uuid index 3d3c7ebf68..12e61dcff1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9a4a40c45feb2bb89020dc7711b4753479112ceae7ce2a44521d72afeddfac83 \ No newline at end of file +14a5cbddc887e23a684fabab1a213cce261bd6cffa0663d4f138b92d0b65b9c2 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index b943b2a99c2a7d48e1553cc8287b06e8bc43ce44..01e4263e05f93f8c3e904e05a6ec60c39613435a 100644 GIT binary patch delta 17412 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 EA8PYO?*IS* delta 17022 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 From 74e0d966952b140f9732be351b04cb755d713cbf Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 13 Jun 2020 03:18:21 +0000 Subject: [PATCH 154/224] Identifiers "TRUE" and "FALSE" cannot take on their boolean constant values if they are operands of the "." operator. FossilOrigin-Name: ad738286e2441b5e84d05366db3fcafabe66be766f21fe6c17f43a8fabab16fb --- manifest | 12 +++++++----- manifest.uuid | 2 +- src/expr.c | 2 ++ test/istrue.test | 29 +++++++++++++++++++++++++++++ 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/manifest b/manifest index ee9f96a3ff..4259fbc66c 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,9 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C New\stest\scase\sadded\sto\stest/fuzzdata8.db. -D 2020-06-12T15:45:02.008 +C Identifiers\s"TRUE"\sand\s"FALSE"\scannot\stake\son\stheir\sboolean\sconstant\svalues\sif\nthey\sare\soperands\sof\sthe\s"."\soperator. +D 2020-06-13T03:18:21.016 F ext/fts3/fts3.c acc51e4378dd772251b31ead0ccd19070fc1774f6f6a55b11e00cb885e0f34bc F src/btree.c fabc215bd1ebab0e48108e95e0f50531da9883156b95888f479f6c696db032ad +F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 F src/select.c 929e1c0db3cb3d9f7d2304c6596868abcb6dfd7c2a0ac1bdf12a5a4432078ba4 F src/sqliteInt.h fe320867c4f48eeeca523062c5668508b3f9b88d65690d42610bd138a5fdb5c4 @@ -11,8 +12,9 @@ F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c7880bb0c67d0 F test/fts3corrupt4.test e77b06926348eb45b71569f9dc45e5b19c984ca1b1ef6671367f4ca9d6eaa973 F test/fuzzdata8.db b87ae726c84c3f80d457642d7650724a76eb3d7b76258959d712cc4d926ddfc7 +F test/istrue.test 06f92ea38750fa74df7dbbe6920205251c2310861fbbe23a3adfa918a2e2ba74 F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P 9a4a40c45feb2bb89020dc7711b4753479112ceae7ce2a44521d72afeddfac83 -R 84a32bdefc83764df15377cf4aebb49f +P 14a5cbddc887e23a684fabab1a213cce261bd6cffa0663d4f138b92d0b65b9c2 +R ebfcb880c83916e081aacf3bd673aef2 U drh -Z 693eb51b87f57815e5f55c632a3ec02d +Z f044363c3bc3fa94bf2e0fcb83823aba diff --git a/manifest.uuid b/manifest.uuid index 12e61dcff1..3cd9d72d8e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -14a5cbddc887e23a684fabab1a213cce261bd6cffa0663d4f138b92d0b65b9c2 \ No newline at end of file +ad738286e2441b5e84d05366db3fcafabe66be766f21fe6c17f43a8fabab16fb \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 79d57454c9..bfa247b4e9 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2048,8 +2048,10 @@ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ /* Fall through */ case TK_IF_NULL_ROW: case TK_REGISTER: + case TK_DOT: testcase( pExpr->op==TK_REGISTER ); testcase( pExpr->op==TK_IF_NULL_ROW ); + testcase( pExpr->op==TK_DOT ); pWalker->eCode = 0; return WRC_Abort; case TK_VARIABLE: diff --git a/test/istrue.test b/test/istrue.test index d2768b3798..b2f5b8d22b 100644 --- a/test/istrue.test +++ b/test/istrue.test @@ -172,4 +172,33 @@ do_execsql_test istrue-710 { SELECT 0.0 IS FALSE COLLATE BINARY; } {1 1 1 1 1 1 1 1 1} +# 2020-06-12 bug report from Chromium +# https://bugs.chromium.org/p/chromium/issues/detail?id=1094247 +do_catchsql_test istrue-800 { + SELECT 9 IN (false.false); +} {1 {no such column: false.false}} +do_execsql_test istrue-810 { + CREATE TABLE t8(a INT, true INT, false INT, d INT); + INSERT INTO t8(a,true,false,d) VALUES(5,6,7,8),(4,3,2,1),('a','b','c','d'); + SELECT * FROM t8 ORDER BY false; +} {4 3 2 1 5 6 7 8 a b c d} +do_catchsql_test istrue-820 { + SELECT 9 IN (false.false) FROM t8; +} {1 {no such column: false.false}} +do_execsql_test istrue-830 { + CREATE TABLE false(true INT, false INT, x INT CHECK (5 IN (false.false))); +} {} +do_execsql_test istrue-840 { + INSERT INTO False VALUES(4,5,6); +} {} +do_catchsql_test istrue-841 { + INSERT INTO False VALUES(5,6,7); +} {1 {CHECK constraint failed: false}} +do_execsql_test istrue-850 { + SELECT 9 IN (false.false) FROM false; +} {0} +do_execsql_test istrue-851 { + SELECT 5 IN (false.false) FROM false; +} {1} + finish_test From cd653a3266a4fd88b334c4aaffd1945e871a8d9a Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 13 Jun 2020 21:24:40 +0000 Subject: [PATCH 155/224] Avoid deleting expression nodes in the flattener code, as they may be referenced by AggInfo objects further up the stack. FossilOrigin-Name: cc1fffdeddf422404170fa163ab80372ae58b444d7012b2c164021b221709b3e --- manifest | 15 ++++++++------- manifest.uuid | 2 +- src/select.c | 8 +++++++- test/select3.test | 9 +++++++++ 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 4259fbc66c..481336b693 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Identifiers\s"TRUE"\sand\s"FALSE"\scannot\stake\son\stheir\sboolean\sconstant\svalues\sif\nthey\sare\soperands\sof\sthe\s"."\soperator. -D 2020-06-13T03:18:21.016 +C Avoid\sdeleting\sexpression\snodes\sin\sthe\sflattener\scode,\sas\sthey\smay\sbe\sreferenced\sby\sAggInfo\sobjects\sfurther\sup\sthe\sstack. +D 2020-06-13T21:24:40.551 F ext/fts3/fts3.c acc51e4378dd772251b31ead0ccd19070fc1774f6f6a55b11e00cb885e0f34bc F src/btree.c fabc215bd1ebab0e48108e95e0f50531da9883156b95888f479f6c696db032ad F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 -F src/select.c 929e1c0db3cb3d9f7d2304c6596868abcb6dfd7c2a0ac1bdf12a5a4432078ba4 +F src/select.c 1a791ad41c35ec24217b8da877a4deb2a9e22a1dfae2bc46d68d9ad4e4bf8f40 F src/sqliteInt.h fe320867c4f48eeeca523062c5668508b3f9b88d65690d42610bd138a5fdb5c4 F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c @@ -13,8 +13,9 @@ F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c788 F test/fts3corrupt4.test e77b06926348eb45b71569f9dc45e5b19c984ca1b1ef6671367f4ca9d6eaa973 F test/fuzzdata8.db b87ae726c84c3f80d457642d7650724a76eb3d7b76258959d712cc4d926ddfc7 F test/istrue.test 06f92ea38750fa74df7dbbe6920205251c2310861fbbe23a3adfa918a2e2ba74 +F test/select3.test c49fbb758903f3718e2de5aa4655eda4838131cbea24a86db908f8b6889aa68c F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P 14a5cbddc887e23a684fabab1a213cce261bd6cffa0663d4f138b92d0b65b9c2 -R ebfcb880c83916e081aacf3bd673aef2 -U drh -Z f044363c3bc3fa94bf2e0fcb83823aba +P ad738286e2441b5e84d05366db3fcafabe66be766f21fe6c17f43a8fabab16fb +R 5e5118679cf69aa40cdce2d30c720aca +U dan +Z 711c877ed46b56919faaa443580ab634 diff --git a/manifest.uuid b/manifest.uuid index 3cd9d72d8e..b498bd973f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ad738286e2441b5e84d05366db3fcafabe66be766f21fe6c17f43a8fabab16fb \ No newline at end of file +cc1fffdeddf422404170fa163ab80372ae58b444d7012b2c164021b221709b3e \ No newline at end of file diff --git a/src/select.c b/src/select.c index e89db37aeb..ae41aaf81f 100644 --- a/src/select.c +++ b/src/select.c @@ -4115,7 +4115,13 @@ static int flattenSubquery( if( isLeftJoin>0 ){ sqlite3SetJoinExpr(pWhere, iNewParent); } - pParent->pWhere = sqlite3ExprAnd(pParse, pWhere, pParent->pWhere); + if( pWhere ){ + if( pParent->pWhere ){ + pParent->pWhere = sqlite3PExpr(pParse, TK_AND, pWhere, pParent->pWhere); + }else{ + pParent->pWhere = pWhere; + } + } if( db->mallocFailed==0 ){ SubstContext x; x.pParse = pParse; diff --git a/test/select3.test b/test/select3.test index 50039c551e..fec8ba4a51 100644 --- a/test/select3.test +++ b/test/select3.test @@ -314,4 +314,13 @@ do_execsql_test select3-9.100 { SELECT * FROM t0 GROUP BY c0; } {1.0 1.0} +reset_db +do_execsql_test select3.10.100 { + CREATE TABLE t1(a, b); + CREATE TABLE t2(c, d); + SELECT max(t1.a), + (SELECT 'xyz' FROM (SELECT * FROM t2 WHERE 0) WHERE t1.b=1) + FROM t1; +} {{} {}} + finish_test From 86d2de2571d5dd910a57c5f186bd34f1883974d4 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 14 Jun 2020 13:40:13 +0000 Subject: [PATCH 156/224] Check-in [1d4f86201dab9a22] changed a testcase() to an assert() because we didn't know how to reach that condition any more. But YongHeng's fuzzer found a way. So now we change it back. Ticket [9fb26d37cefaba40]. FossilOrigin-Name: 90b1169d1b200d35a3f9f0ad2ae35a1b336bdd9b1ad0494ba80a382354c8d8b8 --- manifest | 14 ++++++++------ manifest.uuid | 2 +- src/vdbe.c | 2 +- test/whereG.test | 11 +++++++++++ 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 481336b693..748c6f0d44 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Avoid\sdeleting\sexpression\snodes\sin\sthe\sflattener\scode,\sas\sthey\smay\sbe\sreferenced\sby\sAggInfo\sobjects\sfurther\sup\sthe\sstack. -D 2020-06-13T21:24:40.551 +C Check-in\s[1d4f86201dab9a22]\schanged\sa\stestcase()\sto\san\sassert()\sbecause\swe\ndidn't\sknow\show\sto\sreach\sthat\scondition\sany\smore.\s\sBut\sYongHeng's\sfuzzer\nfound\sa\sway.\s\sSo\snow\swe\schange\sit\sback.\s\sTicket\s[9fb26d37cefaba40]. +D 2020-06-14T13:40:13.692 F ext/fts3/fts3.c acc51e4378dd772251b31ead0ccd19070fc1774f6f6a55b11e00cb885e0f34bc F src/btree.c fabc215bd1ebab0e48108e95e0f50531da9883156b95888f479f6c696db032ad F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 @@ -8,14 +8,16 @@ F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 F src/select.c 1a791ad41c35ec24217b8da877a4deb2a9e22a1dfae2bc46d68d9ad4e4bf8f40 F src/sqliteInt.h fe320867c4f48eeeca523062c5668508b3f9b88d65690d42610bd138a5fdb5c4 F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 +F src/vdbe.c 2f5cdcd66be9bc1d1c6ca23b4a4ae003a5a36cf9830d9fa160efce66d9161c9d F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c7880bb0c67d0 F test/fts3corrupt4.test e77b06926348eb45b71569f9dc45e5b19c984ca1b1ef6671367f4ca9d6eaa973 F test/fuzzdata8.db b87ae726c84c3f80d457642d7650724a76eb3d7b76258959d712cc4d926ddfc7 F test/istrue.test 06f92ea38750fa74df7dbbe6920205251c2310861fbbe23a3adfa918a2e2ba74 F test/select3.test c49fbb758903f3718e2de5aa4655eda4838131cbea24a86db908f8b6889aa68c +F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P ad738286e2441b5e84d05366db3fcafabe66be766f21fe6c17f43a8fabab16fb -R 5e5118679cf69aa40cdce2d30c720aca -U dan -Z 711c877ed46b56919faaa443580ab634 +P cc1fffdeddf422404170fa163ab80372ae58b444d7012b2c164021b221709b3e +R 0ef6a213a076036833f157fe6b031b0b +U drh +Z 53f32837c1b7756aa8533c51e60a57b4 diff --git a/manifest.uuid b/manifest.uuid index b498bd973f..3d3f2d2583 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cc1fffdeddf422404170fa163ab80372ae58b444d7012b2c164021b221709b3e \ No newline at end of file +90b1169d1b200d35a3f9f0ad2ae35a1b336bdd9b1ad0494ba80a382354c8d8b8 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index f26b64680b..c08e67612e 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2076,7 +2076,7 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ if( (flags1 | flags3)&MEM_Str ){ if( (flags1 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){ applyNumericAffinity(pIn1,0); - assert( flags3==pIn3->flags ); + testcase( flags3==pIn3->flags ); flags3 = pIn3->flags; } if( (flags3 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){ diff --git a/test/whereG.test b/test/whereG.test index 9d4cde7b4d..c6ae3ce325 100644 --- a/test/whereG.test +++ b/test/whereG.test @@ -317,4 +317,15 @@ do_execsql_test 9.10 { SELECT coalesce(max(quote(a)),10) FROM t1 GROUP BY a; } {NULL '' 'X'} +# 2020-06-14: assert() changed back into testcase() +# ticket 9fb26d37cefaba40 +# +reset_db +do_execsql_test 10.1 { + CREATE TABLE a(b TEXT); INSERT INTO a VALUES(0),(4),(9); + CREATE TABLE c(d NUM); + CREATE VIEW f(g, h) AS SELECT b, 0 FROM a UNION SELECT d, d FROM c; + SELECT g = g FROM f GROUP BY h; +} {1} + finish_test From b7cbf5c1b2a9e099eec176e1ebeb659427a20626 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 15 Jun 2020 13:51:34 +0000 Subject: [PATCH 157/224] Fix a defect in the query-flattener optimization identified by ticket [8f157e8010b22af0]. FossilOrigin-Name: 10fa79d00f8091e5748c245f4cae5b5f499a5f8db20da741c130e05a21ede443 --- manifest | 15 ++++++++------- manifest.uuid | 2 +- src/select.c | 7 +++---- src/sqliteInt.h | 1 + test/selectA.test | 21 +++++++++++++++++++++ 5 files changed, 34 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 748c6f0d44..573d0222f7 100644 --- a/manifest +++ b/manifest @@ -1,12 +1,12 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Check-in\s[1d4f86201dab9a22]\schanged\sa\stestcase()\sto\san\sassert()\sbecause\swe\ndidn't\sknow\show\sto\sreach\sthat\scondition\sany\smore.\s\sBut\sYongHeng's\sfuzzer\nfound\sa\sway.\s\sSo\snow\swe\schange\sit\sback.\s\sTicket\s[9fb26d37cefaba40]. -D 2020-06-14T13:40:13.692 +C Fix\sa\sdefect\sin\sthe\squery-flattener\soptimization\sidentified\sby\nticket\s[8f157e8010b22af0]. +D 2020-06-15T13:51:34.544 F ext/fts3/fts3.c acc51e4378dd772251b31ead0ccd19070fc1774f6f6a55b11e00cb885e0f34bc F src/btree.c fabc215bd1ebab0e48108e95e0f50531da9883156b95888f479f6c696db032ad F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 -F src/select.c 1a791ad41c35ec24217b8da877a4deb2a9e22a1dfae2bc46d68d9ad4e4bf8f40 -F src/sqliteInt.h fe320867c4f48eeeca523062c5668508b3f9b88d65690d42610bd138a5fdb5c4 +F src/select.c 6ddd86a7272ff1f443bd9efcbb0f5ab590674d4c732e4cb8c3d5dd8e3a70cae6 +F src/sqliteInt.h abf448e9f839964086d5508ba795e948dbf36d773b6568cf4c830f6c7ad2110e F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 F src/vdbe.c 2f5cdcd66be9bc1d1c6ca23b4a4ae003a5a36cf9830d9fa160efce66d9161c9d F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c @@ -15,9 +15,10 @@ F test/fts3corrupt4.test e77b06926348eb45b71569f9dc45e5b19c984ca1b1ef6671367f4ca F test/fuzzdata8.db b87ae726c84c3f80d457642d7650724a76eb3d7b76258959d712cc4d926ddfc7 F test/istrue.test 06f92ea38750fa74df7dbbe6920205251c2310861fbbe23a3adfa918a2e2ba74 F test/select3.test c49fbb758903f3718e2de5aa4655eda4838131cbea24a86db908f8b6889aa68c +F test/selectA.test 68de52409e45a3313d00b8461b48bef4fb729faf36ade9067a994eae55cc86f4 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P cc1fffdeddf422404170fa163ab80372ae58b444d7012b2c164021b221709b3e -R 0ef6a213a076036833f157fe6b031b0b +P 90b1169d1b200d35a3f9f0ad2ae35a1b336bdd9b1ad0494ba80a382354c8d8b8 +R 7b2f74d8f4cf58d33d2119b338a7cd5f U drh -Z 53f32837c1b7756aa8533c51e60a57b4 +Z 1c6c6f6f8bb99dca6da53b2db99f530c diff --git a/manifest.uuid b/manifest.uuid index 3d3f2d2583..b9814cc0c8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -90b1169d1b200d35a3f9f0ad2ae35a1b336bdd9b1ad0494ba80a382354c8d8b8 \ No newline at end of file +10fa79d00f8091e5748c245f4cae5b5f499a5f8db20da741c130e05a21ede443 \ No newline at end of file diff --git a/src/select.c b/src/select.c index ae41aaf81f..cdc81fd1fc 100644 --- a/src/select.c +++ b/src/select.c @@ -2702,9 +2702,7 @@ static int multiSelect( selectOpName(p->op))); rc = sqlite3Select(pParse, p, &uniondest); testcase( rc!=SQLITE_OK ); - /* Query flattening in sqlite3Select() might refill p->pOrderBy. - ** Be sure to delete p->pOrderBy, therefore, to avoid a memory leak. */ - sqlite3ExprListDelete(db, p->pOrderBy); + assert( p->pOrderBy==0 ); pDelete = p->pPrior; p->pPrior = pPrior; p->pOrderBy = 0; @@ -4091,7 +4089,7 @@ static int flattenSubquery( ** We look at every expression in the outer query and every place we see ** "a" we substitute "x*3" and every place we see "b" we substitute "y+10". */ - if( pSub->pOrderBy ){ + if( pSub->pOrderBy && (pParent->selFlags & SF_NoopOrderBy)==0 ){ /* At this point, any non-zero iOrderByCol values indicate that the ** ORDER BY column expression is identical to the iOrderByCol'th ** expression returned by SELECT statement pSub. Since these values @@ -5791,6 +5789,7 @@ int sqlite3Select( sqlite3ExprListDelete(db, p->pOrderBy); p->pOrderBy = 0; p->selFlags &= ~SF_Distinct; + p->selFlags |= SF_NoopOrderBy; } sqlite3SelectPrep(pParse, p, 0); if( pParse->nErr || db->mallocFailed ){ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 686096d4e1..1afca88f61 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3122,6 +3122,7 @@ struct Select { #define SF_WhereBegin 0x0080000 /* Really a WhereBegin() call. Debug Only */ #define SF_WinRewrite 0x0100000 /* Window function rewrite accomplished */ #define SF_View 0x0200000 /* SELECT statement is a view */ +#define SF_NoopOrderBy 0x0400000 /* ORDER BY is ignored for this query */ /* ** The results of a SELECT can be distributed in several ways, as defined diff --git a/test/selectA.test b/test/selectA.test index 838e5f4323..7ca0096b1d 100644 --- a/test/selectA.test +++ b/test/selectA.test @@ -1446,5 +1446,26 @@ do_execsql_test 6.1 { SELECT * FROM (SELECT a FROM t1 UNION SELECT b FROM t2) WHERE a=a; } {12345} +# 2020-06-15 ticket 8f157e8010b22af0 +# +reset_db +do_execsql_test 7.1 { + CREATE TABLE t1(c1); INSERT INTO t1 VALUES(12),(123),(1234),(NULL),('abc'); + CREATE TABLE t2(c2); INSERT INTO t2 VALUES(44),(55),(123); + CREATE TABLE t3(c3,c4); INSERT INTO t3 VALUES(66,1),(123,2),(77,3); + CREATE VIEW t4 AS SELECT c3 FROM t3; + CREATE VIEW t5 AS SELECT c3 FROM t3 ORDER BY c4; +} +do_execsql_test 7.2 { + SELECT * FROM t1, t2 WHERE c1=(SELECT 123 INTERSECT SELECT c2 FROM t4) AND c1=123; +} {123 123} +do_execsql_test 7.3 { + SELECT * FROM t1, t2 WHERE c1=(SELECT 123 INTERSECT SELECT c2 FROM t5) AND c1=123; +} {123 123} +do_execsql_test 7.4 { + CREATE TABLE a(b); + CREATE VIEW c(d) AS SELECT b FROM a ORDER BY b; + SELECT sum(d) OVER( PARTITION BY(SELECT 0 FROM c JOIN a WHERE b =(SELECT b INTERSECT SELECT d FROM c) AND b = 123)) FROM c; +} {} finish_test From b13c3a33fdd14c66726fb3d6ada2b0a8941e8bd4 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 15 Jun 2020 14:38:57 +0000 Subject: [PATCH 158/224] Fix the --enable-update-limit option to ./configure. FossilOrigin-Name: d31fd57ea538668238787fde10a6a57bbd8a428c73f2e54b2e95ee9a645bc75b --- configure | 2 +- configure.ac | 2 +- manifest | 12 +++++++----- manifest.uuid | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/configure b/configure index fb1d9cfaa8..afd94711cf 100755 --- a/configure +++ b/configure @@ -11619,7 +11619,7 @@ if test "${enable_update_limit+set}" = set; then : enableval=$enable_update_limit; fi -if test "${enable_udlimit}" = "yes" ; then +if test "${enable_update_limit}" = "yes" ; then OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT" fi diff --git a/configure.ac b/configure.ac index ef70a4f0d1..b9021efc82 100644 --- a/configure.ac +++ b/configure.ac @@ -651,7 +651,7 @@ fi # statements. AC_ARG_ENABLE(update-limit, AC_HELP_STRING([--enable-update-limit], [Enable the UPDATE/DELETE LIMIT clause])) -if test "${enable_udlimit}" = "yes" ; then +if test "${enable_update_limit}" = "yes" ; then OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT" fi diff --git a/manifest b/manifest index 573d0222f7..188f6f98bd 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,8 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Fix\sa\sdefect\sin\sthe\squery-flattener\soptimization\sidentified\sby\nticket\s[8f157e8010b22af0]. -D 2020-06-15T13:51:34.544 +C Fix\sthe\s--enable-update-limit\soption\sto\s./configure. +D 2020-06-15T14:38:57.043 +F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x +F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c F ext/fts3/fts3.c acc51e4378dd772251b31ead0ccd19070fc1774f6f6a55b11e00cb885e0f34bc F src/btree.c fabc215bd1ebab0e48108e95e0f50531da9883156b95888f479f6c696db032ad F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 @@ -18,7 +20,7 @@ F test/select3.test c49fbb758903f3718e2de5aa4655eda4838131cbea24a86db908f8b6889a F test/selectA.test 68de52409e45a3313d00b8461b48bef4fb729faf36ade9067a994eae55cc86f4 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P 90b1169d1b200d35a3f9f0ad2ae35a1b336bdd9b1ad0494ba80a382354c8d8b8 -R 7b2f74d8f4cf58d33d2119b338a7cd5f +P 10fa79d00f8091e5748c245f4cae5b5f499a5f8db20da741c130e05a21ede443 +R 53b85d8633b314f290bd62efdc804e58 U drh -Z 1c6c6f6f8bb99dca6da53b2db99f530c +Z 8f731d1ee1a28a5f07dfda9349a595b2 diff --git a/manifest.uuid b/manifest.uuid index b9814cc0c8..ec8859317b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -10fa79d00f8091e5748c245f4cae5b5f499a5f8db20da741c130e05a21ede443 \ No newline at end of file +d31fd57ea538668238787fde10a6a57bbd8a428c73f2e54b2e95ee9a645bc75b \ No newline at end of file From 999429882edbf4fb04add7bb5338764271aead89 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 15 Jun 2020 20:05:37 +0000 Subject: [PATCH 159/224] Fix the CLI so that interrupts work in columnar output mode. FossilOrigin-Name: 9472f1fe58222b738ad10fc93ceb365dc33b65c2bbca571f52bcd5bdb74b347e --- manifest | 11 ++++++----- manifest.uuid | 2 +- src/shell.c.in | 8 ++++---- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 188f6f98bd..268c0001e3 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Fix\sthe\s--enable-update-limit\soption\sto\s./configure. -D 2020-06-15T14:38:57.043 +C Fix\sthe\sCLI\sso\sthat\sinterrupts\swork\sin\scolumnar\soutput\smode. +D 2020-06-15T20:05:37.857 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c F ext/fts3/fts3.c acc51e4378dd772251b31ead0ccd19070fc1774f6f6a55b11e00cb885e0f34bc @@ -8,6 +8,7 @@ F src/btree.c fabc215bd1ebab0e48108e95e0f50531da9883156b95888f479f6c696db032ad F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 F src/select.c 6ddd86a7272ff1f443bd9efcbb0f5ab590674d4c732e4cb8c3d5dd8e3a70cae6 +F src/shell.c.in 0e439519aae3c08cac2c0da84bc5899bbea4d5f273d3e970febb9bf7516d680b F src/sqliteInt.h abf448e9f839964086d5508ba795e948dbf36d773b6568cf4c830f6c7ad2110e F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 F src/vdbe.c 2f5cdcd66be9bc1d1c6ca23b4a4ae003a5a36cf9830d9fa160efce66d9161c9d @@ -20,7 +21,7 @@ F test/select3.test c49fbb758903f3718e2de5aa4655eda4838131cbea24a86db908f8b6889a F test/selectA.test 68de52409e45a3313d00b8461b48bef4fb729faf36ade9067a994eae55cc86f4 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P 10fa79d00f8091e5748c245f4cae5b5f499a5f8db20da741c130e05a21ede443 -R 53b85d8633b314f290bd62efdc804e58 +P d31fd57ea538668238787fde10a6a57bbd8a428c73f2e54b2e95ee9a645bc75b +R 9bf0d64a5e369f6303626cfabb9127fe U drh -Z 8f731d1ee1a28a5f07dfda9349a595b2 +Z b4b377f6d8e70e8e674e66c244cb5822 diff --git a/manifest.uuid b/manifest.uuid index ec8859317b..98f74649fe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d31fd57ea538668238787fde10a6a57bbd8a428c73f2e54b2e95ee9a645bc75b \ No newline at end of file +9472f1fe58222b738ad10fc93ceb365dc33b65c2bbca571f52bcd5bdb74b347e \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index d1b1203ebe..057c95ad48 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3052,10 +3052,7 @@ static void exec_prepared_stmt_columnar( sqlite3_free_table(azData); return; } - if( nRow==0 || nColumn==0 ){ - sqlite3_free_table(azData); - return; - } + if( nRow==0 || nColumn==0 ) goto columnar_end; if( nColumn>p->nWidth ){ p->colWidth = realloc(p->colWidth, nColumn*2*sizeof(int)); if( p->colWidth==0 ) shell_out_of_memory(); @@ -3077,6 +3074,7 @@ static void exec_prepared_stmt_columnar( j = i%nColumn; if( n>p->actualWidth[j] ) p->actualWidth[j] = n; } + if( seenInterrupt ) goto columnar_end; switch( p->cMode ){ case MODE_Column: { colSep = " "; @@ -3139,6 +3137,7 @@ static void exec_prepared_stmt_columnar( } } for(i=nColumn, j=0; icMode!=MODE_Column ){ utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| "); } @@ -3159,6 +3158,7 @@ static void exec_prepared_stmt_columnar( }else if( p->cMode==MODE_Box ){ print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14); } +columnar_end: sqlite3_free_table(azData); } From 346a70ca1edd53f37e4c04a0eb11c63869ed8bc3 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 15 Jun 2020 20:27:35 +0000 Subject: [PATCH 160/224] Provide "sqlite_schema" as an alternative name to the table that holds the database schema. FossilOrigin-Name: 61782a7ae3c25cf59d7a676cb295eb024d17c46e532ae78c6fe871a91d712fa9 --- manifest | 25 +++++++++----- manifest.uuid | 2 +- src/alter.c | 27 ++++++++------- src/btree.c | 6 ++-- src/build.c | 72 ++++++++++++++++++++++++++-------------- src/shell.c.in | 9 +++-- src/sqliteInt.h | 20 +++++++---- src/trigger.c | 11 +++--- src/vacuum.c | 2 +- src/vdbe.c | 10 +++--- src/vtab.c | 6 ++-- test/where.test | 8 ++--- test/without_rowid3.test | 18 +++++----- 13 files changed, 127 insertions(+), 89 deletions(-) diff --git a/manifest b/manifest index 268c0001e3..208f10fd1c 100644 --- a/manifest +++ b/manifest @@ -1,17 +1,22 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Fix\sthe\sCLI\sso\sthat\sinterrupts\swork\sin\scolumnar\soutput\smode. -D 2020-06-15T20:05:37.857 +C Provide\s"sqlite_schema"\sas\san\salternative\sname\sto\sthe\stable\sthat\sholds\sthe\ndatabase\sschema. +D 2020-06-15T20:27:35.935 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c F ext/fts3/fts3.c acc51e4378dd772251b31ead0ccd19070fc1774f6f6a55b11e00cb885e0f34bc -F src/btree.c fabc215bd1ebab0e48108e95e0f50531da9883156b95888f479f6c696db032ad +F src/alter.c b8ffe4acd48b4fe793d01901f28fd4f3b037854a0e99f0c977738556c31b9d2b +F src/btree.c f3a4479b0dba3a59a1d156d973be41fc1ccb3dbdb69151c4c62a791d86c9ffe2 +F src/build.c 8245e69aa1a2f8b67e76203fdbaa9f88deccd89b5ed41f7097c202b920484fd0 F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 F src/select.c 6ddd86a7272ff1f443bd9efcbb0f5ab590674d4c732e4cb8c3d5dd8e3a70cae6 -F src/shell.c.in 0e439519aae3c08cac2c0da84bc5899bbea4d5f273d3e970febb9bf7516d680b -F src/sqliteInt.h abf448e9f839964086d5508ba795e948dbf36d773b6568cf4c830f6c7ad2110e +F src/shell.c.in c27ee0cd27e17db69257597f927301532a9f019445e3526828c78d348b6f0786 +F src/sqliteInt.h 0a13c93b250270c5876da65c21963eaca60c5fc55271c313d5f6cf20547134af F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 -F src/vdbe.c 2f5cdcd66be9bc1d1c6ca23b4a4ae003a5a36cf9830d9fa160efce66d9161c9d +F src/trigger.c 6b1472e6b5bbca71e13f95c61ebcd0b255450352de8254a42c40222020b7ac43 +F src/vacuum.c b196258ea36cfed5f455f18519345613bab04daf0e038a63ee715407c5a7ae9e +F src/vdbe.c 985f92b5131d62654c3c26062a2e55b1c8f71c2e10497e23021c6650d5c392b3 +F src/vtab.c 33ecf1d8b0fd1508fe23be9da40e48909c86a13db2725e273177eb47db2fc265 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c7880bb0c67d0 F test/fts3corrupt4.test e77b06926348eb45b71569f9dc45e5b19c984ca1b1ef6671367f4ca9d6eaa973 @@ -19,9 +24,11 @@ F test/fuzzdata8.db b87ae726c84c3f80d457642d7650724a76eb3d7b76258959d712cc4d926d F test/istrue.test 06f92ea38750fa74df7dbbe6920205251c2310861fbbe23a3adfa918a2e2ba74 F test/select3.test c49fbb758903f3718e2de5aa4655eda4838131cbea24a86db908f8b6889aa68c F test/selectA.test 68de52409e45a3313d00b8461b48bef4fb729faf36ade9067a994eae55cc86f4 +F test/where.test f5e62453537e5b335b69f3b09f8a02ce3328289fad5d866e25371284b837d78d F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P d31fd57ea538668238787fde10a6a57bbd8a428c73f2e54b2e95ee9a645bc75b -R 9bf0d64a5e369f6303626cfabb9127fe +F test/without_rowid3.test 96426a6c9a2a5cf62bbe55ea1ad038eaaf4bf743f40a1ad517233b8e5a3d4339 +P 9472f1fe58222b738ad10fc93ceb365dc33b65c2bbca571f52bcd5bdb74b347e +R 02b044eedda1f74db4b37271f6bc932d U drh -Z b4b377f6d8e70e8e674e66c244cb5822 +Z dcba90128c816b6defcdc3a0ba95ebaa diff --git a/manifest.uuid b/manifest.uuid index 98f74649fe..1d8a33bad8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9472f1fe58222b738ad10fc93ceb365dc33b65c2bbca571f52bcd5bdb74b347e \ No newline at end of file +61782a7ae3c25cf59d7a676cb295eb024d17c46e532ae78c6fe871a91d712fa9 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 3332665a6c..c5b9328216 100644 --- a/src/alter.c +++ b/src/alter.c @@ -52,22 +52,22 @@ static int isAlterableTable(Parse *pParse, Table *pTab){ static void renameTestSchema(Parse *pParse, const char *zDb, int bTemp){ sqlite3NestedParse(pParse, "SELECT 1 " - "FROM \"%w\".%s " + "FROM \"%w\"." DFLT_SCHEMA_TABLE " " "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" " AND sql NOT LIKE 'create virtual%%'" " AND sqlite_rename_test(%Q, sql, type, name, %d)=NULL ", - zDb, MASTER_NAME, + zDb, zDb, bTemp ); if( bTemp==0 ){ sqlite3NestedParse(pParse, "SELECT 1 " - "FROM temp.%s " + "FROM temp." DFLT_SCHEMA_TABLE " " "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" " AND sql NOT LIKE 'create virtual%%'" " AND sqlite_rename_test(%Q, sql, type, name, 1)=NULL ", - MASTER_NAME, zDb + zDb ); } } @@ -185,17 +185,17 @@ void sqlite3AlterRenameTable( /* Rewrite all CREATE TABLE, INDEX, TRIGGER or VIEW statements in ** the schema to use the new table name. */ sqlite3NestedParse(pParse, - "UPDATE \"%w\".%s SET " + "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET " "sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, %d) " "WHERE (type!='index' OR tbl_name=%Q COLLATE nocase)" "AND name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" - , zDb, MASTER_NAME, zDb, zTabName, zName, (iDb==1), zTabName + , zDb, zDb, zTabName, zName, (iDb==1), zTabName ); /* Update the tbl_name and name columns of the sqlite_master table ** as required. */ sqlite3NestedParse(pParse, - "UPDATE %Q.%s SET " + "UPDATE %Q." DFLT_SCHEMA_TABLE " SET " "tbl_name = %Q, " "name = CASE " "WHEN type='table' THEN %Q " @@ -205,7 +205,7 @@ void sqlite3AlterRenameTable( "ELSE name END " "WHERE tbl_name=%Q COLLATE nocase AND " "(type='table' OR type='index' OR type='trigger');", - zDb, MASTER_NAME, + zDb, zName, zName, zName, nTabName, zTabName ); @@ -382,10 +382,10 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ } db->mDbFlags |= DBFLAG_PreferBuiltin; sqlite3NestedParse(pParse, - "UPDATE \"%w\".%s SET " + "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET " "sql = substr(sql,1,%d) || ', ' || %Q || substr(sql,%d) " "WHERE type = 'table' AND name = %Q", - zDb, MASTER_NAME, pNew->addColOffset, zCol, pNew->addColOffset+1, + zDb, pNew->addColOffset, zCol, pNew->addColOffset+1, zTab ); sqlite3DbFree(db, zCol); @@ -595,21 +595,20 @@ void sqlite3AlterRenameColumn( assert( pNew->n>0 ); bQuote = sqlite3Isquote(pNew->z[0]); sqlite3NestedParse(pParse, - "UPDATE \"%w\".%s SET " + "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET " "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, %d) " "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' " " AND (type != 'index' OR tbl_name = %Q)" " AND sql NOT LIKE 'create virtual%%'", - zDb, MASTER_NAME, + zDb, zDb, pTab->zName, iCol, zNew, bQuote, iSchema==1, pTab->zName ); sqlite3NestedParse(pParse, - "UPDATE temp.%s SET " + "UPDATE temp." DFLT_SCHEMA_TABLE " SET " "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, 1) " "WHERE type IN ('trigger', 'view')", - MASTER_NAME, zDb, pTab->zName, iCol, zNew, bQuote ); diff --git a/src/btree.c b/src/btree.c index 6ec97f2edd..f9fb69f63b 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3429,7 +3429,7 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ /* Any read-only or read-write transaction implies a read-lock on ** page 1. So if some other shared-cache client already has a write-lock ** on page 1, the transaction cannot be opened. */ - rc = querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK); + rc = querySharedCacheTableLock(p, SCHEMA_ROOT, READ_LOCK); if( SQLITE_OK!=rc ) goto trans_begun; pBt->btsFlags &= ~BTS_INITIALLY_EMPTY; @@ -9477,7 +9477,7 @@ void sqlite3BtreeGetMeta(Btree *p, int idx, u32 *pMeta){ sqlite3BtreeEnter(p); assert( p->inTrans>TRANS_NONE ); - assert( SQLITE_OK==querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK) ); + assert( SQLITE_OK==querySharedCacheTableLock(p, SCHEMA_ROOT, READ_LOCK) ); assert( pBt->pPage1 ); assert( idx>=0 && idx<=15 ); @@ -10360,7 +10360,7 @@ int sqlite3BtreeSchemaLocked(Btree *p){ int rc; assert( sqlite3_mutex_held(p->db->mutex) ); sqlite3BtreeEnter(p); - rc = querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK); + rc = querySharedCacheTableLock(p, SCHEMA_ROOT, READ_LOCK); assert( rc==SQLITE_OK || rc==SQLITE_LOCKED_SHAREDCACHE ); sqlite3BtreeLeave(p); return rc; diff --git a/src/build.c b/src/build.c index 03081b9654..a3f4f434cc 100644 --- a/src/build.c +++ b/src/build.c @@ -253,7 +253,7 @@ void sqlite3FinishCoding(Parse *pParse){ ** outermost parser. ** ** Not everything is nestable. This facility is designed to permit -** INSERT, UPDATE, and DELETE operations against SQLITE_MASTER. Use +** INSERT, UPDATE, and DELETE operations against the schema table. Use ** care if you decide to try to use this routine for some other purposes. */ void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ @@ -335,9 +335,21 @@ Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){ } } 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); + if( p==0 && sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){ + if( i==1 ){ + if( sqlite3StrICmp(zName+7, ALT_TEMP_SCHEMA_TABLE+7)==0 + || sqlite3StrICmp(zName+7, ALT_SCHEMA_TABLE+7)==0 + || sqlite3StrICmp(zName+7, DFLT_SCHEMA_TABLE+7)==0 + ){ + p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, + DFLT_TEMP_SCHEMA_TABLE); + } + }else{ + if( sqlite3StrICmp(zName+7, ALT_SCHEMA_TABLE+7)==0 ){ + p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, + DFLT_SCHEMA_TABLE); + } + } } }else{ /* Match against TEMP first */ @@ -352,6 +364,14 @@ Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){ p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName); if( p ) break; } + if( p==0 && sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){ + if( sqlite3StrICmp(zName+7, ALT_SCHEMA_TABLE+7)==0 ){ + p = sqlite3HashFind(&db->aDb[0].pSchema->tblHash, DFLT_SCHEMA_TABLE); + }else if( sqlite3StrICmp(zName+7, ALT_TEMP_SCHEMA_TABLE+7)==0 ){ + p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, + DFLT_TEMP_SCHEMA_TABLE); + } + } } return p; } @@ -746,10 +766,10 @@ char *sqlite3NameFromToken(sqlite3 *db, Token *pName){ ** Open the sqlite_master table stored in database number iDb for ** writing. The table is opened using cursor 0. */ -void sqlite3OpenMasterTable(Parse *p, int iDb){ +void sqlite3OpenSchemaTable(Parse *p, int iDb){ Vdbe *v = sqlite3GetVdbe(p); - sqlite3TableLock(p, iDb, MASTER_ROOT, 1, MASTER_NAME); - sqlite3VdbeAddOp4Int(v, OP_OpenWrite, 0, MASTER_ROOT, iDb, 5); + sqlite3TableLock(p, iDb, SCHEMA_ROOT, 1, DFLT_SCHEMA_TABLE); + sqlite3VdbeAddOp4Int(v, OP_OpenWrite, 0, SCHEMA_ROOT, iDb, 5); if( p->nTab==0 ){ p->nTab = 1; } @@ -1135,7 +1155,7 @@ void sqlite3StartTable( #endif /* Begin generating the code that will insert the table record into - ** the SQLITE_MASTER table. Note in particular that we must go ahead + ** the schema table. Note in particular that we must go ahead ** and allocate the record number for the table entry now. Before any ** PRIMARY KEY or UNIQUE keywords are parsed. Those keywords will cause ** indices to be created and the table record must come before the @@ -1189,7 +1209,7 @@ void sqlite3StartTable( pParse->addrCrTab = sqlite3VdbeAddOp3(v, OP_CreateBtree, iDb, reg2, BTREE_INTKEY); } - sqlite3OpenMasterTable(pParse, iDb); + sqlite3OpenSchemaTable(pParse, iDb); sqlite3VdbeAddOp2(v, OP_NewRowid, 0, reg1); sqlite3VdbeAddOp4(v, OP_Blob, 6, reg3, 0, nullRow, P4_STATIC); sqlite3VdbeAddOp3(v, OP_Insert, 0, reg3, reg1); @@ -2364,7 +2384,7 @@ void sqlite3EndTable( } /* If not initializing, then create a record for the new table - ** in the SQLITE_MASTER table of the database. + ** in the schema table of the database. ** ** If this is a TEMPORARY table, write the entry into the auxiliary ** file instead of into the main database file. @@ -2466,14 +2486,14 @@ void sqlite3EndTable( } /* A slot for the record has already been allocated in the - ** SQLITE_MASTER table. We just need to update that slot with all + ** schema table. We just need to update that slot with all ** the information we've collected. */ sqlite3NestedParse(pParse, - "UPDATE %Q.%s " - "SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q " - "WHERE rowid=#%d", - db->aDb[iDb].zDbSName, MASTER_NAME, + "UPDATE %Q." DFLT_SCHEMA_TABLE + " SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q" + " WHERE rowid=#%d", + db->aDb[iDb].zDbSName, zType, p->zName, p->zName, @@ -2601,7 +2621,7 @@ void sqlite3CreateView( sEnd.z = &z[n-1]; sEnd.n = 1; - /* Use sqlite3EndTable() to add the view to the SQLITE_MASTER table */ + /* Use sqlite3EndTable() to add the view to the schema table */ sqlite3EndTable(pParse, 0, &sEnd, 0, 0); create_view_fail: @@ -2837,8 +2857,9 @@ static void destroyRootPage(Parse *pParse, int iTable, int iDb){ ** token for additional information. */ sqlite3NestedParse(pParse, - "UPDATE %Q.%s SET rootpage=%d WHERE #%d AND rootpage=#%d", - pParse->db->aDb[iDb].zDbSName, MASTER_NAME, iTable, r1, r1); + "UPDATE %Q." DFLT_SCHEMA_TABLE + " SET rootpage=%d WHERE #%d AND rootpage=#%d", + pParse->db->aDb[iDb].zDbSName, iTable, r1, r1); #endif sqlite3ReleaseTempReg(pParse, r1); } @@ -2963,7 +2984,7 @@ void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, int isView){ } #endif - /* Drop all SQLITE_MASTER table and index entries that refer to the + /* Drop all entries in the schema table that refer to the ** table. The program name loops through the master table and deletes ** every row that refers to a table of the same name as the one being ** dropped. Triggers are handled separately because a trigger can be @@ -2971,8 +2992,9 @@ void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, int isView){ ** database. */ sqlite3NestedParse(pParse, - "DELETE FROM %Q.%s WHERE tbl_name=%Q and type!='trigger'", - pDb->zDbSName, MASTER_NAME, pTab->zName); + "DELETE FROM %Q." DFLT_SCHEMA_TABLE + " WHERE tbl_name=%Q and type!='trigger'", + pDb->zDbSName, pTab->zName); if( !isView && !IsVirtual(pTab) ){ destroyTable(pParse, pTab); } @@ -3979,8 +4001,8 @@ void sqlite3CreateIndex( /* Add an entry in sqlite_master for this index */ sqlite3NestedParse(pParse, - "INSERT INTO %Q.%s VALUES('index',%Q,%Q,#%d,%Q);", - db->aDb[iDb].zDbSName, MASTER_NAME, + "INSERT INTO %Q." DFLT_SCHEMA_TABLE " VALUES('index',%Q,%Q,#%d,%Q);", + db->aDb[iDb].zDbSName, pIndex->zName, pTab->zName, iMem, @@ -4150,8 +4172,8 @@ void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists){ if( v ){ sqlite3BeginWriteOperation(pParse, 1, iDb); sqlite3NestedParse(pParse, - "DELETE FROM %Q.%s WHERE name=%Q AND type='index'", - db->aDb[iDb].zDbSName, MASTER_NAME, pIndex->zName + "DELETE FROM %Q." DFLT_SCHEMA_TABLE " WHERE name=%Q AND type='index'", + db->aDb[iDb].zDbSName, pIndex->zName ); sqlite3ClearStatTables(pParse, iDb, "idx", pIndex->zName); sqlite3ChangeCookie(pParse, iDb); diff --git a/src/shell.c.in b/src/shell.c.in index 057c95ad48..15f8c5e659 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -9030,8 +9030,11 @@ static int do_meta_command(char *zLine, ShellState *p){ } } if( zName!=0 ){ - int isMaster = sqlite3_strlike(zName, "sqlite_master", '\\')==0; - if( isMaster || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0 ){ + int isMaster = sqlite3_strlike(zName, "sqlite_master", '\\')==0 + || sqlite3_strlike(zName, "sqlite_schema", '\\')==0 + || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0 + || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0; + if( isMaster ){ char *new_argv[2], *new_colv[2]; new_argv[0] = sqlite3_mprintf( "CREATE TABLE %s (\n" @@ -9040,7 +9043,7 @@ static int do_meta_command(char *zLine, ShellState *p){ " tbl_name text,\n" " rootpage integer,\n" " sql text\n" - ")", isMaster ? "sqlite_master" : "sqlite_temp_master"); + ")", zName); new_argv[1] = 0; new_colv[0] = "sql"; new_colv[1] = 0; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 1afca88f61..87c2bf1a90 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1011,18 +1011,24 @@ struct BusyHandler { ** is a special table that holds the names and attributes of all ** user tables and indices. */ -#define MASTER_NAME "sqlite_master" -#define TEMP_MASTER_NAME "sqlite_temp_master" +//#define MASTER_NAME "sqlite_master" +//#define TEMP_MASTER_NAME "sqlite_temp_master" +#define DFLT_SCHEMA_TABLE "sqlite_master" +#define DFLT_TEMP_SCHEMA_TABLE "sqlite_temp_master" +#define ALT_SCHEMA_TABLE "sqlite_schema" +#define ALT_TEMP_SCHEMA_TABLE "sqlite_temp_schema" + /* -** The root-page of the master database table. +** The root-page of the schema table. */ -#define MASTER_ROOT 1 +#define SCHEMA_ROOT 1 /* -** The name of the schema table. +** The name of the schema table. The name is different for TEMP. */ -#define SCHEMA_TABLE(x) ((!OMIT_TEMPDB)&&(x==1)?TEMP_MASTER_NAME:MASTER_NAME) +#define SCHEMA_TABLE(x) \ + ((!OMIT_TEMPDB)&&(x==1)?DFLT_TEMP_SCHEMA_TABLE:DFLT_SCHEMA_TABLE) /* ** A convenience macro that returns the number of elements in @@ -4144,7 +4150,7 @@ void sqlite3DeleteColumnNames(sqlite3*,Table*); int sqlite3ColumnsFromExprList(Parse*,ExprList*,i16*,Column**); void sqlite3SelectAddColumnTypeAndCollation(Parse*,Table*,Select*,char); Table *sqlite3ResultSetOfSelect(Parse*,Select*,char); -void sqlite3OpenMasterTable(Parse *, int); +void sqlite3OpenSchemaTable(Parse *, int); Index *sqlite3PrimaryKeyIndex(Table*); i16 sqlite3TableColumnToIndex(Index*, i16); #ifdef SQLITE_OMIT_GENERATED_COLUMNS diff --git a/src/trigger.c b/src/trigger.c index 646d6942d3..fb4d89f2a8 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -128,7 +128,7 @@ void sqlite3BeginTrigger( ** ^^^^^^^^ ** ** To maintain backwards compatibility, ignore the database - ** name on pTableName if we are reparsing out of SQLITE_MASTER. + ** name on pTableName if we are reparsing out of the schema table */ if( db->init.busy && iDb!=1 ){ sqlite3DbFree(db, pTableName->a[0].zDatabase); @@ -331,8 +331,9 @@ void sqlite3FinishTrigger( z = sqlite3DbStrNDup(db, (char*)pAll->z, pAll->n); testcase( z==0 ); sqlite3NestedParse(pParse, - "INSERT INTO %Q.%s VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')", - db->aDb[iDb].zDbSName, MASTER_NAME, zName, + "INSERT INTO %Q." DFLT_SCHEMA_TABLE + " VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')", + db->aDb[iDb].zDbSName, zName, pTrig->table, z); sqlite3DbFree(db, z); sqlite3ChangeCookie(pParse, iDb); @@ -639,8 +640,8 @@ void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ */ if( (v = sqlite3GetVdbe(pParse))!=0 ){ sqlite3NestedParse(pParse, - "DELETE FROM %Q.%s WHERE name=%Q AND type='trigger'", - db->aDb[iDb].zDbSName, MASTER_NAME, pTrigger->zName + "DELETE FROM %Q." DFLT_SCHEMA_TABLE " WHERE name=%Q AND type='trigger'", + db->aDb[iDb].zDbSName, pTrigger->zName ); sqlite3ChangeCookie(pParse, iDb); sqlite3VdbeAddOp4(v, OP_DropTrigger, iDb, 0, 0, pTrigger->zName, 0); diff --git a/src/vacuum.c b/src/vacuum.c index 920a98e018..0b3a42cab1 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -304,7 +304,7 @@ SQLITE_NOINLINE int sqlite3RunVacuum( /* Copy the triggers, views, and virtual tables from the main database ** over to the temporary database. None of these objects has any ** associated storage, so all we have to do is copy their entries - ** from the SQLITE_MASTER table. + ** from the schema table. */ rc = execSqlF(db, pzErrMsg, "INSERT INTO vacuum_db.sqlite_master" diff --git a/src/vdbe.c b/src/vdbe.c index c08e67612e..1ca3dc1aa0 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3950,7 +3950,7 @@ case OP_OpenEphemeral: { rc = sqlite3BtreeCreateTable(pCx->pBtx, (int*)&pCx->pgnoRoot, BTREE_BLOBKEY | pOp->p5); if( rc==SQLITE_OK ){ - assert( pCx->pgnoRoot==MASTER_ROOT+1 ); + assert( pCx->pgnoRoot==SCHEMA_ROOT+1 ); assert( pKeyInfo->db==db ); assert( pKeyInfo->enc==ENC(db) ); rc = sqlite3BtreeCursor(pCx->pBtx, pCx->pgnoRoot, BTREE_WRCSR, @@ -3958,8 +3958,8 @@ case OP_OpenEphemeral: { } pCx->isTable = 0; }else{ - pCx->pgnoRoot = MASTER_ROOT; - rc = sqlite3BtreeCursor(pCx->pBtx, MASTER_ROOT, BTREE_WRCSR, + pCx->pgnoRoot = SCHEMA_ROOT; + rc = sqlite3BtreeCursor(pCx->pBtx, SCHEMA_ROOT, BTREE_WRCSR, 0, pCx->uc.pCursor); pCx->isTable = 1; } @@ -6066,7 +6066,7 @@ case OP_SqlExec: { /* Opcode: ParseSchema P1 * * P4 * ** -** Read and parse all entries from the SQLITE_MASTER table of database P1 +** Read and parse all entries from the schema table of database P1 ** that match the WHERE clause P4. If P4 is a NULL pointer, then the ** entire schema for P1 is reparsed. ** @@ -6103,7 +6103,7 @@ case OP_ParseSchema: { }else #endif { - zMaster = MASTER_NAME; + zMaster = DFLT_SCHEMA_TABLE; initData.db = db; initData.iDb = iDb; initData.pzErrMsg = &p->zErrMsg; diff --git a/src/vtab.c b/src/vtab.c index d94f6b5ed3..e20af38697 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -466,7 +466,7 @@ void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ zStmt = sqlite3MPrintf(db, "CREATE VIRTUAL TABLE %T", &pParse->sNameToken); /* A slot for the record has already been allocated in the - ** SQLITE_MASTER table. We just need to update that slot with all + ** schema table. We just need to update that slot with all ** the information we've collected. ** ** The VM register number pParse->regRowid holds the rowid of an @@ -475,10 +475,10 @@ void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ */ iDb = sqlite3SchemaToIndex(db, pTab->pSchema); sqlite3NestedParse(pParse, - "UPDATE %Q.%s " + "UPDATE %Q." DFLT_SCHEMA_TABLE " " "SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q " "WHERE rowid=#%d", - db->aDb[iDb].zDbSName, MASTER_NAME, + db->aDb[iDb].zDbSName, pTab->zName, pTab->zName, zStmt, diff --git a/test/where.test b/test/where.test index 26bf3a0402..9b072da677 100644 --- a/test/where.test +++ b/test/where.test @@ -1496,8 +1496,8 @@ do_execsql_test where-25.0 { INSERT INTO t2 VALUES(3, 'three', 'iii'); PRAGMA writable_schema = 1; - UPDATE sqlite_master SET rootpage = ( - SELECT rootpage FROM sqlite_master WHERE name = 'i2' + UPDATE sqlite_schema SET rootpage = ( + SELECT rootpage FROM sqlite_schema WHERE name = 'i2' ) WHERE name = 'i1'; } db close @@ -1524,8 +1524,8 @@ do_execsql_test where-25.3 { INSERT INTO t2 VALUES(3, 'three', 'iii'); PRAGMA writable_schema = 1; - UPDATE sqlite_master SET rootpage = ( - SELECT rootpage FROM sqlite_master WHERE name = 'i2' + UPDATE sqlite_schema SET rootpage = ( + SELECT rootpage FROM sqlite_schema WHERE name = 'i2' ) WHERE name = 'i1'; } db close diff --git a/test/without_rowid3.test b/test/without_rowid3.test index a9839e147e..eae7e3c856 100644 --- a/test/without_rowid3.test +++ b/test/without_rowid3.test @@ -942,7 +942,7 @@ ifcapable altertable { PRAGMA foreign_keys = off; ALTER TABLE t2 ADD COLUMN h DEFAULT 'text' REFERENCES t1; PRAGMA foreign_keys = on; - SELECT sql FROM sqlite_master WHERE name='t2'; + SELECT sql FROM sqlite_schema WHERE name='t2'; } } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REFERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}} @@ -976,7 +976,7 @@ ifcapable altertable { WITHOUT rowid; CREATE TABLE t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1); } - execsql { SELECT sql FROM sqlite_master WHERE type = 'table'} + execsql { SELECT sql FROM sqlite_schema WHERE type = 'table'} } [list \ {CREATE TABLE t1(a PRIMARY KEY, b REFERENCES t1) WITHOUT rowid} \ {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2) @@ -985,7 +985,7 @@ ifcapable altertable { ] do_test without_rowid3-14.2.2.2 { execsql { ALTER TABLE t1 RENAME TO t4 } - execsql { SELECT sql FROM sqlite_master WHERE type = 'table'} + execsql { SELECT sql FROM sqlite_schema WHERE type = 'table'} } [list \ {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4") WITHOUT rowid} \ {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2) @@ -1037,7 +1037,7 @@ ifcapable altertable { PRAGMA foreign_keys = off; ALTER TABLE t2 ADD COLUMN h DEFAULT 'text' REFERENCES t1; PRAGMA foreign_keys = on; - SELECT sql FROM temp.sqlite_master WHERE name='t2'; + SELECT sql FROM temp.sqlite_schema WHERE name='t2'; } } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REFERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}} @@ -1063,7 +1063,7 @@ ifcapable altertable { WITHOUT rowid; CREATE TEMP TABLE t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1); } - execsql { SELECT sql FROM sqlite_temp_master WHERE type = 'table'} + execsql { SELECT sql FROM sqlite_temp_schema WHERE type = 'table'} } [list \ {CREATE TABLE t1(a PRIMARY KEY, b REFERENCES t1) WITHOUT rowid} \ {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2) @@ -1072,7 +1072,7 @@ ifcapable altertable { ] do_test without_rowid3-14.2tmp.2.2 { execsql { ALTER TABLE t1 RENAME TO t4 } - execsql { SELECT sql FROM temp.sqlite_master WHERE type = 'table'} + execsql { SELECT sql FROM temp.sqlite_schema WHERE type = 'table'} } [list \ {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4") WITHOUT rowid} \ {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2) @@ -1125,7 +1125,7 @@ ifcapable altertable { PRAGMA foreign_keys = off; ALTER TABLE t2 ADD COLUMN h DEFAULT 'text' REFERENCES t1; PRAGMA foreign_keys = on; - SELECT sql FROM aux.sqlite_master WHERE name='t2'; + SELECT sql FROM aux.sqlite_schema WHERE name='t2'; } } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REFERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}} @@ -1151,7 +1151,7 @@ ifcapable altertable { WITHOUT rowid; CREATE TABLE aux.t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1); } - execsql { SELECT sql FROM aux.sqlite_master WHERE type = 'table'} + execsql { SELECT sql FROM aux.sqlite_schema WHERE type = 'table'} } [list \ {CREATE TABLE t1(a PRIMARY KEY, b REFERENCES t1) WITHOUT rowid} \ {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2) @@ -1160,7 +1160,7 @@ ifcapable altertable { ] do_test without_rowid3-14.2aux.2.2 { execsql { ALTER TABLE t1 RENAME TO t4 } - execsql { SELECT sql FROM aux.sqlite_master WHERE type = 'table'} + execsql { SELECT sql FROM aux.sqlite_schema WHERE type = 'table'} } [list \ {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4") WITHOUT rowid} \ {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2) From b65ce3960781aacf8d80e15c2c9bca941b78e071 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 16 Jun 2020 14:06:20 +0000 Subject: [PATCH 161/224] Fix an assert() in fts3 that can fail when processing a corrupt record. FossilOrigin-Name: a58a6d6fb241a50c4c7c9af8a9c65bc4746e905b2ae12290c7182afa944053a2 --- ext/fts3/fts3.c | 2 +- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/fts3corrupt4.test | 17 +++++++++++++++++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 7e2cd79055..d03e7eefb3 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -4523,7 +4523,7 @@ void sqlite3Fts3DoclistNext( assert( nDoclist>0 ); assert( *pbEof==0 ); - assert( p || *piDocid==0 ); + assert_fts3_nc( p || *piDocid==0 ); assert( !p || (p>=aDoclist && p<=&aDoclist[nDoclist]) ); if( p==0 ){ diff --git a/manifest b/manifest index 208f10fd1c..084ad09f65 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Provide\s"sqlite_schema"\sas\san\salternative\sname\sto\sthe\stable\sthat\sholds\sthe\ndatabase\sschema. -D 2020-06-15T20:27:35.935 +C Fix\san\sassert()\sin\sfts3\sthat\scan\sfail\swhen\sprocessing\sa\scorrupt\srecord. +D 2020-06-16T14:06:20.912 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c -F ext/fts3/fts3.c acc51e4378dd772251b31ead0ccd19070fc1774f6f6a55b11e00cb885e0f34bc +F ext/fts3/fts3.c ad3416827315a5bef8d0e23d8e90bf29940fbec23ee78aa0c5d3caed85072dec F src/alter.c b8ffe4acd48b4fe793d01901f28fd4f3b037854a0e99f0c977738556c31b9d2b F src/btree.c f3a4479b0dba3a59a1d156d973be41fc1ccb3dbdb69151c4c62a791d86c9ffe2 F src/build.c 8245e69aa1a2f8b67e76203fdbaa9f88deccd89b5ed41f7097c202b920484fd0 @@ -19,7 +19,7 @@ F src/vdbe.c 985f92b5131d62654c3c26062a2e55b1c8f71c2e10497e23021c6650d5c392b3 F src/vtab.c 33ecf1d8b0fd1508fe23be9da40e48909c86a13db2725e273177eb47db2fc265 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c7880bb0c67d0 -F test/fts3corrupt4.test e77b06926348eb45b71569f9dc45e5b19c984ca1b1ef6671367f4ca9d6eaa973 +F test/fts3corrupt4.test 000cc36cf50f61e51a3ae35748ea883674a9d8b797880975e10866849eefb404 F test/fuzzdata8.db b87ae726c84c3f80d457642d7650724a76eb3d7b76258959d712cc4d926ddfc7 F test/istrue.test 06f92ea38750fa74df7dbbe6920205251c2310861fbbe23a3adfa918a2e2ba74 F test/select3.test c49fbb758903f3718e2de5aa4655eda4838131cbea24a86db908f8b6889aa68c @@ -28,7 +28,7 @@ F test/where.test f5e62453537e5b335b69f3b09f8a02ce3328289fad5d866e25371284b837d7 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c F test/without_rowid3.test 96426a6c9a2a5cf62bbe55ea1ad038eaaf4bf743f40a1ad517233b8e5a3d4339 -P 9472f1fe58222b738ad10fc93ceb365dc33b65c2bbca571f52bcd5bdb74b347e -R 02b044eedda1f74db4b37271f6bc932d -U drh -Z dcba90128c816b6defcdc3a0ba95ebaa +P 61782a7ae3c25cf59d7a676cb295eb024d17c46e532ae78c6fe871a91d712fa9 +R 14b01e4dd1603edf4df42d81f4ced7a5 +U dan +Z 43e2585015a8d4d9f2bfa4334bc823ee diff --git a/manifest.uuid b/manifest.uuid index 1d8a33bad8..44a5194657 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -61782a7ae3c25cf59d7a676cb295eb024d17c46e532ae78c6fe871a91d712fa9 \ No newline at end of file +a58a6d6fb241a50c4c7c9af8a9c65bc4746e905b2ae12290c7182afa944053a2 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 3bcf06af25..c79a5a2379 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -6091,7 +6091,24 @@ do_test 39.2 { } } } 0 +set sqlite_fts3_enable_parentheses $saved +#------------------------------------------------------------------------- +reset_db +set saved $sqlite_fts3_enable_parentheses +set sqlite_fts3_enable_parentheses 1 + +do_execsql_test 40.1 { + + CREATE VIRTUAL TABLE t0 USING fts3(col0 INTEGER PRIMARY KEY, col1, col2 ,col3 ); + INSERT INTO t0_segdir VALUES(0,0,0,0,'0 42', + X'0001310301020001033233340500010102000004616161bc050101020200000462626262050101030200' + ); +} + +do_execsql_test 40.2 { + SELECT 0==matchinfo(t0,'sx') FROM t0 WHERE t0 MATCH '1* 2 3 4 5 6 OR 1'; +} 0 set sqlite_fts3_enable_parentheses $saved From dc8339eaace6ca15a49f8983440ec552a694b68f Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 16 Jun 2020 14:12:43 +0000 Subject: [PATCH 162/224] Add a test case covering the previous check-in to the test/fuzzdata8.db file. FossilOrigin-Name: 95379da0e1ad5110648a5b3af24e7caab66a6f1ad6efdf374c83ae4ef1fed515 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1510400 -> 1518592 bytes 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 084ad09f65..e2eae1f015 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Fix\san\sassert()\sin\sfts3\sthat\scan\sfail\swhen\sprocessing\sa\scorrupt\srecord. -D 2020-06-16T14:06:20.912 +C Add\sa\stest\scase\scovering\sthe\sprevious\scheck-in\sto\sthe\stest/fuzzdata8.db\sfile. +D 2020-06-16T14:12:43.417 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c F ext/fts3/fts3.c ad3416827315a5bef8d0e23d8e90bf29940fbec23ee78aa0c5d3caed85072dec @@ -20,7 +20,7 @@ F src/vtab.c 33ecf1d8b0fd1508fe23be9da40e48909c86a13db2725e273177eb47db2fc265 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c7880bb0c67d0 F test/fts3corrupt4.test 000cc36cf50f61e51a3ae35748ea883674a9d8b797880975e10866849eefb404 -F test/fuzzdata8.db b87ae726c84c3f80d457642d7650724a76eb3d7b76258959d712cc4d926ddfc7 +F test/fuzzdata8.db e7a6a1444adb7bd10dec870234979ddd63173314c7345e3def2d892dcf99d48f F test/istrue.test 06f92ea38750fa74df7dbbe6920205251c2310861fbbe23a3adfa918a2e2ba74 F test/select3.test c49fbb758903f3718e2de5aa4655eda4838131cbea24a86db908f8b6889aa68c F test/selectA.test 68de52409e45a3313d00b8461b48bef4fb729faf36ade9067a994eae55cc86f4 @@ -28,7 +28,7 @@ F test/where.test f5e62453537e5b335b69f3b09f8a02ce3328289fad5d866e25371284b837d7 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c F test/without_rowid3.test 96426a6c9a2a5cf62bbe55ea1ad038eaaf4bf743f40a1ad517233b8e5a3d4339 -P 61782a7ae3c25cf59d7a676cb295eb024d17c46e532ae78c6fe871a91d712fa9 -R 14b01e4dd1603edf4df42d81f4ced7a5 -U dan -Z 43e2585015a8d4d9f2bfa4334bc823ee +P a58a6d6fb241a50c4c7c9af8a9c65bc4746e905b2ae12290c7182afa944053a2 +R 384b84d5739143259cb7eea7bb108567 +U drh +Z 99099ae802c1c7d548d28a65968661d6 diff --git a/manifest.uuid b/manifest.uuid index 44a5194657..4c7bec9a51 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a58a6d6fb241a50c4c7c9af8a9c65bc4746e905b2ae12290c7182afa944053a2 \ No newline at end of file +95379da0e1ad5110648a5b3af24e7caab66a6f1ad6efdf374c83ae4ef1fed515 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 01e4263e05f93f8c3e904e05a6ec60c39613435a..b14e3d1e42672ef0597d159beb176cc76e4d5eb5 100644 GIT binary patch delta 17494 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 Date: Tue, 16 Jun 2020 17:34:40 +0000 Subject: [PATCH 163/224] In the CLI, only interrupt tabular outputs at the end of a line. And print "Interrupt" on a line after stopping the output. FossilOrigin-Name: f3bd689336fecaa1e2928b826c6aedb0178d322f4633ac429dd1ae6fbc08e7f1 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index e2eae1f015..c5528e1a41 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Add\sa\stest\scase\scovering\sthe\sprevious\scheck-in\sto\sthe\stest/fuzzdata8.db\sfile. -D 2020-06-16T14:12:43.417 +C In\sthe\sCLI,\sonly\sinterrupt\stabular\soutputs\sat\sthe\send\sof\sa\sline.\s\sAnd\sprint\n"Interrupt"\son\sa\sline\safter\sstopping\sthe\soutput. +D 2020-06-16T17:34:40.898 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c F ext/fts3/fts3.c ad3416827315a5bef8d0e23d8e90bf29940fbec23ee78aa0c5d3caed85072dec @@ -10,7 +10,7 @@ F src/build.c 8245e69aa1a2f8b67e76203fdbaa9f88deccd89b5ed41f7097c202b920484fd0 F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 F src/select.c 6ddd86a7272ff1f443bd9efcbb0f5ab590674d4c732e4cb8c3d5dd8e3a70cae6 -F src/shell.c.in c27ee0cd27e17db69257597f927301532a9f019445e3526828c78d348b6f0786 +F src/shell.c.in ffd3de9cb7294919fe1b56c49f9d62fc4b049015c4727c934f3d1880128c56e3 F src/sqliteInt.h 0a13c93b250270c5876da65c21963eaca60c5fc55271c313d5f6cf20547134af F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 F src/trigger.c 6b1472e6b5bbca71e13f95c61ebcd0b255450352de8254a42c40222020b7ac43 @@ -28,7 +28,7 @@ F test/where.test f5e62453537e5b335b69f3b09f8a02ce3328289fad5d866e25371284b837d7 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c F test/without_rowid3.test 96426a6c9a2a5cf62bbe55ea1ad038eaaf4bf743f40a1ad517233b8e5a3d4339 -P a58a6d6fb241a50c4c7c9af8a9c65bc4746e905b2ae12290c7182afa944053a2 -R 384b84d5739143259cb7eea7bb108567 +P 95379da0e1ad5110648a5b3af24e7caab66a6f1ad6efdf374c83ae4ef1fed515 +R 7e790a0cce062c1755f55b7e661415e2 U drh -Z 99099ae802c1c7d548d28a65968661d6 +Z 7c2c29d35a69f3e3cd4c13d57f6827c3 diff --git a/manifest.uuid b/manifest.uuid index 4c7bec9a51..887f7e7e6e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -95379da0e1ad5110648a5b3af24e7caab66a6f1ad6efdf374c83ae4ef1fed515 \ No newline at end of file +f3bd689336fecaa1e2928b826c6aedb0178d322f4633ac429dd1ae6fbc08e7f1 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 15f8c5e659..c527942212 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3137,7 +3137,6 @@ static void exec_prepared_stmt_columnar( } } for(i=nColumn, j=0; icMode!=MODE_Column ){ utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| "); } @@ -3149,6 +3148,7 @@ static void exec_prepared_stmt_columnar( if( j==nColumn-1 ){ utf8_printf(p->out, "%s", rowSep); j = -1; + if( seenInterrupt ) goto columnar_end; }else{ utf8_printf(p->out, "%s", colSep); } @@ -3159,6 +3159,9 @@ static void exec_prepared_stmt_columnar( print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14); } columnar_end: + if( seenInterrupt ){ + utf8_printf(p->out, "Interrupt\n"); + } sqlite3_free_table(azData); } From 74bbd37dae20ce353abf2b593f24d24713465be3 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 16 Jun 2020 19:51:56 +0000 Subject: [PATCH 164/224] Add new file doc/wal-lock.md, containing notes on wal-mode blocking locks. FossilOrigin-Name: c6b1d3a385751633d3ac1853e13d5e847185dd6432fb8b960a4080f61357c08c --- doc/wal-lock.md | 88 +++++++++++++++++++++++++++++++++++++++++++++++++ manifest | 13 ++++---- manifest.uuid | 2 +- 3 files changed, 96 insertions(+), 7 deletions(-) create mode 100644 doc/wal-lock.md diff --git a/doc/wal-lock.md b/doc/wal-lock.md new file mode 100644 index 0000000000..d74bb88b63 --- /dev/null +++ b/doc/wal-lock.md @@ -0,0 +1,88 @@ +# Wal-Mode Blocking Locks + +On some Unix-like systems, SQLite may be configured to use POSIX blocking locks +by: + + * building the library with SQLITE\_ENABLE\_SETLK\_TIMEOUT defined, and + * configuring a timeout in ms using the sqlite3\_busy\_timeout() API. + +Blocking locks may be advantageous as (a) waiting database clients do not +need to continuously poll the database lock, and (b) using blocking locks +facilitates transfer of OS priority between processes when a high priority +process is blocked by a lower priority one. + +Only read/write clients use blocking locks. Clients that have read-only access +to the \*-shm file nevery use blocking locks. + +Threads or processes that access a single database at a time never deadlock as +a result of blocking database locks. But it is of course possible for threads +that lock multiple databases simultaneously to do so. In most cases the OS will +detect the deadlock and return an error. + +## Wal Recovery + +Wal database "recovery" is a process required when the number of connected +database clients changes from zero to one. In this case, a client is +considered to connect to the database when it first reads data from it. +Before recovery commences, an exclusive WRITER lock is taken. + +Without blocking locks, if two clients attempt recovery simultaneously, one +fails to obtain the WRITER lock and either invokes the busy-handler callback or +returns SQLITE\_BUSY to the user. With blocking locks configured, the second +client blocks on the WRITER lock. + +## Database Readers + +Usually, read-only are not blocked by any other database clients, so they +have no need of blocking locks. + +If a read-only transaction is being opened on a snapshot, the CHECKPOINTER +lock is required briefly as part of opening the transaction (to check that a +checkpointer is not currently overwriting the snapshot being opened). A +blocking lock is used to obtain the CHECKPOINTER lock in this case. A snapshot +opener may therefore block on and transfer priority to a checkpointer in some +cases. + +## Database Writers + +A database writer must obtain the exclusive WRITER lock. It uses a blocking +lock to do so if any of the following are true: + + * the transaction is an implicit one consisting of a single DML or DDL + statement, or + * the transaction is opened using BEGIN IMMEDIATE or BEGIN EXCLUSIVE, or + * the first SQL statement executed following the BEGIN command is a DML or + DDL statement (not a read-only statement like a SELECT). + +In other words, in all cases except when an open read-transaction is upgraded +to a write-transaction. In that case a non-blocking lock is used. + +## Database Checkpointers + +Database checkpointers takes the following locks, in order: + + * The exclusive CHECKPOINTER lock. + * The exclusive WRITER lock (FULL, RESTART and TRUNCATE only). + * Exclusive lock on read-mark slots 1-N. These are immediately released after being taken. + * Exclusive lock on read-mark 0. + * Exclusive lock on read-mark slots 1-N again. These are immediately released + after being taken (RESTART and TRUNCATE only). + +All of the above use blocking locks. + +## Summary + +With blocking locks configured, the only cases in which clients should see an +SQLITE\_BUSY error are: + + * if the OS does not grant a blocking lock before the configured timeout + expires, and + * when an open read-transaction is upgraded to a write-transaction. + +In all other cases the blocking locks implementation should prevent clients +from having to handle SQLITE\_BUSY errors and facilitate appropriate transfer +of priorities between competing clients. + +Clients that lock multiple databases simultaneously must be wary of deadlock. + + diff --git a/manifest b/manifest index c5528e1a41..1c62e7fa0f 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,9 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C In\sthe\sCLI,\sonly\sinterrupt\stabular\soutputs\sat\sthe\send\sof\sa\sline.\s\sAnd\sprint\n"Interrupt"\son\sa\sline\safter\sstopping\sthe\soutput. -D 2020-06-16T17:34:40.898 +C Add\snew\sfile\sdoc/wal-lock.md,\scontaining\snotes\son\swal-mode\sblocking\slocks. +D 2020-06-16T19:51:56.187 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c +F doc/wal-lock.md 781726aaba20bafeceb7ba9f91d5c98c6731691b30c954e37cf0b49a053d461d F ext/fts3/fts3.c ad3416827315a5bef8d0e23d8e90bf29940fbec23ee78aa0c5d3caed85072dec F src/alter.c b8ffe4acd48b4fe793d01901f28fd4f3b037854a0e99f0c977738556c31b9d2b F src/btree.c f3a4479b0dba3a59a1d156d973be41fc1ccb3dbdb69151c4c62a791d86c9ffe2 @@ -28,7 +29,7 @@ F test/where.test f5e62453537e5b335b69f3b09f8a02ce3328289fad5d866e25371284b837d7 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c F test/without_rowid3.test 96426a6c9a2a5cf62bbe55ea1ad038eaaf4bf743f40a1ad517233b8e5a3d4339 -P 95379da0e1ad5110648a5b3af24e7caab66a6f1ad6efdf374c83ae4ef1fed515 -R 7e790a0cce062c1755f55b7e661415e2 -U drh -Z 7c2c29d35a69f3e3cd4c13d57f6827c3 +P f3bd689336fecaa1e2928b826c6aedb0178d322f4633ac429dd1ae6fbc08e7f1 +R 20b349aca00331020aae5b577df5847f +U dan +Z 109a0399a3983dd11a4da8f364e04d14 diff --git a/manifest.uuid b/manifest.uuid index 887f7e7e6e..863cc43bb7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f3bd689336fecaa1e2928b826c6aedb0178d322f4633ac429dd1ae6fbc08e7f1 \ No newline at end of file +c6b1d3a385751633d3ac1853e13d5e847185dd6432fb8b960a4080f61357c08c \ No newline at end of file From 5d237bfab14b5bfa2036f588ddd77662e837ca91 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 17 Jun 2020 14:14:11 +0000 Subject: [PATCH 165/224] Fix a problem with retrying constraint failures within sqlite3changeset_apply() calls with the SQLITE_CHANGESET_INVERT flag is set. FossilOrigin-Name: d73e857b833dfc29400049ca7f01ca465f980466e3aa67214c3c5e5573181419 --- ext/session/session_common.tcl | 4 ++-- ext/session/sessioninvert.test | 24 ++++++++++++++++++++++++ ext/session/sqlite3session.c | 6 +++++- manifest | 13 ++++++++----- manifest.uuid | 2 +- 5 files changed, 40 insertions(+), 9 deletions(-) diff --git a/ext/session/session_common.tcl b/ext/session/session_common.tcl index ceffdad4ba..c52ac457c0 100644 --- a/ext/session/session_common.tcl +++ b/ext/session/session_common.tcl @@ -172,8 +172,8 @@ proc compare_db {db1 db2} { set data1 [$db1 eval $sql] set data2 [$db2 eval $sql] if {$data1 != $data2} { - puts "$data1" - puts "$data2" + puts "$db1: $data1" + puts "$db2: $data2" error "table $tbl data mismatch" } } diff --git a/ext/session/sessioninvert.test b/ext/session/sessioninvert.test index 49205f6b26..b7c157d2e7 100644 --- a/ext/session/sessioninvert.test +++ b/ext/session/sessioninvert.test @@ -155,5 +155,29 @@ do_test 3.2 { compare_db db db2 } {} +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 4.0 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b UNIQUE); + INSERT INTO t1 VALUES(1, 'one'); + INSERT INTO t1 VALUES(2, 'two'); + INSERT INTO t1 VALUES(3, 'three'); + INSERT INTO t1 VALUES(4, 'four'); +} + +do_invert_test 4.1 { + DELETE FROM t1; + INSERT INTO t1 VALUES(1, 'two'); + INSERT INTO t1 VALUES(2, 'five'); + INSERT INTO t1 VALUES(3, 'one'); + INSERT INTO t1 VALUES(4, 'three'); +} { + {UPDATE t1 0 X. {i 1 t two} {{} {} t one}} + {UPDATE t1 0 X. {i 2 t five} {{} {} t two}} + {UPDATE t1 0 X. {i 3 t one} {{} {} t three}} + {UPDATE t1 0 X. {i 4 t three} {{} {} t four}} +} + finish_test diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index 78cc5875cd..cb350ab2d4 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -3479,6 +3479,7 @@ struct SessionApplyCtx { u8 *abPK; /* Boolean array - true if column is in PK */ int bStat1; /* True if table is sqlite_stat1 */ int bDeferConstraints; /* True to defer constraints */ + int bInvertConstraints; /* Invert when iterating constraints buffer */ SessionBuffer constraints; /* Deferred constraints are stored here */ SessionBuffer rebase; /* Rebase information (if any) here */ u8 bRebaseStarted; /* If table header is already in rebase */ @@ -4251,7 +4252,9 @@ static int sessionRetryConstraints( SessionBuffer cons = pApply->constraints; memset(&pApply->constraints, 0, sizeof(SessionBuffer)); - rc = sessionChangesetStart(&pIter2, 0, 0, cons.nBuf, cons.aBuf, 0); + rc = sessionChangesetStart( + &pIter2, 0, 0, cons.nBuf, cons.aBuf, pApply->bInvertConstraints + ); if( rc==SQLITE_OK ){ size_t nByte = 2*pApply->nCol*sizeof(sqlite3_value*); int rc2; @@ -4318,6 +4321,7 @@ static int sessionChangesetApply( pIter->in.bNoDiscard = 1; memset(&sApply, 0, sizeof(sApply)); sApply.bRebase = (ppRebase && pnRebase); + sApply.bInvertConstraints = !!(flags & SQLITE_CHANGESETAPPLY_INVERT); sqlite3_mutex_enter(sqlite3_db_mutex(db)); if( (flags & SQLITE_CHANGESETAPPLY_NOSAVEPOINT)==0 ){ rc = sqlite3_exec(db, "SAVEPOINT changeset_apply", 0, 0, 0); diff --git a/manifest b/manifest index 1c62e7fa0f..08766c3872 100644 --- a/manifest +++ b/manifest @@ -1,10 +1,13 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Add\snew\sfile\sdoc/wal-lock.md,\scontaining\snotes\son\swal-mode\sblocking\slocks. -D 2020-06-16T19:51:56.187 +C Fix\sa\sproblem\swith\sretrying\sconstraint\sfailures\swithin\ssqlite3changeset_apply()\scalls\swith\sthe\sSQLITE_CHANGESET_INVERT\sflag\sis\sset. +D 2020-06-17T14:14:11.666 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c F doc/wal-lock.md 781726aaba20bafeceb7ba9f91d5c98c6731691b30c954e37cf0b49a053d461d F ext/fts3/fts3.c ad3416827315a5bef8d0e23d8e90bf29940fbec23ee78aa0c5d3caed85072dec +F ext/session/session_common.tcl f613174665456b2d916ae8df3e5735092a1c1712f36f46840172e9a01e8cc53e +F ext/session/sessioninvert.test 04075517a9497a80d39c495ba6b44f3982c7371129b89e2c52219819bc105a25 +F ext/session/sqlite3session.c fc8c6c13dc0456943ff24abf574ced10418eec66a548c97d3eafbebe9fc5e908 F src/alter.c b8ffe4acd48b4fe793d01901f28fd4f3b037854a0e99f0c977738556c31b9d2b F src/btree.c f3a4479b0dba3a59a1d156d973be41fc1ccb3dbdb69151c4c62a791d86c9ffe2 F src/build.c 8245e69aa1a2f8b67e76203fdbaa9f88deccd89b5ed41f7097c202b920484fd0 @@ -29,7 +32,7 @@ F test/where.test f5e62453537e5b335b69f3b09f8a02ce3328289fad5d866e25371284b837d7 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c F test/without_rowid3.test 96426a6c9a2a5cf62bbe55ea1ad038eaaf4bf743f40a1ad517233b8e5a3d4339 -P f3bd689336fecaa1e2928b826c6aedb0178d322f4633ac429dd1ae6fbc08e7f1 -R 20b349aca00331020aae5b577df5847f +P c6b1d3a385751633d3ac1853e13d5e847185dd6432fb8b960a4080f61357c08c +R 1c31ce9492a1552b437bdc6502d1c44a U dan -Z 109a0399a3983dd11a4da8f364e04d14 +Z 7c6b85ada24210dbbf9cdb2233bd591e diff --git a/manifest.uuid b/manifest.uuid index 863cc43bb7..47d4d0968d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c6b1d3a385751633d3ac1853e13d5e847185dd6432fb8b960a4080f61357c08c \ No newline at end of file +d73e857b833dfc29400049ca7f01ca465f980466e3aa67214c3c5e5573181419 \ No newline at end of file From 0ad1b3284a241336fee692fc555b2ca5567e043b Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 17 Jun 2020 14:54:06 +0000 Subject: [PATCH 166/224] Fix an assert() in fts3 that could fail when processing a corrupt record. FossilOrigin-Name: 4adc0a1b0d84c2df6d6bf0d5d9d3fa9f7d048af8d232c4beb77518727890f212 --- ext/fts3/fts3.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fts3corrupt4.test | 11 +++++++++++ 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index d03e7eefb3..afea064cb2 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -2338,7 +2338,7 @@ static int fts3PoslistPhraseMerge( /* Never set both isSaveLeft and isExact for the same invocation. */ assert( isSaveLeft==0 || isExact==0 ); - assert( p!=0 && *p1!=0 && *p2!=0 ); + assert_fts3_nc( p!=0 && *p1!=0 && *p2!=0 ); if( *p1==POS_COLUMN ){ p1++; p1 += fts3GetVarint32(p1, &iCol1); diff --git a/manifest b/manifest index 08766c3872..c0d32fa03d 100644 --- a/manifest +++ b/manifest @@ -1,10 +1,10 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Fix\sa\sproblem\swith\sretrying\sconstraint\sfailures\swithin\ssqlite3changeset_apply()\scalls\swith\sthe\sSQLITE_CHANGESET_INVERT\sflag\sis\sset. -D 2020-06-17T14:14:11.666 +C Fix\san\sassert()\sin\sfts3\sthat\scould\sfail\swhen\sprocessing\sa\scorrupt\srecord. +D 2020-06-17T14:54:06.215 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c F doc/wal-lock.md 781726aaba20bafeceb7ba9f91d5c98c6731691b30c954e37cf0b49a053d461d -F ext/fts3/fts3.c ad3416827315a5bef8d0e23d8e90bf29940fbec23ee78aa0c5d3caed85072dec +F ext/fts3/fts3.c b0e864379ff9bdc375b6a1c5e401f79f993cc9387978aa11ba87b0c1ef73ce2e F ext/session/session_common.tcl f613174665456b2d916ae8df3e5735092a1c1712f36f46840172e9a01e8cc53e F ext/session/sessioninvert.test 04075517a9497a80d39c495ba6b44f3982c7371129b89e2c52219819bc105a25 F ext/session/sqlite3session.c fc8c6c13dc0456943ff24abf574ced10418eec66a548c97d3eafbebe9fc5e908 @@ -23,7 +23,7 @@ F src/vdbe.c 985f92b5131d62654c3c26062a2e55b1c8f71c2e10497e23021c6650d5c392b3 F src/vtab.c 33ecf1d8b0fd1508fe23be9da40e48909c86a13db2725e273177eb47db2fc265 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c7880bb0c67d0 -F test/fts3corrupt4.test 000cc36cf50f61e51a3ae35748ea883674a9d8b797880975e10866849eefb404 +F test/fts3corrupt4.test 4664c72bb49400b6f3d86627760129ee7962e4834869909c55037ff21ccd36b8 F test/fuzzdata8.db e7a6a1444adb7bd10dec870234979ddd63173314c7345e3def2d892dcf99d48f F test/istrue.test 06f92ea38750fa74df7dbbe6920205251c2310861fbbe23a3adfa918a2e2ba74 F test/select3.test c49fbb758903f3718e2de5aa4655eda4838131cbea24a86db908f8b6889aa68c @@ -32,7 +32,7 @@ F test/where.test f5e62453537e5b335b69f3b09f8a02ce3328289fad5d866e25371284b837d7 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c F test/without_rowid3.test 96426a6c9a2a5cf62bbe55ea1ad038eaaf4bf743f40a1ad517233b8e5a3d4339 -P c6b1d3a385751633d3ac1853e13d5e847185dd6432fb8b960a4080f61357c08c -R 1c31ce9492a1552b437bdc6502d1c44a +P d73e857b833dfc29400049ca7f01ca465f980466e3aa67214c3c5e5573181419 +R fad1962efa665077ebb220317fee79c1 U dan -Z 7c6b85ada24210dbbf9cdb2233bd591e +Z 22b7adc607746dfc70b52eaa1489f89e diff --git a/manifest.uuid b/manifest.uuid index 47d4d0968d..1ddf30e06a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d73e857b833dfc29400049ca7f01ca465f980466e3aa67214c3c5e5573181419 \ No newline at end of file +4adc0a1b0d84c2df6d6bf0d5d9d3fa9f7d048af8d232c4beb77518727890f212 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index c79a5a2379..27b4eb53b6 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -6112,4 +6112,15 @@ do_execsql_test 40.2 { set sqlite_fts3_enable_parentheses $saved +#------------------------------------------------------------------------- +reset_db +do_execsql_test 41.1 { + CREATE VIRTUAL TABLE t1 USING fts3(a,b,c); + INSERT INTO t1_segdir VALUES(0,0,0,0,'0 835',X'000130120106000106000106001f030001030001030000083230313630363039090107000107000107000001340901050001050001050000013509010400010400010400010730303030303030091c0400010400010400000662696e6172793c0301020200030102020003010202000301020200030102020003010202000301020200030102020003010202000301020200030102020003010202000008636f3870696c657209010200010200010200000664627374617409070300010300010300010465627567090402000102000102000006656e61626c653f07020001020001020001020001020001020001020001020001020001030001010002020001020001020001020001120001020001020001020001020001020001087874656e73696f6e091f0400010400010400000466747334090a0300010300010400030135090d03000103000103000003676363090103000103000103000106656f706f6c790910030001030001030000056a736f6e310913030001030001030000046c6f6164091f030001030001030000036d6178091c02000102000102000105656d6f7279091c03000103000103000304737973350916030001030001030000066e6f636173653c02010202000301020200030102020003010202000301020200030102020003010202000301020200030102020003010202000301020200030102020000046f6d6974091f020001020001020000057274726565091903000103000103000302696d3c010102020003010202000301020200030102020003010202000301020200030102020003010202000301020200030102020003010202000301020200000a746872656164736166650922020001020001020000047674616209070400010400010400000178b401010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200'); +} + +do_execsql_test 41.2 { + SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'rtree ner "json1^enable"'; +} + finish_test From 877859f2d36990bc06b4a37b82c9739e916c10d5 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 17 Jun 2020 20:29:56 +0000 Subject: [PATCH 167/224] Fix an assert() that could fail when operating on a database with a corrupt schema. FossilOrigin-Name: 4a340c9bc7d939efc947e3b17ca79314482f74368b15567dd089d40e4270890e --- manifest | 13 +++---- manifest.uuid | 2 +- src/btree.c | 4 ++- test/corruptL.test | 84 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c0d32fa03d..b8bd183351 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Fix\san\sassert()\sin\sfts3\sthat\scould\sfail\swhen\sprocessing\sa\scorrupt\srecord. -D 2020-06-17T14:54:06.215 +C Fix\san\sassert()\sthat\scould\sfail\swhen\soperating\son\sa\sdatabase\swith\sa\scorrupt\sschema. +D 2020-06-17T20:29:56.720 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c F doc/wal-lock.md 781726aaba20bafeceb7ba9f91d5c98c6731691b30c954e37cf0b49a053d461d @@ -9,7 +9,7 @@ F ext/session/session_common.tcl f613174665456b2d916ae8df3e5735092a1c1712f36f468 F ext/session/sessioninvert.test 04075517a9497a80d39c495ba6b44f3982c7371129b89e2c52219819bc105a25 F ext/session/sqlite3session.c fc8c6c13dc0456943ff24abf574ced10418eec66a548c97d3eafbebe9fc5e908 F src/alter.c b8ffe4acd48b4fe793d01901f28fd4f3b037854a0e99f0c977738556c31b9d2b -F src/btree.c f3a4479b0dba3a59a1d156d973be41fc1ccb3dbdb69151c4c62a791d86c9ffe2 +F src/btree.c e6db473ab10c52d1bc51dd8d21795dde07b7502426314b91d9d246a714e50416 F src/build.c 8245e69aa1a2f8b67e76203fdbaa9f88deccd89b5ed41f7097c202b920484fd0 F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 @@ -22,6 +22,7 @@ F src/vacuum.c b196258ea36cfed5f455f18519345613bab04daf0e038a63ee715407c5a7ae9e F src/vdbe.c 985f92b5131d62654c3c26062a2e55b1c8f71c2e10497e23021c6650d5c392b3 F src/vtab.c 33ecf1d8b0fd1508fe23be9da40e48909c86a13db2725e273177eb47db2fc265 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c +F test/corruptL.test 16564fa7961fcce242945177c9bdaa5cb5dc85d6248612dbe4b927d059eb6014 F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c7880bb0c67d0 F test/fts3corrupt4.test 4664c72bb49400b6f3d86627760129ee7962e4834869909c55037ff21ccd36b8 F test/fuzzdata8.db e7a6a1444adb7bd10dec870234979ddd63173314c7345e3def2d892dcf99d48f @@ -32,7 +33,7 @@ F test/where.test f5e62453537e5b335b69f3b09f8a02ce3328289fad5d866e25371284b837d7 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c F test/without_rowid3.test 96426a6c9a2a5cf62bbe55ea1ad038eaaf4bf743f40a1ad517233b8e5a3d4339 -P d73e857b833dfc29400049ca7f01ca465f980466e3aa67214c3c5e5573181419 -R fad1962efa665077ebb220317fee79c1 +P 4adc0a1b0d84c2df6d6bf0d5d9d3fa9f7d048af8d232c4beb77518727890f212 +R d5c913bb4696618860d8e215a52de60c U dan -Z 22b7adc607746dfc70b52eaa1489f89e +Z 29e5aef02689c7bbd9ca814e67e739ba diff --git a/manifest.uuid b/manifest.uuid index 1ddf30e06a..8e41a9dab6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4adc0a1b0d84c2df6d6bf0d5d9d3fa9f7d048af8d232c4beb77518727890f212 \ No newline at end of file +4a340c9bc7d939efc947e3b17ca79314482f74368b15567dd089d40e4270890e \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index f9fb69f63b..0ed295e0aa 100644 --- a/src/btree.c +++ b/src/btree.c @@ -200,16 +200,18 @@ static int hasSharedCacheTableLock( ** table. */ if( isIndex ){ HashElem *p; + int bSeen = 0; for(p=sqliteHashFirst(&pSchema->idxHash); p; p=sqliteHashNext(p)){ Index *pIdx = (Index *)sqliteHashData(p); if( pIdx->tnum==(int)iRoot ){ - if( iTab ){ + if( bSeen ){ /* Two or more indexes share the same root page. There must ** be imposter tables. So just return true. The assert is not ** useful in that case. */ return 1; } iTab = pIdx->pTable->tnum; + bSeen = 1; } } }else{ diff --git a/test/corruptL.test b/test/corruptL.test index 67d308abca..3c26f1d215 100644 --- a/test/corruptL.test +++ b/test/corruptL.test @@ -1182,5 +1182,89 @@ do_catchsql_test 14.2 { ALTER TABLE t1 RENAME TO alkjalkjdfiiiwuer987lkjwer82mx97sf98788s9789s; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 15.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-3afa1ca9e9c1bd.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 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 06 0e 88 00 0f b8 0f 6d ...............m +| 112: 0f 3a 0f 0b 0e d5 0e 88 01 00 00 00 00 00 00 00 .:.............. +| 3712: 00 00 00 00 00 00 00 00 4b 06 06 17 25 25 01 5b ........K...%%.[ +| 3728: 74 61 62 6c 65 73 71 6c 69 74 65 5f 73 74 61 74 tablesqlite_stat +| 3744: 31 73 71 6c 69 74 65 5f 73 74 61 74 31 07 43 52 1sqlite_stat1.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 EATE TABLE sqlit +| 3776: 65 5f 73 74 61 74 31 28 74 62 6c 2c 69 64 78 2c e_stat1(tbl,idx, +| 3792: 73 74 61 74 29 34 05 06 17 13 11 01 53 69 6e 64 stat)4......Sind +| 3808: 65 78 63 31 63 63 31 06 43 52 45 41 54 45 20 55 exc1cc1.CREATE U +| 3824: 4e 49 51 55 45 20 49 4e 44 45 58 20 63 31 63 20 NIQUE INDEX c1c +| 3840: 4f 4e 20 63 31 28 63 2c 20 62 29 2d 04 06 17 13 ON c1(c, b)-.... +| 3856: 11 01 45 69 6e 64 65 78 63 31 64 63 31 05 43 52 ..Eindexc1dc1.CR +| 3872: 45 41 54 45 20 49 4e 44 45 58 20 63 31 64 20 4f EATE INDEX c1d O +| 3888: 4e 20 63 31 28 64 2c 20 62 29 31 03 06 17 13 11 N c1(d, b)1..... +| 3904: 01 4d 69 6e 64 65 78 62 31 63 62 31 05 43 52 45 .Mindexb1cb1.CRE +| 3920: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 ATE UNIQUE INDEX +| 3936: 20 62 31 63 20 4f 4e 20 62 31 28 63 29 49 02 06 b1c ON b1(c)I.. +| 3952: 17 11 11 0f 7f 74 61 62 6c 65 63 31 63 31 03 43 .....tablec1c1.C +| 3968: 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28 61 REATE TABLE c1(a +| 3984: 20 49 4e 54 20 50 52 49 4d 41 52 59 20 4b 45 59 INT PRIMARY KEY +| 4000: 2c 20 62 2c 20 63 2c 20 64 29 20 57 49 54 48 4f , b, c, d) WITHO +| 4016: 55 54 20 52 4f 57 49 44 46 01 06 17 11 11 01 79 UT ROWIDF......y +| 4032: 74 61 62 6c 65 62 31 62 31 02 43 52 45 41 54 45 tableb1b1.CREATE +| 4048: 20 54 41 42 4c 45 20 62 31 28 61 20 49 4e 54 20 TABLE b1(a INT +| 4064: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 PRIMARY KEY, b, +| 4080: 63 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 c) WITHOUT ROWID +| page 2 offset 4096 +| 0: 0a 00 00 00 07 0f ca 00 0f fa 0f f2 0f ea 0f e2 ................ +| 16: 0f da 00 00 00 01 00 00 00 00 00 00 00 00 00 00 ................ +| 4032: 00 00 00 00 00 00 00 00 00 00 07 04 01 0f 01 06 ................ +| 4048: 67 07 07 04 01 0f 01 06 66 06 07 04 01 0f 01 05 g.......f....... +| 4064: 65 05 07 04 01 0f 01 04 64 04 07 04 01 0f 01 03 e.......d....... +| 4080: 63 03 07 04 01 0f 01 02 62 0f 05 04 09 0f 09 61 c.......b......a +| page 3 offset 8192 +| 0: 0a 00 00 00 07 0f bd 00 0f f9 0f ef 0f e5 0f db ................ +| 16: 0f d1 0f c7 0f bd 00 00 00 00 01 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 09 05 01 ................ +| 4032: 0f 01 01 07 61 07 07 09 05 01 0f 01 01 06 61 06 ....a.........a. +| 4048: 06 09 05 01 0f 01 01 05 61 05 05 09 05 01 0f 01 ........a....... +| 4064: 01 04 61 04 04 09 05 01 0f 01 01 03 61 03 03 09 ..a.........a... +| 4080: 05 01 0f 01 01 02 61 0f 02 06 05 09 0f 09 09 61 ......a........a +| page 4 offset 12288 +| 0: 0a 00 00 00 07 0f d8 00 0f fc 0f f0 0f ea 0f e4 ................ +| 16: 0f de 0f d8 0f f6 00 00 00 00 00 00 00 00 00 00 ................ +| 4048: 00 00 00 00 00 00 00 00 05 03 01 01 07 07 05 03 ................ +| 4064: 01 01 06 06 05 03 01 01 05 05 05 03 01 01 04 04 ................ +| 4080: 05 03 01 01 03 03 05 03 01 01 0f 02 03 03 09 09 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 07 0f ca 00 0f fa 0f f2 0f ea 0f 00 ................ +| 4032: 00 00 00 00 00 00 00 00 00 00 07 04 01 0f 01 07 ................ +| 4048: 61 07 07 04 01 0f 01 06 61 06 07 04 01 0f 01 05 a.......a....... +| 4064: 61 05 07 04 01 1f 01 04 61 04 07 04 01 0f 01 03 a.......a....... +| 4080: 61 03 07 04 01 0f 01 02 61 02 05 04 09 0f 09 61 a.......a......a +| page 6 offset 20480 +| 0: 0a 00 00 00 07 0f ca 00 0f fa 0f ea 0f e2 00 00 ................ +| 4032: 00 00 00 00 00 00 00 00 00 00 07 04 01 0f 01 07 ................ +| 4048: 61 07 07 04 01 0f 01 06 61 06 07 04 01 0f 01 05 a.......a....... +| 4064: 61 05 07 04 01 0f 01 04 61 04 07 04 01 0f 01 03 a.......a....... +| 4080: 61 03 07 04 01 0f 01 0f 61 02 05 04 09 0f 09 61 a.......a......a +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f 1c 00 0f f0 0f e0 0f d3 0f c5 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0b 05 04 11 11 13 62 31 ..............b1 +| 4032: 62 31 37 20 31 0c 04 04 11 13 13 62 31 62 31 63 b17 1......b1b1c +| 4048: 37 20 31 0b 03 04 11 11 13 63 31 63 31 37 20 31 7 1......c1c17 1 +| 4064: 0e 02 04 11 13 07 63 31 63 31 64 37 20 31 20 31 ......c1c1d7 1 1 +| 4080: 0e 01 04 11 13 17 63 31 63 31 63 37 20 31 00 00 ......c1c1c7 1.. +| end crash-3afa1ca9e9c1bd.db +}]} {} + +do_execsql_test 15.1 { + UPDATE c1 SET c= NOT EXISTS(SELECT 1 FROM c1 ORDER BY (SELECT 1 FROM c1 ORDER BY a)) +10 WHERE d BETWEEN 4 AND 7; +} {} finish_test From ccb2113a622f4d119f97185a59d088910cf827b7 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 19 Jun 2020 11:34:57 +0000 Subject: [PATCH 168/224] Refactoring various names. No changes in the resulting machine code. FossilOrigin-Name: 7bb08b1bfcf184e4b59c8c9028926a0052612ff6a6731914ccdb8dee07ea4a98 --- manifest | 33 ++++++++++++----- manifest.uuid | 2 +- src/btree.c | 8 ++--- src/btreeInt.h | 2 +- src/date.c | 6 ++-- src/loadext.c | 10 +++--- src/main.c | 6 ++-- src/mutex_unix.c | 2 +- src/mutex_w32.c | 2 +- src/notify.c | 16 ++++----- src/os.c | 8 ++--- src/os_unix.c | 8 ++--- src/os_win.c | 8 ++--- src/pager.c | 6 ++-- src/sqlite.h.in | 26 ++++++++------ src/sqliteInt.h | 18 ++++------ src/test1.c | 2 +- src/test_multiplex.c | 2 +- src/test_osinst.c | 4 +-- src/vdbeaux.c | 84 ++++++++++++++++++++++---------------------- 20 files changed, 135 insertions(+), 118 deletions(-) diff --git a/manifest b/manifest index b8bd183351..f9d8b2a0cf 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Fix\san\sassert()\sthat\scould\sfail\swhen\soperating\son\sa\sdatabase\swith\sa\scorrupt\sschema. -D 2020-06-17T20:29:56.720 +C Refactoring\svarious\snames.\s\sNo\schanges\sin\sthe\sresulting\smachine\scode. +D 2020-06-19T11:34:57.555 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c F doc/wal-lock.md 781726aaba20bafeceb7ba9f91d5c98c6731691b30c954e37cf0b49a053d461d @@ -9,17 +9,32 @@ F ext/session/session_common.tcl f613174665456b2d916ae8df3e5735092a1c1712f36f468 F ext/session/sessioninvert.test 04075517a9497a80d39c495ba6b44f3982c7371129b89e2c52219819bc105a25 F ext/session/sqlite3session.c fc8c6c13dc0456943ff24abf574ced10418eec66a548c97d3eafbebe9fc5e908 F src/alter.c b8ffe4acd48b4fe793d01901f28fd4f3b037854a0e99f0c977738556c31b9d2b -F src/btree.c e6db473ab10c52d1bc51dd8d21795dde07b7502426314b91d9d246a714e50416 +F src/btree.c d9d7813a28f9c337908858aa46d6129d43cd790bc87c62146cd6915bb412150c +F src/btreeInt.h 401f0549caa02cce8791baeb673aa570ee35c89ce53a7628a3d21804784c23d0 F src/build.c 8245e69aa1a2f8b67e76203fdbaa9f88deccd89b5ed41f7097c202b920484fd0 +F src/date.c 9f1d31ef1bfdc732a83459e05770f6d5aeb57a7e323b48f1798cb870125601ef F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 +F src/loadext.c 436af4968c6954d304fce9efa12719367bd8f37b19b93b71d6ad607e85adbb47 +F src/main.c 84b2ddb649a4fb470abaa980ff41242819812b6a6c08fc0baa2c024b175bc76b +F src/mutex_unix.c dd2b3f1cc1863079bc1349ac0fec395a500090c4fe4e11ab775310a49f2f956d +F src/mutex_w32.c caa50e1c0258ac4443f52e00fe8aaea73b6d0728bd8856bedfff822cae418541 +F src/notify.c 89a97dc854c3aa62ad5f384ef50c5a4a11d70fcc69f86de3e991573421130ed6 +F src/os.c 80e4cf3e5da06be03ca641661e331ce60eeeeabf0d7354dbb1c0e166d0eedbbe +F src/os_unix.c 94bd41f5c058db79ccdf7c51627b8917d98423c0899ec5e5b9b3a6fd36e8b2ff +F src/os_win.c 92f7ed3dd12fcc30b65815fa524fb7c4c6f9a1c9aa44c4b7c46759fc42f66105 +F src/pager.c 7d6cff7a2aca0aacedb15eb67b4a7fb67c39725a1e02d1a6a7bb6573a61a51a1 F src/select.c 6ddd86a7272ff1f443bd9efcbb0f5ab590674d4c732e4cb8c3d5dd8e3a70cae6 F src/shell.c.in ffd3de9cb7294919fe1b56c49f9d62fc4b049015c4727c934f3d1880128c56e3 -F src/sqliteInt.h 0a13c93b250270c5876da65c21963eaca60c5fc55271c313d5f6cf20547134af -F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 +F src/sqlite.h.in d2c03414a8ee5d4a6855c04dd7cd5998e45139b0fe66b65bae86d4223edd091f +F src/sqliteInt.h 5f9b119efd2c628780b5cfb628170c6c2393a1ca46e75b0fe83abb9660bf02c9 +F src/test1.c 8442b50ecbbce891a9e490e54879e6bcc540590be591451c296ec6c57640847d +F src/test_multiplex.c d0ee44ec77687b35e83fd6b9fca4c5860f603b1b407fd375be62437b79af5ae3 +F src/test_osinst.c d341f9d7613e007c8c3f7eba6cd307230047506aa8f97858c1fd21f5069616bd F src/trigger.c 6b1472e6b5bbca71e13f95c61ebcd0b255450352de8254a42c40222020b7ac43 F src/vacuum.c b196258ea36cfed5f455f18519345613bab04daf0e038a63ee715407c5a7ae9e F src/vdbe.c 985f92b5131d62654c3c26062a2e55b1c8f71c2e10497e23021c6650d5c392b3 +F src/vdbeaux.c 4c4716795d47505e25e209c45f3448810d1458fee5210fd1e3759557872de10e F src/vtab.c 33ecf1d8b0fd1508fe23be9da40e48909c86a13db2725e273177eb47db2fc265 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c F test/corruptL.test 16564fa7961fcce242945177c9bdaa5cb5dc85d6248612dbe4b927d059eb6014 @@ -33,7 +48,7 @@ F test/where.test f5e62453537e5b335b69f3b09f8a02ce3328289fad5d866e25371284b837d7 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c F test/without_rowid3.test 96426a6c9a2a5cf62bbe55ea1ad038eaaf4bf743f40a1ad517233b8e5a3d4339 -P 4adc0a1b0d84c2df6d6bf0d5d9d3fa9f7d048af8d232c4beb77518727890f212 -R d5c913bb4696618860d8e215a52de60c -U dan -Z 29e5aef02689c7bbd9ca814e67e739ba +P 4a340c9bc7d939efc947e3b17ca79314482f74368b15567dd089d40e4270890e +R 9833b56461d0ff6ff79be23099c8a427 +U drh +Z 362d8b86a61aefc35e02371751514139 diff --git a/manifest.uuid b/manifest.uuid index 8e41a9dab6..4eea227159 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4a340c9bc7d939efc947e3b17ca79314482f74368b15567dd089d40e4270890e \ No newline at end of file +7bb08b1bfcf184e4b59c8c9028926a0052612ff6a6731914ccdb8dee07ea4a98 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 0ed295e0aa..0c83bc6040 100644 --- a/src/btree.c +++ b/src/btree.c @@ -69,7 +69,7 @@ int sqlite3BtreeTrace=1; /* True to enable tracing */ ** but the test harness needs to access it so we make it global for ** test builds. ** -** Access to this variable is protected by SQLITE_MUTEX_STATIC_MASTER. +** Access to this variable is protected by SQLITE_MUTEX_STATIC_MAIN. */ #ifdef SQLITE_TEST BtShared *SQLITE_WSD sqlite3SharedCacheList = 0; @@ -2422,7 +2422,7 @@ int sqlite3BtreeOpen( #if SQLITE_THREADSAFE mutexOpen = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_OPEN); sqlite3_mutex_enter(mutexOpen); - mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); + mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); sqlite3_mutex_enter(mutexShared); #endif for(pBt=GLOBAL(BtShared*,sqlite3SharedCacheList); pBt; pBt=pBt->pNext){ @@ -2541,7 +2541,7 @@ int sqlite3BtreeOpen( pBt->nRef = 1; if( p->sharable ){ MUTEX_LOGIC( sqlite3_mutex *mutexShared; ) - MUTEX_LOGIC( mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);) + MUTEX_LOGIC( mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN);) if( SQLITE_THREADSAFE && sqlite3GlobalConfig.bCoreMutex ){ pBt->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_FAST); if( pBt->mutex==0 ){ @@ -2635,7 +2635,7 @@ static int removeFromSharingList(BtShared *pBt){ int removed = 0; assert( sqlite3_mutex_notheld(pBt->mutex) ); - MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); ) + MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); ) sqlite3_mutex_enter(pMaster); pBt->nRef--; if( pBt->nRef<=0 ){ diff --git a/src/btreeInt.h b/src/btreeInt.h index ec25b54662..2e3f7105cd 100644 --- a/src/btreeInt.h +++ b/src/btreeInt.h @@ -381,7 +381,7 @@ struct Btree { ** ** Fields in this structure are accessed under the BtShared.mutex ** mutex, except for nRef and pNext which are accessed under the -** global SQLITE_MUTEX_STATIC_MASTER mutex. The pPager field +** global SQLITE_MUTEX_STATIC_MAIN mutex. The pPager field ** may not be modified once it is initially set as long as nRef>0. ** The pSchema field may be set once under BtShared.mutex and ** thereafter is unchanged as long as nRef>0. diff --git a/src/date.c b/src/date.c index fff062fb5a..9cba27f591 100644 --- a/src/date.c +++ b/src/date.c @@ -515,7 +515,7 @@ static int osLocaltime(time_t *t, struct tm *pTm){ #if !HAVE_LOCALTIME_R && !HAVE_LOCALTIME_S struct tm *pX; #if SQLITE_THREADSAFE>0 - sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); #endif sqlite3_mutex_enter(mutex); pX = localtime(t); @@ -1211,10 +1211,10 @@ static void currentTimeFunc( #if HAVE_GMTIME_R pTm = gmtime_r(&t, &sNow); #else - sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN)); pTm = gmtime(&t); if( pTm ) memcpy(&sNow, pTm, sizeof(sNow)); - sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN)); #endif if( pTm ){ strftime(zBuf, 20, zFormat, &sNow); diff --git a/src/loadext.c b/src/loadext.c index 067c47c17f..7007e3137d 100644 --- a/src/loadext.c +++ b/src/loadext.c @@ -689,7 +689,7 @@ int sqlite3_enable_load_extension(sqlite3 *db, int onoff){ ** The following object holds the list of automatically loaded ** extensions. ** -** This list is shared across threads. The SQLITE_MUTEX_STATIC_MASTER +** This list is shared across threads. The SQLITE_MUTEX_STATIC_MAIN ** mutex must be held while accessing this list. */ typedef struct sqlite3AutoExtList sqlite3AutoExtList; @@ -731,7 +731,7 @@ int sqlite3_auto_extension( { u32 i; #if SQLITE_THREADSAFE - sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); #endif wsdAutoextInit; sqlite3_mutex_enter(mutex); @@ -769,7 +769,7 @@ int sqlite3_cancel_auto_extension( void (*xInit)(void) ){ #if SQLITE_THREADSAFE - sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); #endif int i; int n = 0; @@ -796,7 +796,7 @@ void sqlite3_reset_auto_extension(void){ #endif { #if SQLITE_THREADSAFE - sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); #endif wsdAutoextInit; sqlite3_mutex_enter(mutex); @@ -826,7 +826,7 @@ void sqlite3AutoLoadExtensions(sqlite3 *db){ for(i=0; go; i++){ char *zErrmsg; #if SQLITE_THREADSAFE - sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); #endif #ifdef SQLITE_OMIT_LOAD_EXTENSION const sqlite3_api_routines *pThunk = 0; diff --git a/src/main.c b/src/main.c index 9f99cbdf3a..6056478519 100644 --- a/src/main.c +++ b/src/main.c @@ -241,12 +241,12 @@ int sqlite3_initialize(void){ if( rc ) return rc; /* Initialize the malloc() system and the recursive pInitMutex mutex. - ** This operation is protected by the STATIC_MASTER mutex. Note that + ** This operation is protected by the STATIC_MAIN mutex. Note that ** MutexAlloc() is called for a static mutex prior to initializing the ** malloc subsystem - this implies that the allocation of a static ** mutex must not require support from the malloc subsystem. */ - MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); ) + MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); ) sqlite3_mutex_enter(pMaster); sqlite3GlobalConfig.isMutexInit = 1; if( !sqlite3GlobalConfig.isMallocInit ){ @@ -3112,7 +3112,7 @@ static int openDatabase( SQLITE_OPEN_MAIN_JOURNAL | SQLITE_OPEN_TEMP_JOURNAL | SQLITE_OPEN_SUBJOURNAL | - SQLITE_OPEN_MASTER_JOURNAL | + SQLITE_OPEN_SUPER_JOURNAL | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_FULLMUTEX | SQLITE_OPEN_WAL diff --git a/src/mutex_unix.c b/src/mutex_unix.c index 9282d28016..2afaddec69 100644 --- a/src/mutex_unix.c +++ b/src/mutex_unix.c @@ -112,7 +112,7 @@ static int pthreadMutexEnd(void){ return SQLITE_OK; } **