From fb8e71c5843e0111a6fbfd953134f9d68cd5e050 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 20 Oct 2021 11:40:34 +0000 Subject: [PATCH 01/35] Fix a case in the fts3 offsets() function where a corrupt database record could lead to dereferencing an uninitialized pointer. FossilOrigin-Name: 7b7d31a6153b1505288eb3e849d0d9ef9e88e961c7b2f918ef5582fd77990f6d --- ext/fts3/fts3.c | 4 ++-- ext/fts3/fts3Int.h | 1 + ext/fts3/fts3_expr.c | 10 +++++----- ext/fts3/fts3_snippet.c | 11 ++++------- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- 6 files changed, 23 insertions(+), 25 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 9c49afa2ed..3a6ee3bbd4 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -5337,8 +5337,8 @@ static void fts3EvalNextRow( Fts3Expr *pRight = pExpr->pRight; sqlite3_int64 iCmp = DOCID_CMP(pLeft->iDocid, pRight->iDocid); - assert( pLeft->bStart || pLeft->iDocid==pRight->iDocid ); - assert( pRight->bStart || pLeft->iDocid==pRight->iDocid ); + assert_fts3_nc( pLeft->bStart || pLeft->iDocid==pRight->iDocid ); + assert_fts3_nc( pRight->bStart || pLeft->iDocid==pRight->iDocid ); if( pRight->bEof || (pLeft->bEof==0 && iCmp<0) ){ fts3EvalNextRow(pCsr, pLeft, pRc); diff --git a/ext/fts3/fts3Int.h b/ext/fts3/fts3Int.h index 348b88387e..3a62ccc7a7 100644 --- a/ext/fts3/fts3Int.h +++ b/ext/fts3/fts3Int.h @@ -621,6 +621,7 @@ void sqlite3Fts3ExprFree(Fts3Expr *); int sqlite3Fts3ExprInitTestInterface(sqlite3 *db, Fts3Hash*); int sqlite3Fts3InitTerm(sqlite3 *db); #endif +void *sqlite3Fts3MallocZero(i64 nByte); int sqlite3Fts3OpenTokenizer(sqlite3_tokenizer *, int, const char *, int, sqlite3_tokenizer_cursor ** diff --git a/ext/fts3/fts3_expr.c b/ext/fts3/fts3_expr.c index 7a69a935f0..ea8167c595 100644 --- a/ext/fts3/fts3_expr.c +++ b/ext/fts3/fts3_expr.c @@ -122,7 +122,7 @@ static int fts3isspace(char c){ ** zero the memory before returning a pointer to it. If unsuccessful, ** return NULL. */ -static void *fts3MallocZero(sqlite3_int64 nByte){ +void *sqlite3Fts3MallocZero(sqlite3_int64 nByte){ void *pRet = sqlite3_malloc64(nByte); if( pRet ) memset(pRet, 0, nByte); return pRet; @@ -203,7 +203,7 @@ static int getNextToken( rc = pModule->xNext(pCursor, &zToken, &nToken, &iStart, &iEnd, &iPosition); if( rc==SQLITE_OK ){ nByte = sizeof(Fts3Expr) + sizeof(Fts3Phrase) + nToken; - pRet = (Fts3Expr *)fts3MallocZero(nByte); + pRet = (Fts3Expr *)sqlite3Fts3MallocZero(nByte); if( !pRet ){ rc = SQLITE_NOMEM; }else{ @@ -458,7 +458,7 @@ static int getNextNode( if( fts3isspace(cNext) || cNext=='"' || cNext=='(' || cNext==')' || cNext==0 ){ - pRet = (Fts3Expr *)fts3MallocZero(sizeof(Fts3Expr)); + pRet = (Fts3Expr *)sqlite3Fts3MallocZero(sizeof(Fts3Expr)); if( !pRet ){ return SQLITE_NOMEM; } @@ -637,7 +637,7 @@ static int fts3ExprParse( && p->eType==FTSQUERY_PHRASE && pParse->isNot ){ /* Create an implicit NOT operator. */ - Fts3Expr *pNot = fts3MallocZero(sizeof(Fts3Expr)); + Fts3Expr *pNot = sqlite3Fts3MallocZero(sizeof(Fts3Expr)); if( !pNot ){ sqlite3Fts3ExprFree(p); rc = SQLITE_NOMEM; @@ -671,7 +671,7 @@ static int fts3ExprParse( /* Insert an implicit AND operator. */ Fts3Expr *pAnd; assert( pRet && pPrev ); - pAnd = fts3MallocZero(sizeof(Fts3Expr)); + pAnd = sqlite3Fts3MallocZero(sizeof(Fts3Expr)); if( !pAnd ){ sqlite3Fts3ExprFree(p); rc = SQLITE_NOMEM; diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index 68bcd07e74..555135ce61 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -138,9 +138,8 @@ static MatchinfoBuffer *fts3MIBufferNew(size_t nElem, const char *zMatchinfo){ + sizeof(MatchinfoBuffer); sqlite3_int64 nStr = strlen(zMatchinfo); - pRet = sqlite3_malloc64(nByte + nStr+1); + pRet = sqlite3Fts3MallocZero(nByte + nStr+1); if( pRet ){ - memset(pRet, 0, nByte); pRet->aMatchinfo[0] = (u8*)(&pRet->aMatchinfo[1]) - (u8*)pRet; pRet->aMatchinfo[1+nElem] = pRet->aMatchinfo[0] + sizeof(u32)*((int)nElem+1); @@ -544,11 +543,10 @@ static int fts3BestSnippet( ** the required space using malloc(). */ nByte = sizeof(SnippetPhrase) * nList; - sIter.aPhrase = (SnippetPhrase *)sqlite3_malloc64(nByte); + sIter.aPhrase = (SnippetPhrase *)sqlite3Fts3MallocZero(nByte); if( !sIter.aPhrase ){ return SQLITE_NOMEM; } - memset(sIter.aPhrase, 0, nByte); /* Initialize the contents of the SnippetIter object. Then iterate through ** the set of phrases in the expression to populate the aPhrase[] array. @@ -1151,9 +1149,8 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ /* Allocate and populate the array of LcsIterator objects. The array ** contains one element for each matchable phrase in the query. **/ - aIter = sqlite3_malloc64(sizeof(LcsIterator) * pCsr->nPhrase); + aIter = sqlite3Fts3MallocZero(sizeof(LcsIterator) * pCsr->nPhrase); if( !aIter ) return SQLITE_NOMEM; - memset(aIter, 0, sizeof(LcsIterator) * pCsr->nPhrase); (void)fts3ExprIterate(pCsr->pExpr, fts3MatchinfoLcsCb, (void*)aIter); for(i=0; inPhrase; i++){ @@ -1614,7 +1611,7 @@ void sqlite3Fts3Offsets( if( rc!=SQLITE_OK ) goto offsets_out; /* Allocate the array of TermOffset iterators. */ - sCtx.aTerm = (TermOffset *)sqlite3_malloc64(sizeof(TermOffset)*nToken); + sCtx.aTerm = (TermOffset *)sqlite3Fts3MallocZero(sizeof(TermOffset)*nToken); if( 0==sCtx.aTerm ){ rc = SQLITE_NOMEM; goto offsets_out; diff --git a/manifest b/manifest index 5c7e84a489..5b0f098e3b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\scleanup\sin\sfinish_test\sso\sthat\sspecifying\smultiple\stest\smodules\non\sthe\s"./testfixture"\scommand-line\sis\smore\slikely\sto\swork. -D 2021-10-19T18:59:10.277 +C Fix\sa\scase\sin\sthe\sfts3\soffsets()\sfunction\swhere\sa\scorrupt\sdatabase\srecord\scould\slead\sto\sdereferencing\san\suninitialized\spointer. +D 2021-10-20T11:40:34.022 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -84,16 +84,16 @@ F ext/fts3/README.content b9078d0843a094d86af0d48dffbff13c906702b4c3558012e67b9c F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 957237610d2938d4ec694fa6aed02140f1af6256b08f831a5a38657dcb3fa711 +F ext/fts3/fts3.c a28ef007016800249b2360fa4c66d7fcb71217f54755cc1a6772946b3246d6b3 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h 07cf1abc14140973c8f7f5e3035e9fe5c9f0fc04785c38821540a177ec32fca8 +F ext/fts3/fts3Int.h cff59b8b13dafe9d59924a5d710f771ed8b121a55cccbc99b6e2a723fcde14dc F ext/fts3/fts3_aux.c 1af58af8f2b00a49f4fb1c2602f8da2054ad60076f46c8ebf85c5410eccccb65 -F ext/fts3/fts3_expr.c 5853cd7a35a79d193614add9b4c461b2d56f465d90899ca4309f05d9d1536558 +F ext/fts3/fts3_expr.c 903bfb9433109fffb10e910d7066c49cbf8eeae316adc93f0499c4da7dfc932a 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 a4b2f009c3eba05fc51826d70a31aad67f2a0681b6a5b12a9d1d8b7575c88f93 +F ext/fts3/fts3_snippet.c dd267a96a064b068d69d26de2f98b234807bd2c82acf55641ebc362d89c55260 F ext/fts3/fts3_term.c f45a1e7c6ef464abb1231245d123dae12266b69e05cc56e14045b76591ae92d1 F ext/fts3/fts3_test.c d8d7b2734f894e8a489987447658e374cdd3a3bc8575c401decf1911cb7c6454 F ext/fts3/fts3_tokenize_vtab.c 8d15b148e7d88a4280389a200b26e8d52abda4c4ec2e9a35e9d7a1fa50e5aa03 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 55b6241871a3b52d835ebdc52a1ce6c736861cf7a03331391c5d6ffd39720514 -R cc426998f06e87a7bc21c105b31a88c7 -U drh -Z 41e8af220976b65d8b8f69383f67a625 +P 3658417bf300e004e5166ee69aa2d8c70697b87ea7456cb6337b0ad6d60257d5 +R 50fce9f313378c62042cb6f8e61ad7c5 +U dan +Z 26a1082e34643fb3ae17d00ac6671b5b diff --git a/manifest.uuid b/manifest.uuid index e9261140c8..edd1702581 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3658417bf300e004e5166ee69aa2d8c70697b87ea7456cb6337b0ad6d60257d5 \ No newline at end of file +7b7d31a6153b1505288eb3e849d0d9ef9e88e961c7b2f918ef5582fd77990f6d \ No newline at end of file From 7132f4361bdf1c4ef133943d81b0669b1538a7e6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 20 Oct 2021 12:52:12 +0000 Subject: [PATCH 02/35] Ensure that valid bytecode is generated for RETURNING clauses even if the schema is corrupt and PRAGMA writable_schema is set so that the schema parse returns no errors. dbsqlfuzz cb21825bdcd6fdb4b686ce4f6e2f45e781d2f220 FossilOrigin-Name: 699117156e0b5a7beda606de56bd511af322e3efa4eee6e60f0a8d60561def64 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/build.c | 30 +++++++++++++++++++----------- src/vdbe.c | 2 +- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index 5b0f098e3b..34b6328aad 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scase\sin\sthe\sfts3\soffsets()\sfunction\swhere\sa\scorrupt\sdatabase\srecord\scould\slead\sto\sdereferencing\san\suninitialized\spointer. -D 2021-10-20T11:40:34.022 +C Ensure\sthat\svalid\sbytecode\sis\sgenerated\sfor\sRETURNING\sclauses\seven\sif\nthe\sschema\sis\scorrupt\sand\sPRAGMA\swritable_schema\sis\sset\sso\sthat\sthe\nschema\sparse\sreturns\sno\serrors.\ndbsqlfuzz\scb21825bdcd6fdb4b686ce4f6e2f45e781d2f220 +D 2021-10-20T12:52:12.857 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -493,7 +493,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 0604f4af97624ffbe2f0757c559c51f57760c6ad3d8ee3ee94fa6ec5795f2832 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h ee9348c4cb9077243b049edc93a82c1f32ca48baeabf2140d41362b9f9139ff7 -F src/build.c f70d6375ea5b78daac5b1d24eab53ed7b81c3e68a17dff9581c50c0c06180e00 +F src/build.c e2eae084ad154b4ca78b0bb8f165e61d90d11b9054c2a28d986fd6518834e352 F src/callback.c 106b585da1edd57d75fa579d823a5218e0bf37f191dbf7417eeb4a8a9a267dbc F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -621,7 +621,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 34b6b9a82ec6a15eaf94dd69cbb21362dffc9f27682ca1d6f1eccc352cf89d3e F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 -F src/vdbe.c b42cf4c8518ef237586258528cd7ecff14134e1ceee741e6f95b68848b844eff +F src/vdbe.c a80943ed189ed5f4215636bde0aa7901319b051baffc0706f93a786bdf49ffcf F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c 7b83468feb1d42a09d4c2e5241a3eaa3d1f138e289a843cba9fd3f1dad95ca67 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3658417bf300e004e5166ee69aa2d8c70697b87ea7456cb6337b0ad6d60257d5 -R 50fce9f313378c62042cb6f8e61ad7c5 -U dan -Z 26a1082e34643fb3ae17d00ac6671b5b +P 7b7d31a6153b1505288eb3e849d0d9ef9e88e961c7b2f918ef5582fd77990f6d +R 7e4e37a135766c582a919f858b2a6a3d +U drh +Z 17be0212b59eb5785076e1b476487655 diff --git a/manifest.uuid b/manifest.uuid index edd1702581..72d567d4e9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7b7d31a6153b1505288eb3e849d0d9ef9e88e961c7b2f918ef5582fd77990f6d \ No newline at end of file +699117156e0b5a7beda606de56bd511af322e3efa4eee6e60f0a8d60561def64 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 55d336c38f..348a2d785d 100644 --- a/src/build.c +++ b/src/build.c @@ -170,17 +170,21 @@ void sqlite3FinishCoding(Parse *pParse){ int i; int reg; - addrRewind = - sqlite3VdbeAddOp1(v, OP_Rewind, pReturning->iRetCur); - VdbeCoverage(v); - reg = pReturning->iRetReg; - for(i=0; inRetCol; i++){ - sqlite3VdbeAddOp3(v, OP_Column, pReturning->iRetCur, i, reg+i); + if( pReturning->nRetCol==0 ){ + assert( CORRUPT_DB ); + }else{ + addrRewind = + sqlite3VdbeAddOp1(v, OP_Rewind, pReturning->iRetCur); + VdbeCoverage(v); + reg = pReturning->iRetReg; + for(i=0; inRetCol; i++){ + sqlite3VdbeAddOp3(v, OP_Column, pReturning->iRetCur, i, reg+i); + } + sqlite3VdbeAddOp2(v, OP_ResultRow, reg, i); + sqlite3VdbeAddOp2(v, OP_Next, pReturning->iRetCur, addrRewind+1); + VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addrRewind); } - sqlite3VdbeAddOp2(v, OP_ResultRow, reg, i); - sqlite3VdbeAddOp2(v, OP_Next, pReturning->iRetCur, addrRewind+1); - VdbeCoverage(v); - sqlite3VdbeJumpHere(v, addrRewind); } sqlite3VdbeAddOp0(v, OP_Halt); @@ -261,7 +265,11 @@ void sqlite3FinishCoding(Parse *pParse){ if( pParse->bReturning ){ Returning *pRet = pParse->u1.pReturning; - sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRet->iRetCur, pRet->nRetCol); + if( pRet->nRetCol==0 ){ + assert( CORRUPT_DB ); + }else{ + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRet->iRetCur, pRet->nRetCol); + } } /* Finally, jump back to the beginning of the executable code. */ diff --git a/src/vdbe.c b/src/vdbe.c index f7df923877..a129e3a45b 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -4093,7 +4093,7 @@ case OP_OpenEphemeral: { aMem[pOp->p3].z = ""; } pCx = p->apCsr[pOp->p1]; - if( pCx && !pCx->hasBeenDuped ){ + if( pCx && !pCx->hasBeenDuped && ALWAYS(pOp->p2<=pCx->nField) ){ /* If the ephermeral table is already open and has no duplicates from ** OP_OpenDup, then erase all existing content so that the table is ** empty again, rather than creating a new table. */ From dec8572d8ac1f8d736e060a692991d10d8f5c33a Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 20 Oct 2021 13:48:12 +0000 Subject: [PATCH 03/35] Fix a problem with the CARRAY extension when the SQLITE_TRANSIENT destructor is used for non-text arrays. [forum:/forumpost/48e525b266|Forum thread 48e525b266]. FossilOrigin-Name: cac910c15f409c5358843643b2f90252eb90328b9e5ff84cedbccb604d9891af --- ext/misc/carray.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- test/carray01.test | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 41 insertions(+), 9 deletions(-) diff --git a/ext/misc/carray.c b/ext/misc/carray.c index 43d714689c..b6eb0453a0 100644 --- a/ext/misc/carray.c +++ b/ext/misc/carray.c @@ -464,7 +464,7 @@ SQLITE_API int sqlite3_carray_bind( z += n+1; } }else{ - memcpy(pNew->aData, aData, sz*nData); + memcpy(pNew->aData, aData, sz); } pNew->xDel = sqlite3_free; }else{ diff --git a/manifest b/manifest index 34b6328aad..13b53f4dad 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\svalid\sbytecode\sis\sgenerated\sfor\sRETURNING\sclauses\seven\sif\nthe\sschema\sis\scorrupt\sand\sPRAGMA\swritable_schema\sis\sset\sso\sthat\sthe\nschema\sparse\sreturns\sno\serrors.\ndbsqlfuzz\scb21825bdcd6fdb4b686ce4f6e2f45e781d2f220 -D 2021-10-20T12:52:12.857 +C Fix\sa\sproblem\swith\sthe\sCARRAY\sextension\swhen\sthe\sSQLITE_TRANSIENT\sdestructor\nis\sused\sfor\snon-text\sarrays.\n[forum:/forumpost/48e525b266|Forum\sthread\s48e525b266]. +D 2021-10-20T13:48:12.145 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -290,7 +290,7 @@ F ext/misc/anycollseq.c 5ffdfde9829eeac52219136ad6aa7cd9a4edb3b15f4f2532de52f4a2 F ext/misc/appendvfs.c 9642c7a194a2a25dca7ad3e36af24a0a46d7702168c4ad7e59c9f9b0e16a3824 F ext/misc/blobio.c a867c4c4617f6ec223a307ebfe0eabb45e0992f74dd47722b96f3e631c0edb2a F ext/misc/btreeinfo.c d28ce349b40054eaa9473e835837bad7a71deec33ba13e39f963d50933bfa0f9 -F ext/misc/carray.c af9c4b3de67f87eb00644c3bb874b77e5917422b8d2c3ffc2853a118668501fa +F ext/misc/carray.c b752f46411e4e47e34dce6f0c88bc8e51bb821ba9e49bfcd882506451c928f69 F ext/misc/carray.h d2b1b12486d531367c37832d3d0dad34eea4bdd83ed839d445521ef01f0bc4e3 F ext/misc/cksumvfs.c b42ef52eaaa510d54ec320c87bea149e934a3b06cd232be2093562bf669bd572 F ext/misc/closure.c dbfd8543b2a017ae6b1a5843986b22ddf99ff126ec9634a2f4047cd14c85c243 @@ -758,7 +758,7 @@ F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 F test/capi3c.test 54e2dc0c8fd7c34ad1590d1be6864397da2438c95a9f5aee2f8fbc60c112e44b F test/capi3d.test aba917805573a03deed961a21f07a5a84505ad0a616f7e3fc1508844a15bccc4 F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe -F test/carray01.test 3f2658bbddd75a013735a296ae2178ff441aca3f00ba623cfbae00b732ede792 +F test/carray01.test d55d57bf66b1af1c7ac55fae66ff4910884a8f5d21a90a18797ce386212a2634 F test/cast.test 336fa21989b5170ebcaf90c24266be22dd97b3e23d1fad5ecf6ad4efb04c4423 F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef F test/changes.test 9dd8e597d84072122fc8a4fcdea837f4a54a461e6e536053ea984303e8ca937b @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7b7d31a6153b1505288eb3e849d0d9ef9e88e961c7b2f918ef5582fd77990f6d -R 7e4e37a135766c582a919f858b2a6a3d +P 699117156e0b5a7beda606de56bd511af322e3efa4eee6e60f0a8d60561def64 +R cf56933f6006b45d93d99fc6072efe54 U drh -Z 17be0212b59eb5785076e1b476487655 +Z 590b76cfe5702e43cf5589b10e3b6679 diff --git a/manifest.uuid b/manifest.uuid index 72d567d4e9..3e610303b2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -699117156e0b5a7beda606de56bd511af322e3efa4eee6e60f0a8d60561def64 \ No newline at end of file +cac910c15f409c5358843643b2f90252eb90328b9e5ff84cedbccb604d9891af \ No newline at end of file diff --git a/test/carray01.test b/test/carray01.test index 6db4f5eabc..d6243eb274 100644 --- a/test/carray01.test +++ b/test/carray01.test @@ -62,10 +62,34 @@ do_test 120 { sqlite3_carray_bind -int64 $STMT 3 1 2 3 4 5 6 7 run_stmt $STMT 0 } {1} +do_test 121 { + sqlite3_carray_bind -int64 -transient $STMT 3 1 2 3 4 5 6 7 + run_stmt $STMT 0 +} {1} +do_test 122 { + sqlite3_carray_bind -int64 -static $STMT 3 1 2 3 4 5 6 7 + run_stmt $STMT 0 +} {1} +do_test 123 { + sqlite3_carray_bind -int32 -transient $STMT 3 1 2 3 4 5 6 7 + run_stmt $STMT 0 +} {1} +do_test 124 { + sqlite3_carray_bind -int32 -static $STMT 3 1 2 3 4 5 6 7 + run_stmt $STMT 0 +} {1} +do_test 125 { + sqlite3_carray_bind -int32 $STMT 3 1 2 3 4 5 6 7 + run_stmt $STMT 0 +} {1} do_test 130 { sqlite3_carray_bind -int64 $STMT 3 1 2 3 4 6 7 run_stmt $STMT 0 } {0} +do_test 131 { + sqlite3_carray_bind -int64 -transient $STMT 3 1 2 3 4 6 7 + run_stmt $STMT 0 +} {0} do_test 131 { sqlite3_carray_bind -int64 -static $STMT 3 1 2 3 4 6 7 run_stmt $STMT 0 @@ -74,6 +98,14 @@ do_test 140 { sqlite3_carray_bind -double $STMT 3 1 2 3 4 5 6 7 run_stmt $STMT 0 } {1} +do_test 141 { + sqlite3_carray_bind -double -transient $STMT 3 1 2 3 4 5 6 7 + run_stmt $STMT 0 +} {1} +do_test 142 { + sqlite3_carray_bind -double -static $STMT 3 1 2 3 4 5 6 7 + run_stmt $STMT 0 +} {1} do_test 150 { sqlite3_carray_bind -double $STMT 3 1 2 3 4 6 7 run_stmt $STMT 0 From 9fdd66e3c033427d9ed0d3a5001619959ed6c104 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 20 Oct 2021 17:58:33 +0000 Subject: [PATCH 04/35] Enabled the testcase() macros under SQLITE_DEBUG. FossilOrigin-Name: 0ae8dd132db8331ca9cc42ad511066924f9d3a1d158ecdb630cebc41b6bd2493 --- ext/rtree/rtree.c | 2 +- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/build.c | 1 - src/global.c | 6 ++++++ src/sqliteInt.h | 8 +++++--- src/util.c | 10 ---------- src/vdbeaux.c | 2 +- 8 files changed, 25 insertions(+), 28 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 2f95a71272..cd718073e7 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -436,7 +436,7 @@ struct RtreeMatchArg { ** it is not, make it a no-op. */ #ifndef SQLITE_AMALGAMATION -# ifdef SQLITE_COVERAGE_TEST +# if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_DEBUG) unsigned int sqlite3RtreeTestcase = 0; # define testcase(X) if( X ){ sqlite3RtreeTestcase += __LINE__; } # else diff --git a/manifest b/manifest index 13b53f4dad..cebb076c9f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sthe\sCARRAY\sextension\swhen\sthe\sSQLITE_TRANSIENT\sdestructor\nis\sused\sfor\snon-text\sarrays.\n[forum:/forumpost/48e525b266|Forum\sthread\s48e525b266]. -D 2021-10-20T13:48:12.145 +C Enabled\sthe\stestcase()\smacros\sunder\sSQLITE_DEBUG. +D 2021-10-20T17:58:33.677 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -394,7 +394,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c a7021cb524621573ccda213a35b0339371849dd4acc4909f689786ee1f964b7f -F ext/rtree/rtree.c f2658ccaf20c65f2c2d7b097e42aa71be7272a3b49af586a57d9eed8ceb8436f +F ext/rtree/rtree.c a602c5ba860c93a3087ec0c41ad4c4c0c2e9ba2f0008617d4b444200e3b3625d F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 35c3bc0def71317b7601ee0d1149e7df2cd8fc4f13ec89a64761ac3f46ca123f F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -493,7 +493,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 0604f4af97624ffbe2f0757c559c51f57760c6ad3d8ee3ee94fa6ec5795f2832 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h ee9348c4cb9077243b049edc93a82c1f32ca48baeabf2140d41362b9f9139ff7 -F src/build.c e2eae084ad154b4ca78b0bb8f165e61d90d11b9054c2a28d986fd6518834e352 +F src/build.c 8bdda90f9b1189c7b0813575171b3c6b2d74b3ade57c11cb4383776781ea9335 F src/callback.c 106b585da1edd57d75fa579d823a5218e0bf37f191dbf7417eeb4a8a9a267dbc F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -505,7 +505,7 @@ F src/expr.c 529f7eca2821e874a375b1b318e697d62cb28f56069677c93f587f2de5dceb54 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 187b67af20c5795953a592832c5d985e4313fe503ebd8f95e3e9e9ad5a730bb5 F src/func.c 1cfb09d7ffca81238eccefdb0293e1f5b7cfebbd1816dfad5ec6024742a7496b -F src/global.c 612ea60c9acbcb45754c2ed659b4a56936a06814718e969636fedc7e3b889808 +F src/global.c 59bfd5705a623f0b45e91622699953cfd1be2c176e78d8ff610463f2ea4ec51b F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 @@ -554,7 +554,7 @@ F src/shell.c.in e80fe5118fc3b942c1becc67ebfca6a887dbab9295e0bd5b6da61c4375baa63 F src/sqlite.h.in f0c1ecb5af508aa8e970cd8bc0ec851e6c380b81825038d458846c2fcdfcef50 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 642c17df9e5a3517db452ac73a2b953143449a8bc2f6570c60de455a89a8571c +F src/sqliteInt.h df3bc11691f5977041efb0d16fcd2b5e10e97bc5f8231edd3fbc0ed24978be30 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -619,13 +619,13 @@ F src/trigger.c 3f612ce5f0858b6c23460a3c799d01f408b49b0b29d931d8b8e6fc224a8667de F src/update.c 69c4c10bc6873a80c0a77cb578f9fc60ee90003d03f9530bc3370fa24615772d F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 -F src/util.c 34b6b9a82ec6a15eaf94dd69cbb21362dffc9f27682ca1d6f1eccc352cf89d3e +F src/util.c 30df8356e231dad33be10bb27897655002668343280004ba28c734489414a167 F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 F src/vdbe.c a80943ed189ed5f4215636bde0aa7901319b051baffc0706f93a786bdf49ffcf F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c 7b83468feb1d42a09d4c2e5241a3eaa3d1f138e289a843cba9fd3f1dad95ca67 -F src/vdbeaux.c 897912feb91ec3cd8dedc3fce21d192fd6d37d299538a13d9d93100b22e4d4a0 +F src/vdbeaux.c a57c760d1897f1b72f6fae26983df363db7a2c42d88721187e907f2c84862b42 F src/vdbeblob.c 292e96c01c4219fca71d74e1002906d43eb232af4bd83f7552a3faec741f3eb8 F src/vdbemem.c 8be0af1060012520381d3296fcb1718e80cd5b99ce04f51f7e1c4dba4072caac F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 699117156e0b5a7beda606de56bd511af322e3efa4eee6e60f0a8d60561def64 -R cf56933f6006b45d93d99fc6072efe54 +P cac910c15f409c5358843643b2f90252eb90328b9e5ff84cedbccb604d9891af +R b58b0d6940cbb987a3db5591c7793ff3 U drh -Z 590b76cfe5702e43cf5589b10e3b6679 +Z ed1a880f40a6b2e9669ca472c69ec5e6 diff --git a/manifest.uuid b/manifest.uuid index 3e610303b2..5cb2a44d83 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cac910c15f409c5358843643b2f90252eb90328b9e5ff84cedbccb604d9891af \ No newline at end of file +0ae8dd132db8331ca9cc42ad511066924f9d3a1d158ecdb630cebc41b6bd2493 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 348a2d785d..ba49aa6fa9 100644 --- a/src/build.c +++ b/src/build.c @@ -2218,7 +2218,6 @@ static void estimateIndexWidth(Index *pIdx){ */ static int hasColumn(const i16 *aiCol, int nCol, int x){ while( nCol-- > 0 ){ - assert( aiCol[0]>=0 ); if( x==*(aiCol++) ){ return 1; } diff --git a/src/global.c b/src/global.c index 675cdec236..52ca5bab2e 100644 --- a/src/global.c +++ b/src/global.c @@ -298,6 +298,12 @@ SQLITE_WSD struct Sqlite3Config sqlite3Config = { */ FuncDefHash sqlite3BuiltinFunctions; +/* +** Counter used for coverage testing. Does not come into play for +** release builds. +*/ +unsigned int sqlite3CoverageCounter; + #ifdef VDBE_PROFILE /* ** The following performance counter can be used in place of diff --git a/src/sqliteInt.h b/src/sqliteInt.h index dbf994d53f..06264a258f 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -437,9 +437,11 @@ ** can insure that all cases are evaluated. ** */ -#ifdef SQLITE_COVERAGE_TEST - void sqlite3Coverage(int); -# define testcase(X) if( X ){ sqlite3Coverage(__LINE__); } +#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_DEBUG) +# ifndef SQLITE_AMALGAMATION + extern unsigned int sqlite3CoverageCounter; +# endif +# define testcase(X) if( X ){ sqlite3CoverageCounter += (unsigned)__LINE__; } #else # define testcase(X) #endif diff --git a/src/util.c b/src/util.c index d707a9bfcb..8452aea665 100644 --- a/src/util.c +++ b/src/util.c @@ -21,16 +21,6 @@ #include #endif -/* -** Routine needed to support the testcase() macro. -*/ -#ifdef SQLITE_COVERAGE_TEST -void sqlite3Coverage(int x){ - static unsigned dummy = 0; - dummy += (unsigned)x; -} -#endif - /* ** Calls to sqlite3FaultSim() are used to simulate a failure during testing, ** or to bypass normal error detection during testing in order to let diff --git a/src/vdbeaux.c b/src/vdbeaux.c index da594993b6..6e2fb7b190 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1907,8 +1907,8 @@ static void releaseMemArray(Mem *p, int N){ */ testcase( p->flags & MEM_Agg ); testcase( p->flags & MEM_Dyn ); - testcase( p->xDel==sqlite3VdbeFrameMemDel ); if( p->flags&(MEM_Agg|MEM_Dyn) ){ + testcase( (p->flags & MEM_Dyn)!=0 && p->xDel==sqlite3VdbeFrameMemDel ); sqlite3VdbeMemRelease(p); }else if( p->szMalloc ){ sqlite3DbFreeNN(db, p->zMalloc); From b18a11ed378d5255532ca01e900c67422164e552 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 20 Oct 2021 18:17:31 +0000 Subject: [PATCH 05/35] Fix the finish_test proc in tester.tcl so that it works for Windows test builds. Fix for problem introduced yesterday by check-in [3658417bf300e004]. FossilOrigin-Name: f52b84e69e5fcbe59ccc6163e7e78aa3822f2c354c88f8a76a2d1d4c90a99821 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/tester.tcl | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index cebb076c9f..8655020c1b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enabled\sthe\stestcase()\smacros\sunder\sSQLITE_DEBUG. -D 2021-10-20T17:58:33.677 +C Fix\sthe\sfinish_test\sproc\sin\stester.tcl\sso\sthat\sit\sworks\sfor\sWindows\stest\nbuilds.\s\sFix\sfor\sproblem\sintroduced\syesterday\sby\scheck-in\s[3658417bf300e004]. +D 2021-10-20T18:17:31.262 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1461,7 +1461,7 @@ F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 F test/temptable2.test d2940417496e2b9548e01d09990763fbe88c316504033256d51493e1f1a5ce6a F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637 F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc -F test/tester.tcl 2b55f29390d187026f187b5b82849a4001763960e5e90797ba2dc95c70fe77a6 +F test/tester.tcl f577d040078dd4fb56ea1ccaa71f6bfd0ebf0bd0ac373304db4269b5474f9cb7 F test/thread001.test b61a29dd87cf669f5f6ac96124a7c97d71b0c80d9012746072055877055cf9ef F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P cac910c15f409c5358843643b2f90252eb90328b9e5ff84cedbccb604d9891af -R b58b0d6940cbb987a3db5591c7793ff3 +P 0ae8dd132db8331ca9cc42ad511066924f9d3a1d158ecdb630cebc41b6bd2493 +R 3118246a821316ba678380f724f46b08 U drh -Z ed1a880f40a6b2e9669ca472c69ec5e6 +Z e61d5b6226e546ad207433c5c688d2ff diff --git a/manifest.uuid b/manifest.uuid index 5cb2a44d83..745bb973ad 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0ae8dd132db8331ca9cc42ad511066924f9d3a1d158ecdb630cebc41b6bd2493 \ No newline at end of file +f52b84e69e5fcbe59ccc6163e7e78aa3822f2c354c88f8a76a2d1d4c90a99821 \ No newline at end of file diff --git a/test/tester.tcl b/test/tester.tcl index 68bff929cd..bfcc831ff9 100644 --- a/test/tester.tcl +++ b/test/tester.tcl @@ -1209,9 +1209,9 @@ proc finish_test_precleanup {} { catch {db1 close} catch {db2 close} catch {db3 close} - unregister_devsim - unregister_jt_vfs - unregister_demovfs + catch {unregister_devsim} + catch {unregister_jt_vfs} + catch {unregister_demovfs} } # Run this routine last From 8b554e2a1ea4de0cb30a49357684836710f44905 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 20 Oct 2021 20:22:37 +0000 Subject: [PATCH 06/35] Fix an incorrect JSON assert() that was added 5 days ago by check-in [7b8ea2298927fd34]. FossilOrigin-Name: e162da3ab4c183b67872be004035c48fc8f20084bc5757aec27410ce23a36631 --- ext/misc/json1.c | 3 ++- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index df6dcba76d..70f344ea01 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -1680,7 +1680,8 @@ static JsonNode *jsonMergePatch( if( pParse->oom ) return 0; jsonRemoveAllNulls(pPatch); pTarget = &pParse->aNode[iTarget]; - assert( pParse->aNode[iRoot].eU==0 ); + assert( pParse->aNode[iRoot].eU==0 || pParse->aNode[iRoot].eU==2 ); + testcase( pParse->aNode[iRoot].eU==2 ); pParse->aNode[iRoot].jnFlags |= JNODE_APPEND; VVA( pParse->aNode[iRoot].eU = 2 ); pParse->aNode[iRoot].u.iAppend = iStart - iRoot; diff --git a/manifest b/manifest index 8655020c1b..f4a1eebc38 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sfinish_test\sproc\sin\stester.tcl\sso\sthat\sit\sworks\sfor\sWindows\stest\nbuilds.\s\sFix\sfor\sproblem\sintroduced\syesterday\sby\scheck-in\s[3658417bf300e004]. -D 2021-10-20T18:17:31.262 +C Fix\san\sincorrect\sJSON\sassert()\sthat\swas\sadded\s5\sdays\sago\sby\scheck-in\s[7b8ea2298927fd34]. +D 2021-10-20T20:22:37.259 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -306,7 +306,7 @@ F ext/misc/fileio.c 57fefd0efc535e62bb8b07fa146875171481da81a759bbfbe2fc91bab900 F ext/misc/fossildelta.c 1240b2d3e52eab1d50c160c7fe1902a9bd210e052dc209200a750bbf885402d5 F ext/misc/fuzzer.c eae560134f66333e9e1ca4c8ffea75df42056e2ce8456734565dbe1c2a92bf3d F ext/misc/ieee754.c 91a5594071143a4ab79c638fe9f059af1db09932faf2e704c3e29216a7d4f511 -F ext/misc/json1.c 9344f0c08fe74119022466384557c849f21fb4a15e8314f70847b1831c500f29 +F ext/misc/json1.c 2ff65a8f97c9b8ae03124fe89a1b74197e68958882cb533daac8a694d1b81c57 F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b F ext/misc/memvfs.c 7dffa8cc89c7f2d73da4bd4ccea1bcbd2bd283e3bb4cea398df7c372a197291b @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0ae8dd132db8331ca9cc42ad511066924f9d3a1d158ecdb630cebc41b6bd2493 -R 3118246a821316ba678380f724f46b08 +P f52b84e69e5fcbe59ccc6163e7e78aa3822f2c354c88f8a76a2d1d4c90a99821 +R 670ebc316cf1a452957a2d11a7221cf2 U drh -Z e61d5b6226e546ad207433c5c688d2ff +Z 70867d1471ed7c4b89f3d005caea5399 diff --git a/manifest.uuid b/manifest.uuid index 745bb973ad..2057820b87 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f52b84e69e5fcbe59ccc6163e7e78aa3822f2c354c88f8a76a2d1d4c90a99821 \ No newline at end of file +e162da3ab4c183b67872be004035c48fc8f20084bc5757aec27410ce23a36631 \ No newline at end of file From 8ef0b84c37ff393924386f76a2274f930ec837b4 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 21 Oct 2021 17:01:10 +0000 Subject: [PATCH 07/35] Fix the new "table_list" pragma so that it shows the correct number of columns for views and virtual tables even when the object has not been previously used. FossilOrigin-Name: fb0ed8c55f6362d2639687392a72cc3ed9dc318929e11893edd2a0f023929f7e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pragma.c | 11 +++++++++++ 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index f4a1eebc38..2a61e942db 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sincorrect\sJSON\sassert()\sthat\swas\sadded\s5\sdays\sago\sby\scheck-in\s[7b8ea2298927fd34]. -D 2021-10-20T20:22:37.259 +C Fix\sthe\snew\s"table_list"\spragma\sso\sthat\sit\sshows\sthe\scorrect\snumber\sof\ncolumns\sfor\sviews\sand\svirtual\stables\seven\swhen\sthe\sobject\shas\snot\sbeen\npreviously\sused. +D 2021-10-21T17:01:10.549 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -542,7 +542,7 @@ F src/parse.y 0bd7971a7489bbf6c3726f1b50da6e508bdff8fa493e9cc3f5a96b12cbb2361e F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 -F src/pragma.c 12760c6ae92a350f5924896644a3e58d969c7c78e346b8cb542f2a8cef7c45d1 +F src/pragma.c e98bdbaf4bbe13e1085e6713b4bf022a8091e279162fec96e5ea30b53b1851a3 F src/pragma.h 87330ed2fbfa2a1274de93ca0ab850fba336189228cb256089202c3b52766fad F src/prepare.c 8f07616db04337057b8498b72d051ee90f73c54615c2e908c05404cef1e060b7 F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f52b84e69e5fcbe59ccc6163e7e78aa3822f2c354c88f8a76a2d1d4c90a99821 -R 670ebc316cf1a452957a2d11a7221cf2 +P e162da3ab4c183b67872be004035c48fc8f20084bc5757aec27410ce23a36631 +R 5b3b99f69598abd3ff48cb7e9e2a37d6 U drh -Z 70867d1471ed7c4b89f3d005caea5399 +Z fe3fae615e6e48414d5d1a1ec7e33318 diff --git a/manifest.uuid b/manifest.uuid index 2057820b87..a4bb84a3a7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e162da3ab4c183b67872be004035c48fc8f20084bc5757aec27410ce23a36631 \ No newline at end of file +fb0ed8c55f6362d2639687392a72cc3ed9dc318929e11893edd2a0f023929f7e \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index 42db7e5807..3392871d8a 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1242,6 +1242,17 @@ void sqlite3Pragma( }else{ zType = "table"; } + if( zType[0]=='v' && pTab->nCol==0 ){ + /* The number of columns is not known for views and virtual tables + ** until after the object is used at least once. */ + char *zSql = sqlite3MPrintf(db, "SELECT * FROM \"%w\"", pTab->zName); + if( zSql ){ + sqlite3_stmt *pDummy = 0; + (void)sqlite3_prepare(db, zSql, -1, &pDummy, 0); + (void)sqlite3_finalize(pDummy); + sqlite3DbFree(db, zSql); + } + } sqlite3VdbeMultiLoad(v, 1, "sssiii", db->aDb[ii].zDbSName, pTab->zName, From dc88b40285aba0eac225d17cf6eb4f6e31e0b5c4 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 21 Oct 2021 19:48:14 +0000 Subject: [PATCH 08/35] Fix the previous check-in so that it works with virtual tables that add new shadow tables the first time they are referenced. FossilOrigin-Name: f73b499e539b9551a70deecec4fc10c3a4af3830324977861cd0558f9782a1d3 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/hash.h | 2 +- src/pragma.c | 38 +++++++++++++++++++++++++++----------- test/fuzzdata8.db | Bin 2748416 -> 2798592 bytes 5 files changed, 37 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index 2a61e942db..fcae3aa996 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\snew\s"table_list"\spragma\sso\sthat\sit\sshows\sthe\scorrect\snumber\sof\ncolumns\sfor\sviews\sand\svirtual\stables\seven\swhen\sthe\sobject\shas\snot\sbeen\npreviously\sused. -D 2021-10-21T17:01:10.549 +C Fix\sthe\sprevious\scheck-in\sso\sthat\sit\sworks\swith\svirtual\stables\sthat\sadd\snew\nshadow\stables\sthe\sfirst\stime\sthey\sare\sreferenced. +D 2021-10-21T19:48:14.633 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -507,7 +507,7 @@ F src/fkey.c 187b67af20c5795953a592832c5d985e4313fe503ebd8f95e3e9e9ad5a730bb5 F src/func.c 1cfb09d7ffca81238eccefdb0293e1f5b7cfebbd1816dfad5ec6024742a7496b F src/global.c 59bfd5705a623f0b45e91622699953cfd1be2c176e78d8ff610463f2ea4ec51b F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 -F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 +F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c b32e2dcbca838cb8acd4777a59243db4bcea53089e3181b0ea3e4dc75b43aeff @@ -542,7 +542,7 @@ F src/parse.y 0bd7971a7489bbf6c3726f1b50da6e508bdff8fa493e9cc3f5a96b12cbb2361e F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 -F src/pragma.c e98bdbaf4bbe13e1085e6713b4bf022a8091e279162fec96e5ea30b53b1851a3 +F src/pragma.c fc4c772d25766f7440dff6bf352e8c66981f92c80689d1a0fe229d39a38f69a5 F src/pragma.h 87330ed2fbfa2a1274de93ca0ab850fba336189228cb256089202c3b52766fad F src/prepare.c 8f07616db04337057b8498b72d051ee90f73c54615c2e908c05404cef1e060b7 F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d @@ -1063,7 +1063,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 62c5303ef5a570b1a302d7e495ecfaf007dd4752618ed6378913df671fd0cb2a +F test/fuzzdata8.db e12b57c30566b9511ed8760eeccfb23e6361db9c43092032252e922ed942d67c F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e162da3ab4c183b67872be004035c48fc8f20084bc5757aec27410ce23a36631 -R 5b3b99f69598abd3ff48cb7e9e2a37d6 +P fb0ed8c55f6362d2639687392a72cc3ed9dc318929e11893edd2a0f023929f7e +R d9d7a435d8b8a1837f287c26685a733e U drh -Z fe3fae615e6e48414d5d1a1ec7e33318 +Z b3b900615c7f934236b8d70c4ffaa098 diff --git a/manifest.uuid b/manifest.uuid index a4bb84a3a7..b9fbb74cb6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fb0ed8c55f6362d2639687392a72cc3ed9dc318929e11893edd2a0f023929f7e \ No newline at end of file +f73b499e539b9551a70deecec4fc10c3a4af3830324977861cd0558f9782a1d3 \ No newline at end of file diff --git a/src/hash.h b/src/hash.h index 951cc06c90..3f491e45c0 100644 --- a/src/hash.h +++ b/src/hash.h @@ -91,6 +91,6 @@ void sqlite3HashClear(Hash*); /* ** Number of entries in a hash table */ -/* #define sqliteHashCount(H) ((H)->count) // NOT USED */ +#define sqliteHashCount(H) ((H)->count) #endif /* SQLITE_HASH_H */ diff --git a/src/pragma.c b/src/pragma.c index 3392871d8a..d23457f845 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1227,8 +1227,35 @@ void sqlite3Pragma( for(ii=0; iinDb; ii++){ HashElem *k; Hash *pHash; + int initNCol; if( zDb && sqlite3_stricmp(zDb, db->aDb[ii].zDbSName)!=0 ) continue; + + /* Ensure that the Table.nCol field is initialized for all views + ** and virtual tables. Each time we initialize a Table.nCol value + ** for a table, that can potentially disrupt the hash table, so restart + ** the initialization scan. + */ pHash = &db->aDb[ii].pSchema->tblHash; + initNCol = sqliteHashCount(pHash); + while( initNCol-- ){ + for(k=sqliteHashFirst(pHash); 1; k=sqliteHashNext(k) ){ + Table *pTab; + if( k==0 ){ initNCol = 0; break; } + pTab = sqliteHashData(k); + if( pTab->nCol==0 ){ + char *zSql = sqlite3MPrintf(db, "SELECT*FROM\"%w\"", pTab->zName); + if( zSql ){ + sqlite3_stmt *pDummy = 0; + (void)sqlite3_prepare(db, zSql, -1, &pDummy, 0); + (void)sqlite3_finalize(pDummy); + sqlite3DbFree(db, zSql); + } + pHash = &db->aDb[ii].pSchema->tblHash; + break; + } + } + } + for(k=sqliteHashFirst(pHash); k; k=sqliteHashNext(k) ){ Table *pTab = sqliteHashData(k); const char *zType; @@ -1242,17 +1269,6 @@ void sqlite3Pragma( }else{ zType = "table"; } - if( zType[0]=='v' && pTab->nCol==0 ){ - /* The number of columns is not known for views and virtual tables - ** until after the object is used at least once. */ - char *zSql = sqlite3MPrintf(db, "SELECT * FROM \"%w\"", pTab->zName); - if( zSql ){ - sqlite3_stmt *pDummy = 0; - (void)sqlite3_prepare(db, zSql, -1, &pDummy, 0); - (void)sqlite3_finalize(pDummy); - sqlite3DbFree(db, zSql); - } - } sqlite3VdbeMultiLoad(v, 1, "sssiii", db->aDb[ii].zDbSName, pTab->zName, diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 808d8065f7deb0599532ab66d4f19e4cdb43ba8a..f3ee3fdc946aab631de3a903b039b64fca74bdea 100644 GIT binary patch delta 63616 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

qrLExYS+waZ2b`A=E@ zt+%-fXLITLLVE|J68hYrZ{3x91xG*RTxbt93OGM^;(yA%?O&D^&Mp#wFij-bBGOeZsq zUvgS0l`vOT%UBP3eZ3Sa!}~p45$uhru1KC)K<@u|Sv^XfpfnV~**OJ$mxG z`G5F7PQ%C$WG&;5IT`_{#2ldb{p9T|=jm@G`HD@5qpG z)!RKiGb1A_E2|vxn&=y1Mn?K%SXmG@SST%r)nB;dc>AkXg;hXFbl7lS+F;l>D(n%! z>9x0jfJNe$?#b{*cGzTyf5bIf#KoZu&(-Ka^u_hAbcEqxaDVMy0J$|dzwg^X2MgVN z@WTenb^-z*DK0EU$e042I@hCcGA?W>Y}rT=n-~{11cXg=2&}CR3=7ZfEzk5#n}yk} z^2Q9vN7Avv#7bE7tsE_trub5 z?&SJ);VXr{-*_S&<@3usQ!nh(%%lhuHIeUT)U;A+{T|mGu2onja*$-|Bx84^+CMkg{jkw?yli0#?)8y zodUj{Ww7(p3@Y&8X?X+_XBZedmJe43X<@K=ePkefKQ%A}KA0IUp_9LH%t=PEvz=qQ z;L@2AQ-h1@AEF|dm3|4@N}VP*h0*NnZLup(D(jr@`_CFG>%7>wK+t>E^G-|!o84fn z!@z7-wa4H&1(z8;1u_Oar(`iHv4K0kZjI{XgSG-m zE00w08`ah-lTc-FAl5P{|~^?)(; zBbc$oI8QJ|K}Uym+cZ{H(&;$y59qXw&H9_Mo(R)3S<*|LR@q==KPOKA0dfUYP3`oq zrBpzrhC<^>cOk2|V%+N_bJ@PnjeJ`Wp1#YodSqpIyY=h|xi1PDOaIE)CvyPyJ7c=N za*b9$4@UmOXtB@4JF8$-r6&eH`Z_R~_5GeVzM6?Y8Hgu7bU-xmR}B;Kw-eFf=NHQP zu=@!)luZdTTV3`A2xR4O17*V^%s&ct%&#HO$M+~R4oZ@V6DGwFC+iw*mb=7SF<>X( z&wAOhMDu-O|HInR^?zW^$!0OJ&%?)R;fZMTVYWau9||Imu|=%#`$93`iSgFu!8zuS4hMgwTsjsn=&Z88Nd!kj06rLk7fiNo zpgD<<#RmtOYw<=r4B0vdudDFd2(zEGWZ9esw2G$Lzg>!j`$n2C*&9%<$MGx@lL)ot zn_*6bXFE)Ze1H{?GZ8Fb&cq4k9G9a3!vtQx^Jrt0*^yN~7r8=MUl%UIr1Hpp_#!GV z#h;b_U&4MmIL(}b58!Fi?l@i-!v|&y_7(VjBQ$5&l9^s(zAiZ$oMOO>xG8WZg7m0a zBduLq-QW-dcJO6TWxF3Wi%9Tle5k2>a)m)_yc9fIco<8lGp}&~wswaL2VsMGJkajK zmOAmN7*^P5K5w(H$EP+xUMxn~rk;#FywkScM2MA%8+b==gh3UNqu}yC?Gl@`nRmI& zCT%zWAxN8>Jq;L9`6r4+g+cXBbEO@yq%ExZh=~!vwXc{N(6|ss&%JM9hjKf8iZvfK zzr#iU1*aQs4|fK#h`r`@LbkHzV`d3qWv%8`fox+}4#pZ*uI zRR3$h$H3k<%~1^NdfZN)fkn@B%tjB07~Ia`^&+zUKc%Rb9C(t~nAaT=KR5e9zC9$- zgJM0uE29B79%m}L-~Q#7U%=NS_kf2_nVo~4-8i%X-D(bW>b^^WvlpVqaxVIR^4`M$ zXn7|z7X^)Em%0VVVRnqOCSta`prDrxY3$FLd(an?Eh?uffvx>?H24eVIRVkyvyFl1 z?XL!(WR4F_cc9%Z1}wf04u5X0gfsokAXlllh%63n2w|^%Zn_ESz)pUFdbOit%;J&1 KyX|`v_WuDJTe;H! delta 50026 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 From 95888784efafb95aa993b9393d2ddb61ee6dd626 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 21 Oct 2021 20:08:00 +0000 Subject: [PATCH 09/35] Enable FTS5 for fuzzcheck. FossilOrigin-Name: 559ba38b8a0f7795d781838ec78969874fd678f749b26cd49cf6112afc838732 --- Makefile.in | 2 +- Makefile.msc | 1 + manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Makefile.in b/Makefile.in index 840b504f1d..b3ea4628b3 100644 --- a/Makefile.in +++ b/Makefile.in @@ -624,7 +624,7 @@ FUZZCHECK_OPT += -DSQLITE_MAX_MEMORY=50000000 FUZZCHECK_OPT += -DSQLITE_PRINTF_PRECISION_LIMIT=1000 FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS4 FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS3_PARENTHESIS -#FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS5 +FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS5 FUZZCHECK_OPT += -DSQLITE_ENABLE_RTREE FUZZCHECK_OPT += -DSQLITE_ENABLE_GEOPOLY FUZZCHECK_OPT += -DSQLITE_ENABLE_DBSTAT_VTAB diff --git a/Makefile.msc b/Makefile.msc index cfa20c6245..1d934c47b6 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1699,6 +1699,7 @@ MPTESTER_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 FUZZERSHELL_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 FUZZCHECK_OPTS = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 -DSQLITE_OSS_FUZZ -DSQLITE_MAX_MEMORY=50000000 -DSQLITE_PRINTF_PRECISION_LIMIT=1000 FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_FTS4 +FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_FTS5 FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_RTREE FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_GEOPOLY FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_DBSTAT_VTAB diff --git a/manifest b/manifest index fcae3aa996..1b7c60b729 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Fix\sthe\sprevious\scheck-in\sso\sthat\sit\sworks\swith\svirtual\stables\sthat\sadd\snew\nshadow\stables\sthe\sfirst\stime\sthey\sare\sreferenced. -D 2021-10-21T19:48:14.633 +C Enable\sFTS5\sfor\sfuzzcheck. +D 2021-10-21T20:08:00.665 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in 457a0f10540bd18a700c9d45add8dcc06e040bc9d1e948c9816b9b6eab1de384 +F Makefile.in 0e91c42a1dd13a569b1fa4f4dfb7d3632f3164a1c05c71341533d67db5b641dd F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc fef1e54f1a2138aa2de79ad8a928f1711106d082e6a35cdfbbfec9e8fd0c59c3 +F Makefile.msc 5904e640ee2f577bcd137b9b5393895be3a1602d1e2b8c99e356f569d96ad98b F README.md 27fb76aa7eb57ed63a53bbba7292b6bf71f51125554f79f16b5d040edd1e6110 F VERSION c6595fef606851f2bc3ebed6a7386c73751835fc909feab7c093739fa4b3c1d1 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fb0ed8c55f6362d2639687392a72cc3ed9dc318929e11893edd2a0f023929f7e -R d9d7a435d8b8a1837f287c26685a733e +P f73b499e539b9551a70deecec4fc10c3a4af3830324977861cd0558f9782a1d3 +R c12908b5ad7e1daca726d21d0e808b76 U drh -Z b3b900615c7f934236b8d70c4ffaa098 +Z 8f7717d9b592fff6ee99b8fe013f83fa diff --git a/manifest.uuid b/manifest.uuid index b9fbb74cb6..dcf2d0a2f3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f73b499e539b9551a70deecec4fc10c3a4af3830324977861cd0558f9782a1d3 \ No newline at end of file +559ba38b8a0f7795d781838ec78969874fd678f749b26cd49cf6112afc838732 \ No newline at end of file From dcf10a1a4bb5c242e1ec87a2f83df637f1dfe9e9 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 22 Oct 2021 11:17:29 +0000 Subject: [PATCH 10/35] Fix harmless compiler warnings. Improve the independence of some TCL tests. FossilOrigin-Name: 1a038242dc6c0cab97dd9375acfce62aa1c386debc36aaed388d366b87ddd931 --- ext/rtree/rtree9.test | 2 +- ext/rtree/rtreedoc.test | 3 ++- ext/rtree/test_rtreedoc.c | 15 +++++++-------- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/global.c | 6 ++++++ src/sqliteInt.h | 1 - 7 files changed, 27 insertions(+), 22 deletions(-) diff --git a/ext/rtree/rtree9.test b/ext/rtree/rtree9.test index a7cd344d76..f39a82e582 100644 --- a/ext/rtree/rtree9.test +++ b/ext/rtree/rtree9.test @@ -36,7 +36,7 @@ do_execsql_test rtree9-1.4 { DELETE FROM rt; } {} - +unset -nocomplain x for {set i 0} {$i < 1000} {incr i} { set x [expr $i%10] set y [expr ($i/10)%10] diff --git a/ext/rtree/rtreedoc.test b/ext/rtree/rtreedoc.test index d2b37428a9..b64faa2e99 100644 --- a/ext/rtree/rtreedoc.test +++ b/ext/rtree/rtreedoc.test @@ -39,6 +39,7 @@ proc column_name_list {db tbl} { } return $lCol } +unset -nocomplain res #------------------------------------------------------------------------- #------------------------------------------------------------------------- @@ -792,6 +793,7 @@ do_execsql_test 3.0 { INSERT INTO x1 VALUES(4, 4, 4); } do_test 3.1 { + unset -nocomplain res set res [list] db eval { SELECT * FROM x1 } { lappend res $a $b $c @@ -1579,4 +1581,3 @@ execsql ROLLBACK finish_test - diff --git a/ext/rtree/test_rtreedoc.c b/ext/rtree/test_rtreedoc.c index 752a7ac124..3272d89eca 100644 --- a/ext/rtree/test_rtreedoc.c +++ b/ext/rtree/test_rtreedoc.c @@ -105,15 +105,15 @@ static int invokeTclGeomCb( if( p->pUser || p->xDelUser ){ rc = SQLITE_ERROR; }else{ - BoxGeomCtx *pCtx = sqlite3_malloc(sizeof(BoxGeomCtx)); - if( pCtx==0 ){ + BoxGeomCtx *pBGCtx = sqlite3_malloc(sizeof(BoxGeomCtx)); + if( pBGCtx==0 ){ rc = SQLITE_NOMEM; }else{ - pCtx->interp = interp; - pCtx->pScript = Tcl_DuplicateObj(pRes); - Tcl_IncrRefCount(pCtx->pScript); - Tcl_ListObjReplace(interp, pCtx->pScript, 0, 1, 0, 0); - p->pUser = (void*)pCtx; + pBGCtx->interp = interp; + pBGCtx->pScript = Tcl_DuplicateObj(pRes); + Tcl_IncrRefCount(pBGCtx->pScript); + Tcl_ListObjReplace(interp, pBGCtx->pScript, 0, 1, 0, 0); + p->pUser = (void*)pBGCtx; p->xDelUser = testDelUser; } } @@ -346,4 +346,3 @@ int Sqlitetestrtreedoc_Init(Tcl_Interp *interp){ #endif /* SQLITE_ENABLE_RTREE */ return TCL_OK; } - diff --git a/manifest b/manifest index 1b7c60b729..5ea5f0607b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enable\sFTS5\sfor\sfuzzcheck. -D 2021-10-21T20:08:00.665 +C Fix\sharmless\scompiler\swarnings.\s\sImprove\sthe\sindependence\sof\ssome\sTCL\stests. +D 2021-10-22T11:17:29.954 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -404,7 +404,7 @@ F ext/rtree/rtree5.test 49c9041d713d54560b315c2c7ef7207ee287eba1b20f8266968a06f2 F ext/rtree/rtree6.test 9ce3691c1aac43070a9f194f0ebf54372db346c5a82241fd11b525ed53ce9f3f F ext/rtree/rtree7.test c8fb2e555b128dd0f0bdb520c61380014f497f8a23c40f2e820acc9f9e4fdce5 F ext/rtree/rtree8.test 2d99006a1386663978c9e1df167554671e4f711c419175b39f332719deb1ce0e -F ext/rtree/rtree9.test c646f12c8c1c68ef015c6c043d86a0c42488e2e68ed1bb1b0771a7ca246cbabf +F ext/rtree/rtree9.test fd3c9384ef8aabbc127b3878764070398f136eebc551cd20484b570f2cc1956a F ext/rtree/rtreeA.test c0d8e91e25052d5f3fbda17632ca843b82ca13c4181fb6000a0d63bd2d7e70ce F ext/rtree/rtreeB.test 4cec297f8e5c588654bbf3c6ed0903f10612be8a2878055dd25faf8c71758bc9 F ext/rtree/rtreeC.test c4bfa9a61c6788c03e4a9ce40ab2cfc6100982559effd9842d1b658e1d47aa5f @@ -419,12 +419,12 @@ F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b5879 F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/rtreedoc.test 903c5229758bcef1d5590892bf973d9f91dcd1d96b1c09b6761e2c0e398e78e1 +F ext/rtree/rtreedoc.test 27a5703cb1200f6f69051de68da546cef3dfdcf59be73afadfc50b9f9c9960d9 F ext/rtree/rtreedoc2.test 194ebb7d561452dcdc10bf03f44e30c082c2f0c14efeb07f5e02c7daf8284d93 F ext/rtree/rtreedoc3.test 555a878c4d79c4e37fa439a1c3b02ee65d3ebaf75d9e8d96a9c55d66db3efbf8 F ext/rtree/rtreefuzz001.test 0fc793f67897c250c5fde96cefee455a5e2fb92f4feeabde5b85ea02040790ee F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 -F ext/rtree/test_rtreedoc.c e81d9bf69f7cbc8ba536458bbd8fc06a6f9ca93165f7d68832f588461e6a53cb +F ext/rtree/test_rtreedoc.c 0167f9243a56d08e79230f604f3979d6b7cde4816355acf7a7d436d9d788bf38 F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de F ext/rtree/util/randomshape.tcl 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 @@ -505,7 +505,7 @@ F src/expr.c 529f7eca2821e874a375b1b318e697d62cb28f56069677c93f587f2de5dceb54 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 187b67af20c5795953a592832c5d985e4313fe503ebd8f95e3e9e9ad5a730bb5 F src/func.c 1cfb09d7ffca81238eccefdb0293e1f5b7cfebbd1816dfad5ec6024742a7496b -F src/global.c 59bfd5705a623f0b45e91622699953cfd1be2c176e78d8ff610463f2ea4ec51b +F src/global.c 1f56aead86e8a18c4415638f5e6c4d0a0550427f4b3f5d065ba5164cc09c22e8 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 @@ -554,7 +554,7 @@ F src/shell.c.in e80fe5118fc3b942c1becc67ebfca6a887dbab9295e0bd5b6da61c4375baa63 F src/sqlite.h.in f0c1ecb5af508aa8e970cd8bc0ec851e6c380b81825038d458846c2fcdfcef50 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h df3bc11691f5977041efb0d16fcd2b5e10e97bc5f8231edd3fbc0ed24978be30 +F src/sqliteInt.h 317bbdf926ec7c391fb00bcaa1f82799836a1151568bd9d343f43c2cdf1a48b9 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f73b499e539b9551a70deecec4fc10c3a4af3830324977861cd0558f9782a1d3 -R c12908b5ad7e1daca726d21d0e808b76 +P 559ba38b8a0f7795d781838ec78969874fd678f749b26cd49cf6112afc838732 +R 332dd56b39999f59e5d9d9296b7da59d U drh -Z 8f7717d9b592fff6ee99b8fe013f83fa +Z 09926337278faa19265979e4ffc8ebe1 diff --git a/manifest.uuid b/manifest.uuid index dcf2d0a2f3..da82038d25 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -559ba38b8a0f7795d781838ec78969874fd678f749b26cd49cf6112afc838732 \ No newline at end of file +1a038242dc6c0cab97dd9375acfce62aa1c386debc36aaed388d366b87ddd931 \ No newline at end of file diff --git a/src/global.c b/src/global.c index 52ca5bab2e..34b7d9583b 100644 --- a/src/global.c +++ b/src/global.c @@ -298,11 +298,17 @@ SQLITE_WSD struct Sqlite3Config sqlite3Config = { */ FuncDefHash sqlite3BuiltinFunctions; +#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_DEBUG) /* ** Counter used for coverage testing. Does not come into play for ** release builds. +** +** Access to this global variable is not mutex protected. This might +** result in TSAN warnings. But as the variable does not exist in +** release builds, that should not be a concern. */ unsigned int sqlite3CoverageCounter; +#endif /* SQLITE_COVERAGE_TEST || SQLITE_DEBUG */ #ifdef VDBE_PROFILE /* diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 06264a258f..cb20a37f24 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -435,7 +435,6 @@ ** is significant and used at least once. On switch statements ** where multiple cases go to the same block of code, testcase() ** can insure that all cases are evaluated. -** */ #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_DEBUG) # ifndef SQLITE_AMALGAMATION From be5365617143b4bb58ab8a105df1a5ba041b0bb6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 23 Oct 2021 11:30:35 +0000 Subject: [PATCH 11/35] Update fuzzcheck so that it allows ATTACH statements with memdb filenames. FossilOrigin-Name: 31671237e560b52dc27f707309269069a6bdcd017df9844908e77b57dc11f180 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 6 +++++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 5ea5f0607b..c6635feacc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings.\s\sImprove\sthe\sindependence\sof\ssome\sTCL\stests. -D 2021-10-22T11:17:29.954 +C Update\sfuzzcheck\sso\sthat\sit\sallows\sATTACH\sstatements\swith\smemdb\sfilenames. +D 2021-10-23T11:30:35.169 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1055,7 +1055,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 2295d04576264ef8d1aa5adf689fa0b774aede30c565cd6cb11772bf66361b69 +F test/fuzzcheck.c 7d9cf020fa4a1c52b09aa5f9daf5a0fa5a3edfd952e5933f0812735d138f7529 F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 559ba38b8a0f7795d781838ec78969874fd678f749b26cd49cf6112afc838732 -R 332dd56b39999f59e5d9d9296b7da59d +P 1a038242dc6c0cab97dd9375acfce62aa1c386debc36aaed388d366b87ddd931 +R 34386e9b5caf945336fe068df17fa91d U drh -Z 09926337278faa19265979e4ffc8ebe1 +Z fe79b53e74aa12c3b50f43764f01d9e9 diff --git a/manifest.uuid b/manifest.uuid index da82038d25..a71d65e118 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1a038242dc6c0cab97dd9375acfce62aa1c386debc36aaed388d366b87ddd931 \ No newline at end of file +31671237e560b52dc27f707309269069a6bdcd017df9844908e77b57dc11f180 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index dc5269481b..21a84d3325 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -762,7 +762,10 @@ static int block_troublesome_sql( oomCounter = atoi(zArg2); } }else if( eCode==SQLITE_ATTACH ){ - if( zArg1==0 || (zArg1[0]!=0 && strcmp(zArg1,":memory:")!=0) ){ + if( zArg1==0 ) return SQLITE_DENY; + if( strcmp(zArg1,":memory:")!=0 + && sqlite3_strglob("file:*[?]vfs=memdb", zArg1)!=0 + ){ return SQLITE_DENY; } } @@ -1503,6 +1506,7 @@ int main(int argc, char **argv){ int nV; /* How much to increase verbosity with -vvvv */ sqlite3_int64 tmStart; /* Start of each test */ + sqlite3_config(SQLITE_CONFIG_URI,1); registerOomSimulator(); sqlite3_initialize(); iBegin = timeOfDay(); From 88944e6f1035d98e8af36c57c9d29636d2d77ec9 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 23 Oct 2021 17:46:00 +0000 Subject: [PATCH 12/35] Fix the memdb VFS so that it does not allow mmap if it is resizable, and so that it never opens a disk file for any reason. FossilOrigin-Name: 5ee14715a561d7522e9c6fd35a2ad3e6de526450025a99d2a523c2b27151be4f --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/memdb.c | 13 ++++++------- src/vdbesort.c | 2 +- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index c6635feacc..b12b6068a2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sfuzzcheck\sso\sthat\sit\sallows\sATTACH\sstatements\swith\smemdb\sfilenames. -D 2021-10-23T11:30:35.169 +C Fix\sthe\smemdb\sVFS\sso\sthat\sit\sdoes\snot\sallow\smmap\sif\sit\sis\sresizable,\sand\sso\nthat\sit\snever\sopens\sa\sdisk\sfile\sfor\sany\sreason. +D 2021-10-23T17:46:00.160 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -520,7 +520,7 @@ F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c c8bfc9446fd0798bddd495eb5d9dbafa7d4b7287d8c22d50a83ac9daa26d8a75 F src/mem3.c 30301196cace2a085cbedee1326a49f4b26deff0af68774ca82c1f7c06fda4f6 F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memdb.c cd8cf3ee965db4a4ab4b5423b49a4ef810490b8ba828911e523325f2cce3ed1a +F src/memdb.c ca36b36c497558abe8bf1fa6b6ad974db2275312ce30fc44e578e160688a7503 F src/memjournal.c a85f0dc5c02a42453d0bc3819ecfb5666cb6433e5deefcd93ccbe05c9f088b83 F src/msvc.h 3a15918220367a8876be3fa4f2abe423a861491e84b864fb2b7426bf022a28f8 F src/mutex.c 5e3409715552348732e97b9194abe92fdfcd934cfb681df4ba0ab87ac6c18d25 @@ -628,7 +628,7 @@ F src/vdbeapi.c 7b83468feb1d42a09d4c2e5241a3eaa3d1f138e289a843cba9fd3f1dad95ca67 F src/vdbeaux.c a57c760d1897f1b72f6fae26983df363db7a2c42d88721187e907f2c84862b42 F src/vdbeblob.c 292e96c01c4219fca71d74e1002906d43eb232af4bd83f7552a3faec741f3eb8 F src/vdbemem.c 8be0af1060012520381d3296fcb1718e80cd5b99ce04f51f7e1c4dba4072caac -F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 +F src/vdbesort.c 04292f8c569dc9ad2afc1d56d118f2cfab36ca65a3f02eef0b5b92bda01560be F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c F src/vtab.c d07cc24dd84b0b51bf05adb187b0d2e6b0cac56cfbc0197995a26d4f8fa5c7e2 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1a038242dc6c0cab97dd9375acfce62aa1c386debc36aaed388d366b87ddd931 -R 34386e9b5caf945336fe068df17fa91d +P 31671237e560b52dc27f707309269069a6bdcd017df9844908e77b57dc11f180 +R 444deadb002e60bf5ed2135691fd7c7f U drh -Z fe79b53e74aa12c3b50f43764f01d9e9 +Z aa0780d26c17b9f3da4ad58aee5df686 diff --git a/manifest.uuid b/manifest.uuid index a71d65e118..d460d8ce6b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -31671237e560b52dc27f707309269069a6bdcd017df9844908e77b57dc11f180 \ No newline at end of file +5ee14715a561d7522e9c6fd35a2ad3e6de526450025a99d2a523c2b27151be4f \ No newline at end of file diff --git a/src/memdb.c b/src/memdb.c index 0d970b6ca3..321ef6ff7c 100644 --- a/src/memdb.c +++ b/src/memdb.c @@ -272,7 +272,7 @@ static int memdbRead( */ static int memdbEnlarge(MemStore *p, sqlite3_int64 newSz){ unsigned char *pNew; - if( (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)==0 || p->nMmap>0 ){ + if( (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)==0 || NEVER(p->nMmap>0) ){ return SQLITE_FULL; } if( newSz>p->szMax ){ @@ -471,7 +471,7 @@ static int memdbFetch( ){ MemStore *p = ((MemFile*)pFile)->pStore; memdbEnter(p); - if( iOfst+iAmt>p->sz ){ + if( iOfst+iAmt>p->sz || (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)!=0 ){ *pp = 0; }else{ p->nMmap++; @@ -505,9 +505,7 @@ static int memdbOpen( MemFile *pFile = (MemFile*)pFd; MemStore *p = 0; int szName; - if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){ - return ORIGVFS(pVfs)->xOpen(ORIGVFS(pVfs), zName, pFd, flags, pOutFlags); - } + memset(pFile, 0, sizeof(*pFile)); szName = sqlite3Strlen30(zName); if( szName>1 && zName[0]=='/' ){ @@ -567,8 +565,9 @@ static int memdbOpen( p->szMax = sqlite3GlobalConfig.mxMemdbSize; } pFile->pStore = p; - assert( pOutFlags!=0 ); /* True because flags==SQLITE_OPEN_MAIN_DB */ - *pOutFlags = flags | SQLITE_OPEN_MEMORY; + if( pOutFlags!=0 ){ + *pOutFlags = flags | SQLITE_OPEN_MEMORY; + } pFd->pMethods = &memdb_io_methods; memdbLeave(p); return SQLITE_OK; diff --git a/src/vdbesort.c b/src/vdbesort.c index 397935aa8c..6cb4f87269 100644 --- a/src/vdbesort.c +++ b/src/vdbesort.c @@ -1289,7 +1289,7 @@ static void vdbeSorterExtendFile(sqlite3 *db, sqlite3_file *pFd, i64 nByte){ sqlite3OsFileControlHint(pFd, SQLITE_FCNTL_CHUNK_SIZE, &chunksize); sqlite3OsFileControlHint(pFd, SQLITE_FCNTL_SIZE_HINT, &nByte); sqlite3OsFetch(pFd, 0, (int)nByte, &p); - sqlite3OsUnfetch(pFd, 0, p); + if( p ) sqlite3OsUnfetch(pFd, 0, p); } } #else From 021e228ec0344920decc9baa2da4f09f63d95433 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 23 Oct 2021 20:32:27 +0000 Subject: [PATCH 13/35] The pager now remembers when a VFS reports that a database file is SQLITE_OPEN_MEMORY and treats that database as an in-memory database. FossilOrigin-Name: 967b65623807ff992869da0a7d9b0105701939c4658a7aee37a30fb267869c6d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pager.c | 5 +++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index b12b6068a2..9ca05fe881 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\smemdb\sVFS\sso\sthat\sit\sdoes\snot\sallow\smmap\sif\sit\sis\sresizable,\sand\sso\nthat\sit\snever\sopens\sa\sdisk\sfile\sfor\sany\sreason. -D 2021-10-23T17:46:00.160 +C The\spager\snow\sremembers\swhen\sa\sVFS\sreports\sthat\sa\sdatabase\sfile\sis\nSQLITE_OPEN_MEMORY\sand\streats\sthat\sdatabase\sas\san\sin-memory\sdatabase. +D 2021-10-23T20:32:27.236 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -536,7 +536,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c feac74a0ba7652c405ba30f61d9e738be717d15899f2915a129ef160a3e5b26b F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 71e3102150ae1b5567043ccda932aa81fb7de9848f501dafe491087c940e34dc +F src/pager.c bc10c191d18bffd3d76eda5f162799e43a9f875ecfe7c4869f752e2ddef87ea2 F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f F src/parse.y 0bd7971a7489bbf6c3726f1b50da6e508bdff8fa493e9cc3f5a96b12cbb2361e F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 31671237e560b52dc27f707309269069a6bdcd017df9844908e77b57dc11f180 -R 444deadb002e60bf5ed2135691fd7c7f +P 5ee14715a561d7522e9c6fd35a2ad3e6de526450025a99d2a523c2b27151be4f +R d561d8148c02fd21a733d83483d3f438 U drh -Z aa0780d26c17b9f3da4ad58aee5df686 +Z 751678e6ce28d48782acb94cc1b3fb72 diff --git a/manifest.uuid b/manifest.uuid index d460d8ce6b..86786e4483 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5ee14715a561d7522e9c6fd35a2ad3e6de526450025a99d2a523c2b27151be4f \ No newline at end of file +967b65623807ff992869da0a7d9b0105701939c4658a7aee37a30fb267869c6d \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 20c39abb1b..0ed5848343 100644 --- a/src/pager.c +++ b/src/pager.c @@ -630,6 +630,7 @@ struct Pager { u8 noLock; /* Do not lock (except in WAL mode) */ u8 readOnly; /* True for a read-only database */ u8 memDb; /* True to inhibit all file I/O */ + u8 memVfs; /* VFS-implemented memory database */ /************************************************************************** ** The following block contains those class members that change during @@ -4872,7 +4873,7 @@ int sqlite3PagerOpen( rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd, vfsFlags, &fout); assert( !memDb ); #ifndef SQLITE_OMIT_DESERIALIZE - memJM = (fout&SQLITE_OPEN_MEMORY)!=0; + pPager->memVfs = memJM = (fout&SQLITE_OPEN_MEMORY)!=0; #endif readOnly = (fout&SQLITE_OPEN_READONLY)!=0; @@ -6809,7 +6810,7 @@ void sqlite3PagerCacheStat(Pager *pPager, int eStat, int reset, int *pnVal){ ** Return true if this is an in-memory or temp-file backed pager. */ int sqlite3PagerIsMemdb(Pager *pPager){ - return pPager->tempFile; + return pPager->tempFile || pPager->memVfs; } /* From f81b40a52d94b619be842c1758358dd886d7a8a0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 23 Oct 2021 22:11:18 +0000 Subject: [PATCH 14/35] Provide an assert() to fire for applications that should never open or create a disk-based database file. FossilOrigin-Name: 5218ac788ca35fdd7f98117758f0bef9d55fe7517098e7bf62fda3fed2af3d51 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/os_unix.c | 5 +++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 9ca05fe881..04feaa7df9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\spager\snow\sremembers\swhen\sa\sVFS\sreports\sthat\sa\sdatabase\sfile\sis\nSQLITE_OPEN_MEMORY\sand\streats\sthat\sdatabase\sas\san\sin-memory\sdatabase. -D 2021-10-23T20:32:27.236 +C Provide\san\sassert()\sto\sfire\sfor\sapplications\sthat\sshould\snever\sopen\sor\screate\na\sdisk-based\sdatabase\sfile. +D 2021-10-23T22:11:18.414 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/os.c 91fc69f95ef0528368174dca20f01e1d8f82934f719e1cb50fd0260b18c028a6 F src/os.h 26890f540b475598cd9881dcc68931377b8d429d3ea3e2eeb64470cde64199f8 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c feac74a0ba7652c405ba30f61d9e738be717d15899f2915a129ef160a3e5b26b +F src/os_unix.c f445ad0597184e27f225bfc3d327dee32b49f7918d6eda9c921369b5060d96ef F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c bc10c191d18bffd3d76eda5f162799e43a9f875ecfe7c4869f752e2ddef87ea2 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5ee14715a561d7522e9c6fd35a2ad3e6de526450025a99d2a523c2b27151be4f -R d561d8148c02fd21a733d83483d3f438 +P 967b65623807ff992869da0a7d9b0105701939c4658a7aee37a30fb267869c6d +R a9ff94845a8cffbce47542363f26ab35 U drh -Z 751678e6ce28d48782acb94cc1b3fb72 +Z 2501f234de757bdac4c4fa55bb7c36cf diff --git a/manifest.uuid b/manifest.uuid index 86786e4483..f3919a049f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -967b65623807ff992869da0a7d9b0105701939c4658a7aee37a30fb267869c6d \ No newline at end of file +5218ac788ca35fdd7f98117758f0bef9d55fe7517098e7bf62fda3fed2af3d51 \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index d45fdabab2..bc6063dae8 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -6125,6 +6125,11 @@ static int unixOpen( } memset(p, 0, sizeof(unixFile)); +#ifdef SQLITE_ASSERT_NO_FILES + /* Applications that never read or write a persistent disk files */ + assert( zName==0 ); +#endif + if( eType==SQLITE_OPEN_MAIN_DB ){ UnixUnusedFd *pUnused; pUnused = findReusableFd(zName, flags); From c8f7211d8fe18068cd28632e7b2e4e7420f1b282 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 23 Oct 2021 22:14:11 +0000 Subject: [PATCH 15/35] Improve the authorizer filter for ATTACH on fuzzcheck. FossilOrigin-Name: 87d49e80878674470d280de79c8ade222dd006e65c90e79616c4f72c7c32dabb --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 10 +++++++--- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 04feaa7df9..8ad190687f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Provide\san\sassert()\sto\sfire\sfor\sapplications\sthat\sshould\snever\sopen\sor\screate\na\sdisk-based\sdatabase\sfile. -D 2021-10-23T22:11:18.414 +C Improve\sthe\sauthorizer\sfilter\sfor\sATTACH\son\sfuzzcheck. +D 2021-10-23T22:14:11.249 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1055,7 +1055,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 7d9cf020fa4a1c52b09aa5f9daf5a0fa5a3edfd952e5933f0812735d138f7529 +F test/fuzzcheck.c a86cc34bcc91c4a882cbac0ccc7c903d27c2a520bd6006510b3371e7befdd09b F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 967b65623807ff992869da0a7d9b0105701939c4658a7aee37a30fb267869c6d -R a9ff94845a8cffbce47542363f26ab35 +P 5218ac788ca35fdd7f98117758f0bef9d55fe7517098e7bf62fda3fed2af3d51 +R 17548d134303a4e483245fa3f87d916c U drh -Z 2501f234de757bdac4c4fa55bb7c36cf +Z 9ccb24f9c373f9b4367082008057e6de diff --git a/manifest.uuid b/manifest.uuid index f3919a049f..28fbef41bc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5218ac788ca35fdd7f98117758f0bef9d55fe7517098e7bf62fda3fed2af3d51 \ No newline at end of file +87d49e80878674470d280de79c8ade222dd006e65c90e79616c4f72c7c32dabb \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 21a84d3325..ee709d3e4e 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -762,12 +762,16 @@ static int block_troublesome_sql( oomCounter = atoi(zArg2); } }else if( eCode==SQLITE_ATTACH ){ + /* Deny the ATTACH if it is attaching anything other than an in-memory + ** database. */ if( zArg1==0 ) return SQLITE_DENY; - if( strcmp(zArg1,":memory:")!=0 - && sqlite3_strglob("file:*[?]vfs=memdb", zArg1)!=0 + if( strcmp(zArg1,":memory:")==0 ) return SQLITE_OK; + if( sqlite3_strglob("file:*[?]vfs=memdb", zArg1)==0 + && sqlite3_strglob("file:*[^/a-zA-Z0-9_.]*[?]vfs=memdb", zArg1)!=0 ){ - return SQLITE_DENY; + return SQLITE_OK; } + return SQLITE_DENY; } return SQLITE_OK; } From 63e8f03c783eb746a21d2481349335c40e96f4bb Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 25 Oct 2021 12:54:23 +0000 Subject: [PATCH 16/35] Do not allow large busy_timeout pragmas in fuzzcheck, as they accomplish nothing other than making the tests unnecessarily slow. FossilOrigin-Name: fba441bf9f6ed729a66ccd4e42b5a8859bf3952d70a66bc9a2496ec49d90a60c --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 6 +++++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 8ad190687f..a581a6ff99 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\sthe\sauthorizer\sfilter\sfor\sATTACH\son\sfuzzcheck. -D 2021-10-23T22:14:11.249 +C Do\snot\sallow\slarge\sbusy_timeout\spragmas\sin\sfuzzcheck,\sas\sthey\saccomplish\nnothing\sother\sthan\smaking\sthe\stests\sunnecessarily\sslow. +D 2021-10-25T12:54:23.541 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1055,7 +1055,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c a86cc34bcc91c4a882cbac0ccc7c903d27c2a520bd6006510b3371e7befdd09b +F test/fuzzcheck.c 0bb10903f3059b2cf006dd9db081159661360e9abcc8bc5ea61d2adcf9ec4c3e F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5218ac788ca35fdd7f98117758f0bef9d55fe7517098e7bf62fda3fed2af3d51 -R 17548d134303a4e483245fa3f87d916c +P 87d49e80878674470d280de79c8ade222dd006e65c90e79616c4f72c7c32dabb +R bc4bb1c85a5699919f19901db43f7f5f U drh -Z 9ccb24f9c373f9b4367082008057e6de +Z 82f19ae953cfc65c5ff84d970cd775e3 diff --git a/manifest.uuid b/manifest.uuid index 28fbef41bc..488b1da4a1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -87d49e80878674470d280de79c8ade222dd006e65c90e79616c4f72c7c32dabb \ No newline at end of file +fba441bf9f6ed729a66ccd4e42b5a8859bf3952d70a66bc9a2496ec49d90a60c \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index ee709d3e4e..922095cb33 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -750,7 +750,11 @@ static int block_troublesome_sql( (void)zArg3; (void)zArg4; if( eCode==SQLITE_PRAGMA ){ - if( eVerbosity==0 ){ + if( sqlite3_stricmp("busy_timeout",zArg1)==0 + && (zArg2==0 || atoi(zArg2)>100) + ){ + return SQLITE_DENY; + }else if( eVerbosity==0 ){ if( sqlite3_strnicmp("vdbe_", zArg1, 5)==0 || sqlite3_stricmp("parser_trace", zArg1)==0 || sqlite3_stricmp("temp_store_directory", zArg1)==0 From 9b35c679a9c534631cb002b6850f72f26a5d45f2 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 25 Oct 2021 18:51:56 +0000 Subject: [PATCH 17/35] Remove a NEVER() in rebuildPage that is reachable, as is demonstrated by dbsqlfuzz case beac09b2756b5d285aa68f9737fdb06c972f159a. FossilOrigin-Name: ac3f617827e06800d26ef688c5f5480b9621676f141d2eac134f877e0c454149 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index a581a6ff99..545b6fa316 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sallow\slarge\sbusy_timeout\spragmas\sin\sfuzzcheck,\sas\sthey\saccomplish\nnothing\sother\sthan\smaking\sthe\stests\sunnecessarily\sslow. -D 2021-10-25T12:54:23.541 +C Remove\sa\sNEVER()\sin\srebuildPage\sthat\sis\sreachable,\sas\sis\sdemonstrated\sby\ndbsqlfuzz\scase\sbeac09b2756b5d285aa68f9737fdb06c972f159a. +D 2021-10-25T18:51:56.300 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -490,7 +490,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 0604f4af97624ffbe2f0757c559c51f57760c6ad3d8ee3ee94fa6ec5795f2832 +F src/btree.c 004c647dfb5332ee4b56385f3ac264ebea781cb00f7a1561a48f4a45b78fed61 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h ee9348c4cb9077243b049edc93a82c1f32ca48baeabf2140d41362b9f9139ff7 F src/build.c 8bdda90f9b1189c7b0813575171b3c6b2d74b3ade57c11cb4383776781ea9335 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 87d49e80878674470d280de79c8ade222dd006e65c90e79616c4f72c7c32dabb -R bc4bb1c85a5699919f19901db43f7f5f +P fba441bf9f6ed729a66ccd4e42b5a8859bf3952d70a66bc9a2496ec49d90a60c +R b046afa0c3d079723fde3f7c27c80f0b U drh -Z 82f19ae953cfc65c5ff84d970cd775e3 +Z 7cee34f3c763c52a086ac43f9a7fefb9 diff --git a/manifest.uuid b/manifest.uuid index 488b1da4a1..9772a0f585 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fba441bf9f6ed729a66ccd4e42b5a8859bf3952d70a66bc9a2496ec49d90a60c \ No newline at end of file +ac3f617827e06800d26ef688c5f5480b9621676f141d2eac134f877e0c454149 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index ccb7eac1a7..0d220a3b93 100644 --- a/src/btree.c +++ b/src/btree.c @@ -7084,7 +7084,7 @@ static int rebuildPage( assert( i(u32)usableSize) ){ j = 0; } + if( j>(u32)usableSize ){ j = 0; } memcpy(&pTmp[j], &aData[j], usableSize - j); for(k=0; pCArray->ixNx[k]<=i && ALWAYS(k Date: Tue, 26 Oct 2021 09:53:51 +0000 Subject: [PATCH 18/35] Fix the busy_timeout restriction on fuzzcheck so that it can deal with hexadecimal integer literals. FossilOrigin-Name: 4b41535b096dec4b15a85e657102a72d4288728da6103f3fdcbe0e6f244c673a --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 545b6fa316..aa67b05119 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sNEVER()\sin\srebuildPage\sthat\sis\sreachable,\sas\sis\sdemonstrated\sby\ndbsqlfuzz\scase\sbeac09b2756b5d285aa68f9737fdb06c972f159a. -D 2021-10-25T18:51:56.300 +C Fix\sthe\sbusy_timeout\srestriction\son\sfuzzcheck\sso\sthat\sit\scan\sdeal\swith\nhexadecimal\sinteger\sliterals. +D 2021-10-26T09:53:51.938 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1055,7 +1055,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 0bb10903f3059b2cf006dd9db081159661360e9abcc8bc5ea61d2adcf9ec4c3e +F test/fuzzcheck.c 5773a888c10080da4a3174b19136631a787735a0ee44aa1bc0078384b2caeb13 F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fba441bf9f6ed729a66ccd4e42b5a8859bf3952d70a66bc9a2496ec49d90a60c -R b046afa0c3d079723fde3f7c27c80f0b +P ac3f617827e06800d26ef688c5f5480b9621676f141d2eac134f877e0c454149 +R aaa4122ff484e5344bdfc79be4d2bdda U drh -Z 7cee34f3c763c52a086ac43f9a7fefb9 +Z 44dd105d0edba620f6048dd47ca2265d diff --git a/manifest.uuid b/manifest.uuid index 9772a0f585..06a6268c02 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ac3f617827e06800d26ef688c5f5480b9621676f141d2eac134f877e0c454149 \ No newline at end of file +4b41535b096dec4b15a85e657102a72d4288728da6103f3fdcbe0e6f244c673a \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 922095cb33..66e64c4c83 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -751,7 +751,7 @@ static int block_troublesome_sql( (void)zArg4; if( eCode==SQLITE_PRAGMA ){ if( sqlite3_stricmp("busy_timeout",zArg1)==0 - && (zArg2==0 || atoi(zArg2)>100) + && (zArg2==0 || strtoll(zArg2,0,0)>100) ){ return SQLITE_DENY; }else if( eVerbosity==0 ){ From f9a49b0cad3eeda68ed1751a42f7af91c742bc18 Mon Sep 17 00:00:00 2001 From: larrybr Date: Tue, 26 Oct 2021 16:57:09 +0000 Subject: [PATCH 19/35] Add phase and error number to CLI error messages. FossilOrigin-Name: 7f87a298688c37bbad8fd2e1cf0e8fbcc36f0c211dcfa3685298525648dbe21b --- manifest | 23 +++++++++++++---------- manifest.uuid | 2 +- src/shell.c.in | 19 +++++++++---------- test/shell1.test | 4 ++-- test/shell2.test | 2 +- test/shell3.test | 4 ++-- 6 files changed, 28 insertions(+), 26 deletions(-) diff --git a/manifest b/manifest index aa67b05119..37433885c4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sbusy_timeout\srestriction\son\sfuzzcheck\sso\sthat\sit\scan\sdeal\swith\nhexadecimal\sinteger\sliterals. -D 2021-10-26T09:53:51.938 +C Add\sphase\sand\serror\snumber\sto\sCLI\serror\smessages. +D 2021-10-26T16:57:09.903 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -550,7 +550,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ae65c88f5d0d4bc0052b203773d407efa2387c2bd6b202f87178006c7bb8632c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 32d25b5af6c708aa63373c78c2e59681910387a7a78c08ec3086cadc77d41627 -F src/shell.c.in e80fe5118fc3b942c1becc67ebfca6a887dbab9295e0bd5b6da61c4375baa637 +F src/shell.c.in 6aefb37d9c87da9e33ae7d3541d07a24c8b74a4bc7b805a2a367d92fe5709108 F src/sqlite.h.in f0c1ecb5af508aa8e970cd8bc0ec851e6c380b81825038d458846c2fcdfcef50 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1376,9 +1376,9 @@ 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 d014dc15876233d06df1eaf5a22275653a1d391abf1ca28df5ef3ac688df72e9 -F test/shell2.test a03b835a9e7dcc1f79b471e4d62e0c85bdc4cb954a00820702603f1409553caf -F test/shell3.test 1586a163e7918775d3c25530bf84200453f30a77cc338490389114a67352f4d9 +F test/shell1.test c354008b27c904f0166c2138abd7382013ea070b41114114ecbdfb32c726a807 +F test/shell2.test f00a0501c00583cbc46f7510e1d713366326b2b3e63d06d15937284171a8787c +F test/shell3.test cb4b835a901742c9719437a89171172ecc4a8823ad97349af8e4e841e6f82566 F test/shell4.test 3ed6c4b42fd695efcbc25d69ef759dbb15855ca8e52ba6c5ee076f8b435f48be F test/shell5.test 84a30b55722a95a5b72989e691c469a999ca7591e7aa00b7fabc783ea5c9a6fe F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 @@ -1929,7 +1929,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 ac3f617827e06800d26ef688c5f5480b9621676f141d2eac134f877e0c454149 -R aaa4122ff484e5344bdfc79be4d2bdda -U drh -Z 44dd105d0edba620f6048dd47ca2265d +P 4b41535b096dec4b15a85e657102a72d4288728da6103f3fdcbe0e6f244c673a +R 0e943f95c783da0ea080484e06b0d01a +T *branch * detail_cli_errors +T *sym-detail_cli_errors * +T -sym-trunk * +U larrybr +Z 75e901f51a636f4c844fe34247eb3a80 diff --git a/manifest.uuid b/manifest.uuid index 06a6268c02..b56cf872d1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4b41535b096dec4b15a85e657102a72d4288728da6103f3fdcbe0e6f244c673a \ No newline at end of file +7f87a298688c37bbad8fd2e1cf0e8fbcc36f0c211dcfa3685298525648dbe21b \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 27dbe98957..cc4fb593e2 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -2606,17 +2606,16 @@ static int run_table_dump_query( } /* -** Allocate space and save off current error string. +** Allocate space and save off string indicating current error. */ static char *save_err_msg( - sqlite3 *db /* Database to query */ + sqlite3 *db, /* Database to query */ + const char *zWhen, /* Qualifier (format) wrapper */ + int rc /* Error code returned from API */ ){ - int nErrMsg = 1+strlen30(sqlite3_errmsg(db)); - char *zErrMsg = sqlite3_malloc64(nErrMsg); - if( zErrMsg ){ - memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg); - } - return zErrMsg; + if( zWhen==0 ) + zWhen = "%s (%d)"; + return sqlite3_mprintf(zWhen, sqlite3_errmsg(db), rc); } #ifdef __linux__ @@ -3538,7 +3537,7 @@ static int shell_exec( rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); if( SQLITE_OK != rc ){ if( pzErrMsg ){ - *pzErrMsg = save_err_msg(db); + *pzErrMsg = save_err_msg(db, "in prepare, %s (%d)", rc); } }else{ if( !pStmt ){ @@ -3652,7 +3651,7 @@ static int shell_exec( zSql = zLeftover; while( IsSpace(zSql[0]) ) zSql++; }else if( pzErrMsg ){ - *pzErrMsg = save_err_msg(db); + *pzErrMsg = save_err_msg(db, "stepping, %s (%d)", rc); } /* clear saved stmt handle */ diff --git a/test/shell1.test b/test/shell1.test index d54964fd81..c4e2ceb88b 100644 --- a/test/shell1.test +++ b/test/shell1.test @@ -53,7 +53,7 @@ do_test shell1-1.1.2 { # error on extra options do_test shell1-1.1.3 { catchcmd "test.db FOO test.db BAD" ".quit" -} {1 {Error: near "FOO": syntax error}} +} {1 {Error: in prepare, near "FOO": syntax error (1)}} # -help do_test shell1-1.2.1 { @@ -78,7 +78,7 @@ do_test shell1-1.3.2 { } {0 {}} do_test shell1-1.3.3 { catchcmd "-init FOO test.db BAD .quit" "" -} {1 {Error: near "BAD": syntax error}} +} {1 {Error: in prepare, near "BAD": syntax error (1)}} # -echo print commands before execution do_test shell1-1.4.1 { diff --git a/test/shell2.test b/test/shell2.test index 4f2f4f3f63..6b4dff515e 100644 --- a/test/shell2.test +++ b/test/shell2.test @@ -63,7 +63,7 @@ do_test shell2-1.3 { UPDATE OR REPLACE t5 SET a = 4 WHERE a = 1; } -} {1 {Error: near line 9: too many levels of trigger recursion}} +} {1 {Error: near line 9: stepping, too many levels of trigger recursion (1)}} diff --git a/test/shell3.test b/test/shell3.test index 714a4781ea..243da976fa 100644 --- a/test/shell3.test +++ b/test/shell3.test @@ -68,7 +68,7 @@ do_test shell3-1.6 { } {0 {}} do_test shell3-1.7 { catchcmd "foo.db \"CREATE TABLE\"" -} {1 {Error: incomplete input}} +} {1 {Error: in prepare, incomplete input (1)}} #---------------------------------------------------------------------------- # shell3-2.*: Basic tests for running SQL file from command line. @@ -98,7 +98,7 @@ do_test shell3-2.6 { } {0 {}} do_test shell3-2.7 { catchcmd "foo.db" "CREATE TABLE" -} {1 {Error: near line 1: incomplete input}} +} {1 {Error: near line 1: in prepare, incomplete input (1)}} #---------------------------------------------------------------------------- From 48b4bf269c915afec9b5ee4add4e6561b0061b72 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 26 Oct 2021 22:36:41 +0000 Subject: [PATCH 20/35] Enhance fuzzcheck so that if an argument is an ordinary disk file (not a database) it is read in and processed as a script. FossilOrigin-Name: 978dc89df521f5855678128b3c0eb503c67c1b97ddb297076e5f2c03d6297605 --- manifest | 13 ++++----- manifest.uuid | 2 +- test/fuzzcheck.c | 76 ++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 68 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index b970e4d506..7547c349f3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sCLI\serror\smessages. -D 2021-10-26T17:36:26.684 +C Enhance\sfuzzcheck\sso\sthat\sif\san\sargument\sis\san\sordinary\sdisk\sfile\s(not\na\sdatabase)\sit\sis\sread\sin\sand\sprocessed\sas\sa\sscript. +D 2021-10-26T22:36:41.583 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1055,7 +1055,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 5773a888c10080da4a3174b19136631a787735a0ee44aa1bc0078384b2caeb13 +F test/fuzzcheck.c b19baffbde9f6b8b3084b8ac3d73bf51a6918078eced6df36d8e0138c91bc4f8 F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1929,8 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4b41535b096dec4b15a85e657102a72d4288728da6103f3fdcbe0e6f244c673a 7f87a298688c37bbad8fd2e1cf0e8fbcc36f0c211dcfa3685298525648dbe21b -R 0e943f95c783da0ea080484e06b0d01a -T +closed 7f87a298688c37bbad8fd2e1cf0e8fbcc36f0c211dcfa3685298525648dbe21b +P 8443a2724f463bd2e14ea3aa337e8987104f63365767ca2b0993f3f3196cff95 +R da5eebcdd2e37607fde1f372cc816cab U drh -Z 2ef74f1ee23e599e6910e8c7178d34e6 +Z ca83264146ee66b96c9f2eb230ec2598 diff --git a/manifest.uuid b/manifest.uuid index ca8daeca25..346f4c92fe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8443a2724f463bd2e14ea3aa337e8987104f63365767ca2b0993f3f3196cff95 \ No newline at end of file +978dc89df521f5855678128b3c0eb503c67c1b97ddb297076e5f2c03d6297605 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 66e64c4c83..da90d3d4e2 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -302,6 +302,37 @@ static VFile *createVFile(const char *zName, int sz, unsigned char *pData){ return pNew; } +/* +** Read the complete content of a file into memory. Add a 0x00 terminator +** and return a pointer to the result. +** +** The file content is held in memory obtained from sqlite_malloc64() which +** should be freed by the caller. +*/ +static char *readFile(const char *zFilename, long *sz){ + FILE *in; + long nIn; + unsigned char *pBuf; + + *sz = 0; + if( zFilename==0 ) return 0; + in = fopen(zFilename, "rb"); + if( in==0 ) return 0; + fseek(in, 0, SEEK_END); + *sz = nIn = ftell(in); + rewind(in); + pBuf = sqlite3_malloc64( nIn+1 ); + if( pBuf && 1==fread(pBuf, nIn, 1, in) ){ + pBuf[nIn] = 0; + fclose(in); + return pBuf; + } + sqlite3_free(pBuf); + *sz = 0; + fclose(in); + return 0; +} + /* ** Implementation of the "readfile(X)" SQL function. The entire content @@ -313,25 +344,15 @@ static void readfileFunc( int argc, sqlite3_value **argv ){ - const char *zName; - FILE *in; long nIn; void *pBuf; + const char *zName = (const char*)sqlite3_value_text(argv[0]); - zName = (const char*)sqlite3_value_text(argv[0]); if( zName==0 ) return; - in = fopen(zName, "rb"); - if( in==0 ) return; - fseek(in, 0, SEEK_END); - nIn = ftell(in); - rewind(in); - pBuf = sqlite3_malloc64( nIn ); - if( pBuf && 1==fread(pBuf, nIn, 1, in) ){ + pBuf = readFile(zName, &nIn); + if( pBuf ){ sqlite3_result_blob(context, pBuf, nIn, sqlite3_free); - }else{ - sqlite3_free(pBuf); } - fclose(in); } /* @@ -1690,12 +1711,21 @@ int main(int argc, char **argv){ /* Process each source database separately */ for(iSrcDb=0; iSrcDbzName); + if( rc==SQLITE_OK ){ + rc = sqlite3_exec(db, "SELECT count(*) FROM sqlite_schema", 0, 0, 0); + } if( rc ){ - fatalError("cannot open source database %s - %s", - azSrcDb[iSrcDb], sqlite3_errmsg(db)); + sqlite3_close(db); + zRawData = readFile(azSrcDb[iSrcDb], &nRawData); + if( zRawData==0 ){ + fatalError("input file \"%s\" is not recognized\n", azSrcDb[iSrcDb]); + } + sqlite3_open(":memory:", &db); } /* Print the description, if there is one */ @@ -1730,6 +1760,7 @@ int main(int argc, char **argv){ sqlite3_finalize(pStmt); printf("\n"); sqlite3_close(db); + sqlite3_free(zRawData); continue; } @@ -1754,6 +1785,21 @@ int main(int argc, char **argv){ sqlite3_free(zSql); if( rc ) fatalError("cannot change description: %s", sqlite3_errmsg(db)); } + if( zRawData ){ + zInsSql = "INSERT INTO xsql(sqltext) VALUES(?1)"; + rc = sqlite3_prepare_v2(db, zInsSql, -1, &pStmt, 0); + if( rc ) fatalError("cannot prepare statement [%s]: %s", + zInsSql, sqlite3_errmsg(db)); + sqlite3_bind_text(pStmt, 1, zRawData, nRawData, SQLITE_STATIC); + sqlite3_step(pStmt); + rc = sqlite3_reset(pStmt); + if( rc ) fatalError("insert failed for %s", argv[i]); + sqlite3_finalize(pStmt); + rebuild_database(db, dbSqlOnly); + zInsSql = 0; + sqlite3_free(zRawData); + zRawData = 0; + } ossFuzzThisDb = ossFuzz; /* If the CONFIG(name,value) table exists, read db-specific settings From 075201e50f3fb3f854a321e800b6311f23435b01 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 27 Oct 2021 12:05:28 +0000 Subject: [PATCH 21/35] Add the --script option to fuzzcheck. FossilOrigin-Name: 5a9676bd4945ca098652780515e94d04859e73588d9db5558ab42f8b068a9ddb --- manifest | 12 ++--- manifest.uuid | 2 +- test/fuzzcheck.c | 128 +++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 124 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index 7547c349f3..8b0d1ffd37 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sfuzzcheck\sso\sthat\sif\san\sargument\sis\san\sordinary\sdisk\sfile\s(not\na\sdatabase)\sit\sis\sread\sin\sand\sprocessed\sas\sa\sscript. -D 2021-10-26T22:36:41.583 +C Add\sthe\s--script\soption\sto\sfuzzcheck. +D 2021-10-27T12:05:28.928 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1055,7 +1055,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c b19baffbde9f6b8b3084b8ac3d73bf51a6918078eced6df36d8e0138c91bc4f8 +F test/fuzzcheck.c c466c078af4476a4f9c6193a9bad5b16966e55bc3c5717b6aa638dea8308c08a F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8443a2724f463bd2e14ea3aa337e8987104f63365767ca2b0993f3f3196cff95 -R da5eebcdd2e37607fde1f372cc816cab +P 978dc89df521f5855678128b3c0eb503c67c1b97ddb297076e5f2c03d6297605 +R 8173569b9fa9f89185b2af54915c96dd U drh -Z ca83264146ee66b96c9f2eb230ec2598 +Z 551daae1722bbf6ff67f95bde9dbd7dc diff --git a/manifest.uuid b/manifest.uuid index 346f4c92fe..90e6732e9e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -978dc89df521f5855678128b3c0eb503c67c1b97ddb297076e5f2c03d6297605 \ No newline at end of file +5a9676bd4945ca098652780515e94d04859e73588d9db5558ab42f8b068a9ddb \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index da90d3d4e2..2b9266a06a 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -302,6 +302,77 @@ static VFile *createVFile(const char *zName, int sz, unsigned char *pData){ return pNew; } +/* Return true if the line is all zeros */ +static int allZero(unsigned char *aLine){ + int i; + for(i=0; i<16 && aLine[i]==0; i++){} + return i==16; +} + +/* +** Render a database and query as text that can be input into +** the CLI. +*/ +static void renderDbSqlForCLI( + FILE *out, /* Write to this file */ + const char *zFile, /* Name of the database file */ + unsigned char *aDb, /* Database content */ + int nDb, /* Number of bytes in aDb[] */ + unsigned char *zSql, /* SQL content */ + int nSql /* Bytes of SQL */ +){ + fprintf(out, ".print ******* %s *******\n", zFile); + if( nDb>100 ){ + int i, j; /* Loop counters */ + int pgsz; /* Size of each page */ + int lastPage = 0; /* Last page number shown */ + int iPage; /* Current page number */ + unsigned char *aLine; /* Single line to display */ + unsigned char buf[16]; /* Fake line */ + unsigned char bShow[256]; /* Characters ok to display */ + + memset(bShow, '.', sizeof(bShow)); + for(i=' '; i<='~'; i++){ + if( i!='{' && i!='}' && i!='"' && i!='\\' ) bShow[i] = i; + } + pgsz = (aDb[16]<<8) | aDb[17]; + if( pgsz==0 ) pgsz = 65536; + if( pgsz<512 || (pgsz&(pgsz-1))!=0 ) pgsz = 4096; + fprintf(out,".open --hexdb\n"); + fprintf(out,"| size %d pagesize %d filename %s\n",nDb,pgsz,zFile); + for(i=0; inDb ){ + memset(buf, 0, sizeof(buf)); + memcpy(buf, aDb+i, nDb-i); + aLine = buf; + }else{ + aLine = aDb + i; + } + if( allZero(aLine) ) continue; + iPage = i/pgsz + 1; + if( lastPage!=iPage ){ + fprintf(out,"| page %d offset %d\n", iPage, (iPage-1)*pgsz); + lastPage = iPage; + } + fprintf(out,"| %5d:", i-(iPage-1)*pgsz); + for(j=0; j<16; j++) fprintf(out," %02x", aLine[j]); + fprintf(out," "); + for(j=0; j<16; j++){ + unsigned char c = (unsigned char)aLine[j]; + fputc( bShow[c], stdout); + } + fputc('\n', stdout); + } + fprintf(out,"| end %s\n", zFile); + }else{ + fprintf(out,".open :memory:\n"); + } + fprintf(out,".testctrl prng_seed 1 db\n"); + fprintf(out,".testctrl internal_functions\n"); + fprintf(out,"%.*s", nSql, zSql); + if( nSql>0 && zSql[nSql-1]!='\n' ) fprintf(out, "\n"); +} + /* ** Read the complete content of a file into memory. Add a 0x00 terminator ** and return a pointer to the result. @@ -325,7 +396,7 @@ static char *readFile(const char *zFilename, long *sz){ if( pBuf && 1==fread(pBuf, nIn, 1, in) ){ pBuf[nIn] = 0; fclose(in); - return pBuf; + return (char*)pBuf; } sqlite3_free(pBuf); *sz = 0; @@ -876,7 +947,13 @@ static int runDbSql(sqlite3 *db, const char *zSql){ } /* Invoke this routine to run a single test case */ -int runCombinedDbSqlInput(const uint8_t *aData, size_t nByte, int iTimeout){ +int runCombinedDbSqlInput( + const uint8_t *aData, /* Combined DB+SQL content */ + size_t nByte, /* Size of aData in bytes */ + int iTimeout, /* Use this timeout */ + int bScript, /* If true, just render CLI output */ + int iSqlId /* SQL identifier */ +){ int rc; /* SQLite API return value */ int iSql; /* Index in aData[] of start of SQL */ unsigned char *aDb = 0; /* Decoded database content */ @@ -902,6 +979,14 @@ int runCombinedDbSqlInput(const uint8_t *aData, size_t nByte, int iTimeout){ iSql = decodeDatabase((unsigned char*)aData, (int)nByte, &aDb, &nDb); if( iSql<0 ) return 0; nSql = (int)(nByte - iSql); + if( bScript ){ + char zName[100]; + sqlite3_snprintf(sizeof(zName),zName,"dbsql%06d.db",iSqlId); + renderDbSqlForCLI(stdout, zName, aDb, nDb, + (unsigned char*)(aData+iSql), nSql); + sqlite3_free(aDb); + return 0; + } if( eVerbosity>=3 ){ printf( "****** %d-byte input, %d-byte database, %d-byte script " @@ -1005,7 +1090,7 @@ testrun_finished: if( rc!=SQLITE_OK ){ fprintf(stdout, "sqlite3_close() returns %d\n", rc); } - if( eVerbosity>=2 ){ + if( eVerbosity>=2 && !bScript ){ fprintf(stdout, "Peak memory usages: %f MB\n", sqlite3_memory_highwater(1) / 1000000.0); } @@ -1479,6 +1564,7 @@ static void showHelp(void){ " -q|--quiet Reduced output\n" " --rebuild Rebuild and vacuum the database file\n" " --result-trace Show the results of each SQL command\n" +" --script Output CLI script instead of running tests\n" " --skip N Skip the first N test cases\n" " --spinner Use a spinner to show progress\n" " --sqlid N Use only SQL where sqlid=N\n" @@ -1508,6 +1594,7 @@ int main(int argc, char **argv){ int vdbeLimitFlag = 0; /* --limit-vdbe */ int infoFlag = 0; /* --info */ int nSkip = 0; /* --skip */ + int bScript = 0; /* --script */ int bSpinner = 0; /* True for --spinner */ int timeoutTest = 0; /* undocumented --timeout-test flag */ int runFlags = 0; /* Flags sent to runSql() */ @@ -1642,6 +1729,9 @@ int main(int argc, char **argv){ if( strcmp(z,"result-trace")==0 ){ runFlags |= SQL_OUTPUT; }else + if( strcmp(z,"script")==0 ){ + bScript = 1; + }else if( strcmp(z,"skip")==0 ){ if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); nSkip = atoi(argv[++i]); @@ -1930,7 +2020,7 @@ int main(int argc, char **argv){ } /* Print the description, if there is one */ - if( !quietFlag ){ + if( !quietFlag && !bScript ){ zDbName = azSrcDb[iSrcDb]; i = (int)strlen(zDbName) - 1; while( i>0 && zDbName[i-1]!='/' && zDbName[i-1]!='\\' ){ i--; } @@ -1987,12 +2077,16 @@ int main(int argc, char **argv){ /* Run a test using each SQL script against each database. */ - if( !verboseFlag && !quietFlag && !bSpinner ) printf("%s:", zDbName); + if( !verboseFlag && !quietFlag && !bSpinner && !bScript ){ + printf("%s:", zDbName); + } for(pSql=g.pFirstSql; pSql; pSql=pSql->pNext){ tmStart = timeOfDay(); if( isDbSql(pSql->a, pSql->sz) ){ sqlite3_snprintf(sizeof(g.zTestName), g.zTestName, "sqlid=%d",pSql->id); - if( bSpinner ){ + if( bScript ){ + /* No progress output */ + }else if( bSpinner ){ int nTotal =g.nSql; int idx = pSql->seq; printf("\r%s: %d/%d ", zDbName, idx, nTotal); @@ -2013,10 +2107,10 @@ int main(int argc, char **argv){ if( nSkip>0 ){ nSkip--; }else{ - runCombinedDbSqlInput(pSql->a, pSql->sz, iTimeout); + runCombinedDbSqlInput(pSql->a, pSql->sz, iTimeout, bScript, pSql->id); } nTest++; - if( bTimer ){ + if( bTimer && !bScript ){ sqlite3_int64 tmEnd = timeOfDay(); printf("%lld %s\n", tmEnd - tmStart, g.zTestName); } @@ -2029,7 +2123,9 @@ int main(int argc, char **argv){ const char *zVfs = "inmem"; sqlite3_snprintf(sizeof(g.zTestName), g.zTestName, "sqlid=%d,dbid=%d", pSql->id, pDb->id); - if( bSpinner ){ + if( bScript ){ + /* No progress output */ + }else if( bSpinner ){ int nTotal = g.nDb*g.nSql; int idx = pSql->seq*g.nDb + pDb->id - 1; printf("\r%s: %d/%d ", zDbName, idx, nTotal); @@ -2051,6 +2147,14 @@ int main(int argc, char **argv){ nSkip--; continue; } + if( bScript ){ + char zName[100]; + sqlite3_snprintf(sizeof(zName), zName, "db%06d.db", + pDb->id>1 ? pDb->id : pSql->id); + renderDbSqlForCLI(stdout, zName, + pDb->a, pDb->sz, pSql->a, pSql->sz); + continue; + } createVFile("main.db", pDb->sz, pDb->a); sqlite3_randomness(0,0); if( ossFuzzThisDb ){ @@ -2123,7 +2227,9 @@ int main(int argc, char **argv){ } } } - if( bSpinner ){ + if( bScript ){ + /* No progress output */ + }else if( bSpinner ){ int nTotal = g.nDb*g.nSql; printf("\r%s: %d/%d \n", zDbName, nTotal, nTotal); }else if( !quietFlag && !verboseFlag ){ @@ -2139,7 +2245,7 @@ int main(int argc, char **argv){ } /* End loop over all source databases */ - if( !quietFlag ){ + if( !quietFlag && !bScript ){ sqlite3_int64 iElapse = timeOfDay() - iBegin; printf("fuzzcheck: 0 errors out of %d tests in %d.%03d seconds\n" "SQLite %s %s\n", From 662bebb6bde0edac65645d0ccd5f06beb905b23d Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 27 Oct 2021 13:16:33 +0000 Subject: [PATCH 22/35] Change fuzzcheck so that it accepts binary dbsql files. FossilOrigin-Name: c87a2426b81f22bd21543aa2408625ae472d8fe6cbe6b04145937066e61123c9 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzcheck.c | 12 +++++++++++- test/fuzzdata8.db | Bin 2798592 -> 2973696 bytes 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 8b0d1ffd37..d72c3d5a27 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s--script\soption\sto\sfuzzcheck. -D 2021-10-27T12:05:28.928 +C Change\sfuzzcheck\sso\sthat\sit\saccepts\sbinary\sdbsql\sfiles. +D 2021-10-27T13:16:33.148 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1055,7 +1055,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c c466c078af4476a4f9c6193a9bad5b16966e55bc3c5717b6aa638dea8308c08a +F test/fuzzcheck.c 523173cb3a6888b65799f8dc64f141ab1da49bac0f1e32c3aef303a25ec63c04 F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1063,7 +1063,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 e12b57c30566b9511ed8760eeccfb23e6361db9c43092032252e922ed942d67c +F test/fuzzdata8.db ea80e98f115387b052effb7194899cc9780a81f15606bc4641051342352020cc F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 978dc89df521f5855678128b3c0eb503c67c1b97ddb297076e5f2c03d6297605 -R 8173569b9fa9f89185b2af54915c96dd +P 5a9676bd4945ca098652780515e94d04859e73588d9db5558ab42f8b068a9ddb +R a3ce3bdce9f1afa70675a07ac543d9e2 U drh -Z 551daae1722bbf6ff67f95bde9dbd7dc +Z 7628dc954bdefd8530bd18c257ba3ac6 diff --git a/manifest.uuid b/manifest.uuid index 90e6732e9e..7d0a6e254d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5a9676bd4945ca098652780515e94d04859e73588d9db5558ab42f8b068a9ddb \ No newline at end of file +c87a2426b81f22bd21543aa2408625ae472d8fe6cbe6b04145937066e61123c9 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 2b9266a06a..c179aaf19f 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -1693,7 +1693,7 @@ int main(int argc, char **argv){ }else if( strcmp(z,"load-dbsql")==0 ){ zInsSql = "INSERT INTO xsql(sqltext)" - "VALUES(CAST(readtextfile(?1) AS text))"; + "VALUES(readfile(?1))"; iFirstInsArg = i+1; openFlags4Data = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; dbSqlOnly = 1; @@ -1780,6 +1780,16 @@ int main(int argc, char **argv){ } return 0; }else + if( strcmp(z,"is-dbsql")==0 ){ + i++; + for(i++; ivcQ+(fZDaMrj?Qb{x-sk<_yEtd&o_p@8-}CL? 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 From be2d6fdd7178ccca28ba0e7fe26d96fcba29c72a Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 27 Oct 2021 15:16:30 +0000 Subject: [PATCH 23/35] Fix a harmless compiler warning in fuzzcheck. FossilOrigin-Name: 1cfb7e8a095e1e24df5117aa7be97470d8ce91837ff83dabebac53fafee0b09c --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index d72c3d5a27..8244dbed6c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sfuzzcheck\sso\sthat\sit\saccepts\sbinary\sdbsql\sfiles. -D 2021-10-27T13:16:33.148 +C Fix\sa\sharmless\scompiler\swarning\sin\sfuzzcheck. +D 2021-10-27T15:16:30.612 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1055,7 +1055,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 523173cb3a6888b65799f8dc64f141ab1da49bac0f1e32c3aef303a25ec63c04 +F test/fuzzcheck.c 7a07718e3c017f31e88b56a891bb79a3eb42a413a811fd65b89a7b09fdd1adbd F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5a9676bd4945ca098652780515e94d04859e73588d9db5558ab42f8b068a9ddb -R a3ce3bdce9f1afa70675a07ac543d9e2 +P c87a2426b81f22bd21543aa2408625ae472d8fe6cbe6b04145937066e61123c9 +R 03053c57e10c09eb198ca9ed884c519a U drh -Z 7628dc954bdefd8530bd18c257ba3ac6 +Z 65fd4279cd2fff966b4135294c4a57dc diff --git a/manifest.uuid b/manifest.uuid index 7d0a6e254d..bd5179e946 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c87a2426b81f22bd21543aa2408625ae472d8fe6cbe6b04145937066e61123c9 \ No newline at end of file +1cfb7e8a095e1e24df5117aa7be97470d8ce91837ff83dabebac53fafee0b09c \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index c179aaf19f..b8b0fee460 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -1785,7 +1785,7 @@ int main(int argc, char **argv){ for(i++; i Date: Wed, 27 Oct 2021 15:19:01 +0000 Subject: [PATCH 24/35] Fix a harmless compiler warning in memdb.c. FossilOrigin-Name: 22fdc658a7cc6d2c50957f92c19de74c9ac7d7d3498731d73e035b99a82bc406 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/memdb.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 8244dbed6c..a978fdd743 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\scompiler\swarning\sin\sfuzzcheck. -D 2021-10-27T15:16:30.612 +C Fix\sa\sharmless\scompiler\swarning\sin\smemdb.c. +D 2021-10-27T15:19:01.315 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -520,7 +520,7 @@ F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c c8bfc9446fd0798bddd495eb5d9dbafa7d4b7287d8c22d50a83ac9daa26d8a75 F src/mem3.c 30301196cace2a085cbedee1326a49f4b26deff0af68774ca82c1f7c06fda4f6 F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memdb.c ca36b36c497558abe8bf1fa6b6ad974db2275312ce30fc44e578e160688a7503 +F src/memdb.c a6c2bb1257c3398b4dd058f81888d647472b140bb1d262d47be50606eed75d55 F src/memjournal.c a85f0dc5c02a42453d0bc3819ecfb5666cb6433e5deefcd93ccbe05c9f088b83 F src/msvc.h 3a15918220367a8876be3fa4f2abe423a861491e84b864fb2b7426bf022a28f8 F src/mutex.c 5e3409715552348732e97b9194abe92fdfcd934cfb681df4ba0ab87ac6c18d25 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c87a2426b81f22bd21543aa2408625ae472d8fe6cbe6b04145937066e61123c9 -R 03053c57e10c09eb198ca9ed884c519a +P 1cfb7e8a095e1e24df5117aa7be97470d8ce91837ff83dabebac53fafee0b09c +R b45ae9ac354d606f769be528b5f7b109 U drh -Z 65fd4279cd2fff966b4135294c4a57dc +Z 52325743b236752bc1fb158c9a88c470 diff --git a/manifest.uuid b/manifest.uuid index bd5179e946..748add109a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1cfb7e8a095e1e24df5117aa7be97470d8ce91837ff83dabebac53fafee0b09c \ No newline at end of file +22fdc658a7cc6d2c50957f92c19de74c9ac7d7d3498731d73e035b99a82bc406 \ No newline at end of file diff --git a/src/memdb.c b/src/memdb.c index 321ef6ff7c..1cc9fc2e68 100644 --- a/src/memdb.c +++ b/src/memdb.c @@ -505,6 +505,7 @@ static int memdbOpen( MemFile *pFile = (MemFile*)pFd; MemStore *p = 0; int szName; + UNUSED_PARAMETER(pVfs); memset(pFile, 0, sizeof(*pFile)); szName = sqlite3Strlen30(zName); From f76d28774244072344d0d7c263b7873725632770 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 27 Oct 2021 17:15:08 +0000 Subject: [PATCH 25/35] Fix the build for various the OMIT-everything compile-time option. No impact on regular builds. FossilOrigin-Name: 947805719bc8629619af5358ad50a6365c01f8d9ceabfe8e4df947696d3819b3 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index a978fdd743..a03ceb5dff 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\scompiler\swarning\sin\smemdb.c. -D 2021-10-27T15:19:01.315 +C Fix\sthe\sbuild\sfor\svarious\sthe\sOMIT-everything\scompile-time\soption.\s\sNo\simpact\non\sregular\sbuilds. +D 2021-10-27T17:15:08.514 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -501,7 +501,7 @@ F src/date.c fa928630fecf1d436cdc7a7a5c950c781709023ca782c21b7a43cc7361a9451e F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 0c151975fa99560767d7747f9b60543d0093d9f8b89f13d2d6058e9c83ad19e7 -F src/expr.c 529f7eca2821e874a375b1b318e697d62cb28f56069677c93f587f2de5dceb54 +F src/expr.c b882787df249b7de2f62c5c240ca8af2111839c761f1a5e9b8f501f940a9d92e F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 187b67af20c5795953a592832c5d985e4313fe503ebd8f95e3e9e9ad5a730bb5 F src/func.c 1cfb09d7ffca81238eccefdb0293e1f5b7cfebbd1816dfad5ec6024742a7496b @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1cfb7e8a095e1e24df5117aa7be97470d8ce91837ff83dabebac53fafee0b09c -R b45ae9ac354d606f769be528b5f7b109 +P 22fdc658a7cc6d2c50957f92c19de74c9ac7d7d3498731d73e035b99a82bc406 +R 443ce04155b2c98d2803e4679dccac9d U drh -Z 52325743b236752bc1fb158c9a88c470 +Z ee620333c98e156ed73754087d493167 diff --git a/manifest.uuid b/manifest.uuid index 748add109a..5b0add7737 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -22fdc658a7cc6d2c50957f92c19de74c9ac7d7d3498731d73e035b99a82bc406 \ No newline at end of file +947805719bc8629619af5358ad50a6365c01f8d9ceabfe8e4df947696d3819b3 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 12c2ad636e..7a957fe025 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1748,7 +1748,7 @@ Select *sqlite3SelectDup(sqlite3 *db, const Select *pDup, int flags){ return pRet; } #else -Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){ +Select *sqlite3SelectDup(sqlite3 *db, const Select *p, int flags){ assert( p==0 ); return 0; } From 9b2adcc3d19410b17156593052d7554728a26064 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 27 Oct 2021 19:05:04 +0000 Subject: [PATCH 26/35] New assert()s to help prove correctness in sqlite3VdbeMemExpandBlob(). FossilOrigin-Name: 7238d58051bfdcea8f7a4aeab89145849d0659c987df9063aacafe97be6657fe --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbemem.c | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index a03ceb5dff..154c787ff5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sbuild\sfor\svarious\sthe\sOMIT-everything\scompile-time\soption.\s\sNo\simpact\non\sregular\sbuilds. -D 2021-10-27T17:15:08.514 +C New\sassert()s\sto\shelp\sprove\scorrectness\sin\ssqlite3VdbeMemExpandBlob(). +D 2021-10-27T19:05:04.804 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -627,7 +627,7 @@ F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c 7b83468feb1d42a09d4c2e5241a3eaa3d1f138e289a843cba9fd3f1dad95ca67 F src/vdbeaux.c a57c760d1897f1b72f6fae26983df363db7a2c42d88721187e907f2c84862b42 F src/vdbeblob.c 292e96c01c4219fca71d74e1002906d43eb232af4bd83f7552a3faec741f3eb8 -F src/vdbemem.c 8be0af1060012520381d3296fcb1718e80cd5b99ce04f51f7e1c4dba4072caac +F src/vdbemem.c 71a449c57be10a66a8a5620e5c5a67ebb9ca70121556dc631ffd4c4458708d8c F src/vdbesort.c 04292f8c569dc9ad2afc1d56d118f2cfab36ca65a3f02eef0b5b92bda01560be F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 22fdc658a7cc6d2c50957f92c19de74c9ac7d7d3498731d73e035b99a82bc406 -R 443ce04155b2c98d2803e4679dccac9d +P 947805719bc8629619af5358ad50a6365c01f8d9ceabfe8e4df947696d3819b3 +R 25804e35f2af1022a83cf075d76b7647 U drh -Z ee620333c98e156ed73754087d493167 +Z 847be2825d463962a46d3dd1feb437b1 diff --git a/manifest.uuid b/manifest.uuid index 5b0add7737..ed4a5f7126 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -947805719bc8629619af5358ad50a6365c01f8d9ceabfe8e4df947696d3819b3 \ No newline at end of file +7238d58051bfdcea8f7a4aeab89145849d0659c987df9063aacafe97be6657fe \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index d381d4fc5c..f659e55659 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -374,6 +374,8 @@ int sqlite3VdbeMemExpandBlob(Mem *pMem){ if( sqlite3VdbeMemGrow(pMem, nByte, 1) ){ return SQLITE_NOMEM_BKPT; } + assert( pMem->z!=0 ); + assert( sqlite3DbMallocSize(pMem->db,pMem->z) >= nByte ); memset(&pMem->z[pMem->n], 0, pMem->u.nZero); pMem->n += pMem->u.nZero; From 5f25627a1c7c151b04a5710427c9da4284d0a090 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 27 Oct 2021 19:57:59 +0000 Subject: [PATCH 27/35] Improve the comment on walIndexPage() to more accurately describe the post-conditions. FossilOrigin-Name: b619e936455f4001b543a9a58dea2ac9ebd598327d6be01130ca6e7e9764ffe6 --- manifest | 15 +++++++++------ manifest.uuid | 2 +- src/wal.c | 14 ++++++++++---- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 154c787ff5..4eb388a925 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\sassert()s\sto\shelp\sprove\scorrectness\sin\ssqlite3VdbeMemExpandBlob(). -D 2021-10-27T19:05:04.804 +C Improve\sthe\scomment\son\swalIndexPage()\sto\smore\saccurately\sdescribe\sthe\npost-conditions. +D 2021-10-27T19:57:59.451 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -633,7 +633,7 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c F src/vtab.c d07cc24dd84b0b51bf05adb187b0d2e6b0cac56cfbc0197995a26d4f8fa5c7e2 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 2be08331d798237ad5d7ae0b252700ffb2b63189cb18d993496d009a93e2f81c +F src/wal.c 2bf6d846140a3ef6ac4dae85e993e98dd304e03641ccef65904744eb85e65e2e F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c ecabef93b0f14442a73eca205fc960428984d75fbdc7d60226b7fc9cac127187 @@ -1929,7 +1929,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 947805719bc8629619af5358ad50a6365c01f8d9ceabfe8e4df947696d3819b3 -R 25804e35f2af1022a83cf075d76b7647 +P 7238d58051bfdcea8f7a4aeab89145849d0659c987df9063aacafe97be6657fe +R d7b0bf6adaa4481b0cdf4adead947bd2 +T *branch * wal-tuneup +T *sym-wal-tuneup * +T -sym-trunk * U drh -Z 847be2825d463962a46d3dd1feb437b1 +Z 903a3bc4a6ff5101d13b9fbd42b22ae8 diff --git a/manifest.uuid b/manifest.uuid index ed4a5f7126..724e8d66ee 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7238d58051bfdcea8f7a4aeab89145849d0659c987df9063aacafe97be6657fe \ No newline at end of file +b619e936455f4001b543a9a58dea2ac9ebd598327d6be01130ca6e7e9764ffe6 \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index 83929ea467..0b01c30f22 100644 --- a/src/wal.c +++ b/src/wal.c @@ -620,9 +620,13 @@ struct WalIterator { ** so. It is safe to enlarge the wal-index if pWal->writeLock is true ** or pWal->exclusiveMode==WAL_HEAPMEMORY_MODE. ** -** If this call is successful, *ppPage is set to point to the wal-index -** page and SQLITE_OK is returned. If an error (an OOM or VFS error) occurs, -** then an SQLite error code is returned and *ppPage is set to 0. +** Three possible result scenarios: +** +** (1) rc==SQLITE_OK and *ppPage==Requested-Wal-Index-Page +** (2) rc>=SQLITE_ERROR and *ppPage==NULL +** (3) rc==SQLITE_OK and *ppPage==NULL // only if iPage==0 +** +** Scenario (3) can only occur when pWal->writeLock is false and iPage==0 */ static SQLITE_NOINLINE int walIndexPageRealloc( Wal *pWal, /* The WAL context */ @@ -655,7 +659,9 @@ static SQLITE_NOINLINE int walIndexPageRealloc( rc = sqlite3OsShmMap(pWal->pDbFd, iPage, WALINDEX_PGSZ, pWal->writeLock, (void volatile **)&pWal->apWiData[iPage] ); - assert( pWal->apWiData[iPage]!=0 || rc!=SQLITE_OK || pWal->writeLock==0 ); + assert( pWal->apWiData[iPage]!=0 + || rc!=SQLITE_OK + || (pWal->writeLock==0 && iPage==0) ); testcase( pWal->apWiData[iPage]==0 && rc==SQLITE_OK ); if( rc==SQLITE_OK ){ if( iPage>0 && sqlite3FaultSim(600) ) rc = SQLITE_NOMEM; From 71c3ea7523498f127da538b0f7cc9709adc7c381 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 27 Oct 2021 20:23:59 +0000 Subject: [PATCH 28/35] Avoid the 1-based indexing on the WalHashLoc.aPgno[] array. Make it 0-indexed instead. FossilOrigin-Name: 28f5f709b4b28ba7f6f56bdd4a9e8c04d0d2df90d13d6df1a589fa4a65163f4d --- manifest | 15 ++++++--------- manifest.uuid | 2 +- src/wal.c | 41 ++++++++++++++++++++--------------------- 3 files changed, 27 insertions(+), 31 deletions(-) diff --git a/manifest b/manifest index 4eb388a925..2c0303812e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\sthe\scomment\son\swalIndexPage()\sto\smore\saccurately\sdescribe\sthe\npost-conditions. -D 2021-10-27T19:57:59.451 +C Avoid\sthe\s1-based\sindexing\son\sthe\sWalHashLoc.aPgno[]\sarray.\s\sMake\sit\s0-indexed\ninstead. +D 2021-10-27T20:23:59.854 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -633,7 +633,7 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c F src/vtab.c d07cc24dd84b0b51bf05adb187b0d2e6b0cac56cfbc0197995a26d4f8fa5c7e2 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 2bf6d846140a3ef6ac4dae85e993e98dd304e03641ccef65904744eb85e65e2e +F src/wal.c 2fd68f0a2e12486a543016ee47828874863c486b8a090989e70627f556ccde32 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c ecabef93b0f14442a73eca205fc960428984d75fbdc7d60226b7fc9cac127187 @@ -1929,10 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7238d58051bfdcea8f7a4aeab89145849d0659c987df9063aacafe97be6657fe -R d7b0bf6adaa4481b0cdf4adead947bd2 -T *branch * wal-tuneup -T *sym-wal-tuneup * -T -sym-trunk * +P b619e936455f4001b543a9a58dea2ac9ebd598327d6be01130ca6e7e9764ffe6 +R 0450e5bea2ea312618d6c5cbc7e1928c U drh -Z 903a3bc4a6ff5101d13b9fbd42b22ae8 +Z 2a7a0238c8886bf3fdd3adf1dc184586 diff --git a/manifest.uuid b/manifest.uuid index 724e8d66ee..957b241b44 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b619e936455f4001b543a9a58dea2ac9ebd598327d6be01130ca6e7e9764ffe6 \ No newline at end of file +28f5f709b4b28ba7f6f56bdd4a9e8c04d0d2df90d13d6df1a589fa4a65163f4d \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index 0b01c30f22..2b53bdc067 100644 --- a/src/wal.c +++ b/src/wal.c @@ -1000,8 +1000,8 @@ struct WalHashLoc { ** slot in the hash table is set to N, it refers to frame number ** (pLoc->iZero+N) in the log. ** -** Finally, set pLoc->aPgno so that pLoc->aPgno[1] is the page number of the -** first frame indexed by the hash table, frame (pLoc->iZero+1). +** Finally, set pLoc->aPgno so that pLoc->aPgno[0] is the page number of the +** first frame indexed by the hash table, frame (pLoc->iZero). */ static int walHashGet( Wal *pWal, /* WAL handle */ @@ -1021,7 +1021,6 @@ static int walHashGet( }else{ pLoc->iZero = HASHTABLE_NPAGE_ONE + (iHash-1)*HASHTABLE_NPAGE; } - pLoc->aPgno = &pLoc->aPgno[-1]; } return rc; } @@ -1103,8 +1102,9 @@ static void walCleanupHash(Wal *pWal){ /* Zero the entries in the aPgno array that correspond to frames with ** frame numbers greater than pWal->hdr.mxFrame. */ - nByte = (int)((char *)sLoc.aHash - (char *)&sLoc.aPgno[iLimit+1]); - memset((void *)&sLoc.aPgno[iLimit+1], 0, nByte); + nByte = (int)((char *)sLoc.aHash - (char *)&sLoc.aPgno[iLimit]); + assert( nByte>=0 ); + memset((void *)&sLoc.aPgno[iLimit], 0, nByte); #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT /* Verify that the every entry in the mapping region is still reachable @@ -1113,11 +1113,11 @@ static void walCleanupHash(Wal *pWal){ if( iLimit ){ int j; /* Loop counter */ int iKey; /* Hash key */ - for(j=1; j<=iLimit; j++){ + for(j=0; j=0 ); + memset((void*)sLoc.aPgno, 0, nByte); } /* If the entry in aPgno[] is already set, then the previous writer @@ -1160,9 +1160,9 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){ ** Remove the remnants of that writers uncommitted transaction from ** the hash-table before writing any new entries. */ - if( sLoc.aPgno[idx] ){ + if( sLoc.aPgno[idx-1] ){ walCleanupHash(pWal); - assert( !sLoc.aPgno[idx] ); + assert( !sLoc.aPgno[idx-1] ); } /* Write the aPgno[] array entry and the hash-table slot. */ @@ -1170,7 +1170,7 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){ for(iKey=walHash(iPage); sLoc.aHash[iKey]; iKey=walNextHash(iKey)){ if( (nCollide--)==0 ) return SQLITE_CORRUPT_BKPT; } - sLoc.aPgno[idx] = iPage; + sLoc.aPgno[idx-1] = iPage; AtomicStore(&sLoc.aHash[iKey], (ht_slot)idx); #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT @@ -1191,19 +1191,18 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){ */ if( (idx&0x3ff)==0 ){ int i; /* Loop counter */ - for(i=1; i<=idx; i++){ + for(i=0; i=0 ); + pgno = sLoc.aPgno[i-sLoc.iZero-1]; iDbOff = (i64)(pgno-1) * szPage; if( iDbOff+szPage<=szDb ){ @@ -3193,7 +3192,7 @@ int sqlite3WalFindFrame( 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 ){ + if( iFrame<=iLast && iFrame>=pWal->minFrame && sLoc.aPgno[iH-1]==pgno ){ assert( iFrame>iRead || CORRUPT_DB ); iRead = iFrame; } From eaad533e54083d4e06b1668e20023a27f620728d Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 27 Oct 2021 23:55:30 +0000 Subject: [PATCH 29/35] Ensure that all possible outcomes for walIndexPage() are accounted for by callers. FossilOrigin-Name: 12715c6b234a04627ca27e94bfa8bd456998360a9f0117480e0038f4747818d6 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wal.c | 7 +++++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 2c0303812e..863ea96277 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sthe\s1-based\sindexing\son\sthe\sWalHashLoc.aPgno[]\sarray.\s\sMake\sit\s0-indexed\ninstead. -D 2021-10-27T20:23:59.854 +C Ensure\sthat\sall\spossible\soutcomes\sfor\swalIndexPage()\sare\saccounted\sfor\sby\ncallers. +D 2021-10-27T23:55:30.606 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -633,7 +633,7 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c F src/vtab.c d07cc24dd84b0b51bf05adb187b0d2e6b0cac56cfbc0197995a26d4f8fa5c7e2 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 2fd68f0a2e12486a543016ee47828874863c486b8a090989e70627f556ccde32 +F src/wal.c 6ae14d4797f31c67fc2be659d24fbc6e1a6f5f423bdfb5ef831ea171bce42320 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c ecabef93b0f14442a73eca205fc960428984d75fbdc7d60226b7fc9cac127187 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b619e936455f4001b543a9a58dea2ac9ebd598327d6be01130ca6e7e9764ffe6 -R 0450e5bea2ea312618d6c5cbc7e1928c +P 28f5f709b4b28ba7f6f56bdd4a9e8c04d0d2df90d13d6df1a589fa4a65163f4d +R fe9d125153f206ef4cb83374e184623d U drh -Z 2a7a0238c8886bf3fdd3adf1dc184586 +Z 4e7264e2dc788c50ad6f39937abcf192 diff --git a/manifest.uuid b/manifest.uuid index 957b241b44..baec424603 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -28f5f709b4b28ba7f6f56bdd4a9e8c04d0d2df90d13d6df1a589fa4a65163f4d \ No newline at end of file +12715c6b234a04627ca27e94bfa8bd456998360a9f0117480e0038f4747818d6 \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index 2b53bdc067..4c37560798 100644 --- a/src/wal.c +++ b/src/wal.c @@ -1013,7 +1013,7 @@ static int walHashGet( rc = walIndexPage(pWal, iHash, &pLoc->aPgno); assert( rc==SQLITE_OK || iHash>0 ); - if( rc==SQLITE_OK ){ + if( pLoc->aPgno ){ pLoc->aHash = (volatile ht_slot *)&pLoc->aPgno[HASHTABLE_NPAGE]; if( iHash==0 ){ pLoc->aPgno = &pLoc->aPgno[WALINDEX_HDR_SIZE/sizeof(u32)]; @@ -1021,6 +1021,8 @@ static int walHashGet( }else{ pLoc->iZero = HASHTABLE_NPAGE_ONE + (iHash-1)*HASHTABLE_NPAGE; } + }else if( NEVER(rc==SQLITE_OK) ){ + rc = SQLITE_ERROR; } return rc; } @@ -1323,7 +1325,8 @@ static int walIndexRecover(Wal *pWal){ u32 iFirst = 1 + (iPg==0?0:HASHTABLE_NPAGE_ONE+(iPg-1)*HASHTABLE_NPAGE); u32 nHdr, nHdr32; rc = walIndexPage(pWal, iPg, (volatile u32**)&aShare); - if( rc ) break; + assert( aShare!=0 || rc!=SQLITE_OK ); + if( aShare==0 ) break; pWal->apWiData[iPg] = aPrivate; for(iFrame=iFirst; iFrame<=iLast; iFrame++){ From 33d28ab4cf151707a0c45e59fb5586f9c7815f4b Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 28 Oct 2021 12:07:43 +0000 Subject: [PATCH 30/35] Minor changes to make it easier for static analyzers to reason about the code. FossilOrigin-Name: ba4104aa02625b51113978c1bb540b75bd88cb1959c7e9bfb4113db4159df5d4 --- manifest | 17 ++++++++--------- manifest.uuid | 2 +- src/insert.c | 5 +++-- src/os.c | 3 +++ src/vdbesort.c | 1 + 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 7abb13825f..eaf766ec29 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\sWAL\scode\scorrectly\shandles\sall\spossible\soutcomes\sfrom\sthe\nwalIndexPage()\sroutine. -D 2021-10-28T00:09:31.896 +C Minor\schanges\sto\smake\sit\seasier\sfor\sstatic\sanalyzers\sto\sreason\sabout\sthe\scode. +D 2021-10-28T12:07:43.062 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -510,7 +510,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c b32e2dcbca838cb8acd4777a59243db4bcea53089e3181b0ea3e4dc75b43aeff +F src/insert.c 137038155adad9f00ba4e2c2602eec0335d6ef5ff0c3958c02f778657006dc59 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e F src/main.c bfe067d61ebbd0e6eb023f1fb6b353021e621cf1657e061d629064a740bfbf6f @@ -529,7 +529,7 @@ F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4 F src/mutex_unix.c dd2b3f1cc1863079bc1349ac0fec395a500090c4fe4e11ab775310a49f2f956d F src/mutex_w32.c caa50e1c0258ac4443f52e00fe8aaea73b6d0728bd8856bedfff822cae418541 F src/notify.c 89a97dc854c3aa62ad5f384ef50c5a4a11d70fcc69f86de3e991573421130ed6 -F src/os.c 91fc69f95ef0528368174dca20f01e1d8f82934f719e1cb50fd0260b18c028a6 +F src/os.c b1c4f2d485961e9a5b6b648c36687d25047c252222e9660b7cc25a6e1ea436ab F src/os.h 26890f540b475598cd9881dcc68931377b8d429d3ea3e2eeb64470cde64199f8 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 @@ -628,7 +628,7 @@ F src/vdbeapi.c 7b83468feb1d42a09d4c2e5241a3eaa3d1f138e289a843cba9fd3f1dad95ca67 F src/vdbeaux.c a57c760d1897f1b72f6fae26983df363db7a2c42d88721187e907f2c84862b42 F src/vdbeblob.c 292e96c01c4219fca71d74e1002906d43eb232af4bd83f7552a3faec741f3eb8 F src/vdbemem.c 71a449c57be10a66a8a5620e5c5a67ebb9ca70121556dc631ffd4c4458708d8c -F src/vdbesort.c 04292f8c569dc9ad2afc1d56d118f2cfab36ca65a3f02eef0b5b92bda01560be +F src/vdbesort.c 513b481c8bab4a6578c92194a60cf3bc3b48736e4a53f8d2d7918121c5b594e7 F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c F src/vtab.c d07cc24dd84b0b51bf05adb187b0d2e6b0cac56cfbc0197995a26d4f8fa5c7e2 @@ -1929,8 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7238d58051bfdcea8f7a4aeab89145849d0659c987df9063aacafe97be6657fe 12715c6b234a04627ca27e94bfa8bd456998360a9f0117480e0038f4747818d6 -R fe9d125153f206ef4cb83374e184623d -T +closed 12715c6b234a04627ca27e94bfa8bd456998360a9f0117480e0038f4747818d6 +P 6979efbf07d93e7afad508165df684dcc6fe33b91ca772397c8afa00d16d1a0d +R eda5d70b72df4d58dd65fea5053b20ca U drh -Z b79ac0d17a59f6e7c71e03a206543e27 +Z dda87f03214a3375b663846ecba879a7 diff --git a/manifest.uuid b/manifest.uuid index 11f72edd9c..94e1887cf1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6979efbf07d93e7afad508165df684dcc6fe33b91ca772397c8afa00d16d1a0d \ No newline at end of file +ba4104aa02625b51113978c1bb540b75bd88cb1959c7e9bfb4113db4159df5d4 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index d8948e6056..9b3b195f6a 100644 --- a/src/insert.c +++ b/src/insert.c @@ -2613,8 +2613,9 @@ int sqlite3OpenTableAndIndices( assert( op==OP_OpenWrite || p5==0 ); if( IsVirtual(pTab) ){ /* This routine is a no-op for virtual tables. Leave the output - ** variables *piDataCur and *piIdxCur uninitialized so that valgrind - ** can detect if they are used by mistake in the caller. */ + ** variables *piDataCur and *piIdxCur set to illegal cursor numbers + ** for improved error detection. */ + *piDataCur = *piIdxCur = -999; return 0; } iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); diff --git a/src/os.c b/src/os.c index cf26b8ae5d..0c3c9d898d 100644 --- a/src/os.c +++ b/src/os.c @@ -316,12 +316,15 @@ int sqlite3OsOpenMalloc( rc = sqlite3OsOpen(pVfs, zFile, pFile, flags, pOutFlags); if( rc!=SQLITE_OK ){ sqlite3_free(pFile); + *ppFile = 0; }else{ *ppFile = pFile; } }else{ + *ppFile = 0; rc = SQLITE_NOMEM_BKPT; } + assert( *ppFile!=0 || rc!=SQLITE_OK ); return rc; } void sqlite3OsCloseFree(sqlite3_file *pFile){ diff --git a/src/vdbesort.c b/src/vdbesort.c index 6cb4f87269..8bf7b57173 100644 --- a/src/vdbesort.c +++ b/src/vdbesort.c @@ -2007,6 +2007,7 @@ static int vdbeIncrMergerNew( vdbeMergeEngineFree(pMerger); rc = SQLITE_NOMEM_BKPT; } + assert( *ppOut!=0 || rc!=SQLITE_OK ); return rc; } From 6ac9a5cf5a9102bd3e22cf1bf072770a8c43ed87 Mon Sep 17 00:00:00 2001 From: larrybr Date: Thu, 28 Oct 2021 19:49:23 +0000 Subject: [PATCH 31/35] Fix .import -skip issue reported at https://sqlite.org/forum/forumpost/4c0816c24fc9d16f?t=h FossilOrigin-Name: 3aadbe17edc1efc7fa6c9600de84e23242ba7866d2dcef2189afd7ba4c97979f --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/shell.c.in | 5 +++++ test/shell5.test | 15 +++++++++++++++ 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index eaf766ec29..72ee7b58ba 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\schanges\sto\smake\sit\seasier\sfor\sstatic\sanalyzers\sto\sreason\sabout\sthe\scode. -D 2021-10-28T12:07:43.062 +C Fix\s.import\s-skip\sissue\sreported\sat\shttps://sqlite.org/forum/forumpost/4c0816c24fc9d16f?t=h +D 2021-10-28T19:49:23.955 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -550,7 +550,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ae65c88f5d0d4bc0052b203773d407efa2387c2bd6b202f87178006c7bb8632c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 32d25b5af6c708aa63373c78c2e59681910387a7a78c08ec3086cadc77d41627 -F src/shell.c.in 6aefb37d9c87da9e33ae7d3541d07a24c8b74a4bc7b805a2a367d92fe5709108 +F src/shell.c.in 185e4b905c3a399e9376597a04cf668f6f992513290978ac978cf4991954d89f F src/sqlite.h.in f0c1ecb5af508aa8e970cd8bc0ec851e6c380b81825038d458846c2fcdfcef50 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1380,7 +1380,7 @@ F test/shell1.test c354008b27c904f0166c2138abd7382013ea070b41114114ecbdfb32c726a F test/shell2.test f00a0501c00583cbc46f7510e1d713366326b2b3e63d06d15937284171a8787c F test/shell3.test cb4b835a901742c9719437a89171172ecc4a8823ad97349af8e4e841e6f82566 F test/shell4.test 3ed6c4b42fd695efcbc25d69ef759dbb15855ca8e52ba6c5ee076f8b435f48be -F test/shell5.test 84a30b55722a95a5b72989e691c469a999ca7591e7aa00b7fabc783ea5c9a6fe +F test/shell5.test 6e4aa0e531dcb8dcf74b7920a2a7442c6712d4dff8422bbc81f768f9dee8a0e3 F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 F test/shell7.test 115132f66d0463417f408562cc2cf534f6bbc6d83a6d50f0072a9eb171bae97f F test/shell8.test 96be02ea0c21f05b24c1883d7b711a1fa8525a68ab7b636aacf6057876941013 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6979efbf07d93e7afad508165df684dcc6fe33b91ca772397c8afa00d16d1a0d -R eda5d70b72df4d58dd65fea5053b20ca -U drh -Z dda87f03214a3375b663846ecba879a7 +P ba4104aa02625b51113978c1bb540b75bd88cb1959c7e9bfb4113db4159df5d4 +R 94b406dcc0f783386fbc1fd7aca47850 +U larrybr +Z a41ac8d69ba1283362a2564021d5a0c2 diff --git a/manifest.uuid b/manifest.uuid index 94e1887cf1..397c3755ea 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ba4104aa02625b51113978c1bb540b75bd88cb1959c7e9bfb4113db4159df5d4 \ No newline at end of file +3aadbe17edc1efc7fa6c9600de84e23242ba7866d2dcef2189afd7ba4c97979f \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index cc4fb593e2..375c75124f 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -8282,6 +8282,11 @@ static int do_meta_command(char *zLine, ShellState *p){ failIfSafeMode(p, "cannot run .import in safe mode"); memset(&sCtx, 0, sizeof(sCtx)); + sCtx.z = sqlite3_malloc64(120); + if( sCtx.z==0 ){ + import_cleanup(&sCtx); + shell_out_of_memory(); + } if( p->mode==MODE_Ascii ){ xRead = ascii_read_one_field; }else{ diff --git a/test/shell5.test b/test/shell5.test index 8ec9a632bf..dc99a7acea 100644 --- a/test/shell5.test +++ b/test/shell5.test @@ -456,4 +456,19 @@ CREATE TABLE t7(a, b, c); db eval { SELECT * FROM t7 ORDER BY a } } {1 2 3 4 5 {} 6 7 8} +do_test shell5-4.3 { + forcedelete shell5.csv + set fd [open shell5.csv w] + puts $fd ",," + puts $fd "1,2,3" + close $fd + catchcmd test.db [string trim { +.mode csv +CREATE TABLE t8(a, b, c); +.import -skip 1 shell5.csv t8 +.nullvalue # + }] + db eval { SELECT * FROM t8 } +} {1 2 3} + finish_test From 8cb63f5a5e4aba5658a0115f9e019f4238cd7455 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 29 Oct 2021 09:59:06 +0000 Subject: [PATCH 32/35] Fix the OP_Transaction opcode so that if an error other than SQLITE_SCHEMA occurs first, the original error is not overwritten by SQLITE_SCHEMA. dbsqlfuzz 85bf7e262017c6c7bddb03ff6d8541511985d36c. FossilOrigin-Name: 5374226df4a2c1b59258839532b67a399c447ac8ec1408fdf2dffb9c41e1349e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 2 ++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 72ee7b58ba..29be098b99 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\s.import\s-skip\sissue\sreported\sat\shttps://sqlite.org/forum/forumpost/4c0816c24fc9d16f?t=h -D 2021-10-28T19:49:23.955 +C Fix\sthe\sOP_Transaction\sopcode\sso\sthat\sif\san\serror\sother\sthan\sSQLITE_SCHEMA\noccurs\sfirst,\sthe\soriginal\serror\sis\snot\soverwritten\sby\sSQLITE_SCHEMA.\ndbsqlfuzz\s85bf7e262017c6c7bddb03ff6d8541511985d36c. +D 2021-10-29T09:59:06.437 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -621,7 +621,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 30df8356e231dad33be10bb27897655002668343280004ba28c734489414a167 F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 -F src/vdbe.c a80943ed189ed5f4215636bde0aa7901319b051baffc0706f93a786bdf49ffcf +F src/vdbe.c daa876fbf9331a8b776696903877353bc352c9e30f5260c465386f2b29dfc4cf F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c 7b83468feb1d42a09d4c2e5241a3eaa3d1f138e289a843cba9fd3f1dad95ca67 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ba4104aa02625b51113978c1bb540b75bd88cb1959c7e9bfb4113db4159df5d4 -R 94b406dcc0f783386fbc1fd7aca47850 -U larrybr -Z a41ac8d69ba1283362a2564021d5a0c2 +P 3aadbe17edc1efc7fa6c9600de84e23242ba7866d2dcef2189afd7ba4c97979f +R 8b39a8898084dde2064094959fc37e70 +U drh +Z 822067d590d9e99496c15dedcdb68543 diff --git a/manifest.uuid b/manifest.uuid index 397c3755ea..9b3967c672 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3aadbe17edc1efc7fa6c9600de84e23242ba7866d2dcef2189afd7ba4c97979f \ No newline at end of file +5374226df4a2c1b59258839532b67a399c447ac8ec1408fdf2dffb9c41e1349e \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index a129e3a45b..e1f3fe4c63 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3656,6 +3656,7 @@ case OP_Transaction: { assert( pOp->p2>=0 && pOp->p2<=2 ); assert( pOp->p1>=0 && pOp->p1nDb ); assert( DbMaskTest(p->btreeMask, pOp->p1) ); + assert( rc==SQLITE_OK ); if( pOp->p2 && (db->flags & SQLITE_QueryOnly)!=0 ){ rc = SQLITE_READONLY; goto abort_due_to_error; @@ -3702,6 +3703,7 @@ case OP_Transaction: { if( pOp->p5 && (iMeta!=pOp->p3 || db->aDb[pOp->p1].pSchema->iGeneration!=pOp->p4.i) + && rc==SQLITE_OK ){ /* ** IMPLEMENTATION-OF: R-03189-51135 As each SQL statement runs, the schema From 37bbcb48a92b2aed80daf1d2e8ed8428eedc371f Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 29 Oct 2021 12:29:22 +0000 Subject: [PATCH 33/35] Add pragmas "multiplex_enabled", "multiplex_chunksize", and "multiplex_filecount" to the multiplexer implementation. FossilOrigin-Name: 39c5e80dbf94ac3079b3e0c2c3e6608ac366e3f3de3cea4f4947addc3f52bc36 --- manifest | 14 +++---- manifest.uuid | 2 +- src/test_multiplex.c | 91 +++++++++++++++++++++++++++++++++++--------- test/multiplex.test | 17 +++++++++ 4 files changed, 97 insertions(+), 27 deletions(-) diff --git a/manifest b/manifest index 29be098b99..132a8fe675 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sOP_Transaction\sopcode\sso\sthat\sif\san\serror\sother\sthan\sSQLITE_SCHEMA\noccurs\sfirst,\sthe\soriginal\serror\sis\snot\soverwritten\sby\sSQLITE_SCHEMA.\ndbsqlfuzz\s85bf7e262017c6c7bddb03ff6d8541511985d36c. -D 2021-10-29T09:59:06.437 +C Add\spragmas\s"multiplex_enabled",\s"multiplex_chunksize",\sand\s"multiplex_filecount"\sto\sthe\smultiplexer\simplementation. +D 2021-10-29T12:29:22.568 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -588,7 +588,7 @@ F src/test_journal.c a0b9709b2f12b1ec819eea8a1176f283bca6d688a6d4a502bd6fd79786f F src/test_loadext.c 337056bae59f80b9eb00ba82088b39d0f4fe6dfd F src/test_malloc.c 21121ea85b49ec0bdb69995847cef9036ef9beca3ce63bbb776e4ea2ecc44b97 F src/test_md5.c 7268e1e8c399d4a5e181b64ac20e1e6f3bc4dd9fc87abac02db145a3d951fa8c -F src/test_multiplex.c 2ccf35551c094e353af20b0cdfac053a37bf3e96e10e7cf9f4abd1d279890a78 +F src/test_multiplex.c 1b23782212a01349fac382913ef82b8de4ae8a4cb46556602c2ee733edabbbc9 F src/test_multiplex.h 5436d03f2d0501d04f3ed50a75819e190495b635 F src/test_mutex.c abf486e91bd65e2448027d4bb505e7cce6ba110e1afb9bd348d1996961cadf0d F src/test_onefile.c f31e52e891c5fef6709b9fcef54ce660648a34172423a9cbdf4cbce3ba0049f4 @@ -1222,7 +1222,7 @@ 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/multiplex.test d74c034e52805f6de8cc5432cef8c9eb774bb64ec29b83a22effc8ca4dac1f08 F test/multiplex2.test 580ca5817c7edbe4cc68fa150609c9473393003a F test/multiplex3.test d228f59eac91839a977eac19f21d053f03e4d101 F test/multiplex4.test e8ae4c4bd70606a5727743241f13b5701990abe4 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3aadbe17edc1efc7fa6c9600de84e23242ba7866d2dcef2189afd7ba4c97979f -R 8b39a8898084dde2064094959fc37e70 +P 5374226df4a2c1b59258839532b67a399c447ac8ec1408fdf2dffb9c41e1349e +R db79de1638e0749eebe4d5bf88ced051 U drh -Z 822067d590d9e99496c15dedcdb68543 +Z ec23d72770cad137c5e9586cf56e39f9 diff --git a/manifest.uuid b/manifest.uuid index 9b3967c672..58c45a9c0c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5374226df4a2c1b59258839532b67a399c447ac8ec1408fdf2dffb9c41e1349e \ No newline at end of file +39c5e80dbf94ac3079b3e0c2c3e6608ac366e3f3de3cea4f4947addc3f52bc36 \ No newline at end of file diff --git a/src/test_multiplex.c b/src/test_multiplex.c index 5ef1ec1839..ff12817158 100644 --- a/src/test_multiplex.c +++ b/src/test_multiplex.c @@ -962,26 +962,79 @@ static int multiplexFileControl(sqlite3_file *pConn, int op, void *pArg){ ** element is the argument to the pragma or NULL if the pragma has no ** argument. */ - if( aFcntl[1] && sqlite3_stricmp(aFcntl[1],"multiplex_truncate")==0 ){ - if( aFcntl[2] && aFcntl[2][0] ){ - if( sqlite3_stricmp(aFcntl[2], "on")==0 - || sqlite3_stricmp(aFcntl[2], "1")==0 ){ - pGroup->bTruncate = 1; - }else - if( sqlite3_stricmp(aFcntl[2], "off")==0 - || sqlite3_stricmp(aFcntl[2], "0")==0 ){ - pGroup->bTruncate = 0; - } - } - /* EVIDENCE-OF: R-27806-26076 The handler for an SQLITE_FCNTL_PRAGMA - ** file control can optionally make the first element of the char** - ** argument point to a string obtained from sqlite3_mprintf() or the - ** equivalent and that string will become the result of the pragma - ** or the error message if the pragma fails. + if( aFcntl[1] && sqlite3_strnicmp(aFcntl[1],"multiplex_",10)==0 ){ + sqlite3_int64 sz = 0; + (void)multiplexFileSize(pConn, &sz); + /* + ** PRAGMA multiplex_truncate=BOOLEAN; + ** PRAGMA multiplex_truncate; + ** + ** Turn the multiplexor truncate feature on or off. Return either + ** "on" or "off" to indicate the new setting. If the BOOLEAN argument + ** is omitted, just return the current value for the truncate setting. */ - aFcntl[0] = sqlite3_mprintf(pGroup->bTruncate ? "on" : "off"); - rc = SQLITE_OK; - break; + if( sqlite3_stricmp(aFcntl[1],"multiplex_truncate")==0 ){ + if( aFcntl[2] && aFcntl[2][0] ){ + if( sqlite3_stricmp(aFcntl[2], "on")==0 + || sqlite3_stricmp(aFcntl[2], "1")==0 ){ + pGroup->bTruncate = 1; + }else + if( sqlite3_stricmp(aFcntl[2], "off")==0 + || sqlite3_stricmp(aFcntl[2], "0")==0 ){ + pGroup->bTruncate = 0; + } + } + /* EVIDENCE-OF: R-27806-26076 The handler for an SQLITE_FCNTL_PRAGMA + ** file control can optionally make the first element of the char** + ** argument point to a string obtained from sqlite3_mprintf() or the + ** equivalent and that string will become the result of the pragma + ** or the error message if the pragma fails. + */ + aFcntl[0] = sqlite3_mprintf(pGroup->bTruncate ? "on" : "off"); + rc = SQLITE_OK; + break; + } + /* + ** PRAGMA multiplex_enabled; + ** + ** Return 0 or 1 depending on whether the multiplexor is enabled or + ** disabled, respectively. + */ + if( sqlite3_stricmp(aFcntl[1],"multiplex_enabled")==0 ){ + aFcntl[0] = sqlite3_mprintf("%d", pGroup->bEnabled!=0); + rc = SQLITE_OK; + break; + } + /* + ** PRAGMA multiplex_chunksize; + ** + ** Return the chunksize for the multiplexor, or no-op if the + ** multiplexor is not active. + */ + if( sqlite3_stricmp(aFcntl[1],"multiplex_chunksize")==0 + && pGroup->bEnabled + ){ + aFcntl[0] = sqlite3_mprintf("%u", pGroup->szChunk); + rc = SQLITE_OK; + break; + } + /* + ** PRAGMA multiplex_filecount; + ** + ** Return the number of disk files currently in use by the + ** multiplexor. This should be the total database size size + ** divided by the chunksize and rounded up. + */ + if( sqlite3_stricmp(aFcntl[1],"multiplex_filecount")==0 ){ + int n = 0; + int ii; + for(ii=0; iinReal; ii++){ + if( pGroup->aReal[ii].p!=0 ) n++; + } + aFcntl[0] = sqlite3_mprintf("%d", n); + rc = SQLITE_OK; + break; + } } /* If the multiplexor does not handle the pragma, pass it through ** into the default case. */ diff --git a/test/multiplex.test b/test/multiplex.test index 6ea328906e..2f1a02fb87 100644 --- a/test/multiplex.test +++ b/test/multiplex.test @@ -182,6 +182,11 @@ do_test multiplex-2.1.3 { file size [multiplex_name test.x 0] } {4096} do_test multiplex-2.1.4 { execsql { INSERT INTO t1 VALUES(3, randomblob(1100)) } } {} +do_execsql_test multiplex-2.1.5 { + PRAGMA multiplex_enabled; + PRAGMA multiplex_filecount; + PRAGMA multiplex_chunksize; +} {1 1 2147418112} do_test multiplex-2.2.1 { execsql { INSERT INTO t1 VALUES(3, randomblob(1100)) } @@ -267,6 +272,18 @@ do_test multiplex-2.5.8 { do_test multiplex-2.5.9 { file size [multiplex_name test.x 0] } [list $g_chunk_size] do_test multiplex-2.5.10 { file size [multiplex_name test.x 1] } [list $g_chunk_size] +do_execsql_test multiplex-2.5.11 { + PRAGMA multiplex_enabled; + PRAGMA multiplex_filecount; + PRAGMA multiplex_chunksize; +} {1 3 65536} +sqlite3 db test.x +do_execsql_test multiplex-2.5.12 { + PRAGMA multiplex_filecount; + PRAGMA multiplex_chunksize; +} {3 65536} + + do_test multiplex-2.5.99 { db close From cfb52496224be43bcb96e0c829a57a9480745005 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 29 Oct 2021 13:10:02 +0000 Subject: [PATCH 34/35] Allow "VACUUM INTO" to change the page_size of a database even if the original database is in WAL mode. Enhancement suggested by [forum:/forumpost/033f2c9d1f|forum post 033f2c9d1f]. FossilOrigin-Name: efc7e8c99a86e9d9eb81655ce96353847bd2cca64eb8f8d10e297f6f4d38e563 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vacuum.c | 4 +++- test/vacuum-into.test | 31 +++++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 132a8fe675..db89ae7616 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\spragmas\s"multiplex_enabled",\s"multiplex_chunksize",\sand\s"multiplex_filecount"\sto\sthe\smultiplexer\simplementation. -D 2021-10-29T12:29:22.568 +C Allow\s"VACUUM\sINTO"\sto\schange\sthe\spage_size\sof\sa\sdatabase\seven\sif\sthe\noriginal\sdatabase\sis\sin\sWAL\smode.\s\sEnhancement\ssuggested\sby\n[forum:/forumpost/033f2c9d1f|forum\spost\s033f2c9d1f]. +D 2021-10-29T13:10:02.528 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -620,7 +620,7 @@ F src/update.c 69c4c10bc6873a80c0a77cb578f9fc60ee90003d03f9530bc3370fa24615772d F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 30df8356e231dad33be10bb27897655002668343280004ba28c734489414a167 -F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 +F src/vacuum.c 6c38ddc52f0619865c91dae9c441d4d48bf3040d7dc1bc5b22da1e45547ed0b3 F src/vdbe.c daa876fbf9331a8b776696903877353bc352c9e30f5260c465386f2b29dfc4cf F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b @@ -1681,7 +1681,7 @@ 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-into.test c4c25dcf8ca909e33c1f5f0bb0f54b990c2c1dcbee7a4995843e79e40681a894 F test/vacuum.test ce91c39f7f91a4273bf620efad21086b5aa6ef1d F test/vacuum2.test 9fd45ce6ce29f5614c249e03938d3567c06a9e772d4f155949f8eafe2d8af520 F test/vacuum3.test 77ecdd54592b45a0bcb133339f99f1ae0ae94d0d @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5374226df4a2c1b59258839532b67a399c447ac8ec1408fdf2dffb9c41e1349e -R db79de1638e0749eebe4d5bf88ced051 +P 39c5e80dbf94ac3079b3e0c2c3e6608ac366e3f3de3cea4f4947addc3f52bc36 +R d68f81b39f86cb06b4a36b68798fdf37 U drh -Z ec23d72770cad137c5e9586cf56e39f9 +Z df8c8b91d90a62fffcb8772ebdcbd4b6 diff --git a/manifest.uuid b/manifest.uuid index 58c45a9c0c..2db762f867 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -39c5e80dbf94ac3079b3e0c2c3e6608ac366e3f3de3cea4f4947addc3f52bc36 \ No newline at end of file +efc7e8c99a86e9d9eb81655ce96353847bd2cca64eb8f8d10e297f6f4d38e563 \ No newline at end of file diff --git a/src/vacuum.c b/src/vacuum.c index be0e17535d..bcab1de142 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -250,7 +250,9 @@ SQLITE_NOINLINE int sqlite3RunVacuum( /* Do not attempt to change the page size for a WAL database */ if( sqlite3PagerGetJournalMode(sqlite3BtreePager(pMain)) - ==PAGER_JOURNALMODE_WAL ){ + ==PAGER_JOURNALMODE_WAL + && pOut==0 + ){ db->nextPagesize = 0; } diff --git a/test/vacuum-into.test b/test/vacuum-into.test index cd1c57a26b..1207105e05 100644 --- a/test/vacuum-into.test +++ b/test/vacuum-into.test @@ -100,4 +100,35 @@ do_test vacuum-into-510 { db2 close db close +# Change the page-size on a VACUUM INTO even if the original +# database is in WAL mode. +# +forcedelete test.db +forcedelete test.db2 +do_test vacuum-into-600 { + sqlite3 db test.db + db eval { + PRAGMA page_size=4096; + PRAGMA journal_mode=WAL; + CREATE TABLE t1(a); + INSERT INTO t1 VALUES(19); + CREATE INDEX t1a ON t1(a); + PRAGMA integrity_check; + } +} {wal ok} +do_execsql_test vacuum-into-610 { + PRAGMA page_size; +} {4096} +do_execsql_test vacuum-into-620 { + PRAGMA page_size=1024; + VACUUM INTO 'test.db2'; +} {} +do_test vacuum-into-630 { + sqlite3 db test.db2 + db eval { + PRAGMA page_size; + PRAGMA integrity_check; + } +} {1024 ok} + finish_test From e4e1af5efb91767192cd440ebd7ec7999f6751f4 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 29 Oct 2021 16:19:03 +0000 Subject: [PATCH 35/35] Reorder a test add earlier today to OP_Transaction for easier testing. FossilOrigin-Name: 8ba73b3cadb72ffcf176d19f9f946c1b90b224e5ab9a0e9eb9a83affa7476d23 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index db89ae7616..c36252731a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\s"VACUUM\sINTO"\sto\schange\sthe\spage_size\sof\sa\sdatabase\seven\sif\sthe\noriginal\sdatabase\sis\sin\sWAL\smode.\s\sEnhancement\ssuggested\sby\n[forum:/forumpost/033f2c9d1f|forum\spost\s033f2c9d1f]. -D 2021-10-29T13:10:02.528 +C Reorder\sa\stest\sadd\searlier\stoday\sto\sOP_Transaction\sfor\seasier\stesting. +D 2021-10-29T16:19:03.333 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -621,7 +621,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 30df8356e231dad33be10bb27897655002668343280004ba28c734489414a167 F src/vacuum.c 6c38ddc52f0619865c91dae9c441d4d48bf3040d7dc1bc5b22da1e45547ed0b3 -F src/vdbe.c daa876fbf9331a8b776696903877353bc352c9e30f5260c465386f2b29dfc4cf +F src/vdbe.c 54089e5ebb02d35e52d6b3d51061b79b8923c70e839df4ca4ff7bd9bcb9b9708 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c 7b83468feb1d42a09d4c2e5241a3eaa3d1f138e289a843cba9fd3f1dad95ca67 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 39c5e80dbf94ac3079b3e0c2c3e6608ac366e3f3de3cea4f4947addc3f52bc36 -R d68f81b39f86cb06b4a36b68798fdf37 +P efc7e8c99a86e9d9eb81655ce96353847bd2cca64eb8f8d10e297f6f4d38e563 +R 946767be3c5aa505f601226a0027015d U drh -Z df8c8b91d90a62fffcb8772ebdcbd4b6 +Z 818395ff90b7bf4ecce02cad13dcc7aa diff --git a/manifest.uuid b/manifest.uuid index 2db762f867..d2580d16cd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -efc7e8c99a86e9d9eb81655ce96353847bd2cca64eb8f8d10e297f6f4d38e563 \ No newline at end of file +8ba73b3cadb72ffcf176d19f9f946c1b90b224e5ab9a0e9eb9a83affa7476d23 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index e1f3fe4c63..2b06eea91e 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3700,10 +3700,10 @@ case OP_Transaction: { } } assert( pOp->p5==0 || pOp->p4type==P4_INT32 ); - if( pOp->p5 + if( rc==SQLITE_OK + && pOp->p5 && (iMeta!=pOp->p3 || db->aDb[pOp->p1].pSchema->iGeneration!=pOp->p4.i) - && rc==SQLITE_OK ){ /* ** IMPLEMENTATION-OF: R-03189-51135 As each SQL statement runs, the schema