From c9099d2d73559e1f640c0e70723dd776e57c9695 Mon Sep 17 00:00:00 2001 From: stephan Date: Sat, 1 Oct 2022 13:38:27 +0000 Subject: [PATCH] Tweak sqlite3-worker1.js to be able to load either sqlite3.js or sqlite3-wasmfs.js, noting that the latter still does not load in a Worker because of an Emscripten loader bug. FossilOrigin-Name: 000ef7059bfb54dc4f829b81a8d8c927c0382980218d8a3d60cd2c4d89151c90 --- ext/fts3/fts3.c | 4 +- ext/fts3/fts3Int.h | 2 +- ext/fts3/fts3_porter.c | 2 +- ext/fts3/fts3_tokenizer1.c | 2 +- ext/fts3/fts3_write.c | 62 +++++++++-------- ext/icu/icu.c | 5 +- ext/wasm/sqlite3-worker1-promiser.js | 2 +- ext/wasm/sqlite3-worker1.js | 15 ++-- manifest | 48 ++++++------- manifest.uuid | 2 +- src/btree.c | 16 ++--- src/expr.c | 1 + src/malloc.c | 28 ++++++-- src/select.c | 50 +------------- src/test_demovfs.c | 22 +++--- src/trigger.c | 17 +++++ src/vdbe.c | 10 ++- src/where.c | 100 +++++++++++++-------------- test/fuzzdata8.db | Bin 3283968 -> 3298304 bytes test/fuzzinvariants.c | 14 ++++ test/join.test | 76 ++++++++++++++++++++ 21 files changed, 284 insertions(+), 194 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 3b73fbba1d..c43eac4914 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -2888,7 +2888,7 @@ static int fts3TermSelectMerge( ** ** Similar padding is added in the fts3DoclistOrMerge() function. */ - pTS->aaOutput[0] = sqlite3_malloc(nDoclist + FTS3_VARINT_MAX + 1); + pTS->aaOutput[0] = sqlite3_malloc64((i64)nDoclist + FTS3_VARINT_MAX + 1); pTS->anOutput[0] = nDoclist; if( pTS->aaOutput[0] ){ memcpy(pTS->aaOutput[0], aDoclist, nDoclist); @@ -4745,7 +4745,7 @@ static int fts3EvalIncrPhraseNext( if( bEof==0 ){ int nList = 0; int nByte = a[p->nToken-1].nList; - char *aDoclist = sqlite3_malloc(nByte+FTS3_BUFFER_PADDING); + char *aDoclist = sqlite3_malloc64((i64)nByte+FTS3_BUFFER_PADDING); if( !aDoclist ) return SQLITE_NOMEM; memcpy(aDoclist, a[p->nToken-1].pList, nByte+1); memset(&aDoclist[nByte], 0, FTS3_BUFFER_PADDING); diff --git a/ext/fts3/fts3Int.h b/ext/fts3/fts3Int.h index 0626486edf..e821d6be31 100644 --- a/ext/fts3/fts3Int.h +++ b/ext/fts3/fts3Int.h @@ -558,7 +558,7 @@ struct Fts3MultiSegReader { int nAdvance; /* How many seg-readers to advance */ Fts3SegFilter *pFilter; /* Pointer to filter object */ char *aBuffer; /* Buffer to merge doclists in */ - int nBuffer; /* Allocated size of aBuffer[] in bytes */ + i64 nBuffer; /* Allocated size of aBuffer[] in bytes */ int iColFilter; /* If >=0, filter for this column */ int bRestart; diff --git a/ext/fts3/fts3_porter.c b/ext/fts3/fts3_porter.c index 8fb4c25daa..fbe7913020 100644 --- a/ext/fts3/fts3_porter.c +++ b/ext/fts3/fts3_porter.c @@ -621,7 +621,7 @@ static int porterNext( if( n>c->nAllocated ){ char *pNew; c->nAllocated = n+20; - pNew = sqlite3_realloc(c->zToken, c->nAllocated); + pNew = sqlite3_realloc64(c->zToken, c->nAllocated); if( !pNew ) return SQLITE_NOMEM; c->zToken = pNew; } diff --git a/ext/fts3/fts3_tokenizer1.c b/ext/fts3/fts3_tokenizer1.c index deea06d92b..78e5889da5 100644 --- a/ext/fts3/fts3_tokenizer1.c +++ b/ext/fts3/fts3_tokenizer1.c @@ -185,7 +185,7 @@ static int simpleNext( if( n>c->nTokenAllocated ){ char *pNew; c->nTokenAllocated = n+20; - pNew = sqlite3_realloc(c->pToken, c->nTokenAllocated); + pNew = sqlite3_realloc64(c->pToken, c->nTokenAllocated); if( !pNew ) return SQLITE_NOMEM; c->pToken = pNew; } diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index f1a4bd6bba..6a727eaf5f 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -649,7 +649,7 @@ static int fts3PendingListAppendVarint( /* Allocate or grow the PendingList as required. */ if( !p ){ - p = sqlite3_malloc(sizeof(*p) + 100); + p = sqlite3_malloc64(sizeof(*p) + 100); if( !p ){ return SQLITE_NOMEM; } @@ -658,14 +658,14 @@ static int fts3PendingListAppendVarint( p->nData = 0; } else if( p->nData+FTS3_VARINT_MAX+1>p->nSpace ){ - int nNew = p->nSpace * 2; - p = sqlite3_realloc(p, sizeof(*p) + nNew); + i64 nNew = p->nSpace * 2; + p = sqlite3_realloc64(p, sizeof(*p) + nNew); if( !p ){ sqlite3_free(*pp); *pp = 0; return SQLITE_NOMEM; } - p->nSpace = nNew; + p->nSpace = (int)nNew; p->aData = (char *)&p[1]; } @@ -1222,7 +1222,7 @@ int sqlite3Fts3ReadBlock( int nByte = sqlite3_blob_bytes(p->pSegments); *pnBlob = nByte; if( paBlob ){ - char *aByte = sqlite3_malloc(nByte + FTS3_NODE_PADDING); + char *aByte = sqlite3_malloc64((i64)nByte + FTS3_NODE_PADDING); if( !aByte ){ rc = SQLITE_NOMEM; }else{ @@ -1339,7 +1339,7 @@ static int fts3SegReaderNext( int nTerm = fts3HashKeysize(pElem); if( (nTerm+1)>pReader->nTermAlloc ){ sqlite3_free(pReader->zTerm); - pReader->zTerm = (char*)sqlite3_malloc((nTerm+1)*2); + pReader->zTerm = (char*)sqlite3_malloc64(((i64)nTerm+1)*2); if( !pReader->zTerm ) return SQLITE_NOMEM; pReader->nTermAlloc = (nTerm+1)*2; } @@ -1347,7 +1347,7 @@ static int fts3SegReaderNext( pReader->zTerm[nTerm] = '\0'; pReader->nTerm = nTerm; - aCopy = (char*)sqlite3_malloc(nCopy); + aCopy = (char*)sqlite3_malloc64(nCopy); if( !aCopy ) return SQLITE_NOMEM; memcpy(aCopy, pList->aData, nCopy); pReader->nNode = pReader->nDoclist = nCopy; @@ -1634,7 +1634,7 @@ int sqlite3Fts3SegReaderNew( nExtra = nRoot + FTS3_NODE_PADDING; } - pReader = (Fts3SegReader *)sqlite3_malloc(sizeof(Fts3SegReader) + nExtra); + pReader = (Fts3SegReader *)sqlite3_malloc64(sizeof(Fts3SegReader) + nExtra); if( !pReader ){ return SQLITE_NOMEM; } @@ -1726,7 +1726,7 @@ int sqlite3Fts3SegReaderPending( if( nElem==nAlloc ){ Fts3HashElem **aElem2; nAlloc += 16; - aElem2 = (Fts3HashElem **)sqlite3_realloc( + aElem2 = (Fts3HashElem **)sqlite3_realloc64( aElem, nAlloc*sizeof(Fts3HashElem *) ); if( !aElem2 ){ @@ -2060,7 +2060,7 @@ static int fts3NodeAddTerm( ** this is not expected to be a serious problem. */ assert( pTree->aData==(char *)&pTree[1] ); - pTree->aData = (char *)sqlite3_malloc(nReq); + pTree->aData = (char *)sqlite3_malloc64(nReq); if( !pTree->aData ){ return SQLITE_NOMEM; } @@ -2078,7 +2078,7 @@ static int fts3NodeAddTerm( if( isCopyTerm ){ if( pTree->nMalloczMalloc, nTerm*2); + char *zNew = sqlite3_realloc64(pTree->zMalloc, (i64)nTerm*2); if( !zNew ){ return SQLITE_NOMEM; } @@ -2104,7 +2104,7 @@ static int fts3NodeAddTerm( ** now. Instead, the term is inserted into the parent of pTree. If pTree ** has no parent, one is created here. */ - pNew = (SegmentNode *)sqlite3_malloc(sizeof(SegmentNode) + p->nNodeSize); + pNew = (SegmentNode *)sqlite3_malloc64(sizeof(SegmentNode) + p->nNodeSize); if( !pNew ){ return SQLITE_NOMEM; } @@ -2242,7 +2242,7 @@ static int fts3SegWriterAdd( ){ int nPrefix; /* Size of term prefix in bytes */ int nSuffix; /* Size of term suffix in bytes */ - int nReq; /* Number of bytes required on leaf page */ + i64 nReq; /* Number of bytes required on leaf page */ int nData; SegmentWriter *pWriter = *ppWriter; @@ -2251,13 +2251,13 @@ static int fts3SegWriterAdd( sqlite3_stmt *pStmt; /* Allocate the SegmentWriter structure */ - pWriter = (SegmentWriter *)sqlite3_malloc(sizeof(SegmentWriter)); + pWriter = (SegmentWriter *)sqlite3_malloc64(sizeof(SegmentWriter)); if( !pWriter ) return SQLITE_NOMEM; memset(pWriter, 0, sizeof(SegmentWriter)); *ppWriter = pWriter; /* Allocate a buffer in which to accumulate data */ - pWriter->aData = (char *)sqlite3_malloc(p->nNodeSize); + pWriter->aData = (char *)sqlite3_malloc64(p->nNodeSize); if( !pWriter->aData ) return SQLITE_NOMEM; pWriter->nSize = p->nNodeSize; @@ -2332,7 +2332,7 @@ static int fts3SegWriterAdd( ** the buffer to make it large enough. */ if( nReq>pWriter->nSize ){ - char *aNew = sqlite3_realloc(pWriter->aData, nReq); + char *aNew = sqlite3_realloc64(pWriter->aData, nReq); if( !aNew ) return SQLITE_NOMEM; pWriter->aData = aNew; pWriter->nSize = nReq; @@ -2357,7 +2357,7 @@ static int fts3SegWriterAdd( */ if( isCopyTerm ){ if( nTerm>pWriter->nMalloc ){ - char *zNew = sqlite3_realloc(pWriter->zMalloc, nTerm*2); + char *zNew = sqlite3_realloc64(pWriter->zMalloc, (i64)nTerm*2); if( !zNew ){ return SQLITE_NOMEM; } @@ -2665,12 +2665,12 @@ static void fts3ColumnFilter( static int fts3MsrBufferData( Fts3MultiSegReader *pMsr, /* Multi-segment-reader handle */ char *pList, - int nList + i64 nList ){ if( nList>pMsr->nBuffer ){ char *pNew; pMsr->nBuffer = nList*2; - pNew = (char *)sqlite3_realloc(pMsr->aBuffer, pMsr->nBuffer); + pNew = (char *)sqlite3_realloc64(pMsr->aBuffer, pMsr->nBuffer); if( !pNew ) return SQLITE_NOMEM; pMsr->aBuffer = pNew; } @@ -2726,7 +2726,7 @@ int sqlite3Fts3MsrIncrNext( fts3SegReaderSort(pMsr->apSegment, nMerge, j, xCmp); if( nList>0 && fts3SegReaderIsPending(apSegment[0]) ){ - rc = fts3MsrBufferData(pMsr, pList, nList+1); + rc = fts3MsrBufferData(pMsr, pList, (i64)nList+1); if( rc!=SQLITE_OK ) return rc; assert( (pMsr->aBuffer[nList] & 0xFE)==0x00 ); pList = pMsr->aBuffer; @@ -2863,11 +2863,11 @@ int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr){ return SQLITE_OK; } -static int fts3GrowSegReaderBuffer(Fts3MultiSegReader *pCsr, int nReq){ +static int fts3GrowSegReaderBuffer(Fts3MultiSegReader *pCsr, i64 nReq){ if( nReq>pCsr->nBuffer ){ char *aNew; pCsr->nBuffer = nReq*2; - aNew = sqlite3_realloc(pCsr->aBuffer, pCsr->nBuffer); + aNew = sqlite3_realloc64(pCsr->aBuffer, pCsr->nBuffer); if( !aNew ){ return SQLITE_NOMEM; } @@ -2958,7 +2958,8 @@ int sqlite3Fts3SegReaderStep( ){ pCsr->nDoclist = apSegment[0]->nDoclist; if( fts3SegReaderIsPending(apSegment[0]) ){ - rc = fts3MsrBufferData(pCsr, apSegment[0]->aDoclist, pCsr->nDoclist); + rc = fts3MsrBufferData(pCsr, apSegment[0]->aDoclist, + (i64)pCsr->nDoclist); pCsr->aDoclist = pCsr->aBuffer; }else{ pCsr->aDoclist = apSegment[0]->aDoclist; @@ -3011,7 +3012,8 @@ int sqlite3Fts3SegReaderStep( nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0); - rc = fts3GrowSegReaderBuffer(pCsr, nByte+nDoclist+FTS3_NODE_PADDING); + rc = fts3GrowSegReaderBuffer(pCsr, + (i64)nByte+nDoclist+FTS3_NODE_PADDING); if( rc ) return rc; if( isFirst ){ @@ -3037,7 +3039,7 @@ int sqlite3Fts3SegReaderStep( fts3SegReaderSort(apSegment, nMerge, j, xCmp); } if( nDoclist>0 ){ - rc = fts3GrowSegReaderBuffer(pCsr, nDoclist+FTS3_NODE_PADDING); + rc = fts3GrowSegReaderBuffer(pCsr, (i64)nDoclist+FTS3_NODE_PADDING); if( rc ) return rc; memset(&pCsr->aBuffer[nDoclist], 0, FTS3_NODE_PADDING); pCsr->aDoclist = pCsr->aBuffer; @@ -3750,7 +3752,7 @@ struct NodeReader { static void blobGrowBuffer(Blob *pBlob, int nMin, int *pRc){ if( *pRc==SQLITE_OK && nMin>pBlob->nAlloc ){ int nAlloc = nMin; - char *a = (char *)sqlite3_realloc(pBlob->a, nAlloc); + char *a = (char *)sqlite3_realloc64(pBlob->a, nAlloc); if( a ){ pBlob->nAlloc = nAlloc; pBlob->a = a; @@ -4547,7 +4549,7 @@ static int fts3RepackSegdirLevel( if( nIdx>=nAlloc ){ int *aNew; nAlloc += 16; - aNew = sqlite3_realloc(aIdx, nAlloc*sizeof(int)); + aNew = sqlite3_realloc64(aIdx, nAlloc*sizeof(int)); if( !aNew ){ rc = SQLITE_NOMEM; break; @@ -4921,7 +4923,7 @@ int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ /* Allocate space for the cursor, filter and writer objects */ const int nAlloc = sizeof(*pCsr) + sizeof(*pFilter) + sizeof(*pWriter); - pWriter = (IncrmergeWriter *)sqlite3_malloc(nAlloc); + pWriter = (IncrmergeWriter *)sqlite3_malloc64(nAlloc); if( !pWriter ) return SQLITE_NOMEM; pFilter = (Fts3SegFilter *)&pWriter[1]; pCsr = (Fts3MultiSegReader *)&pFilter[1]; @@ -5557,7 +5559,7 @@ int sqlite3Fts3DeferredTokenList( return SQLITE_OK; } - pRet = (char *)sqlite3_malloc(p->pList->nData); + pRet = (char *)sqlite3_malloc64(p->pList->nData); if( !pRet ) return SQLITE_NOMEM; nSkip = sqlite3Fts3GetVarint(p->pList->aData, &dummy); @@ -5577,7 +5579,7 @@ int sqlite3Fts3DeferToken( int iCol /* Column that token must appear in (or -1) */ ){ Fts3DeferredToken *pDeferred; - pDeferred = sqlite3_malloc(sizeof(*pDeferred)); + pDeferred = sqlite3_malloc64(sizeof(*pDeferred)); if( !pDeferred ){ return SQLITE_NOMEM; } diff --git a/ext/icu/icu.c b/ext/icu/icu.c index 92d7c5438e..e745ab0253 100644 --- a/ext/icu/icu.c +++ b/ext/icu/icu.c @@ -299,8 +299,9 @@ static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){ if( U_SUCCESS(status) ){ sqlite3_set_auxdata(p, 0, pExpr, icuRegexpDelete); - }else{ - assert(!pExpr); + pExpr = sqlite3_get_auxdata(p, 0); + } + if( !pExpr ){ icuFunctionError(p, "uregex_open", status); return; } diff --git a/ext/wasm/sqlite3-worker1-promiser.js b/ext/wasm/sqlite3-worker1-promiser.js index 46abc642bf..71e2e33135 100644 --- a/ext/wasm/sqlite3-worker1-promiser.js +++ b/ext/wasm/sqlite3-worker1-promiser.js @@ -237,6 +237,6 @@ self.sqlite3Worker1Promiser = function callee(config = callee.defaultConfig){ }; }/*sqlite3Worker1Promiser()*/; self.sqlite3Worker1Promiser.defaultConfig = { - worker: ()=>new Worker("sqlite3-worker1.js"), + worker: ()=>new Worker("sqlite3-worker1.js"+self.location.search), onerror: (...args)=>console.error('worker1 promiser error',...args) }; diff --git a/ext/wasm/sqlite3-worker1.js b/ext/wasm/sqlite3-worker1.js index 7ccf79f010..167c6a5c79 100644 --- a/ext/wasm/sqlite3-worker1.js +++ b/ext/wasm/sqlite3-worker1.js @@ -27,8 +27,13 @@ above in order to know when the module has completed initialization. */ "use strict"; -importScripts('sqlite3.js'); -sqlite3InitModule().then((sqlite3)=>{ - sqlite3.capi.sqlite3_wasmfs_opfs_dir(); - sqlite3.initWorker1API(); -}); +(()=>{ + const urlParams = new URL(self.location.href).searchParams; + importScripts(urlParams.has('wasmfs') + ? 'sqlite3-wasmfs.js' + : 'sqlite3.js'); + sqlite3InitModule().then((sqlite3)=>{ + sqlite3.capi.sqlite3_wasmfs_opfs_dir(); + sqlite3.initWorker1API(); + }); +})(); diff --git a/manifest b/manifest index e7b7ef95cf..1fb4beac82 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Note\stwo\swasm-related\spotential\sTODOs. -D 2022-10-01T12:04:49.570 +C Tweak\ssqlite3-worker1.js\sto\sbe\sable\sto\sload\seither\ssqlite3.js\sor\ssqlite3-wasmfs.js,\snoting\sthat\sthe\slatter\sstill\sdoes\snot\sload\sin\sa\sWorker\sbecause\sof\san\sEmscripten\sloader\sbug. +D 2022-10-01T13:38:27.672 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -85,25 +85,25 @@ 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 b20bd583991e740c1e14371896f3ab61d7b6c033740646366bbf6667191bc4e2 +F ext/fts3/fts3.c 46c116ee0868fc09520d61a1b747c62343c71c399ba67a3d0395b0be29b1a19f F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h dafdc371f9fbab175744b06cfe019d5f040cdfdbd11fea752f5dc28d45b04c05 +F ext/fts3/fts3Int.h ae2a44b04cddb5fb35cac4ea5f7f819b2894fd258186465777a19f7acfdf84ed F ext/fts3/fts3_aux.c f0dc9bd98582615b7750218899bd0c729879b6bbf94d1be57ca1833ff49afc6f 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_porter.c e19807ce0ae31c1c6e9898e89ecc93183d7ec224ea101af039722a4f49e5f2b8 F ext/fts3/fts3_snippet.c f9a8149173553113f3c495a503843e30028b5dc3723d0ca798c5ad6142e130e6 F ext/fts3/fts3_term.c f45a1e7c6ef464abb1231245d123dae12266b69e05cc56e14045b76591ae92d1 F ext/fts3/fts3_test.c d8d7b2734f894e8a489987447658e374cdd3a3bc8575c401decf1911cb7c6454 F ext/fts3/fts3_tokenize_vtab.c a95feda3590f3c3e17672fe35b67ea6112471aeea4c07ef7744a6606b66549aa F ext/fts3/fts3_tokenizer.c 6d8fc150c48238955d5182bf661498db0dd473c8a2a80e00c16994a646fa96e7 F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 -F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 +F ext/fts3/fts3_tokenizer1.c c1de4ae28356ad98ccb8b2e3388a7fdcce7607b5523738c9afb6275dab765154 F ext/fts3/fts3_unicode.c de426ff05c1c2e7bce161cf6b706638419c3a1d9c2667de9cb9dc0458c18e226 F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c 85279b980f99253c296006503a13f92957ec49b716123083f021acc74545ecfc +F ext/fts3/fts3_write.c 4fb644df0ff840267e47a724286c7a1fa5540273a7ce15756dd5913a101ec302 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 F ext/fts3/tool/fts3view.c 413c346399159df81f86c4928b7c4a455caab73bfbc8cd68f950f632e5751674 @@ -239,7 +239,7 @@ F ext/fts5/tool/loadfts5.tcl 95b03429ee6b138645703c6ca192c3ac96eaf093 F ext/fts5/tool/mkfts5c.tcl 3eba8e9bee4221ed165f3304b51b2a74a705f4ec5df3d044573a2be539534af8 F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c F ext/icu/README.txt 7ab7ced8ae78e3a645b57e78570ff589d4c672b71370f5aa9e1cd7024f400fc9 -F ext/icu/icu.c 91c021c7e3e8bbba286960810fa303295c622e323567b2e6def4ce58e4466e60 +F ext/icu/icu.c c074519b46baa484bb5396c7e01e051034da8884bad1a1cb7f09bbe6be3f0282 F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a32075a8 F ext/lsm1/Makefile a553b728bba6c11201b795188c5708915cc4290f02b7df6ba7e8c4c943fd5cd9 F ext/lsm1/Makefile.msc f8c878b467232226de288da320e1ac71c131f5ec91e08b21f502303347260013 @@ -523,8 +523,8 @@ F ext/wasm/split-speedtest1-script.sh a3e271938d4d14ee49105eb05567c6a69ba4c1f129 F ext/wasm/sql/000-mandelbrot.sql 775337a4b80938ac8146aedf88808282f04d02d983d82675bd63d9c2d97a15f0 F ext/wasm/sql/001-sudoku.sql 35b7cb7239ba5d5f193bc05ec379bcf66891bce6f2a5b3879f2f78d0917299b5 F ext/wasm/sqlite3-opfs-async-proxy.js 7367733ce409c8106b6c49e8ef2b55440e9974a64f39e0c97f5e3a4587d1fc2a -F ext/wasm/sqlite3-worker1-promiser.js c88d712805d0fe99b4d5171ebf665f281c4a4a915ba20e283456cf1919aa9508 -F ext/wasm/sqlite3-worker1.js 5266ebc4d709fe23d2d076ae44e6085fbc32b82f26ef514b947312f36b1206a9 +F ext/wasm/sqlite3-worker1-promiser.js 307d7837420ca6a9d3780dfc81194f1c0715637e6d9540e935514086b96913d8 +F ext/wasm/sqlite3-worker1.js 466e9bd39409ab03f3e00999887aaffc11e95b416e2689596e3d7f1516673fdf F ext/wasm/test-opfs-vfs.html eb69dda21eb414b8f5e3f7c1cc0f774103cc9c0f87b2d28a33419e778abfbab5 F ext/wasm/test-opfs-vfs.js a59ff9210b17d46b0c6fbf6a0ba60143c033327865f2e556e14f06280cef62ac F ext/wasm/testing-worker1-promiser.html 6eaec6e04a56cf24cf4fa8ef49d78ce8905dde1354235c9125dca6885f7ce893 @@ -556,7 +556,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c a2891172438e385fdbe97c11c9745676bec54f518d4447090af97189fd8e52d7 F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d F src/btmutex.c 6ffb0a22c19e2f9110be0964d0731d2ef1c67b5f7fabfbaeb7b9dabc4b7740ca -F src/btree.c 138804ba7c054533573e87facdfcf9f8aa003c7123152dda8d9281f837ab2622 +F src/btree.c ef9c126d6dc5dff8ff76abc807dfef5b8aac42144e3be11cbcd9cb6eaecef580 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e F src/build.c 898884afd67d953808cb687babc15b66a10213f99fe2ce7db98960e959881f98 @@ -567,7 +567,7 @@ F src/date.c 94ce83b4cd848a387680a5f920c9018c16655db778c4d36525af0a0f34679ac5 F src/dbpage.c 5808e91bc27fa3981b028000f8fadfdc10ce9e59a34ce7dc4e035a69be3906ec F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 86573edae75e3d3e9a8b590d87db8e47222103029df4f3e11fa56044459b514e -F src/expr.c 24e828db6b2fab8aabfb5d2c0d83dbdfc5a1972b1147fa893350e317ab7e282f +F src/expr.c 1cbdd76eeedb729ea9060df03e3e6b74a302784a13bfa38794a8194f894641ea F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 722f20779f5342a787922deded3628d8c74b5249cab04098cf17ee2f2aaff002 F src/func.c 8f72e88cccdee22185133c10f96ccd61dc34c5ea4b1fa9a73c237ef59b2e64f1 @@ -581,7 +581,7 @@ F src/json.c 7749b98c62f691697c7ee536b570c744c0583cab4a89200fdd0fc2aa8cc8cbd6 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 853385cc7a604157e137585097949252d5d0c731768e16b044608e5c95c3614b F src/main.c b434b8e4aca38419962de3d1c55fb9279807ba6a8802998a427b1635dc8250f6 -F src/malloc.c b7a3430cbe91d3e8e04fc10c2041b3a19794e63556ad2441a13d8dadd9b2bafc +F src/malloc.c dfddca1e163496c0a10250cedeafaf56dff47673e0f15888fb0925340a8e3f90 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c c8bfc9446fd0798bddd495eb5d9dbafa7d4b7287d8c22d50a83ac9daa26d8a75 @@ -617,7 +617,7 @@ F src/printf.c e99ee9741e79ae3873458146f59644276657340385ade4e76a5f5d1c25793764 F src/random.c 546d6feb15ec69c1aafe9bb351a277cbb498fd5410e646add673acb805714960 F src/resolve.c efea4e5fbecfd6d0a9071b0be0d952620991673391b6ffaaf4c277b0bb674633 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c d69dfb5b082f9a25e6700e152ddb3d942359b847b1df504eb09f9b4531844f8d +F src/select.c bb18acf4eded647fef88d4d543c673874dbebff516fbeba90a85e6c13f2a58cd F src/shell.c.in 2980312ab57fc5ccf298d1f0682588ec3832f52a878bea8abe34647d2cf31d05 F src/sqlite.h.in b9b7fd73239d94db20332bb6e504688001e5564b655e1318a4427a1caef4b99e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -644,7 +644,7 @@ F src/test_blob.c ae4a0620b478548afb67963095a7417cd06a4ec0a56adb453542203bfdcb31 F src/test_btree.c 8b2dc8b8848cf3a4db93f11578f075e82252a274 F src/test_config.c 8264637b06a3c1f0727c88d1ea32dcf7986b9e7e358a970cae87cdac8a5b2708 F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f -F src/test_demovfs.c 86142ba864d4297d54c5b2e972e74f3141ae4b30f05b3a95824184ed2d3d7f91 +F src/test_demovfs.c 7cc7623d1025d1e92c51da20fd25060759733b7a356a121545a3b7d2faa8a0f1 F src/test_devsym.c aff2255ea290d7718da08af30cdf18e470ff7325a5eff63e0057b1496ed66593 F src/test_fs.c ba1e1dc18fd3159fdba0b9c4256f14032159785320dfbd6776eb9973cb75d480 F src/test_func.c 24df3a346c012b1fc9e1001d346db6054deb426db0a7437e92490630e71c9b0a @@ -683,13 +683,13 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 1305797eab3542a0896b552c6e7669c972c1468e11e92b370533c1f37a37082b F src/treeview.c 07787f67cd297a6d09d04b8d70c06769c60c9c1d9080378f93929c16f8fd3298 -F src/trigger.c 61bea163b1fa3039bc572ed8312461b978e5c527e5301f302b078f4c1ccdec6a +F src/trigger.c bc70c58e713dcfb6cabe5cc0bed71aedb02c3e9e128c6089a78aca945ba4d720 F src/update.c c52a7991bece0453d22c77c08469512ee2f1391c12503fd347d1c939220c5877 F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 0be191521ff6d2805995f4910f0b6231b42843678b2efdc1abecaf39929a673f F src/vacuum.c bb346170b0b54c6683bba4a5983aea40485597fdf605c87ec8bc2e199fe88cd8 -F src/vdbe.c d27ec9a57f752fc2acf6a64d43bbf6072d2415efc976184f6d8a146e65819d3b +F src/vdbe.c 0d1e3c658d98a7bb7201532ea7a3e4d59bf9165421c780d5f84c361e372f1179 F src/vdbe.h 64619af62603dc3c4f5ff6ff6d2c8f389abd667a29ce6007ed44bd22b3211cd0 F src/vdbeInt.h 17b7461ffcf9ee760d1341731715a419f6b8c763089a7ece25c2e8098d702b3f F src/vdbeapi.c fc3183daf72808b4311b228989120fdbc2dc44972fb0d77d5c453460cc0e5b2c @@ -704,7 +704,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c b9df133a705093da8977da5eb202eaadb844839f1c7297c08d33471f5491843d F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b -F src/where.c 424c42590b71968a9b81cd890df2671902028613fee38a50ed4c2f7ca65315d3 +F src/where.c 63e712bcad47f70e94c2150976cd7da5040933699e3938d4189d064acbe40891 F src/whereInt.h 70cd30de9ed784aa33fa6bd1245f060617de7a00d992469b6d8e419eed915743 F src/wherecode.c 6bb1cf9d0a4e3e04dab0bf0ea4a8d936a0dcc05a7e2207beeda6c61aea6dd341 F src/whereexpr.c 55a39f42aaf982574fbf52906371a84cceed98a994422198dfd03db4fce4cc46 @@ -1141,11 +1141,11 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db ca9a97f401b06b0d5376139ec7e1f9e773e13345a9a2d9ccc0032cdbfedea230 +F test/fuzzdata8.db 653423800b7671e67caa740e977d80e1360f0d69e9992851f3ea5c4a69a2724a F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc -F test/fuzzinvariants.c c1c7ae6be4c5fe4e5b845ce2b166c17a3d0f8ef545ab0248c9990505010070da +F test/fuzzinvariants.c d7bb4a0fcc0ac344bcb72f1b86e4ae0acba5ea26dddde8160ee3db6520f10c64 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c F test/gencol1.test cc0dbb0ee116e5602e18ea7d47f2a0f76b26e09a823b7c36ef254370c2b0f3c1 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 @@ -1209,7 +1209,7 @@ F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b F test/istrue.test e7f285bb70282625c258e866ce6337d4c762922f5a300e1b50f958aef6e7d9c9 -F test/join.test 21dbc65ab2476b10ae3ed1dcf64a99fb9a40473caa22f4cec2d6a829933c1442 +F test/join.test e32cb9b1491eed682489e2cde33a22a4eb7611fe5aa3b0aa4b275fe27ab3f3ac F test/join2.test 466b07233820f5deee66a6c3bf6e4500c8bbf7b83649e67606f5f649c07928c0 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 @@ -2029,8 +2029,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9f2b331a32cbaadfd20d04c9908171355322c1aa1d9d6df3628f3b2fb4391ec1 -R e1a4db7681d0b6f0e817818894cccc93 +P 5636e82864457d870754ee7125c307dc5d2195197a5c0266579da9f102938b89 +R 993ef66f3fd9ce234bc978415f38aac9 U stephan -Z f54e8c9426807c11ccd8ec22ac465fb2 +Z e29500eccf112ba55345d53a058a1e30 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8c2a11e06b..db57858bad 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5636e82864457d870754ee7125c307dc5d2195197a5c0266579da9f102938b89 \ No newline at end of file +000ef7059bfb54dc4f829b81a8d8c927c0382980218d8a3d60cd2c4d89151c90 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 577de2bee2..c54fd2e7c8 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1547,7 +1547,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ if( iFree2+sz2 > usableSize ) return SQLITE_CORRUPT_PAGE(pPage); memmove(&data[iFree+sz+sz2], &data[iFree+sz], iFree2-(iFree+sz)); sz += sz2; - }else if( NEVER(iFree+sz>usableSize) ){ + }else if( iFree+sz>usableSize ){ return SQLITE_CORRUPT_PAGE(pPage); } @@ -6077,14 +6077,7 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ pPage = pCur->pPage; idx = ++pCur->ix; - if( !pPage->isInit || sqlite3FaultSim(412) ){ - /* The only known way for this to happen is for there to be a - ** recursive SQL function that does a DELETE operation as part of a - ** SELECT which deletes content out from under an active cursor - ** in a corrupt database file where the table being DELETE-ed from - ** has pages in common with the table being queried. See TH3 - ** module cov1/btree78.test testcase 220 (2018-06-08) for an - ** example. */ + if( NEVER(!pPage->isInit) || sqlite3FaultSim(412) ){ return SQLITE_CORRUPT_BKPT; } @@ -8774,6 +8767,11 @@ static int balance(BtCursor *pCur){ }else{ break; } + }else if( sqlite3PagerPageRefcount(pPage->pDbPage)>1 ){ + /* The page being written is not a root page, and there is currently + ** more than one reference to it. This only happens if the page is one + ** of its own ancestor pages. Corruption. */ + rc = SQLITE_CORRUPT_BKPT; }else{ MemPage * const pParent = pCur->apPage[iPage-1]; int const iIdx = pCur->aiIdx[iPage-1]; diff --git a/src/expr.c b/src/expr.c index 8572512926..baa0fe6476 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3223,6 +3223,7 @@ void sqlite3CodeRhsOfIN( sqlite3VdbeChangeP4(v, addr, (void *)pKeyInfo, P4_KEYINFO); } if( addrOnce ){ + sqlite3VdbeAddOp1(v, OP_NullRow, iTab); sqlite3VdbeJumpHere(v, addrOnce); /* Subroutine return */ assert( ExprUseYSub(pExpr) ); diff --git a/src/malloc.c b/src/malloc.c index 3fcedf8a37..af83743fc0 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -270,18 +270,34 @@ static void mallocWithAlarm(int n, void **pp){ *pp = p; } +/* +** Maximum size of any single memory allocation. +** +** This is not a limit on the total amount of memory used. This is +** a limit on the size parameter to sqlite3_malloc() and sqlite3_realloc(). +** +** The upper bound is slightly less than 2GiB: 0x7ffffeff == 2,147,483,391 +** This provides a 256-byte safety margin for defense against 32-bit +** signed integer overflow bugs when computing memory allocation sizes. +** Parnoid applications might want to reduce the maximum allocation size +** further for an even larger safety margin. 0x3fffffff or 0x0fffffff +** or even smaller would be reasonable upper bounds on the size of a memory +** allocations for most applications. +*/ +#ifndef SQLITE_MAX_ALLOCATION_SIZE +# define SQLITE_MAX_ALLOCATION_SIZE 2147483391 +#endif +#if SQLITE_MAX_ALLOCATION_SIZE>2147483391 +# error Maximum size for SQLITE_MAX_ALLOCATION_SIZE is 2147483391 +#endif + /* ** Allocate memory. This routine is like sqlite3_malloc() except that it ** assumes the memory subsystem has already been initialized. */ void *sqlite3Malloc(u64 n){ void *p; - if( n==0 || n>=0x7fffff00 ){ - /* A memory allocation of a number of bytes which is near the maximum - ** signed integer value might cause an integer overflow inside of the - ** xMalloc(). Hence we limit the maximum size to 0x7fffff00, giving - ** 255 bytes of overhead. SQLite itself will never use anything near - ** this amount. The only way to reach the limit is with sqlite3_malloc() */ + if( n==0 || n>SQLITE_MAX_ALLOCATION_SIZE ){ p = 0; }else if( sqlite3GlobalConfig.bMemstat ){ sqlite3_mutex_enter(mem0.mutex); diff --git a/src/select.c b/src/select.c index 950d0db62b..2876f48ab8 100644 --- a/src/select.c +++ b/src/select.c @@ -3724,7 +3724,7 @@ static int multiSelectOrderBy( ** the left operands of a RIGHT JOIN. In either case, we need to potentially ** bypass the substituted expression with OP_IfNullRow. ** -** Suppose the original expression integer constant. Even though the table +** Suppose the original expression is an integer constant. Even though the table ** has the nullRow flag set, because the expression is an integer constant, ** it will not be NULLed out. So instead, we insert an OP_IfNullRow opcode ** that checks to see if the nullRow flag is set on the table. If the nullRow @@ -4181,19 +4181,13 @@ static void renumberCursors( ** See also (3) for restrictions on LEFT JOIN. ** ** (27) The subquery may not contain a FULL or RIGHT JOIN unless it -** is the first element of the parent query. This must be the -** the case if: -** (27a) the subquery is not compound query, and +** is the first element of the parent query. Two subcases: +** (27a) the subquery is not a compound query. ** (27b) the subquery is a compound query and the RIGHT JOIN occurs ** in any arm of the compound query. (See also (17g).) ** ** (28) The subquery is not a MATERIALIZED CTE. ** -** (29) Either the subquery is not the right-hand operand of a join with an -** ON or USING clause nor the right-hand operand of a NATURAL JOIN, or -** the right-most table within the FROM clause of the subquery -** is not part of an outer join. -** ** ** In this routine, the "p" parameter is a pointer to the outer query. ** The subquery is p->pSrc->a[iFrom]. isAgg is true if the outer query @@ -4297,15 +4291,6 @@ static int flattenSubquery( } isOuterJoin = 1; } -#ifdef SQLITE_EXTRA_IFNULLROW - else if( iFrom>0 && !isAgg ){ - /* Setting isOuterJoin to -1 causes OP_IfNullRow opcodes to be generated for - ** every reference to any result column from subquery in a join, even - ** though they are not necessary. This will stress-test the OP_IfNullRow - ** opcode. */ - isOuterJoin = -1; - } -#endif assert( pSubSrc->nSrc>0 ); /* True by restriction (7) */ if( iFrom>0 && (pSubSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ @@ -4315,35 +4300,6 @@ static int flattenSubquery( return 0; /* (28) */ } - /* Restriction (29): - ** - ** We do not want two constraints on the same term of the flattened - ** query where one constraint has EP_InnerON and the other is EP_OuterON. - ** To prevent this, one or the other of the following conditions must be - ** false: - ** - ** (29a) The right-most entry in the FROM clause of the subquery - ** must not be part of an outer join. - ** - ** (29b) The subquery itself must not be the right operand of a - ** NATURAL join or a join that as an ON or USING clause. - ** - ** These conditions are sufficient to keep an EP_OuterON from being - ** flattened into an EP_InnerON. Restrictions (3a) and (27a) prevent - ** an EP_InnerON from being flattened into an EP_OuterON. - */ - if( pSubSrc->nSrc>=2 - && (pSubSrc->a[pSubSrc->nSrc-1].fg.jointype & JT_OUTER)!=0 - ){ - if( (pSubitem->fg.jointype & JT_NATURAL)!=0 - || pSubitem->fg.isUsing - || NEVER(pSubitem->u3.pOn!=0) /* ON clause already shifted into WHERE */ - || pSubitem->fg.isOn - ){ - return 0; - } - } - /* Restriction (17): If the sub-query is a compound SELECT, then it must ** use only the UNION ALL operator. And none of the simple select queries ** that make up the compound SELECT are allowed to be aggregate or distinct diff --git a/src/test_demovfs.c b/src/test_demovfs.c index eaba208732..29307675bd 100644 --- a/src/test_demovfs.c +++ b/src/test_demovfs.c @@ -462,21 +462,23 @@ static int demoDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ if( rc==0 && dirSync ){ int dfd; /* File descriptor open on directory */ int i; /* Iterator variable */ + char *zSlash; char zDir[MAXPATHNAME+1]; /* Name of directory containing file zPath */ /* Figure out the directory name from the path of the file deleted. */ sqlite3_snprintf(MAXPATHNAME, zDir, "%s", zPath); zDir[MAXPATHNAME] = '\0'; - for(i=strlen(zDir); i>1 && zDir[i]!='/'; i++); - zDir[i] = '\0'; - - /* Open a file-descriptor on the directory. Sync. Close. */ - dfd = open(zDir, O_RDONLY, 0); - if( dfd<0 ){ - rc = -1; - }else{ - rc = fsync(dfd); - close(dfd); + zSlash = strrchr(zDir,'/'); + if( zSlash ){ + /* Open a file-descriptor on the directory. Sync. Close. */ + zSlash[0] = 0; + dfd = open(zDir, O_RDONLY, 0); + if( dfd<0 ){ + rc = -1; + }else{ + rc = fsync(dfd); + close(dfd); + } } } return (rc==0 ? SQLITE_OK : SQLITE_IOERR_DELETE); diff --git a/src/trigger.c b/src/trigger.c index 3b7d0d9e88..1c62fc231b 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -351,6 +351,23 @@ void sqlite3FinishTrigger( Vdbe *v; char *z; + /* If this is a new CREATE TABLE statement, and if shadow tables + ** are read-only, and the trigger makes a change to a shadow table, + ** then raise an error - do not allow the trigger to be created. */ + if( sqlite3ReadOnlyShadowTables(db) ){ + TriggerStep *pStep; + for(pStep=pTrig->step_list; pStep; pStep=pStep->pNext){ + if( pStep->zTarget!=0 + && sqlite3ShadowTableName(db, pStep->zTarget) + ){ + sqlite3ErrorMsg(pParse, + "trigger \"%s\" may not write to shadow table \"%s\"", + pTrig->zName, pStep->zTarget); + goto triggerfinish_cleanup; + } + } + } + /* Make an entry in the sqlite_schema table */ v = sqlite3GetVdbe(pParse); if( v==0 ) goto triggerfinish_cleanup; diff --git a/src/vdbe.c b/src/vdbe.c index 686ebf175f..ebf52e67af 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -4897,12 +4897,16 @@ case OP_SeekHit: { /* Opcode: IfNotOpen P1 P2 * * * ** Synopsis: if( !csr[P1] ) goto P2 ** -** If cursor P1 is not open, jump to instruction P2. Otherwise, fall through. +** If cursor P1 is not open or if P1 is set to a NULL row using the +** OP_NullRow opcode, then jump to instruction P2. Otherwise, fall through. */ case OP_IfNotOpen: { /* jump */ + VdbeCursor *pCur; + assert( pOp->p1>=0 && pOp->p1nCursor ); - VdbeBranchTaken(p->apCsr[pOp->p1]==0, 2); - if( !p->apCsr[pOp->p1] ){ + pCur = p->apCsr[pOp->p1]; + VdbeBranchTaken(pCur==0 || pCur->nullRow, 2); + if( pCur==0 || pCur->nullRow ){ goto jump_to_p2_and_check_for_interrupt; } break; diff --git a/src/where.c b/src/where.c index 3e90fa9a7c..b0c0ea7d4e 100644 --- a/src/where.c +++ b/src/where.c @@ -743,6 +743,43 @@ static void whereTraceIndexInfoOutputs(sqlite3_index_info *p){ #define whereTraceIndexInfoOutputs(A) #endif +/* +** We know that pSrc is an operand of an outer join. Return true if +** pTerm is a constraint that is compatible with that join. +** +** pTerm must be EP_OuterON if pSrc is the right operand of an +** outer join. pTerm can be either EP_OuterON or EP_InnerON if pSrc +** is the left operand of a RIGHT join. +** +** See https://sqlite.org/forum/forumpost/206d99a16dd9212f +** for an example of a WHERE clause constraints that may not be used on +** the right table of a RIGHT JOIN because the constraint implies a +** not-NULL condition on the left table of the RIGHT JOIN. +*/ +static int constraintCompatibleWithOuterJoin( + const WhereTerm *pTerm, /* WHERE clause term to check */ + const SrcItem *pSrc /* Table we are trying to access */ +){ + assert( (pSrc->fg.jointype&(JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 ); /* By caller */ + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LEFT ); + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LTORJ ); + testcase( ExprHasProperty(pTerm->pExpr, EP_OuterON) ) + testcase( ExprHasProperty(pTerm->pExpr, EP_InnerON) ); + if( !ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON) + || pTerm->pExpr->w.iJoin != pSrc->iCursor + ){ + return 0; + } + if( (pSrc->fg.jointype & (JT_LEFT|JT_RIGHT))!=0 + && ExprHasProperty(pTerm->pExpr, EP_InnerON) + ){ + return 0; + } + return 1; +} + + + #ifndef SQLITE_OMIT_AUTOMATIC_INDEX /* ** Return TRUE if the WHERE clause term pTerm is of a form where it @@ -758,16 +795,10 @@ static int termCanDriveIndex( if( pTerm->leftCursor!=pSrc->iCursor ) return 0; if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) return 0; assert( (pSrc->fg.jointype & JT_RIGHT)==0 ); - if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 ){ - testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LEFT ); - testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LTORJ ); - testcase( ExprHasProperty(pTerm->pExpr, EP_OuterON) ) - testcase( ExprHasProperty(pTerm->pExpr, EP_InnerON) ); - if( !ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON) - || pTerm->pExpr->w.iJoin != pSrc->iCursor - ){ - return 0; /* See tag-20191211-001 */ - } + if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 + && !constraintCompatibleWithOuterJoin(pTerm,pSrc) + ){ + return 0; /* See https://sqlite.org/forum/forumpost/51e6959f61 */ } if( (pTerm->prereqRight & notReady)!=0 ) return 0; assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); @@ -1179,22 +1210,10 @@ static sqlite3_index_info *allocateIndexInfo( assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); assert( pTerm->u.x.leftColumn>=XN_ROWID ); assert( pTerm->u.x.leftColumnnCol ); - - /* tag-20191211-002: WHERE-clause constraints are not useful to the - ** right-hand table of a LEFT JOIN nor to the either table of a - ** RIGHT JOIN. See tag-20191211-001 for the - ** equivalent restriction for ordinary tables. */ - if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 ){ - testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LEFT ); - testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_RIGHT ); - testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LTORJ ); - testcase( ExprHasProperty(pTerm->pExpr, EP_OuterON) ); - testcase( ExprHasProperty(pTerm->pExpr, EP_InnerON) ); - if( !ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON) - || pTerm->pExpr->w.iJoin != pSrc->iCursor - ){ - continue; - } + if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 + && !constraintCompatibleWithOuterJoin(pTerm,pSrc) + ){ + continue; } nTerm++; pTerm->wtFlags |= TERM_OK; @@ -2852,32 +2871,11 @@ static int whereLoopAddBtreeIndex( ** to mix with a lower range bound from some other source */ if( pTerm->wtFlags & TERM_LIKEOPT && pTerm->eOperator==WO_LT ) continue; - /* tag-20191211-001: Do not allow constraints from the WHERE clause to - ** be used by the right table of a LEFT JOIN nor by the left table of a - ** RIGHT JOIN. Only constraints in the ON clause are allowed. - ** See tag-20191211-002 for the vtab equivalent. - ** - ** 2022-06-06: See https://sqlite.org/forum/forumpost/206d99a16dd9212f - ** for an example of a WHERE clause constraints that may not be used on - ** the right table of a RIGHT JOIN because the constraint implies a - ** not-NULL condition on the left table of the RIGHT JOIN. - ** - ** 2022-06-10: The same condition applies to termCanDriveIndex() above. - ** https://sqlite.org/forum/forumpost/51e6959f61 - */ - if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 ){ - testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LEFT ); - testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_RIGHT ); - testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LTORJ ); - testcase( ExprHasProperty(pTerm->pExpr, EP_OuterON) ) - testcase( ExprHasProperty(pTerm->pExpr, EP_InnerON) ); - if( !ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON) - || pTerm->pExpr->w.iJoin != pSrc->iCursor - ){ - continue; - } + if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 + && !constraintCompatibleWithOuterJoin(pTerm,pSrc) + ){ + continue; } - if( IsUniqueIndex(pProbe) && saved_nEq==pProbe->nKeyCol-1 ){ pBuilder->bldFlags1 |= SQLITE_BLDF1_UNIQUE; }else{ diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index de7799f945f521444c9788aa2f933692ca84a6ba..aff7e27340cd560731ada86f167851c766694516 100644 GIT binary patch delta 10092 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 delta 7640 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 diff --git a/test/fuzzinvariants.c b/test/fuzzinvariants.c index a601e7aa45..90f1fad492 100644 --- a/test/fuzzinvariants.c +++ b/test/fuzzinvariants.c @@ -129,6 +129,19 @@ int fuzz_invariant( return SQLITE_CORRUPT; } sqlite3_finalize(pCk); + if( sqlite3_strlike("%group%by%order%by%desc%",sqlite3_sql(pStmt),0)==0 ){ + /* dbsqlfuzz crash-647c162051c9b23ce091b7bbbe5125ce5f00e922 + ** Original statement is: + ** + ** SELECT a,c,d,b,'' FROM t1 GROUP BY 1 HAVING d<>345 ORDER BY a DESC; + ** + ** The values of c, d, and b are indeterminate and change when the + ** enclosed in the test query because the DESC is dropped. + ** + ** SELECT * FROM (...) WHERE "a"==0 + */ + goto not_a_fault; + } rc = sqlite3_prepare_v2(db, "SELECT 1 FROM bytecode(?1) WHERE opcode='VOpen'", -1, &pCk, 0); if( rc==SQLITE_OK ){ @@ -143,6 +156,7 @@ int fuzz_invariant( printf("invariant-error ignored due to the use of virtual tables\n"); } } +not_a_fault: sqlite3_finalize(pTestStmt); return SQLITE_OK; } diff --git a/test/join.test b/test/join.test index 82dbd447f9..f0ac0be8b1 100644 --- a/test/join.test +++ b/test/join.test @@ -1130,5 +1130,81 @@ do_execsql_test join-27.5 { ) AS t99 ON b IN (1,2,3); } {} +db null NULL +do_execsql_test join-27.6 { + INSERT INTO t1 VALUES(3,4,NULL); + INSERT INTO t2 VALUES(1,2); + WITH t99(b) AS ( + SELECT coalesce(b,3) FROM t2 AS x LEFT JOIN t1 ON c IN (SELECT x FROM t3) + ) + SELECT d, e, b FROM t2 JOIN t99 ON b IN (1,2,3) ORDER BY +d; +} {NULL NULL 3 NULL NULL 3 1 2 3 1 2 3} +do_execsql_test join-27.7 { + SELECT d, e, b2 + FROM t2 + JOIN (SELECT coalesce(b,3) AS b2 FROM t2 AS x LEFT JOIN t1 + ON c IN (SELECT x FROM t3)) AS t99 + ON b2 IN (1,2,3) ORDER BY +d; +} {NULL NULL 3 NULL NULL 3 1 2 3 1 2 3} + +do_execsql_test join-27.8 { + DELETE FROM t1; + DELETE FROM t2 WHERE d IS NOT NULL; + DELETE FROM t3; + SELECT * FROM t2 JOIN (SELECT b FROM t2 LEFT JOIN t1 + ON c IN (SELECT x FROM t3)) AS t99 ON b IN (1,2,3); +} {} + +do_execsql_test join-27.9 { + DELETE FROM t1; + DELETE FROM t2; + DELETE FROM t3; + INSERT INTO t1 VALUES(4,3,5); + INSERT INTO t2 VALUES(1,2); + INSERT INTO t3 VALUES(5); + SELECT * FROM t2 JOIN (SELECT b FROM t2 LEFT JOIN t1 + ON c IN (SELECT x FROM t3)) AS t99 ON b IS NULL; +} {} +do_execsql_test join-27.10 { + WITH t99(b) AS ( + SELECT b FROM t2 AS x LEFT JOIN t1 ON c IN (SELECT x FROM t3) + ) + SELECT d, e, b FROM t2 JOIN t99 ON b IS NULL; +} {} + + +# 2022-09-19 https://sqlite.org/forum/forumpost/96b9e5709cf47cda +# Performance regression relative to version 3.38.0 that resulted from +# a new query flattener restriction that was added to fixes the join-27.* +# tests above. The restriction needed to be removed and the join-27.* +# problem fixed another way. +# +reset_db +do_execsql_test join-28.1 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT, c INT); + CREATE TABLE t2(d INTEGER PRIMARY KEY, e INT); + CREATE VIEW t3(a,b,c,d,e) AS SELECT * FROM t1 LEFT JOIN t2 ON d=c; + CREATE TABLE t4(x INT, y INT); + INSERT INTO t1 VALUES(1,2,3); + INSERT INTO t2 VALUES(1,5); + INSERT INTO t4 VALUES(1,4); + SELECT a, b, y FROM t4 JOIN t3 ON a=x; +} {1 2 4} +do_eqp_test join-28.2 { + SELECT a, b, y FROM t4 JOIN t3 ON a=x; +} { + QUERY PLAN + |--SCAN t4 + `--SEARCH t1 USING INTEGER PRIMARY KEY (rowid=?) +} +# ^^^^^^^ Without the fix (if the query flattening optimization does not +# run) the query plan above would look like this: +# +# QUERY PLAN +# |--MATERIALIZE t3 +# | |--SCAN t1 +# | `--SEARCH t2 USING INTEGER PRIMARY KEY (rowid=?) LEFT-JOIN +# |--SCAN t4 +# `--SEARCH t3 USING AUTOMATIC COVERING INDEX (a=?) finish_test