From 0f1fa5de045a3f1b8c08373ace7adea04ab81021 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 13 Dec 2019 21:24:46 +0000 Subject: [PATCH 001/120] Patch to the page cache to avoid harmless pointer arithmetic that due to bugs in the STD-C spec is technically UB. This is to fix a harmless UBSAN complaint that OSSFuzz is hitting. FossilOrigin-Name: c29fc21288e37f81a1617c5e2961c575d3bca6a1d1b013b2e0a99774afb1dcdb --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pcache1.c | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 2135fb477d..786d389eeb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthere\sis\sa\scontaining\sSELECT\sstatement\swhen\sprocessing\sa\nnormal\saggregate\sfunction\sas\sif\sit\swere\sa\swindow\sfunction. -D 2019-12-13T11:42:56.220 +C Patch\sto\sthe\spage\scache\sto\savoid\sharmless\spointer\sarithmetic\sthat\sdue\sto\sbugs\nin\sthe\sSTD-C\sspec\sis\stechnically\sUB.\s\sThis\sis\sto\sfix\sa\sharmless\sUBSAN\ncomplaint\sthat\sOSSFuzz\sis\shitting. +D 2019-12-13T21:24:46.081 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -519,7 +519,7 @@ F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 F src/parse.y c8d2de64db469fd56e0fa24da46cd8ec8523eb98626567d2708df371b47fdc3f F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 -F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 +F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a F src/pragma.c 26e9ee514138b9697d4be6d8f9ca84655053026390cf10de838862238aa4aba9 F src/pragma.h ec3b31eac9b1df040f1cc8cb3d89bc06605c3b4cb3d76f833de8d6d6c3f77f04 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e5dc2939d3e8694d648fc9b73b1174da5b1349e20fbb9cf1c91268939f308f89 -R e59b82d06383bd505b8273cd5ef0d82d +P c1014e80b26131200a115beb86929a8f0ded2dd65b075e47373346c0f170576a +R b59b4afd4c4fcaeb80758977b1b63c0a U drh -Z 2895c09312f8773411c5f3c256e1384f +Z 4fa57844859159ee82f87f0f14b6814f diff --git a/manifest.uuid b/manifest.uuid index 179d24fa66..ab11a63e58 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c1014e80b26131200a115beb86929a8f0ded2dd65b075e47373346c0f170576a \ No newline at end of file +c29fc21288e37f81a1617c5e2961c575d3bca6a1d1b013b2e0a99774afb1dcdb \ No newline at end of file diff --git a/src/pcache1.c b/src/pcache1.c index d0051433de..ed762ebf70 100644 --- a/src/pcache1.c +++ b/src/pcache1.c @@ -448,13 +448,15 @@ static PgHdr1 *pcache1AllocPage(PCache1 *pCache, int benignMalloc){ } #else pPg = pcache1Alloc(pCache->szAlloc); - p = (PgHdr1 *)&((u8 *)pPg)[pCache->szPage]; #endif if( benignMalloc ){ sqlite3EndBenignMalloc(); } #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT pcache1EnterMutex(pCache->pGroup); #endif if( pPg==0 ) return 0; +#ifndef SQLITE_PCACHE_SEPARATE_HEADER + p = (PgHdr1 *)&((u8 *)pPg)[pCache->szPage]; +#endif p->page.pBuf = pPg; p->page.pExtra = &p[1]; p->isBulkLocal = 0; From e3a4f2cf77e7608cf7ba746b2517559015dad9c0 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 13 Dec 2019 23:38:57 +0000 Subject: [PATCH 002/120] Fix an utterly harmless "applying zero offset to null pointer" UB warning in sqlite3AtoF(): FossilOrigin-Name: 052fdf5e58b41ccadaa5aac293ceb4d309ced661d46f3a52be9eb8d01d347a82 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/util.c | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 786d389eeb..766eab9ab7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Patch\sto\sthe\spage\scache\sto\savoid\sharmless\spointer\sarithmetic\sthat\sdue\sto\sbugs\nin\sthe\sSTD-C\sspec\sis\stechnically\sUB.\s\sThis\sis\sto\sfix\sa\sharmless\sUBSAN\ncomplaint\sthat\sOSSFuzz\sis\shitting. -D 2019-12-13T21:24:46.081 +C Fix\san\sutterly\sharmless\s"applying\szero\soffset\sto\snull\spointer"\sUB\swarning\nin\ssqlite3AtoF(): +D 2019-12-13T23:38:57.778 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -597,7 +597,7 @@ F src/trigger.c 681ccdb910a87243940d63f99b26190d9c5d2534c2ded3c0825b7c0e315a342e F src/update.c 07a50767f7d3e26d4c887c31cd66448d700d3215caea6023acf7269336097df7 F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 -F src/util.c 66b22af7b359ce6493c34fef28c87d5c2d1765f212d6e4cd5e08d99ac30b89bb +F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf F src/vdbe.c 30fc70ea7f1a47f50cd6557d8073b57fcf2275b537b896ba7e8d602065bc5648 F src/vdbe.h fdbc0a11e5768a702b46ce63286f60e22e71351a29bd98b3666405e1fccc7802 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c1014e80b26131200a115beb86929a8f0ded2dd65b075e47373346c0f170576a -R b59b4afd4c4fcaeb80758977b1b63c0a +P c29fc21288e37f81a1617c5e2961c575d3bca6a1d1b013b2e0a99774afb1dcdb +R 3d3d486575d8e4fc08b0a007870e491d U drh -Z 4fa57844859159ee82f87f0f14b6814f +Z 3aa16a4b7876299855c152aecef9a886 diff --git a/manifest.uuid b/manifest.uuid index ab11a63e58..8ea5d70027 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c29fc21288e37f81a1617c5e2961c575d3bca6a1d1b013b2e0a99774afb1dcdb \ No newline at end of file +052fdf5e58b41ccadaa5aac293ceb4d309ced661d46f3a52be9eb8d01d347a82 \ No newline at end of file diff --git a/src/util.c b/src/util.c index 2c14911b6f..f7a993a766 100644 --- a/src/util.c +++ b/src/util.c @@ -389,7 +389,7 @@ static LONGDOUBLE_TYPE sqlite3Pow10(int E){ int sqlite3AtoF(const char *z, double *pResult, int length, u8 enc){ #ifndef SQLITE_OMIT_FLOATING_POINT int incr; - const char *zEnd = z + length; + const char *zEnd; /* sign * significand * (10 ^ (esign * exponent)) */ int sign = 1; /* sign of significand */ i64 s = 0; /* significand */ @@ -403,9 +403,11 @@ int sqlite3AtoF(const char *z, double *pResult, int length, u8 enc){ assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); *pResult = 0.0; /* Default return value, in case of an error */ + if( length==0 ) return 0; if( enc==SQLITE_UTF8 ){ incr = 1; + zEnd = z + length; }else{ int i; incr = 2; From 5be1b20aec9151af799d1294fc8328c8aaa17bd8 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 14 Dec 2019 14:15:21 +0000 Subject: [PATCH 003/120] Fix problems in fts3 with processing corrupt records and undefined integer overflows. FossilOrigin-Name: 3b873029ef1903f76442445343af3786cd59ee66b0e5e0e6b76a0b6b1b5eb88a --- ext/fts3/fts3.c | 43 ++++++++++++++++++------------------------ ext/fts3/fts3Int.h | 4 ++++ ext/fts3/fts3_write.c | 31 +++++++++++++++--------------- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- test/fts3corrupt4.test | 42 +++++++++++++++++++++++++++++++++++------ 6 files changed, 85 insertions(+), 57 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 5067c1cf0b..082d2a8cbf 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -308,18 +308,6 @@ SQLITE_EXTENSION_INIT1 #endif -/* -** The following are copied from sqliteInt.h. -** -** Constants for the largest and smallest possible 64-bit signed integers. -** These macros are designed to work correctly on both 32-bit and 64-bit -** compilers. -*/ -#ifndef SQLITE_AMALGAMATION -# define LARGEST_INT64 (0xffffffff|(((sqlite3_int64)0x7fffffff)<<32)) -# define SMALLEST_INT64 (((sqlite3_int64)-1) - LARGEST_INT64) -#endif - static int fts3EvalNext(Fts3Cursor *pCsr); static int fts3EvalStart(Fts3Cursor *pCsr); static int fts3TermSegReaderCursor( @@ -364,12 +352,7 @@ int sqlite3Fts3PutVarint(char *p, sqlite_int64 v){ v = (*ptr++); \ if( (v & mask2)==0 ){ var = v; return ret; } -/* -** Read a 64-bit variable-length integer from memory starting at p[0]. -** Return the number of bytes read, or 0 on error. -** The value is stored in *v. -*/ -int sqlite3Fts3GetVarint(const char *pBuf, sqlite_int64 *v){ +int sqlite3Fts3GetVarintU(const char *pBuf, sqlite_uint64 *v){ const unsigned char *p = (const unsigned char*)pBuf; const unsigned char *pStart = p; u32 a; @@ -391,6 +374,15 @@ int sqlite3Fts3GetVarint(const char *pBuf, sqlite_int64 *v){ return (int)(p - pStart); } +/* +** Read a 64-bit variable-length integer from memory starting at p[0]. +** Return the number of bytes read, or 0 on error. +** The value is stored in *v. +*/ +int sqlite3Fts3GetVarint(const char *pBuf, sqlite_int64 *v){ + return sqlite3Fts3GetVarintU(pBuf, (sqlite3_uint64*)v); +} + /* ** Read a 64-bit variable-length integer from memory starting at p[0] and ** not extending past pEnd[-1]. @@ -2496,12 +2488,12 @@ static void fts3GetDeltaVarint3( if( *pp>=pEnd ){ *pp = 0; }else{ - sqlite3_int64 iVal; - *pp += sqlite3Fts3GetVarint(*pp, &iVal); + u64 iVal; + *pp += sqlite3Fts3GetVarintU(*pp, &iVal); if( bDescIdx ){ - *pVal -= iVal; + *pVal = (i64)((u64)*pVal - iVal); }else{ - *pVal += iVal; + *pVal = (i64)((u64)*pVal + iVal); } } } @@ -2531,10 +2523,10 @@ static void fts3PutDeltaVarint3( sqlite3_uint64 iWrite; if( bDescIdx==0 || *pbFirst==0 ){ assert_fts3_nc( *pbFirst==0 || iVal>=*piPrev ); - iWrite = iVal - *piPrev; + iWrite = (u64)iVal - (u64)*piPrev; }else{ assert_fts3_nc( *piPrev>=iVal ); - iWrite = *piPrev - iVal; + iWrite = (u64)*piPrev - (u64)iVal; } assert( *pbFirst || *piPrev==0 ); assert_fts3_nc( *pbFirst==0 || iWrite>0 ); @@ -2553,7 +2545,8 @@ static void fts3PutDeltaVarint3( ** Using this makes it easier to write code that can merge doclists that are ** sorted in either ascending or descending order. */ -#define DOCID_CMP(i1, i2) ((bDescDoclist?-1:1) * (i1-i2)) +// #define DOCID_CMP(i1, i2) ((bDescDoclist?-1:1) * (i64)((u64)i1-i2)) +#define DOCID_CMP(i1, i2) ((bDescDoclist?-1:1) * (i1>i2?1:((i1==i2)?0:-1))) /* ** This function does an "OR" merge of two doclists (output contains all diff --git a/ext/fts3/fts3Int.h b/ext/fts3/fts3Int.h index 26b23b66f2..50370a9108 100644 --- a/ext/fts3/fts3Int.h +++ b/ext/fts3/fts3Int.h @@ -196,6 +196,9 @@ typedef sqlite3_int64 i64; /* 8-byte signed integer */ # define TESTONLY(X) #endif +#define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32)) +#define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64) + #endif /* SQLITE_AMALGAMATION */ #ifdef SQLITE_DEBUG @@ -578,6 +581,7 @@ int sqlite3Fts3Incrmerge(Fts3Table*,int,int); void sqlite3Fts3ErrMsg(char**,const char*,...); int sqlite3Fts3PutVarint(char *, sqlite3_int64); int sqlite3Fts3GetVarint(const char *, sqlite_int64 *); +int sqlite3Fts3GetVarintU(const char *, sqlite_uint64 *); int sqlite3Fts3GetVarintBounded(const char*,const char*,sqlite3_int64*); int sqlite3Fts3GetVarint32(const char *, int *); int sqlite3Fts3VarintLen(sqlite3_uint64); diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index a6b45aef2e..203b48e2d1 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -696,7 +696,7 @@ static int fts3PendingListAppend( assert( !p || p->iLastDocid<=iDocid ); if( !p || p->iLastDocid!=iDocid ){ - sqlite3_int64 iDelta = iDocid - (p ? p->iLastDocid : 0); + u64 iDelta = (u64)iDocid - (u64)(p ? p->iLastDocid : 0); if( p ){ assert( p->nDatanSpace ); assert( p->aData[p->nData]==0 ); @@ -1531,18 +1531,18 @@ static int fts3SegReaderNextDocid( }else{ rc = fts3SegReaderRequire(pReader, p, FTS3_VARINT_MAX); if( rc==SQLITE_OK ){ - sqlite3_int64 iDelta; - pReader->pOffsetList = p + sqlite3Fts3GetVarint(p, &iDelta); + u64 iDelta; + pReader->pOffsetList = p + sqlite3Fts3GetVarintU(p, &iDelta); if( pTab->bDescIdx ){ - pReader->iDocid -= iDelta; + pReader->iDocid = (i64)((u64)pReader->iDocid - iDelta); }else{ - pReader->iDocid += iDelta; + pReader->iDocid = (i64)((u64)pReader->iDocid + iDelta); } } } } - return SQLITE_OK; + return rc; } @@ -2281,6 +2281,7 @@ static int fts3SegWriterAdd( int rc; /* The current leaf node is full. Write it out to the database. */ + if( pWriter->iFree==LARGEST_INT64 ) return FTS_CORRUPT_VTAB; rc = fts3WriteSegment(p, pWriter->iFree++, pWriter->aData, nData); if( rc!=SQLITE_OK ) return rc; p->nLeafAdd++; @@ -2978,10 +2979,10 @@ int sqlite3Fts3SegReaderStep( sqlite3_int64 iDelta; if( p->bDescIdx && nDoclist>0 ){ if( iPrev<=iDocid ) return FTS_CORRUPT_VTAB; - iDelta = iPrev - iDocid; + iDelta = (i64)((u64)iPrev - (u64)iDocid); }else{ if( nDoclist>0 && iPrev>=iDocid ) return FTS_CORRUPT_VTAB; - iDelta = iDocid - iPrev; + iDelta = (i64)((u64)iDocid - (u64)iPrev); } nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0); @@ -3264,7 +3265,7 @@ static int fts3SegmentMerge( csr.zTerm, csr.nTerm, csr.aDoclist, csr.nDoclist); } if( rc!=SQLITE_OK ) goto finished; - assert( pWriter || bIgnoreEmpty ); + assert_fts3_nc( pWriter || bIgnoreEmpty ); if( iLevel!=FTS3_SEGCURSOR_PENDING ){ rc = fts3DeleteSegdir( @@ -5190,12 +5191,12 @@ static u64 fts3ChecksumIndex( i64 iDocid = 0; i64 iCol = 0; - i64 iPos = 0; + u64 iPos = 0; pCsr += sqlite3Fts3GetVarint(pCsr, &iDocid); while( pCsrbDescIdx ){ - iDocid -= iVal; + iDocid = (i64)((u64)iDocid - iVal); }else{ - iDocid += iVal; + iDocid = (i64)((u64)iDocid + iVal); } } }else{ diff --git a/manifest b/manifest index 766eab9ab7..b99965e3de 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sutterly\sharmless\s"applying\szero\soffset\sto\snull\spointer"\sUB\swarning\nin\ssqlite3AtoF(): -D 2019-12-13T23:38:57.778 +C Fix\sproblems\sin\sfts3\swith\sprocessing\scorrupt\srecords\sand\sundefined\sinteger\soverflows. +D 2019-12-14T14:15:21.800 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -81,9 +81,9 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 9a69143c94195d9342dd4a704021009fb9e45dff9bff775dae024d47e363bab8 +F ext/fts3/fts3.c a05938725571651cc9bedc63a52ede4b39277fec17884c8ff6011dab2ff78c75 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h ba4e5445a0daf4a251345d4704259268fd98a3e0282fedfcaedb9fc6da9f250c +F ext/fts3/fts3Int.h f091030b976045e7df91af2337935952b477cdbd9f48058c44c965684484cb50 F ext/fts3/fts3_aux.c 96708c8b3a7d9b8ca1b68ea2b7e503e283f20e95f145becadedfad096dbd0f34 F ext/fts3/fts3_expr.c b132af223e90e35b9f9efa9fe63d6ae737d34153a3b6066736086df8abc78a1f F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6bdb48b7 @@ -99,7 +99,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c fa971df91b7c9c317ccb76e73de425de372f854cbed16be2d98f42f61be6c0fb +F ext/fts3/fts3_write.c 51e0a4e3782ee17b6dd5e89949b7095fc98e36e87725c53de631734535507498 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -939,7 +939,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test ce7f7b5eaeee5f1804584d061b978d85e64abf2af9adaa7577589fac6f7eae01 F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test bc90c0f6ee73df4c6bd20f1b32fefdfc00b44cc577d67ebca43b157fc3efd422 +F test/fts3corrupt4.test 00ecd7605d5b1478252a3b7c2465de2d427906b8cb73b7acb92628bab81f9903 F test/fts3corrupt5.test 0549f85ec4bd22e992f645f13c59b99d652f2f5e643dac75568bfd23a6db7ed5 F test/fts3cov.test 7eacdbefd756cfa4dc2241974e3db2834e9b372ca215880e00032222f32194cf F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c29fc21288e37f81a1617c5e2961c575d3bca6a1d1b013b2e0a99774afb1dcdb -R 3d3d486575d8e4fc08b0a007870e491d -U drh -Z 3aa16a4b7876299855c152aecef9a886 +P 052fdf5e58b41ccadaa5aac293ceb4d309ced661d46f3a52be9eb8d01d347a82 +R e3e5166e62c991d8b782b6533f40e85d +U dan +Z 2fcdc36e2d58b6d19eb97fe22b33d40d diff --git a/manifest.uuid b/manifest.uuid index 8ea5d70027..d045a1c8e6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -052fdf5e58b41ccadaa5aac293ceb4d309ced661d46f3a52be9eb8d01d347a82 \ No newline at end of file +3b873029ef1903f76442445343af3786cd59ee66b0e5e0e6b76a0b6b1b5eb88a \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 2334907f83..a30fd74473 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -5759,18 +5759,18 @@ do_test 32.0 { | end crash-74fdbc96edbc04.db }]} {} -do_execsql_test 32.1 { +do_catchsql_test 32.1 { UPDATE t1 SET b=quote(zeroblob(6.51158946e+5)) WHERE a MATCH '*t*'; -} {} - -do_catchsql_test 32.2 { - UPDATE t1 SET b=((- '' )) WHERE a MATCH '0*t'; } {1 {database disk image is malformed}} +#do_catchsql_test 32.2 { +# UPDATE t1 SET b=((- '' )) WHERE a MATCH '0*t'; +#} {1 {database disk image is malformed}} + #------------------------------------------------------------------------- # reset_db -do_catchsql_test 32.0 { +do_catchsql_test 33.0 { CREATE VIRTUAL TABLE f USING fts3(a,b,tokenize=icu); CREATE TABLE 'f_docsize'(docid INTEGER PRIMARY KEY, size BLOB); CREATE TABLE 'f_stat'(id INTEGER PRIMARY KEY, value BLOB); @@ -5779,5 +5779,35 @@ do_catchsql_test 32.0 { INSERT INTO f(f) VALUES ('merge=198,49'); } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 34.0 { + CREATE VIRTUAL TABLE f USING fts3(a,b); + INSERT INTO f VALUES (1, '1234'); + INSERT INTO f_segdir VALUES (1,255,0,0,'1 255',x'00'); + UPDATE f_segdir SET level = 0 WHERE level IN ( + SELECT level FROM f_segdir LIMIT 1 OFFSET 1 + ); + INSERT INTO f_segdir VALUES (255,249,0,121,'0 0',x'00'); + INSERT INTO f_content VALUES (255,0,x'ff'); + INSERT INTO f_segdir VALUES (1,255,16,0,'1 255',x'00'); +} + +do_catchsql_test 34.1 { + UPDATE f SET b = x'00' WHERE b IN (SELECT b FROM f LIMIT 1 OFFSET 0); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 35.0 { + CREATE VIRTUAL TABLE f USING fts3(a,b); + INSERT INTO f_segdir VALUES (1,255,0,0,'1 255',x'0001ff000001ff000001ff000001ff000001ff00c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5bec5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5'); +} + +do_catchsql_test 35.1 { + INSERT INTO f(f) VALUES ('integrity-check'); +} {1 {database disk image is malformed}} finish_test From aac30f9b5020f5af1bce935f3d90e9dab3722ba2 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 14 Dec 2019 15:01:55 +0000 Subject: [PATCH 004/120] Make the sqlite3ExprCodeTarget() expression code generator routine robust in the face of unknown opcodes - it simply generates a NULL value. FossilOrigin-Name: f8e876c82a246ceed32b166f64e05dfe5ce4ab4c6820be60404109b43d36bb80 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 5 +++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index b99965e3de..2c90ffc99f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sproblems\sin\sfts3\swith\sprocessing\scorrupt\srecords\sand\sundefined\sinteger\soverflows. -D 2019-12-14T14:15:21.800 +C Make\sthe\ssqlite3ExprCodeTarget()\sexpression\scode\sgenerator\sroutine\srobust\nin\sthe\sface\sof\sunknown\sopcodes\s-\sit\ssimply\sgenerates\sa\sNULL\svalue. +D 2019-12-14T15:01:55.918 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 947911a1826673add2311e8650aeaf9c2809706dfaa45fc2445a5ff32f70693d +F src/expr.c 530df5b8b684f94f0217115da30d292964385a83e87945bd9d7d792b08eb7d17 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 052fdf5e58b41ccadaa5aac293ceb4d309ced661d46f3a52be9eb8d01d347a82 -R e3e5166e62c991d8b782b6533f40e85d -U dan -Z 2fcdc36e2d58b6d19eb97fe22b33d40d +P 3b873029ef1903f76442445343af3786cd59ee66b0e5e0e6b76a0b6b1b5eb88a +R 85c383a5f778e584f7e14589390faee1 +U drh +Z d36aae0806eadd62df0ee61e4708a6ba diff --git a/manifest.uuid b/manifest.uuid index d045a1c8e6..49c0032f3f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3b873029ef1903f76442445343af3786cd59ee66b0e5e0e6b76a0b6b1b5eb88a \ No newline at end of file +f8e876c82a246ceed32b166f64e05dfe5ce4ab4c6820be60404109b43d36bb80 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 3b2b513b6d..c6920b3c81 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3699,7 +3699,8 @@ expr_code_doover: sqlite3VdbeLoadString(v, target, pExpr->u.zToken); return target; } - case TK_NULL: { + default: { + testcase( op!=TK_NULL ); sqlite3VdbeAddOp2(v, OP_Null, 0, target); return target; } @@ -4210,7 +4211,7 @@ expr_code_doover: ** or if there is no matching Ei, the ELSE term Y, or if there is ** no ELSE term, NULL. */ - default: assert( op==TK_CASE ); { + case TK_CASE: { int endLabel; /* GOTO label for end of CASE stmt */ int nextCase; /* GOTO label for next WHEN clause */ int nExpr; /* 2x number of WHEN terms */ From 99670abb82c4c67d528a554ef994a0d4e47b7199 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 14 Dec 2019 17:43:37 +0000 Subject: [PATCH 005/120] Do not set OP_Column flags on the instructions generated by sqlite3ExprCodeGetColumn() if the opcode generated is not really an OP_Column, which might happen if the column is virtual. Fix for ticket [b439bfcfb7deedc6] FossilOrigin-Name: 2401e04730a156aa48787b91af4e516406cb7635145e430be62fd16481816237 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 3 ++- test/gencol1.test | 16 +++++++++++++++- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 2c90ffc99f..3ee9742e6f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sthe\ssqlite3ExprCodeTarget()\sexpression\scode\sgenerator\sroutine\srobust\nin\sthe\sface\sof\sunknown\sopcodes\s-\sit\ssimply\sgenerates\sa\sNULL\svalue. -D 2019-12-14T15:01:55.918 +C Do\snot\sset\sOP_Column\sflags\son\sthe\sinstructions\sgenerated\sby\nsqlite3ExprCodeGetColumn()\sif\sthe\sopcode\sgenerated\sis\snot\sreally\san\nOP_Column,\swhich\smight\shappen\sif\sthe\scolumn\sis\svirtual.\nFix\sfor\sticket\s[b439bfcfb7deedc6] +D 2019-12-14T17:43:37.070 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 530df5b8b684f94f0217115da30d292964385a83e87945bd9d7d792b08eb7d17 +F src/expr.c 7c21a77ca00cc09f500c21cdae7fb3571490c2dec70b392d9e505e81069e45ee F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1022,7 +1022,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test aab394862d6c14a57ff488b0ef3413ed9f3067a56955ede25b5e059188a66a41 +F test/gencol1.test 1cd2b6cfd3ba0a9fe12569db5bcd8972cb83f81586121e8d769905f3b3612879 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3b873029ef1903f76442445343af3786cd59ee66b0e5e0e6b76a0b6b1b5eb88a -R 85c383a5f778e584f7e14589390faee1 +P f8e876c82a246ceed32b166f64e05dfe5ce4ab4c6820be60404109b43d36bb80 +R 3e1bcf29405c2bc765bc5cc02f705dba U drh -Z d36aae0806eadd62df0ee61e4708a6ba +Z d5d947f7a3e61dce535fe821e852738a diff --git a/manifest.uuid b/manifest.uuid index 49c0032f3f..a22bad27d0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f8e876c82a246ceed32b166f64e05dfe5ce4ab4c6820be60404109b43d36bb80 \ No newline at end of file +2401e04730a156aa48787b91af4e516406cb7635145e430be62fd16481816237 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index c6920b3c81..3552322efe 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3487,7 +3487,8 @@ int sqlite3ExprCodeGetColumn( assert( pParse->pVdbe!=0 ); sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pTab, iTable, iColumn, iReg); if( p5 ){ - sqlite3VdbeChangeP5(pParse->pVdbe, p5); + VdbeOp *pOp = sqlite3VdbeGetOp(pParse->pVdbe,-1); + if( pOp->opcode==OP_Column ) pOp->p5 = p5; } return iReg; } diff --git a/test/gencol1.test b/test/gencol1.test index dbcfefe61e..8d3ba648d0 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -342,7 +342,7 @@ do_execsql_test gencol1-12.10 { PRAGMA integrity_check; } {ok} -# 2019-12-09 but report from Yongheng Chen +# 2019-12-09 bug report from Yongheng Chen # Ensure that the SrcList_item.colUsed field is set correctly when a # generated column appears in the USING clause of a join. # @@ -369,5 +369,19 @@ do_execsql_test gencol1-13.22 { SELECT 456 FROM t1 JOIN t1 USING (x,x); } {456} +# 2019-12-14 ticket b439bfcfb7deedc6 +# +sqlite3 db :memory: +do_execsql_test gencol1-14.10 { + CREATE TABLE t0(c0 AS(1 >= 1), c1 UNIQUE AS(TYPEOF(c0)), c2); + INSERT INTO t0 VALUES(0); + REINDEX; + SELECT * FROM t0; +} {1 integer 0} +do_catchsql_test gencol1-14.10 { + INSERT INTO t0 VALUES(2); +} {1 {UNIQUE constraint failed: t0.c1}} + + finish_test From 75f107688588c23f0ac084d59903d2443852b8f1 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 14 Dec 2019 18:08:22 +0000 Subject: [PATCH 006/120] Due to the previous change, the p5 parameter to OP_VColumn no longer ever contains extraneous bits, so change a testcase() into an assert() to show as much. FossilOrigin-Name: 5b4a88cd3b3a32b1242e0eb733cc0bc4becb830a887b8e6604a4c7452050e163 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 3ee9742e6f..d4736b0b01 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sset\sOP_Column\sflags\son\sthe\sinstructions\sgenerated\sby\nsqlite3ExprCodeGetColumn()\sif\sthe\sopcode\sgenerated\sis\snot\sreally\san\nOP_Column,\swhich\smight\shappen\sif\sthe\scolumn\sis\svirtual.\nFix\sfor\sticket\s[b439bfcfb7deedc6] -D 2019-12-14T17:43:37.070 +C Due\sto\sthe\sprevious\schange,\sthe\sp5\sparameter\sto\sOP_VColumn\sno\slonger\sever\ncontains\sextraneous\sbits,\sso\schange\sa\stestcase()\sinto\san\sassert()\sto\sshow\nas\smuch. +D 2019-12-14T18:08:22.047 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -599,7 +599,7 @@ F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 30fc70ea7f1a47f50cd6557d8073b57fcf2275b537b896ba7e8d602065bc5648 +F src/vdbe.c 9195f2233d31c6ffca8f4a4cca67c8da0e70dab1d31a39a166bc61ecc27c18d9 F src/vdbe.h fdbc0a11e5768a702b46ce63286f60e22e71351a29bd98b3666405e1fccc7802 F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f8e876c82a246ceed32b166f64e05dfe5ce4ab4c6820be60404109b43d36bb80 -R 3e1bcf29405c2bc765bc5cc02f705dba +P 2401e04730a156aa48787b91af4e516406cb7635145e430be62fd16481816237 +R 6e927ffe1bc60c5e48f827a09022214f U drh -Z d5d947f7a3e61dce535fe821e852738a +Z e4acfaf148e07535ac807ca90a087964 diff --git a/manifest.uuid b/manifest.uuid index a22bad27d0..6cda219371 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2401e04730a156aa48787b91af4e516406cb7635145e430be62fd16481816237 \ No newline at end of file +5b4a88cd3b3a32b1242e0eb733cc0bc4becb830a887b8e6604a4c7452050e163 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index f4520c608f..53c176b180 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -7217,7 +7217,7 @@ case OP_VColumn: { assert( pModule->xColumn ); memset(&sContext, 0, sizeof(sContext)); sContext.pOut = pDest; - testcase( (pOp->p5 & OPFLAG_NOCHNG)==0 && pOp->p5!=0 ); + assert( pOp->p5==OPFLAG_NOCHNG || pOp->p5==0 ); if( pOp->p5 & OPFLAG_NOCHNG ){ sqlite3VdbeMemSetNull(pDest); pDest->flags = MEM_Null|MEM_Zero; From 7e3f135c62422bb3e2ad0df53541c09449065099 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 14 Dec 2019 19:55:31 +0000 Subject: [PATCH 007/120] When a generated column expression is initially parsed, if it contains errors convert the expression to a simple NULL. This prevents additional pieces of the expression tree that are allocated from lookaside from leaking into the schema, where lookaside allocations are not allowed. FossilOrigin-Name: a89b38605661e36d192df1d074383b704b34a959fcbc169837c0d4f6848f3208 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/build.c | 13 +++++++++++-- test/gencol1.test | 37 ++++++++++++++++++++++++++++++++++++- 4 files changed, 55 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index d4736b0b01..07e3258efd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Due\sto\sthe\sprevious\schange,\sthe\sp5\sparameter\sto\sOP_VColumn\sno\slonger\sever\ncontains\sextraneous\sbits,\sso\schange\sa\stestcase()\sinto\san\sassert()\sto\sshow\nas\smuch. -D 2019-12-14T18:08:22.047 +C When\sa\sgenerated\scolumn\sexpression\sis\sinitially\sparsed,\sif\sit\scontains\serrors\nconvert\sthe\sexpression\sto\sa\ssimple\sNULL.\s\sThis\sprevents\sadditional\spieces\sof\nthe\sexpression\stree\sthat\sare\sallocated\sfrom\slookaside\sfrom\sleaking\sinto\sthe\nschema,\swhere\slookaside\sallocations\sare\snot\sallowed. +D 2019-12-14T19:55:31.349 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -471,7 +471,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c d22498af716953400e314d2d98d1dac3ea5c3b01e0fd243ef9e9b132c74114ec F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c 7c277ccc24c249b84f29ba829b0ed377e78487c93d17d999798641be0c20fad5 +F src/build.c 9a08209f438b5cbc9795ed34430553288944593aa1221325529e67e3c3449143 F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -1022,7 +1022,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test 1cd2b6cfd3ba0a9fe12569db5bcd8972cb83f81586121e8d769905f3b3612879 +F test/gencol1.test 38d90883d0b22ffe8690ecbccf8e6227ece3e380fbbeb4aaed7015a1bd1d9fa4 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2401e04730a156aa48787b91af4e516406cb7635145e430be62fd16481816237 -R 6e927ffe1bc60c5e48f827a09022214f +P 5b4a88cd3b3a32b1242e0eb733cc0bc4becb830a887b8e6604a4c7452050e163 +R 2ce3068a1d1623c8a21d7c464aff2e08 U drh -Z e4acfaf148e07535ac807ca90a087964 +Z ed637028b5830da71aa8a6716a5eba7f diff --git a/manifest.uuid b/manifest.uuid index 6cda219371..b8e530c15c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5b4a88cd3b3a32b1242e0eb733cc0bc4becb830a887b8e6604a4c7452050e163 \ No newline at end of file +a89b38605661e36d192df1d074383b704b34a959fcbc169837c0d4f6848f3208 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 171cc68cf4..f84eda2a82 100644 --- a/src/build.c +++ b/src/build.c @@ -2252,10 +2252,19 @@ void sqlite3EndTable( for(ii=0; iinCol; ii++){ u32 colFlags = p->aCol[ii].colFlags; if( (colFlags & COLFLAG_GENERATED)!=0 ){ + Expr *pX = p->aCol[ii].pDflt; testcase( colFlags & COLFLAG_VIRTUAL ); testcase( colFlags & COLFLAG_STORED ); - sqlite3ResolveSelfReference(pParse, p, NC_GenCol, - p->aCol[ii].pDflt, 0); + if( sqlite3ResolveSelfReference(pParse, p, NC_GenCol, pX, 0) ){ + /* If there are errors in resolving the expression, change the + ** expression to a NULL. This prevents code generators that operate + ** on the expression from inserting extra parts into the expression + ** tree that have been allocated from lookaside memory, which is + ** illegal in a schema and will lead to errors heap corruption when + ** the database connection closes. */ + sqlite3ExprDelete(db, pX); + p->aCol[ii].pDflt = sqlite3ExprAlloc(db, TK_NULL, 0, 0); + } }else{ nNG++; } diff --git a/test/gencol1.test b/test/gencol1.test index 8d3ba648d0..0867844798 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -382,6 +382,41 @@ do_catchsql_test gencol1-14.10 { INSERT INTO t0 VALUES(2); } {1 {UNIQUE constraint failed: t0.c1}} - +# 2019-12-14 gramfuzz1 find +# The schema is malformed in that it has a subquery on a generated +# column expression. This will be loaded if writable_schema=ON. SQLite +# must not use such an expression during code generation as the code generator +# will add bits of content to the expression tree that might be allocated +# from lookaside. But the schema is not tied to a particular database +# connection, so the use of lookaside memory is prohibited. The fix +# is to change the generated column expression to NULL before adding it +# to the schema. +# +reset_db +do_test gencol1-15.10 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 8192 pagesize 4096 filename c27.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 01 00 00 00 02 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................ +| 96: 00 2e 3f d8 0d 00 00 00 01 0f ba 00 0f ba 00 00 ..?............. +| 4016: 00 00 00 00 00 00 00 00 00 00 44 01 06 17 11 11 ..........D..... +| 4032: 01 75 74 61 62 6c 65 74 31 74 31 02 43 52 45 41 .utablet1t1.CREA +| 4048: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e TE TABLE t1(a IN +| 4064: 54 2c 20 62 20 41 53 28 28 56 41 4c 55 45 53 28 T, b AS((VALUES( +| 4080: 31 29 29 20 49 53 20 75 6e 6b 6e 6f 77 6e 29 29 1)) IS unknown)) +| page 2 offset 4096 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| end c27.db +}]} {} +do_execsql_test gencol1-15.20 { + PRAGMA writable_schema=ON; + REPLACE INTO t1 VALUES(9); + SELECT a, quote(b) FROM t1 +} {9 NULL} finish_test From 95866af326ad06f6162fc7448100e0162ea2e2e6 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 15 Dec 2019 00:36:33 +0000 Subject: [PATCH 008/120] Abort the OP_Savepoint opcode early if a virtual table xSync method fails, perhaps due to an interrupt. FossilOrigin-Name: 672e749aef7351de3c69b365c1f80c756fda4e261b5d2ac1faa01d3a7d5a4c49 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 07e3258efd..f7497eb858 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sa\sgenerated\scolumn\sexpression\sis\sinitially\sparsed,\sif\sit\scontains\serrors\nconvert\sthe\sexpression\sto\sa\ssimple\sNULL.\s\sThis\sprevents\sadditional\spieces\sof\nthe\sexpression\stree\sthat\sare\sallocated\sfrom\slookaside\sfrom\sleaking\sinto\sthe\nschema,\swhere\slookaside\sallocations\sare\snot\sallowed. -D 2019-12-14T19:55:31.349 +C Abort\sthe\sOP_Savepoint\sopcode\searly\sif\sa\svirtual\stable\sxSync\smethod\sfails,\nperhaps\sdue\sto\san\sinterrupt. +D 2019-12-15T00:36:33.807 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -599,7 +599,7 @@ F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 9195f2233d31c6ffca8f4a4cca67c8da0e70dab1d31a39a166bc61ecc27c18d9 +F src/vdbe.c ed52f3e6f41a0097c96171379f668f5de26dba2a0d096e48461d2b2742056a22 F src/vdbe.h fdbc0a11e5768a702b46ce63286f60e22e71351a29bd98b3666405e1fccc7802 F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5b4a88cd3b3a32b1242e0eb733cc0bc4becb830a887b8e6604a4c7452050e163 -R 2ce3068a1d1623c8a21d7c464aff2e08 +P a89b38605661e36d192df1d074383b704b34a959fcbc169837c0d4f6848f3208 +R e301f47ec9c8eebaafac7a0537e37181 U drh -Z ed637028b5830da71aa8a6716a5eba7f +Z 8f656184411b5cc9de90e32f691f0d2f diff --git a/manifest.uuid b/manifest.uuid index b8e530c15c..f6db7a6153 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a89b38605661e36d192df1d074383b704b34a959fcbc169837c0d4f6848f3208 \ No newline at end of file +672e749aef7351de3c69b365c1f80c756fda4e261b5d2ac1faa01d3a7d5a4c49 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 53c176b180..45a3fb02e5 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3293,6 +3293,7 @@ case OP_Savepoint: { db->mDbFlags |= DBFLAG_SchemaChange; } } + if( rc ) goto abort_due_to_error; /* Regardless of whether this is a RELEASE or ROLLBACK, destroy all ** savepoints nested inside of the savepoint being operated on. */ From d35bdd6c090ddc4d85213dc0bf8cb432966eb38a Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 15 Dec 2019 02:49:32 +0000 Subject: [PATCH 009/120] Ensure that all ON CONFLICT REPLACE indexes are sorted to the end of the list of indexes for a table, even for weird cases where the same UNIQUE constraint occurs twice with the ON CONFLICT REPLACE clause only on the second one. This avoids an out-of-order contraint processing problem that can arise due to the optimization of check-in [469a62ca33081854]. FossilOrigin-Name: 1e3918ca2f2c1cfcfa44249b1d7b847d52cbb8d302a8d4a335c090cfdf22d7a1 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/build.c | 36 +++++++++++++++++------------------- src/insert.c | 4 ++++ test/conflict.test | 22 ++++++++++++++++++++++ 5 files changed, 52 insertions(+), 28 deletions(-) diff --git a/manifest b/manifest index f7497eb858..007d5cbfbb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Abort\sthe\sOP_Savepoint\sopcode\searly\sif\sa\svirtual\stable\sxSync\smethod\sfails,\nperhaps\sdue\sto\san\sinterrupt. -D 2019-12-15T00:36:33.807 +C Ensure\sthat\sall\sON\sCONFLICT\sREPLACE\sindexes\sare\ssorted\sto\sthe\send\sof\sthe\slist\nof\sindexes\sfor\sa\stable,\seven\sfor\sweird\scases\swhere\sthe\ssame\sUNIQUE\sconstraint\noccurs\stwice\swith\sthe\sON\sCONFLICT\sREPLACE\sclause\sonly\son\sthe\ssecond\sone.\s\sThis\navoids\san\sout-of-order\scontraint\sprocessing\sproblem\sthat\scan\sarise\sdue\nto\sthe\soptimization\sof\scheck-in\s[469a62ca33081854]. +D 2019-12-15T02:49:32.455 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -471,7 +471,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c d22498af716953400e314d2d98d1dac3ea5c3b01e0fd243ef9e9b132c74114ec F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c 9a08209f438b5cbc9795ed34430553288944593aa1221325529e67e3c3449143 +F src/build.c 17f97c9917e84b978f9ec549518f8ec90151c659c3e37058276edb7659c36c44 F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -488,7 +488,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 5de3fd62bd1a692353c8f9c7bbde658f0b579f195620ca3cde1948a53015dddd +F src/insert.c 831408b14a146e93a4e02ddba54dcdfd8097463b9c00ca2ed9daed790c5d452a F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da F src/main.c 868ae7db7a54fe859bf2ca8b7a4f24e9fa03a6134abfb7c9801d08411ef5dacb @@ -747,7 +747,7 @@ F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6 F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151ecac0b95 F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 87ad5458bb8709312dac0d6755fd30e8e4ca83298d0a9ef6e5c24277a3c3390e -F test/conflict.test c7cc007e2af151516ddf38f7412fe10d473a694f55e3df437e2c7b31c2590e8d +F test/conflict.test 58857e2533fb9f2e0358ea7cb191215657846be1dd9da3b3d6df3e750c02ae03 F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c F test/conflict3.test f62a2d0cad9162a60e6458fc913dff3a2208feca924120c21737cfee65a6a74a F test/contrib01.test 2a1cbc0f2f48955d7d073f725765da6fbceda6b4 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a89b38605661e36d192df1d074383b704b34a959fcbc169837c0d4f6848f3208 -R e301f47ec9c8eebaafac7a0537e37181 +P 672e749aef7351de3c69b365c1f80c756fda4e261b5d2ac1faa01d3a7d5a4c49 +R 5b4ddda083685148b74be75770b01033 U drh -Z 8f656184411b5cc9de90e32f691f0d2f +Z d0a5e430475096c2441f59bd7d88b411 diff --git a/manifest.uuid b/manifest.uuid index f6db7a6153..be67899e0e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -672e749aef7351de3c69b365c1f80c756fda4e261b5d2ac1faa01d3a7d5a4c49 \ No newline at end of file +1e3918ca2f2c1cfcfa44249b1d7b847d52cbb8d302a8d4a335c090cfdf22d7a1 \ No newline at end of file diff --git a/src/build.c b/src/build.c index f84eda2a82..f904198fe2 100644 --- a/src/build.c +++ b/src/build.c @@ -3921,26 +3921,9 @@ void sqlite3CreateIndex( sqlite3VdbeJumpHere(v, pIndex->tnum); } } - - /* When adding an index to the list of indices for a table, make - ** sure all indices labeled OE_Replace come after all those labeled - ** OE_Ignore. This is necessary for the correct constraint check - ** processing (in sqlite3GenerateConstraintChecks()) as part of - ** UPDATE and INSERT statements. - */ if( db->init.busy || pTblName==0 ){ - if( onError!=OE_Replace || pTab->pIndex==0 - || pTab->pIndex->onError==OE_Replace){ - pIndex->pNext = pTab->pIndex; - pTab->pIndex = pIndex; - }else{ - Index *pOther = pTab->pIndex; - while( pOther->pNext && pOther->pNext->onError!=OE_Replace ){ - pOther = pOther->pNext; - } - pIndex->pNext = pOther->pNext; - pOther->pNext = pIndex; - } + pIndex->pNext = pTab->pIndex; + pTab->pIndex = pIndex; pIndex = 0; } else if( IN_RENAME_OBJECT ){ @@ -3952,6 +3935,21 @@ void sqlite3CreateIndex( /* Clean up before exiting */ exit_create_index: if( pIndex ) sqlite3FreeIndex(db, pIndex); + if( pTab ){ /* Ensure all REPLACE indexes are at the end of the list */ + Index **ppFrom = &pTab->pIndex; + Index *pThis; + for(ppFrom=&pTab->pIndex; (pThis = *ppFrom)!=0; ppFrom=&pThis->pNext){ + Index *pNext; + if( pThis->onError!=OE_Replace ) continue; + while( (pNext = pThis->pNext)!=0 && pNext->onError!=OE_Replace ){ + *ppFrom = pNext; + pThis->pNext = pNext->pNext; + pNext->pNext = pThis; + ppFrom = &pNext->pNext; + } + break; + } + } sqlite3ExprDelete(db, pPIWhere); sqlite3ExprListDelete(db, pList); sqlite3SrcListDelete(db, pTblName); diff --git a/src/insert.c b/src/insert.c index 5915f4fa95..019dec42f9 100644 --- a/src/insert.c +++ b/src/insert.c @@ -2250,6 +2250,10 @@ void sqlite3CompleteInsertion( assert( v!=0 ); assert( pTab->pSelect==0 ); /* This table is not a VIEW */ for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ + /* All REPLACE indexes are at the end of the list */ + assert( pIdx->onError!=OE_Replace + || pIdx->pNext==0 + || pIdx->pNext->onError==OE_Replace ); if( aRegIdx[i]==0 ) continue; if( pIdx->pPartIdxWhere ){ sqlite3VdbeAddOp2(v, OP_IsNull, aRegIdx[i], sqlite3VdbeCurrentAddr(v)+2); diff --git a/test/conflict.test b/test/conflict.test index 136bc3fec6..b86f86022b 100644 --- a/test/conflict.test +++ b/test/conflict.test @@ -834,5 +834,27 @@ do_catchsql_test conflict-14.1 { REPLACE INTO t1 DEFAULT VALUES; } {1 {NOT NULL constraint failed: t1.x}} +# 2019-12-15 gramfuzz1 find +# Three UNIQUE constraints, where the third would is a duplicate except +# that it adds ON CONFLICT REPLACE. Verify that the indexes end up +# sorted in the correct order (REPLACE last) so that constraint processing +# works correctly. +# +reset_db +do_execsql_test conflict-15.10 { + CREATE TABLE t1( + x PRIMARY KEY, + UNIQUE(x,x), + UNIQUE(x,x) ON CONFLICT REPLACE + ); + INSERT INTO t1(x) VALUES(1); + SELECT * FROM t1; +} {1} +do_catchsql_test conflict-15.20 { + INSERT INTO t1(x) VALUES(1); +} {1 {UNIQUE constraint failed: t1.x}} +do_execsql_test conflict-15.30 { + SELECT * FROM t1; +} {1} finish_test From 4dad7ed532ef1a6b50e5ebf4dedf2a4611a82159 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 16 Dec 2019 16:52:22 +0000 Subject: [PATCH 010/120] When a table is part of a LEFT JOIN and should be a completely NULL row due to the semantics of a LEFT JOIN, make sure any generated columns on that row evaluate to NULL. Ticket [3b84b42943644d6f] FossilOrigin-Name: 0271491438ad2a985aeff355173a8d0f1e5813954c82147bc68cb26cca5804c8 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 13 +++++++++++-- test/gencol1.test | 24 ++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 007d5cbfbb..c0a4bb6641 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sall\sON\sCONFLICT\sREPLACE\sindexes\sare\ssorted\sto\sthe\send\sof\sthe\slist\nof\sindexes\sfor\sa\stable,\seven\sfor\sweird\scases\swhere\sthe\ssame\sUNIQUE\sconstraint\noccurs\stwice\swith\sthe\sON\sCONFLICT\sREPLACE\sclause\sonly\son\sthe\ssecond\sone.\s\sThis\navoids\san\sout-of-order\scontraint\sprocessing\sproblem\sthat\scan\sarise\sdue\nto\sthe\soptimization\sof\scheck-in\s[469a62ca33081854]. -D 2019-12-15T02:49:32.455 +C When\sa\stable\sis\spart\sof\sa\sLEFT\sJOIN\sand\sshould\sbe\sa\scompletely\sNULL\srow\sdue\sto\nthe\ssemantics\sof\sa\sLEFT\sJOIN,\smake\ssure\sany\sgenerated\scolumns\son\sthat\srow\nevaluate\sto\sNULL.\s\sTicket\s[3b84b42943644d6f] +D 2019-12-16T16:52:22.748 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 7c21a77ca00cc09f500c21cdae7fb3571490c2dec70b392d9e505e81069e45ee +F src/expr.c 6346d23442ab7e26b1afdeb04badeb0ec49f3ce3d35dd4e3cf91a8e1e4efe22d F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1022,7 +1022,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test 38d90883d0b22ffe8690ecbccf8e6227ece3e380fbbeb4aaed7015a1bd1d9fa4 +F test/gencol1.test 69008f45faa46b7293cc6ce1236f356a7aff6061b0547334786b54a49b2f98cb F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 672e749aef7351de3c69b365c1f80c756fda4e261b5d2ac1faa01d3a7d5a4c49 -R 5b4ddda083685148b74be75770b01033 +P 1e3918ca2f2c1cfcfa44249b1d7b847d52cbb8d302a8d4a335c090cfdf22d7a1 +R df5ecffdc3336d06465700e45e68356b U drh -Z d0a5e430475096c2441f59bd7d88b411 +Z 5f2c97f622c6cd887eeeafb84f2795e9 diff --git a/manifest.uuid b/manifest.uuid index be67899e0e..fed908ae8c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1e3918ca2f2c1cfcfa44249b1d7b847d52cbb8d302a8d4a335c090cfdf22d7a1 \ No newline at end of file +0271491438ad2a985aeff355173a8d0f1e5813954c82147bc68cb26cca5804c8 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 3552322efe..981e18a8ec 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3408,11 +3408,20 @@ void sqlite3ExprCodeGeneratedColumn( Column *pCol, int regOut ){ + int iAddr; + Vdbe *v = pParse->pVdbe; + assert( v!=0 ); + assert( pParse->iSelfTab!=0 ); + if( pParse->iSelfTab>0 ){ + iAddr = sqlite3VdbeAddOp3(v, OP_IfNullRow, pParse->iSelfTab-1, 0, regOut); + }else{ + iAddr = 0; + } sqlite3ExprCode(pParse, pCol->pDflt, regOut); if( pCol->affinity>=SQLITE_AFF_TEXT ){ - sqlite3VdbeAddOp4(pParse->pVdbe, OP_Affinity, regOut, 1, 0, - &pCol->affinity, 1); + sqlite3VdbeAddOp4(v, OP_Affinity, regOut, 1, 0, &pCol->affinity, 1); } + if( iAddr ) sqlite3VdbeJumpHere(v, iAddr); } #endif /* SQLITE_OMIT_GENERATED_COLUMNS */ diff --git a/test/gencol1.test b/test/gencol1.test index 0867844798..1deb38686f 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -419,4 +419,28 @@ do_execsql_test gencol1-15.20 { SELECT a, quote(b) FROM t1 } {9 NULL} +# 2019-12-16 ticket 3b84b42943644d6f +# When a table is the right table of a LEFT JOIN and the ON clause is +# false, make sure any generated columns evaluate to NULL. +reset_db +do_execsql_test gencol1-16.10 { + CREATE TABLE t0(c0); + CREATE TABLE t1(c1, c2 AS(1)); + INSERT INTO t0 VALUES(0); + SELECT c0, c1, c2 FROM t0 LEFT JOIN t1; +} {0 {} {}} +do_execsql_test gencol1-16.20 { + DROP TABLE t1; + CREATE TABLE t1(c1, c2 AS (c1 ISNULL)); + SELECT c0, c1, c2 FROM t0 LEFT JOIN t1; +} {0 {} {}} +do_execsql_test gencol1-16.30 { + INSERT INTO t1(c1) VALUES(1),(NULL); + SELECT * FROM t1; +} {1 0 {} 1} +do_execsql_test gencol1-16.40 { + SELECT c0, c1, c2 FROM t0 LEFT JOIN t1 ON c0=c1; +} {0 {} {}} + + finish_test From 646975c521f3d857b449f441b5b586e7124b499c Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 17 Dec 2019 12:03:30 +0000 Subject: [PATCH 011/120] Clean up the ExprList that holds the names of columns in a CTE before checking for unused references in the ALTER TABLE implementation. FossilOrigin-Name: 8223e79f987feda5c8e51ec52cec6798cca16d070b10558939e2888ca1a25b8e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/alter.c | 8 +++++--- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index c0a4bb6641..9be83f488b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sa\stable\sis\spart\sof\sa\sLEFT\sJOIN\sand\sshould\sbe\sa\scompletely\sNULL\srow\sdue\sto\nthe\ssemantics\sof\sa\sLEFT\sJOIN,\smake\ssure\sany\sgenerated\scolumns\son\sthat\srow\nevaluate\sto\sNULL.\s\sTicket\s[3b84b42943644d6f] -D 2019-12-16T16:52:22.748 +C Clean\sup\sthe\sExprList\sthat\sholds\sthe\snames\sof\scolumns\sin\sa\sCTE\sbefore\schecking\nfor\sunused\sreferences\sin\sthe\sALTER\sTABLE\simplementation. +D 2019-12-17T12:03:30.587 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -461,7 +461,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 9b3d6f8d3437f0bec3f9a4ebfa9fa4e7e3b34730631611b6d30f6ae1027bf3db +F src/alter.c 14b5516be5b3815d30bf230b619978f6158e754a1d624f70a02cfe2178348b5c F src/analyze.c b3ceec3fc052df8a96ca8a8c858d455dc5029ba681b4be98bb5c5a9162cfa58c F src/attach.c b30c44333d55a68c0a12920b5b9d40b254cbd3d4509bda77417209eeed8b3d80 F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1e3918ca2f2c1cfcfa44249b1d7b847d52cbb8d302a8d4a335c090cfdf22d7a1 -R df5ecffdc3336d06465700e45e68356b +P 0271491438ad2a985aeff355173a8d0f1e5813954c82147bc68cb26cca5804c8 +R c68dc3ba4d5d231b86e4d84e0586fee0 U drh -Z 5f2c97f622c6cd887eeeafb84f2795e9 +Z 71205fed544fdcd4f0e940dde5d4548f diff --git a/manifest.uuid b/manifest.uuid index fed908ae8c..3e93c04a7a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0271491438ad2a985aeff355173a8d0f1e5813954c82147bc68cb26cca5804c8 \ No newline at end of file +8223e79f987feda5c8e51ec52cec6798cca16d070b10558939e2888ca1a25b8e \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 0fe41bd2f1..1cbdefc948 100644 --- a/src/alter.c +++ b/src/alter.c @@ -740,15 +740,17 @@ static int renameUnmapExprCb(Walker *pWalker, Expr *pExpr){ ** to select statement pSelect. */ static void renameWalkWith(Walker *pWalker, Select *pSelect){ - if( pSelect->pWith ){ + With *pWith = pSelect->pWith; + if( pWith ){ int i; - for(i=0; ipWith->nCte; i++){ - Select *p = pSelect->pWith->a[i].pSelect; + for(i=0; inCte; i++){ + Select *p = pWith->a[i].pSelect; NameContext sNC; memset(&sNC, 0, sizeof(sNC)); sNC.pParse = pWalker->pParse; sqlite3SelectPrep(sNC.pParse, p, &sNC); sqlite3WalkSelect(pWalker, p); + sqlite3RenameExprlistUnmap(pWalker->pParse, pWith->a[i].pCols); } } } From 75e95e1fcd52d3ec8282edb75ac8cd0814095d54 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 18 Dec 2019 00:05:50 +0000 Subject: [PATCH 012/120] When processing constant integer values in ORDER BY clauses of window definitions (see check-in [7e4809eadfe99ebf]) be sure to fully disable the constant value to avoid an invalid pointer dereference if the expression is ever duplicated. This fixes a crash report from Yongheng and Rui. FossilOrigin-Name: 1ca0bd982ab1183bbafce0d260e4dceda5eb766ed2e7793374a88d1ae0bdd2ca --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/window.c | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 9be83f488b..1e7db3910c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Clean\sup\sthe\sExprList\sthat\sholds\sthe\snames\sof\scolumns\sin\sa\sCTE\sbefore\schecking\nfor\sunused\sreferences\sin\sthe\sALTER\sTABLE\simplementation. -D 2019-12-17T12:03:30.587 +C When\sprocessing\sconstant\sinteger\svalues\sin\sORDER\sBY\sclauses\sof\swindow\ndefinitions\s(see\scheck-in\s[7e4809eadfe99ebf])\sbe\ssure\sto\sfully\sdisable\nthe\sconstant\svalue\sto\savoid\san\sinvalid\spointer\sdereference\sif\sthe\sexpression\nis\sever\sduplicated.\sThis\sfixes\sa\scrash\sreport\sfrom\sYongheng\sand\sRui. +D 2019-12-18T00:05:50.510 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -617,7 +617,7 @@ F src/where.c c51ebd505c8417285ca1db8f94933a12224bf636ad93f27d821c07f93d59c035 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c 7efa97f4dc2f95548611deba68f0210ab357725899a9bae5391a525e48271875 F src/whereexpr.c 39b6a538804c6e1248c22b33e09d00f89ae6a099c849c4d841ce3995562287b4 -F src/window.c a77f12078dd4b10e655d4ba5a73ca32dbe00e0206018305185c7e86445d3f429 +F src/window.c 913a10696f5197adae32738a7c7cabc03e1f1553240d6c9ce868ee57f5cee88e F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0271491438ad2a985aeff355173a8d0f1e5813954c82147bc68cb26cca5804c8 -R c68dc3ba4d5d231b86e4d84e0586fee0 +P 8223e79f987feda5c8e51ec52cec6798cca16d070b10558939e2888ca1a25b8e +R b2173cceb9c7cb44c37df84c9f42b08c U drh -Z 71205fed544fdcd4f0e940dde5d4548f +Z 156cc4a0e438e4b57215f0738876dab1 diff --git a/manifest.uuid b/manifest.uuid index 3e93c04a7a..eb9ffcac8f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8223e79f987feda5c8e51ec52cec6798cca16d070b10558939e2888ca1a25b8e \ No newline at end of file +1ca0bd982ab1183bbafce0d260e4dceda5eb766ed2e7793374a88d1ae0bdd2ca \ No newline at end of file diff --git a/src/window.c b/src/window.c index 06a341d270..1f1c57f068 100644 --- a/src/window.c +++ b/src/window.c @@ -895,9 +895,11 @@ static ExprList *exprListAppendList( int nInit = pList ? pList->nExpr : 0; for(i=0; inExpr; i++){ Expr *pDup = sqlite3ExprDup(pParse->db, pAppend->a[i].pExpr, 0); + assert( pDup==0 || !ExprHasProperty(pDup, EP_MemToken) ); if( bIntToNull && pDup && pDup->op==TK_INTEGER ){ pDup->op = TK_NULL; pDup->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse); + pDup->u.zToken = 0; } pList = sqlite3ExprListAppend(pParse, pList, pDup); if( pList ) pList->a[nInit+i].sortFlags = pAppend->a[i].sortFlags; From 50efa586006c6ddb7290c37e35b9102747f18d78 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 18 Dec 2019 01:31:21 +0000 Subject: [PATCH 013/120] Remove an assert() in the code generator that can fail due to an invalid INSERT statement. The same assert() appears again in the VDBE and will fire there if the problem persists in an SQL statement that does not contain errors. Gramfuzz find. FossilOrigin-Name: 9bdd57cb9ad8ac1f4a0f1a3942d94ca5193109eeb1975343c4f0c7abf7135946 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 1 - test/select1.test | 20 ++++++++++++++++++++ 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 1e7db3910c..d052b996da 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sprocessing\sconstant\sinteger\svalues\sin\sORDER\sBY\sclauses\sof\swindow\ndefinitions\s(see\scheck-in\s[7e4809eadfe99ebf])\sbe\ssure\sto\sfully\sdisable\nthe\sconstant\svalue\sto\savoid\san\sinvalid\spointer\sdereference\sif\sthe\sexpression\nis\sever\sduplicated.\sThis\sfixes\sa\scrash\sreport\sfrom\sYongheng\sand\sRui. -D 2019-12-18T00:05:50.510 +C Remove\san\sassert()\sin\sthe\scode\sgenerator\sthat\scan\sfail\sdue\sto\san\sinvalid\nINSERT\sstatement.\s\sThe\ssame\sassert()\sappears\sagain\sin\sthe\sVDBE\sand\swill\sfire\nthere\sif\sthe\sproblem\spersists\sin\san\sSQL\sstatement\sthat\sdoes\snot\scontain\nerrors.\s\sGramfuzz\sfind. +D 2019-12-18T01:31:21.798 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 6346d23442ab7e26b1afdeb04badeb0ec49f3ce3d35dd4e3cf91a8e1e4efe22d +F src/expr.c a0330e4035f958bd5dd734fe8b05a5a9ac1c4c3a1eda4ef69b34bce6be1ce2ba F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1294,7 +1294,7 @@ F test/schema6.test e4bd1f23d368695eb9e7b51ef6e02ca0642ea2ab4a52579959826b5e7dce F test/schemafault.test 1936bceca55ac82c5efbcc9fc91a1933e45c8d1e1d106b9a7e56c972a5a2a51e F test/securedel.test 2f70b2449186a1921bd01ec9da407fbfa98c3a7a5521854c300c194b2ff09384 F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5 -F test/select1.test 703154cbf66d0a9fbbd5b771dc3d2c4d3700121d133d695958d4a9c5a33251e8 +F test/select1.test b887331202618dbdabed92446b661ebd95a55ef3923700af56ed71266e9c1157 F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56 F test/select3.test 3905450067c28766bc83ee397f6d87342de868baa60f2bcfd00f286dfbd62cb9 F test/select4.test 5389d9895968d1196c457d59b3ee6515d771d328 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8223e79f987feda5c8e51ec52cec6798cca16d070b10558939e2888ca1a25b8e -R b2173cceb9c7cb44c37df84c9f42b08c +P 1ca0bd982ab1183bbafce0d260e4dceda5eb766ed2e7793374a88d1ae0bdd2ca +R 092a651653668f530eef3aa12db79af2 U drh -Z 156cc4a0e438e4b57215f0738876dab1 +Z 46ff68601fa617a2914722b9a7e1adba diff --git a/manifest.uuid b/manifest.uuid index eb9ffcac8f..e6c8929e72 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1ca0bd982ab1183bbafce0d260e4dceda5eb766ed2e7793374a88d1ae0bdd2ca \ No newline at end of file +9bdd57cb9ad8ac1f4a0f1a3942d94ca5193109eeb1975343c4f0c7abf7135946 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 981e18a8ec..ea59062656 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3507,7 +3507,6 @@ int sqlite3ExprCodeGetColumn( ** over to iTo..iTo+nReg-1. */ void sqlite3ExprCodeMove(Parse *pParse, int iFrom, int iTo, int nReg){ - assert( iFrom>=iTo+nReg || iFrom+nReg<=iTo ); sqlite3VdbeAddOp3(pParse->pVdbe, OP_Move, iFrom, iTo, nReg); } diff --git a/test/select1.test b/test/select1.test index 27191caf67..47dcd0fe4a 100644 --- a/test/select1.test +++ b/test/select1.test @@ -1165,4 +1165,24 @@ do_execsql_test select1-18.4 { ); } {1} +# 2019-12-17 gramfuzz find +# +do_execsql_test select-19.10 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(x); +} {} +do_catchsql_test select-19.20 { + INSERT INTO t1 + SELECT 1,2,3,4,5,6,7 + UNION ALL SELECT 1,2,3,4,5,6,7 + ORDER BY 1; +} {1 {table t1 has 1 columns but 7 values were supplied}} +do_catchsql_test select-19.21 { + INSERT INTO t1 + SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 + UNION ALL SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 + ORDER BY 1; +} {1 {table t1 has 1 columns but 15 values were supplied}} + + finish_test From 94649b6159a58b7fc7e37a9d03753fbbdff5e157 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 18 Dec 2019 02:12:04 +0000 Subject: [PATCH 014/120] Correctly unwind the savepoint stack if the database goes read-only in the middle of a savepoint. FossilOrigin-Name: a96d02b4ab8c70cc20b322e4fa3a4b8814f05c51f5d8b071ec9d69e7379f3ea5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 6 +++++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index d052b996da..52bda33aca 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sassert()\sin\sthe\scode\sgenerator\sthat\scan\sfail\sdue\sto\san\sinvalid\nINSERT\sstatement.\s\sThe\ssame\sassert()\sappears\sagain\sin\sthe\sVDBE\sand\swill\sfire\nthere\sif\sthe\sproblem\spersists\sin\san\sSQL\sstatement\sthat\sdoes\snot\scontain\nerrors.\s\sGramfuzz\sfind. -D 2019-12-18T01:31:21.798 +C Correctly\sunwind\sthe\ssavepoint\sstack\sif\sthe\sdatabase\sgoes\sread-only\sin\nthe\smiddle\sof\sa\ssavepoint. +D 2019-12-18T02:12:04.800 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -599,7 +599,7 @@ F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c ed52f3e6f41a0097c96171379f668f5de26dba2a0d096e48461d2b2742056a22 +F src/vdbe.c ab3f6e647235fe4fa16b71496468313a1da435eb3a2125c3ffdbb0be0d1cbcba F src/vdbe.h fdbc0a11e5768a702b46ce63286f60e22e71351a29bd98b3666405e1fccc7802 F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1ca0bd982ab1183bbafce0d260e4dceda5eb766ed2e7793374a88d1ae0bdd2ca -R 092a651653668f530eef3aa12db79af2 +P 9bdd57cb9ad8ac1f4a0f1a3942d94ca5193109eeb1975343c4f0c7abf7135946 +R b4dd25704860b1cef2883ea8b825990b U drh -Z 46ff68601fa617a2914722b9a7e1adba +Z 065de26ad77175bb3bbe46abfbcca490 diff --git a/manifest.uuid b/manifest.uuid index e6c8929e72..1e737eb21e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9bdd57cb9ad8ac1f4a0f1a3942d94ca5193109eeb1975343c4f0c7abf7135946 \ No newline at end of file +a96d02b4ab8c70cc20b322e4fa3a4b8814f05c51f5d8b071ec9d69e7379f3ea5 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 45a3fb02e5..33c5882bca 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3264,8 +3264,12 @@ case OP_Savepoint: { p->rc = rc = SQLITE_BUSY; goto vdbe_return; } - db->isTransactionSavepoint = 0; rc = p->rc; + if( rc ){ + db->autoCommit = 0; + }else{ + db->isTransactionSavepoint = 0; + } }else{ int isSchemaChange; iSavepoint = db->nSavepoint - iSavepoint - 1; From 8c72afaf33c8e3fd86999a3f56a382cdf2845caf Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 18 Dec 2019 09:17:55 +0000 Subject: [PATCH 015/120] Add a test case for fix in check-in [1ca0bd982ab1183b] FossilOrigin-Name: 519864da8bb671941a64bf333c2086ad9a068b5f85759e7abd368f0706d3aefd --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/window1.test | 16 ++++++++++++++++ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 52bda33aca..b2d2fc21d0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Correctly\sunwind\sthe\ssavepoint\sstack\sif\sthe\sdatabase\sgoes\sread-only\sin\nthe\smiddle\sof\sa\ssavepoint. -D 2019-12-18T02:12:04.800 +C Add\sa\stest\scase\sfor\sfix\sin\scheck-in\s[1ca0bd982ab1183b] +D 2019-12-18T09:17:55.360 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1713,7 +1713,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test b3567fde130dd65fedf56da66a3916cc992e61f910a56b7dac3f71608809faac +F test/window1.test 6db2c38a0830af8554936a563df92e67962cc379253854cd10d0c3cf0a3120c4 F test/window2.tcl 66db96fd9fd202bc31ee7f8ce7904cb469564864cff3f74e009bfef8102333f4 F test/window2.test af2a001ded703bb8f2474fb0edfef170d5aba00f5c1f2aa9f65935b5da13df90 F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9bdd57cb9ad8ac1f4a0f1a3942d94ca5193109eeb1975343c4f0c7abf7135946 -R b4dd25704860b1cef2883ea8b825990b +P a96d02b4ab8c70cc20b322e4fa3a4b8814f05c51f5d8b071ec9d69e7379f3ea5 +R 627893d83616cc9edfdf2fa18820e055 U drh -Z 065de26ad77175bb3bbe46abfbcca490 +Z d0b2b65af4cd0456b98ef351e7111692 diff --git a/manifest.uuid b/manifest.uuid index 1e737eb21e..00692a2360 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a96d02b4ab8c70cc20b322e4fa3a4b8814f05c51f5d8b071ec9d69e7379f3ea5 \ No newline at end of file +519864da8bb671941a64bf333c2086ad9a068b5f85759e7abd368f0706d3aefd \ No newline at end of file diff --git a/test/window1.test b/test/window1.test index b4542891b2..1e64d75799 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1314,5 +1314,21 @@ do_execsql_test 36.40 { VALUES(2),(3),(count(*)OVER()),(4),(5); } {2 3 1 4 5} +# 2019-12-17 crash test case found by Yongheng and Rui +# See check-in 1ca0bd982ab1183b +# +reset_db +do_execsql_test 37.10 { + CREATE TABLE t0(a UNIQUE, b PRIMARY KEY); + CREATE VIEW v0(c) AS SELECT max((SELECT count(a)OVER(ORDER BY 1))) FROM t0; + SELECT c FROM v0 WHERE c BETWEEN 10 AND 20; +} {} +do_execsql_test 37.20 { + DROP VIEW v0; + CREATE VIEW v0(c) AS SELECT max((SELECT count(a)OVER(ORDER BY 1234))) FROM t0; + SELECT c FROM v0 WHERE c BETWEEN -10 AND 20; +} {} + + finish_test From a7648f02e02aa989ffb91227b8bb4466a76304bc Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 18 Dec 2019 13:02:18 +0000 Subject: [PATCH 016/120] Enhancements to fuzzcheck on unix so that it captures signals and prints the current test file and test number prior to terminating. FossilOrigin-Name: ae7cbb246bff3717c283869ccf27ce83611422f3801176819465a8d96f6481bf --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 32 ++++++++++++++++++++++---------- 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index b2d2fc21d0..b7267caad1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\stest\scase\sfor\sfix\sin\scheck-in\s[1ca0bd982ab1183b] -D 2019-12-18T09:17:55.360 +C Enhancements\sto\sfuzzcheck\son\sunix\sso\sthat\sit\scaptures\ssignals\sand\sprints\nthe\scurrent\stest\sfile\sand\stest\snumber\sprior\sto\sterminating. +D 2019-12-18T13:02:18.883 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1009,7 +1009,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c e8cf694f71a1ee39a59f7c2a38c0f8660db0656ce47c8a334b6e9a11f1e66c6d +F test/fuzzcheck.c b2d4dbe3642b3d0d4feb25a24868817d329abdfc84f6678f72c158fd39d4b5fa F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a96d02b4ab8c70cc20b322e4fa3a4b8814f05c51f5d8b071ec9d69e7379f3ea5 -R 627893d83616cc9edfdf2fa18820e055 +P 519864da8bb671941a64bf333c2086ad9a068b5f85759e7abd368f0706d3aefd +R 0747f5adac09bdca7c2e5bcdc15904cf U drh -Z d0b2b65af4cd0456b98ef351e7111692 +Z 387af0afadfac53d17a3ca9cbd82d5ad diff --git a/manifest.uuid b/manifest.uuid index 00692a2360..5891ec034e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -519864da8bb671941a64bf333c2086ad9a068b5f85759e7abd368f0706d3aefd \ No newline at end of file +ae7cbb246bff3717c283869ccf27ce83611422f3801176819465a8d96f6481bf \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index f1d2415de2..cdf21e700e 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -134,6 +134,7 @@ struct Blob { */ static struct GlobalVars { const char *zArgv0; /* Name of program */ + const char *zDbFile; /* Name of database file */ VFile aFile[MX_FILE]; /* The virtual filesystem */ int nDb; /* Number of template databases */ Blob *pFirstDb; /* Content of first template database */ @@ -148,11 +149,10 @@ static struct GlobalVars { */ static void fatalError(const char *zFormat, ...){ va_list ap; - if( g.zTestName[0] ){ - fprintf(stderr, "%s (%s): ", g.zArgv0, g.zTestName); - }else{ - fprintf(stderr, "%s: ", g.zArgv0); - } + fprintf(stderr, "%s", g.zArgv0); + if( g.zDbFile ) fprintf(stderr, " %s", g.zDbFile); + if( g.zTestName[0] ) fprintf(stderr, " (%s)", g.zTestName); + fprintf(stderr, ": "); va_start(ap, zFormat); vfprintf(stderr, zFormat, ap); va_end(ap); @@ -161,12 +161,21 @@ static void fatalError(const char *zFormat, ...){ } /* -** Timeout handler +** signal handler */ #ifdef __unix__ -static void timeoutHandler(int NotUsed){ - (void)NotUsed; - fatalError("timeout\n"); +static void signalHandler(int signum){ + const char *zSig; + if( signum==SIGABRT ){ + zSig = "abort"; + }else if( signum==SIGALRM ){ + zSig = "timeout"; + }else if( signum==SIGSEGV ){ + zSig = "segfault"; + }else{ + zSig = "signal"; + } + fatalError(zSig); } #endif @@ -1360,7 +1369,9 @@ int main(int argc, char **argv){ sqlite3_initialize(); iBegin = timeOfDay(); #ifdef __unix__ - signal(SIGALRM, timeoutHandler); + signal(SIGALRM, signalHandler); + signal(SIGSEGV, signalHandler); + signal(SIGABRT, signalHandler); #endif g.zArgv0 = argv[0]; openFlags4Data = SQLITE_OPEN_READONLY; @@ -1506,6 +1517,7 @@ int main(int argc, char **argv){ /* Process each source database separately */ for(iSrcDb=0; iSrcDbzName); if( rc ){ From 6e1c45ef2ee3aaea9e1f89e1cfa036c0f112e92c Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 18 Dec 2019 13:42:04 +0000 Subject: [PATCH 017/120] Add the --vdbe-debug option to fuzzcheck. FossilOrigin-Name: 289158aa24b066c453d2bce4bc2dead1c56fb0b23c3f7c4810b34b13627cef34 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 7 +++++++ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index b7267caad1..a202a22b06 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhancements\sto\sfuzzcheck\son\sunix\sso\sthat\sit\scaptures\ssignals\sand\sprints\nthe\scurrent\stest\sfile\sand\stest\snumber\sprior\sto\sterminating. -D 2019-12-18T13:02:18.883 +C Add\sthe\s--vdbe-debug\soption\sto\sfuzzcheck. +D 2019-12-18T13:42:04.200 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1009,7 +1009,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c b2d4dbe3642b3d0d4feb25a24868817d329abdfc84f6678f72c158fd39d4b5fa +F test/fuzzcheck.c 0df68e0df3b93a8c8fc24c9873127c7d78024b51444193545f985dbc90ac024e F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 519864da8bb671941a64bf333c2086ad9a068b5f85759e7abd368f0706d3aefd -R 0747f5adac09bdca7c2e5bcdc15904cf +P ae7cbb246bff3717c283869ccf27ce83611422f3801176819465a8d96f6481bf +R 698a2a75d4b0cd7521db241025664bfa U drh -Z 387af0afadfac53d17a3ca9cbd82d5ad +Z 3b78f03b6dfb23a7688d2381f3d2f680 diff --git a/manifest.uuid b/manifest.uuid index 5891ec034e..f2c7aaca3c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ae7cbb246bff3717c283869ccf27ce83611422f3801176819465a8d96f6481bf \ No newline at end of file +289158aa24b066c453d2bce4bc2dead1c56fb0b23c3f7c4810b34b13627cef34 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index cdf21e700e..4f3321f0a1 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -1320,6 +1320,7 @@ static void showHelp(void){ " --sqlid N Use only SQL where sqlid=N\n" " --timeout N Abort if any single test needs more than N seconds\n" " -v|--verbose Increased output. Repeat for more output.\n" +" --vdbe-debug Activate VDBE debugging.\n" ); } @@ -1475,6 +1476,9 @@ int main(int argc, char **argv){ fatalError("timeout is not available on non-unix systems"); #endif }else + if( strcmp(z,"vdbe-debug")==0 ){ + bVdbeDebug = 1; + }else if( strcmp(z,"verbose")==0 ){ quietFlag = 0; verboseFlag++; @@ -1821,6 +1825,9 @@ int main(int argc, char **argv){ #ifdef SQLITE_TESTCTRL_PRNG_SEED sqlite3_test_control(SQLITE_TESTCTRL_PRNG_SEED, 1, db); #endif + if( bVdbeDebug ){ + sqlite3_exec(db, "PRAGMA vdbe_debug=ON", 0, 0, 0); + } do{ runSql(db, (char*)pSql->a, runFlags); }while( timeoutTest ); From 396afe6f6aa90a31303c183e11b2b2d4b7956b35 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 18 Dec 2019 20:51:58 +0000 Subject: [PATCH 018/120] Continue to back away from the LEFT JOIN optimization of check-in [41c27bc0ff1d3135] by disallowing query flattening if the outer query is DISTINCT. Without this fix, if an index scan is run on the table within the view on the right-hand side of the LEFT JOIN, stale result registers might be accessed yielding incorrect results, and/or an OP_IfNullRow opcode might be invoked on the un-opened table, resulting in a NULL-pointer dereference. This problem was found by the Yongheng and Rui fuzzer. FossilOrigin-Name: 862974312edf00e9d1068115d1a39b7235b7db68b6d86b81d38a12f025a4748e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 8 ++++++-- test/join.test | 13 +++++++++++++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index a202a22b06..f2fcc70390 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s--vdbe-debug\soption\sto\sfuzzcheck. -D 2019-12-18T13:42:04.200 +C Continue\sto\sback\saway\sfrom\sthe\sLEFT\sJOIN\soptimization\sof\scheck-in\s[41c27bc0ff1d3135]\nby\sdisallowing\squery\sflattening\sif\sthe\souter\squery\sis\sDISTINCT.\s\sWithout\sthis\sfix,\nif\san\sindex\sscan\sis\srun\son\sthe\stable\swithin\sthe\sview\son\sthe\sright-hand\sside\sof\sthe\nLEFT\sJOIN,\sstale\sresult\sregisters\smight\sbe\saccessed\syielding\sincorrect\sresults,\nand/or\san\sOP_IfNullRow\sopcode\smight\sbe\sinvoked\son\sthe\sun-opened\stable,\sresulting\nin\sa\sNULL-pointer\sdereference.\s\sThis\sproblem\swas\sfound\sby\sthe\sYongheng\sand\sRui\sfuzzer. +D 2019-12-18T20:51:58.702 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -527,7 +527,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 86a7773d2892227ba9ad1721c41bb03c501830f1bf6de5f78dd0062b82e10c9d F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 0fe10579de20eb8dc04ec9ed29659fa782bee2bcc85a35734637f3e2cabc2762 +F src/select.c dd7e40967760b28efe274ade35043d5bf5d72774208bb75d2cb4dd59cbd59ad1 F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817ded F src/sqlite.h.in 2a23e8161775253d9cf383c2c6aa559005dc787d350dcb0be67a6c4cc3bd1d19 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1084,7 +1084,7 @@ F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b F test/istrue.test 75327829744e65cc8700e69340b8e6c192e10e39dfae7ccb0e970d3c4f49090a -F test/join.test f787ee2716efe5beeb9888d10630f917b112c32b6b3e612e48a17ea8aed3a8eb +F test/join.test 99e1d82fada7a1df9002a7b1160bd231c91077b9372492d5e18bfa1d1694d43c F test/join2.test 10f7047e723ebd68b2f47189be8eed20451a6f665d8bf46f1774c640d1062417 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ae7cbb246bff3717c283869ccf27ce83611422f3801176819465a8d96f6481bf -R 698a2a75d4b0cd7521db241025664bfa +P 289158aa24b066c453d2bce4bc2dead1c56fb0b23c3f7c4810b34b13627cef34 +R 9f20156b75204a3ebfd831615fb6a91c U drh -Z 3b78f03b6dfb23a7688d2381f3d2f680 +Z bb78c6170ca7c38efc6081f3520d1341 diff --git a/manifest.uuid b/manifest.uuid index f2c7aaca3c..f41b130af7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -289158aa24b066c453d2bce4bc2dead1c56fb0b23c3f7c4810b34b13627cef34 \ No newline at end of file +862974312edf00e9d1068115d1a39b7235b7db68b6d86b81d38a12f025a4748e \ No newline at end of file diff --git a/src/select.c b/src/select.c index 26c72d6dad..a94c4236e8 100644 --- a/src/select.c +++ b/src/select.c @@ -3600,6 +3600,7 @@ static void substSelect( ** (3b) the FROM clause of the subquery may not contain a virtual ** table and ** (3c) the outer query may not be an aggregate. +** (3d) the outer query may not be DISTINCT. ** ** (4) The subquery can not be DISTINCT. ** @@ -3796,8 +3797,11 @@ static int flattenSubquery( */ if( (pSubitem->fg.jointype & JT_OUTER)!=0 ){ isLeftJoin = 1; - if( pSubSrc->nSrc>1 || isAgg || IsVirtual(pSubSrc->a[0].pTab) ){ - /* (3a) (3c) (3b) */ + if( pSubSrc->nSrc>1 /* (3a) */ + || isAgg /* (3b) */ + || IsVirtual(pSubSrc->a[0].pTab) /* (3c) */ + || (p->selFlags & SF_Distinct)!=0 /* (3d) */ + ){ return 0; } } diff --git a/test/join.test b/test/join.test index 19a061d46e..3b8936fc0e 100644 --- a/test/join.test +++ b/test/join.test @@ -975,4 +975,17 @@ do_execsql_test join-21.10 { SELECT 24, * FROM t1 LEFT JOIN t0 ON +aa ISNULL; } {13 1 {} 14 1 {} 23 1 {} 24 1 {}} +# 2019-12-18 problem with a LEFT JOIN where the RHS is a view. +# Detected by Yongheng and Rui. +# Follows from the optimization attempt of check-in 41c27bc0ff1d3135 +# on 2017-04-18 +# +reset_db +do_execsql_test join-22.10 { + CREATE TABLE t0(a, b); + CREATE INDEX t0a ON t0(a); + INSERT INTO t0 VALUES(10,10),(10,11),(10,12); + SELECT DISTINCT c FROM t0 LEFT JOIN (SELECT a+1 AS c FROM t0) ORDER BY c ; +} {11} + finish_test From c29af653e6a94ef2b4234030d2304dbc2c0cefcb Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 18 Dec 2019 21:22:40 +0000 Subject: [PATCH 019/120] Change an unreachable testcase() into an assert() FossilOrigin-Name: 062e00c4d7e30155299339eaefe6cbe01953894baebf0af6d7ab3295b7436eb7 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 6 +++++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index f2fcc70390..27b1aab5a7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Continue\sto\sback\saway\sfrom\sthe\sLEFT\sJOIN\soptimization\sof\scheck-in\s[41c27bc0ff1d3135]\nby\sdisallowing\squery\sflattening\sif\sthe\souter\squery\sis\sDISTINCT.\s\sWithout\sthis\sfix,\nif\san\sindex\sscan\sis\srun\son\sthe\stable\swithin\sthe\sview\son\sthe\sright-hand\sside\sof\sthe\nLEFT\sJOIN,\sstale\sresult\sregisters\smight\sbe\saccessed\syielding\sincorrect\sresults,\nand/or\san\sOP_IfNullRow\sopcode\smight\sbe\sinvoked\son\sthe\sun-opened\stable,\sresulting\nin\sa\sNULL-pointer\sdereference.\s\sThis\sproblem\swas\sfound\sby\sthe\sYongheng\sand\sRui\sfuzzer. -D 2019-12-18T20:51:58.702 +C Change\san\sunreachable\stestcase()\sinto\san\sassert() +D 2019-12-18T21:22:40.803 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c a0330e4035f958bd5dd734fe8b05a5a9ac1c4c3a1eda4ef69b34bce6be1ce2ba +F src/expr.c 8f873d6a411483a0ba14367aebf63c1f9f4346ef755739ec11feb14fa662002d F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 289158aa24b066c453d2bce4bc2dead1c56fb0b23c3f7c4810b34b13627cef34 -R 9f20156b75204a3ebfd831615fb6a91c +P 862974312edf00e9d1068115d1a39b7235b7db68b6d86b81d38a12f025a4748e +R 32a38e4aaf6284494d646d127a601f97 U drh -Z bb78c6170ca7c38efc6081f3520d1341 +Z f00e4fb5b7f3ab87734a306c50a18bfb diff --git a/manifest.uuid b/manifest.uuid index f41b130af7..4d9e8740b8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -862974312edf00e9d1068115d1a39b7235b7db68b6d86b81d38a12f025a4748e \ No newline at end of file +062e00c4d7e30155299339eaefe6cbe01953894baebf0af6d7ab3295b7436eb7 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index ea59062656..2aef575679 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3709,7 +3709,11 @@ expr_code_doover: return target; } default: { - testcase( op!=TK_NULL ); + /* Make NULL the default case so that if a bug causes an illegal + ** Expr node to be passed into this function, it will be handled + ** sanely and not crash. But keep an assert() to bring the problem + ** to the attention of the developers. */ + assert( op==TK_NULL ); sqlite3VdbeAddOp2(v, OP_Null, 0, target); return target; } From 3e5f7fef333219411606e0b78b2fcaf7f0975266 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 19 Dec 2019 12:29:31 +0000 Subject: [PATCH 020/120] Modify the parse.sql output file from Lemon so that the RULE table contains a column with the complete text of the rule. FossilOrigin-Name: 329cbb372d4d77f774f01a87d104c40ef42d713afbe76195b65f5ca205c5ea7b --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/lemon.c | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 27b1aab5a7..d1d23aa0ca 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\san\sunreachable\stestcase()\sinto\san\sassert() -D 2019-12-18T21:22:40.803 +C Modify\sthe\sparse.sql\soutput\sfile\sfrom\sLemon\sso\sthat\sthe\sRULE\stable\scontains\na\scolumn\swith\sthe\scomplete\stext\sof\sthe\srule. +D 2019-12-19T12:29:31.617 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1771,7 +1771,7 @@ F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce F tool/index_usage.c 9ec344d29cbeb03fdc0fce668eedfb7495792170de933adf95cf8d6904a166ad F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f -F tool/lemon.c 50f9d1896ba141bffca6929317f54f63709d00d3ac82bc5c189d9c9c0a83e832 +F tool/lemon.c ac63a7a2915c2556a855ba2d069cdfc897304cdf9d07a20e2ce470120829acfe F tool/lempar.c e8899b28488f060d0ff931539ea6311b16b22dce068c086c788a06d5e8d01ab7 F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 862974312edf00e9d1068115d1a39b7235b7db68b6d86b81d38a12f025a4748e -R 32a38e4aaf6284494d646d127a601f97 +P 062e00c4d7e30155299339eaefe6cbe01953894baebf0af6d7ab3295b7436eb7 +R 8d6cf8d0b9d8e79c2a551a0656e77e30 U drh -Z f00e4fb5b7f3ab87734a306c50a18bfb +Z bb2d2b67b4a54af65815a14c2eb7c3ad diff --git a/manifest.uuid b/manifest.uuid index 4d9e8740b8..a002c031fc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -062e00c4d7e30155299339eaefe6cbe01953894baebf0af6d7ab3295b7436eb7 \ No newline at end of file +329cbb372d4d77f774f01a87d104c40ef42d713afbe76195b65f5ca205c5ea7b \ No newline at end of file diff --git a/tool/lemon.c b/tool/lemon.c index 0e717e1afa..bc53b06b9c 100644 --- a/tool/lemon.c +++ b/tool/lemon.c @@ -4222,7 +4222,8 @@ void ReportTable( fprintf(sql, "CREATE TABLE rule(\n" " ruleid INTEGER PRIMARY KEY,\n" - " lhs INTEGER REFERENCES symbol(id)\n" + " lhs INTEGER REFERENCES symbol(id),\n" + " txt TEXT\n" ");\n" "CREATE TABLE rulerhs(\n" " ruleid INTEGER REFERENCES rule(ruleid),\n" @@ -4232,13 +4233,12 @@ void ReportTable( ); for(i=0, rp=lemp->rule; rp; rp=rp->next, i++){ assert( i==rp->iRule ); - fprintf(sql, "-- "); - writeRuleText(sql, rp); - fprintf(sql, "\n"); fprintf(sql, - "INSERT INTO rule(ruleid,lhs)VALUES(%d,%d);\n", + "INSERT INTO rule(ruleid,lhs)VALUES(%d,%d,'", rp->iRule, rp->lhs->index ); + writeRuleText(sql, rp); + fprintf(sql,"');\n"); for(j=0; jnrhs; j++){ struct symbol *sp = rp->rhs[j]; if( sp->type!=MULTITERMINAL ){ From 59c56796917a28041e8f315abe1a376508413961 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 19 Dec 2019 13:17:07 +0000 Subject: [PATCH 021/120] Fix incorrect SQL generated by the Lemon change of the previous check-in. FossilOrigin-Name: fccfb8a9ed3c1df9f23762bb8df6fdf36a21118899e3fae41f451169a5f2c08e --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/lemon.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index d1d23aa0ca..91c07f8a4c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Modify\sthe\sparse.sql\soutput\sfile\sfrom\sLemon\sso\sthat\sthe\sRULE\stable\scontains\na\scolumn\swith\sthe\scomplete\stext\sof\sthe\srule. -D 2019-12-19T12:29:31.617 +C Fix\sincorrect\sSQL\sgenerated\sby\sthe\sLemon\schange\sof\sthe\sprevious\scheck-in. +D 2019-12-19T13:17:07.364 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1771,7 +1771,7 @@ F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce F tool/index_usage.c 9ec344d29cbeb03fdc0fce668eedfb7495792170de933adf95cf8d6904a166ad F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f -F tool/lemon.c ac63a7a2915c2556a855ba2d069cdfc897304cdf9d07a20e2ce470120829acfe +F tool/lemon.c a361b85fa230560b783006ac002a6a8bad214c3b9d7fa48980aecc2b691ddcad F tool/lempar.c e8899b28488f060d0ff931539ea6311b16b22dce068c086c788a06d5e8d01ab7 F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 062e00c4d7e30155299339eaefe6cbe01953894baebf0af6d7ab3295b7436eb7 -R 8d6cf8d0b9d8e79c2a551a0656e77e30 +P 329cbb372d4d77f774f01a87d104c40ef42d713afbe76195b65f5ca205c5ea7b +R d028a5f013795e21f082346da52e7329 U drh -Z bb2d2b67b4a54af65815a14c2eb7c3ad +Z 50186217141264fb7bf8cc1df4e95908 diff --git a/manifest.uuid b/manifest.uuid index a002c031fc..f064dd77ff 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -329cbb372d4d77f774f01a87d104c40ef42d713afbe76195b65f5ca205c5ea7b \ No newline at end of file +fccfb8a9ed3c1df9f23762bb8df6fdf36a21118899e3fae41f451169a5f2c08e \ No newline at end of file diff --git a/tool/lemon.c b/tool/lemon.c index bc53b06b9c..8dcf65179f 100644 --- a/tool/lemon.c +++ b/tool/lemon.c @@ -4234,7 +4234,7 @@ void ReportTable( for(i=0, rp=lemp->rule; rp; rp=rp->next, i++){ assert( i==rp->iRule ); fprintf(sql, - "INSERT INTO rule(ruleid,lhs)VALUES(%d,%d,'", + "INSERT INTO rule(ruleid,lhs,txt)VALUES(%d,%d,'", rp->iRule, rp->lhs->index ); writeRuleText(sql, rp); From 54d501092d88c0cf89bec4279951f548fb0b8618 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 19 Dec 2019 15:15:40 +0000 Subject: [PATCH 022/120] Fix the zipfile extension so that INSERT works even if the pathname of the file being inserted is a NULL. Bug discovered by the Yongheng and Rui fuzzer. FossilOrigin-Name: a80f84b511231204658304226de3e075a55afc2e3f39ac063716f7a57f585c06 --- ext/misc/zipfile.c | 1 + manifest | 14 +++++++------- manifest.uuid | 2 +- test/zipfile.test | 14 ++++++++++++++ 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/ext/misc/zipfile.c b/ext/misc/zipfile.c index 0d66f6a6f5..9a0345d9fd 100644 --- a/ext/misc/zipfile.c +++ b/ext/misc/zipfile.c @@ -1619,6 +1619,7 @@ static int zipfileUpdate( if( rc==SQLITE_OK ){ zPath = (const char*)sqlite3_value_text(apVal[2]); + if( zPath==0 ) zPath = ""; nPath = (int)strlen(zPath); mTime = zipfileGetTime(apVal[4]); } diff --git a/manifest b/manifest index 91c07f8a4c..8c11ba8963 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sincorrect\sSQL\sgenerated\sby\sthe\sLemon\schange\sof\sthe\sprevious\scheck-in. -D 2019-12-19T13:17:07.364 +C Fix\sthe\szipfile\sextension\sso\sthat\sINSERT\sworks\seven\sif\sthe\spathname\sof\nthe\sfile\sbeing\sinserted\sis\sa\sNULL.\s\sBug\sdiscovered\sby\sthe\nYongheng\sand\sRui\sfuzzer. +D 2019-12-19T15:15:40.450 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -324,7 +324,7 @@ F ext/misc/vfsstat.c 77b5b4235c9f7f11eddf82487c0a422944ac2f132dafd5af3be7a68a057 F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212 -F ext/misc/zipfile.c 7ad29133e304e40c8fe239bea10e101580ed56bc68c16d992af514cce19572d0 +F ext/misc/zipfile.c 8f965eb309da3ae8c30088f6c3ebdddcdbdf9e0ef24f3bc7ae0756deb93da503 F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64 F ext/rbu/rbu.c 8681f6157db6adc82c34af24b14ea8a3be0146ad2a3b6c1d5da6cb8a5796c8ce F ext/rbu/rbu1.test 221d9c18a5e600ac9ac6b1810d99d9f99163a7909ba61597876ab6e4d4beb3d6 @@ -1748,7 +1748,7 @@ F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912ade F test/writecrash.test f1da7f7adfe8d7f09ea79b42e5ca6dcc41102f27f8e334ad71539501ddd910cc F test/zeroblob.test 07a5b11ab591d1f26c626945fb7f228f68b993533b2ada77273edf6ee29db174 F test/zerodamage.test 9c41628db7e8d9e8a0181e59ea5f189df311a9f6ce99cc376dc461f66db6f8dc -F test/zipfile.test b3b558639f7a103e095713ad0f57fec1fce1b7d60c8054df5789b98f7547a395 +F test/zipfile.test daab4c9be151934fd6bbc71a0d2520351efc61719eabbf545920f953883d172a F test/zipfile2.test 9903388a602a3834189857a985106ff95c3bba6a3969e0134127df991889db5d F test/zipfilefault.test 44d4d7a7f7cca7521d569d7f71026b241d65a6b1757aa409c1a168827edbbc2c F tool/GetFile.cs 47852aa0d806fe47ed1ac5138bdce7f000fe87aaa7f28107d0cb1e26682aeb44 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 329cbb372d4d77f774f01a87d104c40ef42d713afbe76195b65f5ca205c5ea7b -R d028a5f013795e21f082346da52e7329 +P fccfb8a9ed3c1df9f23762bb8df6fdf36a21118899e3fae41f451169a5f2c08e +R 0fec610fab0a45c2e8f5600ef1cab28e U drh -Z 50186217141264fb7bf8cc1df4e95908 +Z aed8df93d89c2e0fad2b3edf29a44f34 diff --git a/manifest.uuid b/manifest.uuid index f064dd77ff..cd30110c81 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fccfb8a9ed3c1df9f23762bb8df6fdf36a21118899e3fae41f451169a5f2c08e \ No newline at end of file +a80f84b511231204658304226de3e075a55afc2e3f39ac063716f7a57f585c06 \ No newline at end of file diff --git a/test/zipfile.test b/test/zipfile.test index 2bab066df0..a37e8139be 100644 --- a/test/zipfile.test +++ b/test/zipfile.test @@ -795,4 +795,18 @@ if {$tcl_platform(platform)!="windows"} { } {. ./x1.txt ./x2.txt} } +# 2019-12-18 Yongheng and Rui fuzzer +# +do_execsql_test 13.10 { + DROP TABLE IF EXISTS t0; + DROP TABLE IF EXISTS t1; + CREATE TABLE t0(a,b,c,d,e,f,g); + REPLACE INTO t0(c,b,f) VALUES(10,10,10); + CREATE VIRTUAL TABLE t1 USING zipfile('h.zip'); + REPLACE INTO t1 SELECT * FROM t0; + SELECT quote(name),quote(mode),quote(mtime),quote(sz),quote(rawdata), + quote(data),quote(method) FROM t1; +} {'' 10 10 2 X'3130' X'3130' 0} + + finish_test From 34ab941e5bae10894b3c0653248c6636edc5e9f8 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 19 Dec 2019 17:42:27 +0000 Subject: [PATCH 023/120] Detect the invalid use of NULLS LAST on an INTEGER PRIMARY KEY definition of a WITHOUT ROWID table. FossilOrigin-Name: 4417c5bf0aabb34ed174f01afd981c924ae965a42128719d8d6735536631d12f --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/build.c | 1 + test/nulls1.test | 7 +++++++ 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 8c11ba8963..6e61b4d4f1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\szipfile\sextension\sso\sthat\sINSERT\sworks\seven\sif\sthe\spathname\sof\nthe\sfile\sbeing\sinserted\sis\sa\sNULL.\s\sBug\sdiscovered\sby\sthe\nYongheng\sand\sRui\sfuzzer. -D 2019-12-19T15:15:40.450 +C Detect\sthe\sinvalid\suse\sof\sNULLS\sLAST\son\san\sINTEGER\sPRIMARY\sKEY\sdefinition\nof\sa\sWITHOUT\sROWID\stable. +D 2019-12-19T17:42:27.314 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -471,7 +471,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c d22498af716953400e314d2d98d1dac3ea5c3b01e0fd243ef9e9b132c74114ec F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c 17f97c9917e84b978f9ec549518f8ec90151c659c3e37058276edb7659c36c44 +F src/build.c 358e894867394839679982d2fe320fb44fd17c94a87feb898aa066c15a8066ea F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -1190,7 +1190,7 @@ F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 F test/notnull.test a37b663d5bb728d66fc182016613fb8e4a0a4bbf3d75b8876a7527f7d4ed3f18 F test/null.test 0dcce4f04284ec66108c503327ad6d224c0752b3 -F test/nulls1.test a325e2f2148fb5c82cd5f734e7b60f5fa28f9394c318edf3140f36f57d39930a +F test/nulls1.test c8fc1b223f06e60007e0cd3e498ccb10195cf75a18fc3312508b3cf679ecb806 F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1 F test/numindex1.test 20a5450d4b056e48cd5db30e659f13347a099823 F test/offset1.test f06b83657bcf26f9ce805e67450e189e282143b2 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fccfb8a9ed3c1df9f23762bb8df6fdf36a21118899e3fae41f451169a5f2c08e -R 0fec610fab0a45c2e8f5600ef1cab28e +P a80f84b511231204658304226de3e075a55afc2e3f39ac063716f7a57f585c06 +R 7a95b86f1a40201b7706c8c6219ee188 U drh -Z aed8df93d89c2e0fad2b3edf29a44f34 +Z a9ed89712b19f96611f174486447a3a5 diff --git a/manifest.uuid b/manifest.uuid index cd30110c81..7dcbbe2a5c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a80f84b511231204658304226de3e075a55afc2e3f39ac063716f7a57f585c06 \ No newline at end of file +4417c5bf0aabb34ed174f01afd981c924ae965a42128719d8d6735536631d12f \ No newline at end of file diff --git a/src/build.c b/src/build.c index f904198fe2..4fa27e5c50 100644 --- a/src/build.c +++ b/src/build.c @@ -1547,6 +1547,7 @@ void sqlite3AddPrimaryKey( assert( autoInc==0 || autoInc==1 ); pTab->tabFlags |= autoInc*TF_Autoincrement; if( pList ) pParse->iPkSortOrder = pList->a[0].sortFlags; + (void)sqlite3HasExplicitNulls(pParse, pList); }else if( autoInc ){ #ifndef SQLITE_OMIT_AUTOINCREMENT sqlite3ErrorMsg(pParse, "AUTOINCREMENT is only allowed on an " diff --git a/test/nulls1.test b/test/nulls1.test index fb059a674b..a6bf62c159 100644 --- a/test/nulls1.test +++ b/test/nulls1.test @@ -248,4 +248,11 @@ do_execsql_test 7.0 { SELECT * FROM t71 ORDER BY a DESC NULLS FIRST; } +# 2019-12-18 gramfuzz1 find +# NULLS LAST not allows on an INTEGER PRIMARY KEY. +# +do_catchsql_test 8.0 { + CREATE TABLE t80(a, b INTEGER, PRIMARY KEY(b NULLS LAST)) WITHOUT ROWID; +} {1 {unsupported use of NULLS LAST}} + finish_test From 8654186b0236d556aa85528c2573ee0b6ab71be3 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 19 Dec 2019 20:37:32 +0000 Subject: [PATCH 024/120] When an error occurs while rewriting the parser tree for window functions in the sqlite3WindowRewrite() routine, make sure that pParse->nErr is set, and make sure that this shuts down any subsequent code generation that might depend on the transformations that were implemented. This fixes a problem discovered by the Yongheng and Rui fuzzer. FossilOrigin-Name: e2bddcd4c55ba3cbe0130332679ff4b048630d0ced9a8899982edb5a3569ba7f --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 1 + src/vdbeaux.c | 3 ++- src/window.c | 6 +++++- 5 files changed, 17 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 6e61b4d4f1..f741b1369e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Detect\sthe\sinvalid\suse\sof\sNULLS\sLAST\son\san\sINTEGER\sPRIMARY\sKEY\sdefinition\nof\sa\sWITHOUT\sROWID\stable. -D 2019-12-19T17:42:27.314 +C When\san\serror\soccurs\swhile\srewriting\sthe\sparser\stree\sfor\swindow\sfunctions\nin\sthe\ssqlite3WindowRewrite()\sroutine,\smake\ssure\sthat\spParse->nErr\sis\sset,\nand\smake\ssure\sthat\sthis\sshuts\sdown\sany\ssubsequent\scode\sgeneration\sthat\smight\ndepend\son\sthe\stransformations\sthat\swere\simplemented.\s\sThis\sfixes\sa\sproblem\ndiscovered\sby\sthe\sYongheng\sand\sRui\sfuzzer. +D 2019-12-19T20:37:32.070 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 8f873d6a411483a0ba14367aebf63c1f9f4346ef755739ec11feb14fa662002d +F src/expr.c 5099de2d6cca77f7c3b5131e0035787fc64ca3d27c267020e7e8bec0e226336c F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -603,7 +603,7 @@ F src/vdbe.c ab3f6e647235fe4fa16b71496468313a1da435eb3a2125c3ffdbb0be0d1cbcba F src/vdbe.h fdbc0a11e5768a702b46ce63286f60e22e71351a29bd98b3666405e1fccc7802 F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 -F src/vdbeaux.c ede199fe272656338741dd831da86362a3b60e42fb12ef5389ea1325823e9686 +F src/vdbeaux.c 858bb43a9d98846cc23fa8c8d0970ada805dd75bc6a01b69e972da608f7f59b1 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c 2eb00a4d1a7d2c97510a4d1ccaf4e12c9143f2ced1c6b96b5eddc372183c9121 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be @@ -617,7 +617,7 @@ F src/where.c c51ebd505c8417285ca1db8f94933a12224bf636ad93f27d821c07f93d59c035 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c 7efa97f4dc2f95548611deba68f0210ab357725899a9bae5391a525e48271875 F src/whereexpr.c 39b6a538804c6e1248c22b33e09d00f89ae6a099c849c4d841ce3995562287b4 -F src/window.c 913a10696f5197adae32738a7c7cabc03e1f1553240d6c9ce868ee57f5cee88e +F src/window.c da010455914c81037dcb5b0c6f4273f8a32c94567865c46a60060b937b018a96 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a80f84b511231204658304226de3e075a55afc2e3f39ac063716f7a57f585c06 -R 7a95b86f1a40201b7706c8c6219ee188 +P 4417c5bf0aabb34ed174f01afd981c924ae965a42128719d8d6735536631d12f +R f9500979ead80e4e63134871bf8fc127 U drh -Z a9ed89712b19f96611f174486447a3a5 +Z b61065dbf7c71aac52e79a354be5735d diff --git a/manifest.uuid b/manifest.uuid index 7dcbbe2a5c..741caa8d4e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4417c5bf0aabb34ed174f01afd981c924ae965a42128719d8d6735536631d12f \ No newline at end of file +e2bddcd4c55ba3cbe0130332679ff4b048630d0ced9a8899982edb5a3569ba7f \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 2aef575679..6ea8ff73f0 100644 --- a/src/expr.c +++ b/src/expr.c @@ -376,6 +376,7 @@ static int codeCompare( int addr; CollSeq *p4; + if( pParse->nErr ) return 0; if( isCommuted ){ p4 = sqlite3BinaryCompareCollSeq(pParse, pRight, pLeft); }else{ diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 311be9af9f..8b9488e9e7 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1303,7 +1303,8 @@ void sqlite3VdbeSetP4KeyInfo(Parse *pParse, Index *pIdx){ */ static void vdbeVComment(Vdbe *p, const char *zFormat, va_list ap){ assert( p->nOp>0 || p->aOp==0 ); - assert( p->aOp==0 || p->aOp[p->nOp-1].zComment==0 || p->db->mallocFailed ); + assert( p->aOp==0 || p->aOp[p->nOp-1].zComment==0 || p->db->mallocFailed + || p->pParse->nErr>0 ); if( p->nOp ){ assert( p->aOp ); sqlite3DbFree(p->db, p->aOp[p->nOp-1].zComment); diff --git a/src/window.c b/src/window.c index 1f1c57f068..f4e12f5fdb 100644 --- a/src/window.c +++ b/src/window.c @@ -934,7 +934,7 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ pTab = sqlite3DbMallocZero(db, sizeof(Table)); if( pTab==0 ){ - return SQLITE_NOMEM; + return sqlite3ErrorToParser(db, SQLITE_NOMEM); } p->pSrc = 0; @@ -1039,6 +1039,10 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ sqlite3DbFree(db, pTab); } + if( rc && pParse->nErr==0 ){ + assert( pParse->db->mallocFailed ); + return sqlite3ErrorToParser(pParse->db, SQLITE_NOMEM); + } return rc; } From 6ad0e25fa41bf51f6ee5302ac62842cf5546223d Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 19 Dec 2019 21:11:48 +0000 Subject: [PATCH 025/120] Fix the regexp extension so that it correctly translates all over-length 3-byte UTF8 sequences into 0xfffd. FossilOrigin-Name: 3d4c0bf8904135fa68c75801bfa738715cacc3b19dc8ad6ef550b11798d4b121 --- ext/misc/regexp.c | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/misc/regexp.c b/ext/misc/regexp.c index 3359109ab3..a972905118 100644 --- a/ext/misc/regexp.c +++ b/ext/misc/regexp.c @@ -156,7 +156,7 @@ static unsigned re_next_char(ReInput *p){ && (p->z[p->i+1]&0xc0)==0x80 ){ c = (c&0x0f)<<12 | ((p->z[p->i]&0x3f)<<6) | (p->z[p->i+1]&0x3f); p->i += 2; - if( c<=0x3ff || (c>=0xd800 && c<=0xdfff) ) c = 0xfffd; + if( c<=0x7ff || (c>=0xd800 && c<=0xdfff) ) c = 0xfffd; }else if( (c&0xf8)==0xf0 && p->i+3mx && (p->z[p->i]&0xc0)==0x80 && (p->z[p->i+1]&0xc0)==0x80 && (p->z[p->i+2]&0xc0)==0x80 ){ c = (c&0x07)<<18 | ((p->z[p->i]&0x3f)<<12) | ((p->z[p->i+1]&0x3f)<<6) diff --git a/manifest b/manifest index f741b1369e..10ad86cc98 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\san\serror\soccurs\swhile\srewriting\sthe\sparser\stree\sfor\swindow\sfunctions\nin\sthe\ssqlite3WindowRewrite()\sroutine,\smake\ssure\sthat\spParse->nErr\sis\sset,\nand\smake\ssure\sthat\sthis\sshuts\sdown\sany\ssubsequent\scode\sgeneration\sthat\smight\ndepend\son\sthe\stransformations\sthat\swere\simplemented.\s\sThis\sfixes\sa\sproblem\ndiscovered\sby\sthe\sYongheng\sand\sRui\sfuzzer. -D 2019-12-19T20:37:32.070 +C Fix\sthe\sregexp\sextension\sso\sthat\sit\scorrectly\stranslates\sall\sover-length\n3-byte\sUTF8\ssequences\sinto\s0xfffd. +D 2019-12-19T21:11:48.622 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -304,7 +304,7 @@ F ext/misc/nextchar.c 279f80fe8ef5ba413242e2704e246503ac601f005eefb180d19e6c9203 F ext/misc/normalize.c b4290464f542bae7a97b43f15bd197949b833ffd668b7c313631bd5d4610212c F ext/misc/percentile.c 148dd07286b16e50f232bb638a47850085ad37d51f270429905bd865e595d1ca F ext/misc/prefixes.c 7be86d17525cfae6ed462fc3c519efc44488ac329890f77491c8f82871f57e17 -F ext/misc/regexp.c 653b6ab5e89bcb5d45f9ebe0747d7f8f3f5706cac963fcbc9a3ddbe5fdc1efa2 +F ext/misc/regexp.c be064ad9478361e40c7b8ca460f78b3d3c9b96080d5f391126c95e14bd362fae F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 540a169cb0d74f15522a8930b0cccdcb37a4fd071d219a5a083a319fc6e8db77 F ext/misc/scrub.c db9fff56fed322ca587d73727c6021b11ae79ce3f31b389e1d82891d144f22ad @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4417c5bf0aabb34ed174f01afd981c924ae965a42128719d8d6735536631d12f -R f9500979ead80e4e63134871bf8fc127 +P e2bddcd4c55ba3cbe0130332679ff4b048630d0ced9a8899982edb5a3569ba7f +R af9053af10312d4307bee0a49d732fcd U drh -Z b61065dbf7c71aac52e79a354be5735d +Z 117f0e64b781f6b402ee8f8a6b6c39a1 diff --git a/manifest.uuid b/manifest.uuid index 741caa8d4e..46d447263b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e2bddcd4c55ba3cbe0130332679ff4b048630d0ced9a8899982edb5a3569ba7f \ No newline at end of file +3d4c0bf8904135fa68c75801bfa738715cacc3b19dc8ad6ef550b11798d4b121 \ No newline at end of file From 8428b3b437569338a9d1e10c4cd8154acbe33089 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 19 Dec 2019 22:08:19 +0000 Subject: [PATCH 026/120] Continuation of [e2bddcd4c55ba3cb]: Add another spot where it is necessary to abort early due to prior errors in sqlite3WindowRewrite(). FossilOrigin-Name: cba2a2a44cdf138a629109bb0ad088ed4ef67fc66bed3e0373554681a39615d2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 10ad86cc98..1b00d4ecdb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sregexp\sextension\sso\sthat\sit\scorrectly\stranslates\sall\sover-length\n3-byte\sUTF8\ssequences\sinto\s0xfffd. -D 2019-12-19T21:11:48.622 +C Continuation\sof\s[e2bddcd4c55ba3cb]:\sAdd\sanother\sspot\swhere\sit\sis\snecessary\nto\sabort\searly\sdue\sto\sprior\serrors\sin\ssqlite3WindowRewrite(). +D 2019-12-19T22:08:19.301 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -527,7 +527,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 86a7773d2892227ba9ad1721c41bb03c501830f1bf6de5f78dd0062b82e10c9d F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c dd7e40967760b28efe274ade35043d5bf5d72774208bb75d2cb4dd59cbd59ad1 +F src/select.c b895d809b93596c828c4cd79f4da96d48bf1969414877bb4313770000ea736cc F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817ded F src/sqlite.h.in 2a23e8161775253d9cf383c2c6aa559005dc787d350dcb0be67a6c4cc3bd1d19 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e2bddcd4c55ba3cbe0130332679ff4b048630d0ced9a8899982edb5a3569ba7f -R af9053af10312d4307bee0a49d732fcd +P 3d4c0bf8904135fa68c75801bfa738715cacc3b19dc8ad6ef550b11798d4b121 +R 5ae11b0f596e58f50666a1f36d76218a U drh -Z 117f0e64b781f6b402ee8f8a6b6c39a1 +Z a0201de5777363689738ee935bfc3b28 diff --git a/manifest.uuid b/manifest.uuid index 46d447263b..3d142a4fef 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3d4c0bf8904135fa68c75801bfa738715cacc3b19dc8ad6ef550b11798d4b121 \ No newline at end of file +cba2a2a44cdf138a629109bb0ad088ed4ef67fc66bed3e0373554681a39615d2 \ No newline at end of file diff --git a/src/select.c b/src/select.c index a94c4236e8..6fff2883ec 100644 --- a/src/select.c +++ b/src/select.c @@ -2809,6 +2809,7 @@ static int multiSelect( } #endif } + if( pParse->nErr ) goto multi_select_end; /* Compute collating sequences used by ** temporary tables needed to implement the compound select. From 0e5ce8029da34055c0ce32c9ad2b0262e21f1e29 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 Dec 2019 12:33:17 +0000 Subject: [PATCH 027/120] Fix an assert() in btree.c that can fail if an INSERT is attempted on a corrupted database while in PRAGMA writable_schema=ON. FossilOrigin-Name: 07beb3629e648e7feae4e786191514339ac1d8f6ba5bb6e7cc8a04bc1f1cd6ab --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 4 +++- test/fuzzdata8.db | Bin 1501184 -> 1503232 bytes 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 1b00d4ecdb..348e689bf5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Continuation\sof\s[e2bddcd4c55ba3cb]:\sAdd\sanother\sspot\swhere\sit\sis\snecessary\nto\sabort\searly\sdue\sto\sprior\serrors\sin\ssqlite3WindowRewrite(). -D 2019-12-19T22:08:19.301 +C Fix\san\sassert()\sin\sbtree.c\sthat\scan\sfail\sif\san\sINSERT\sis\sattempted\son\na\scorrupted\sdatabase\swhile\sin\sPRAGMA\swritable_schema=ON. +D 2019-12-20T12:33:17.322 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -468,7 +468,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c d22498af716953400e314d2d98d1dac3ea5c3b01e0fd243ef9e9b132c74114ec +F src/btree.c 716fc9bd12eb7d35e3d66c5c2c81c37df3fdae49cd25bceaff4e7d702d513d80 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 F src/build.c 358e894867394839679982d2fe320fb44fd17c94a87feb898aa066c15a8066ea @@ -1017,7 +1017,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db b45368bbe9f86d40d30603e8f780ac29807cbcc951a18d7a7fd9d0c0e904706e +F test/fuzzdata8.db d89020bec89dfe98562b15629be034015d12d5d4fc238384be25f2235bf5c985 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3d4c0bf8904135fa68c75801bfa738715cacc3b19dc8ad6ef550b11798d4b121 -R 5ae11b0f596e58f50666a1f36d76218a +P cba2a2a44cdf138a629109bb0ad088ed4ef67fc66bed3e0373554681a39615d2 +R e3918c2a6ba03e1f611ead25e050c496 U drh -Z a0201de5777363689738ee935bfc3b28 +Z c83ab72a8d54d736b94a005afabccf03 diff --git a/manifest.uuid b/manifest.uuid index 3d142a4fef..61cfc90be4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cba2a2a44cdf138a629109bb0ad088ed4ef67fc66bed3e0373554681a39615d2 \ No newline at end of file +07beb3629e648e7feae4e786191514339ac1d8f6ba5bb6e7cc8a04bc1f1cd6ab \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index d0eed5dd43..98f9ec2d62 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8706,7 +8706,9 @@ int sqlite3BtreeInsert( } } - assert( pCur->eState==CURSOR_VALID || (pCur->eState==CURSOR_INVALID && loc) ); + assert( pCur->eState==CURSOR_VALID + || (pCur->eState==CURSOR_INVALID && loc) + || CORRUPT_DB ); pPage = pCur->pPage; assert( pPage->intKey || pX->nKey>=0 ); diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 820ff08a281ea2c7f939c2debbcb520094c14c65..94e0e0bde209eec696534cbe8c0a79bbdb1e9bbc 100644 GIT binary patch delta 17527 zcmc(G2YeLO_iyf$-6T7+JF_M9WJ8lkAiL?2mH?4X5{iI`Bm@wUlF)vrlnkJvA_M|C zSinS(UJ^l$G)V*m5lN!RPf;LI?6hDn$UAp}0a4%ky#MEYJ`X;7H#;-;p6{vm-gD37 zRSwUq9-iMs-x3fY?+>{3@1A9mF>Fg|<`yfvcc&8Akj;xS?hOc#S{dD`4L7<{+sH_v zRx`R#8)S5%mKhxb0>od84%A*V?xFTGBZ=CNjRb1nH{z*1Y{XH!--w}hhY?Nf3xeZpuhCN?R~Pv3FT+3|6~cU($}j`78S5$}rEgX6{~#K!pJ z#>PbRZ@N4u-gS@l=4A*^aJ85h?HfBf*5~t$9UII43LfsKc7%V7FWMLHkMSqb{{(+r zLUepwd~Ez!`u4|`D!NcR| z_Xq+(av>_WN#iz<(SHH?m+tYmcfVbLw{?#RZr3ijSO0;j0|vqIUxT$)@sSCUiIGW> zeqX0feqTg~;Pe40J^H11M`umX8kIF|%*cu3r%i_&?E{xU^Mt_0a5X+~LqqOH-T`St zyea*=d+$x_+c#}Uul_wEf?-EQP$O9Ph1LX04p}4Hw4K!wC-MJ7g={B=tq)YJX^nf~7B*rY%CiLJX5 zli;hn5*t7C=0oxR*t$ze@i!mx$0XKW@g^ns>*Np{?T_{)Q4_=E(EeX<5PCnn=+8ZWtz_2e@df6aD*3f!6xtjKH{_oiLc4K!w!-<#H-#-rQW z5jO=ls#B~tZGbnsQyl190=?=em8@3?*b>0L3D{DQoBERV)i6Vs0xp1mTVQg*)v?jA z^nfL>06)GPCN{7Y1RYvoF*GS)qh3%tb|~bl)`+%a$0m~N#rww8IdB3GZZW>GSz~-- zV-tO2{n`9Z@NjBIfUl3xEXW@pW5&n?@b3={^#sSqQ1BQVJ0{x4FGnZR?<6?)3u^|K zp0ftRe@0kz`0stp4$A|@hVcG#)~3OJbAY(mm|#draW{>MCl&o=2!C`^Od>_HcnYcX z&*zUDoe)a_mBJOpame^qN(>~<%jk0$Y9F_~ho^rJZYQ!MP#z;hKypD)8JwGHn~qt` z_OigP`a@rCI{LMiR>6Aud>ZyJM+t5Vc6PX zJ0r>T#Bo0;TZ6V@X+zrpk-bykPsxPJgRCK(kGEz)rCkVy^rMy%NRMVx;S5vJoCQyCU;;p|6bhj}ld;-dv*#_XYj@E%9#f+eEaNHxbfJ-fGA?#foo@~9! z@cULahrmw4K^B~c+mdXbFwDH$wwAF9DBkECiVsBEHi)beG7dVMV3^N#L1a}Z#oBI& z>^+nc`S<$}+1nb9tvcGyiR=`VT@)HXyFhDi_~TO=`1cEzyCL%m3xv!cg%Fr~g*Ar! z9|Z+EUtq2AXo{_)z&?Q7>p~P%JirQJ$3|yow5HmA7uad=&2uGU$DX!t0xeEC!1$&U z*^~i!2bl#d#aX#;G5Fj8|X7&5^2HIv^a)<4?mAD6(e!(iJnft|tHT-yzVXv5LbG{w8f&O7Za9qVJ< z6h5R+_0Hr8Weh5A1p6_0vF!>gNNd%U3%dp!f^F)~v#nYP1yd$php*4sCh+T@g2Q6F zy7TH@jTMw_JOpW{nQdp;)b@kQ z_PQjyrGQVeu~ug`0dhXk0qoTw!Y~vTq8!QPoiKxy@3ruqxxyA0J+ zZH-{wN!ApTHrkGhmMf#<{l08?^qlQM@V!swv+=yGBTn09%NK;JF$JZO&Ee{4_7XH2 zW%I(2&uq`)v{GBXgG5PMyO{X-gUtCiNL;x z;zX7N^U7@>ptIaoE3hBH*lQb(BM;lwiR?$H9n0>6yjRrwan~{1^+36i6j1XR7>UYK zuF5}3nivhC-+Q(RK|jCR#%Mr#9?Ut<2H!Cj3dy~dhA`}X+j_Z{9{vR~=3713=#=dn zk^Ndw{#Y~UcY-qu27 z0))?Z#9`9UBwZ$A%3@C#gZx;}H>mz$`%z{xF8d+)VFA)-xJN))K~MtW68cJTWdLX}@vITz(R8)~!!RR7{VGBj67RgP+!_+uPUtldMNKX%h z{2sOlyxd3$X0YaLNEg_&$!f#NPGu!yK~Q|u)(Xnn3dz{Nsi2B*wJU1_$&H0k9DguW zg)3L_`-X}`q>$zJC=~*frLr-w-6M1YZxf{#TxqDtaP=y4!eh@`+wxvY!Lp^@cefWt zF(?ZXBrFM4LKq%yu6V7M#uNfzJdzHb0x41C&pRL`O*sffC88UXElO7g-Y}0Jd$(8i zFs4CGiYFWLf3gMQ6rZ97vL-kuQJF8wcIxVaWrLL-m>j3{A#>hmtAunx8CWl#9C)c0 z>jaN=Q5G>b_(v;Kab~j8Hc$?g0Y^ypPSTE(?pwNR;jb>87jq%*NvK1OR}iPg+W$RbpYNsQQ0OkFJyVuo-j9D*5KSR zWentesU+dAIZBYo!ofJ9dY7gwQSb1F}o2g2(M?ulgu8!-iDucX- ztrjSerBW#RNo|T9j{0ijTEJ09xMnxRIQh8orccZjQSrB9iC)>yy$hE>3 zEMjcA-|*6<`D6H{N1^BsR}jp5S?McBzUnr@u<~VvVkqA{w!@63YLN)@Hc1a~3AM)z zugZlzP3gyfM`1=w)xzM9k6h7Eaauitc_)cC$PZF^d>4I~(MH`P;DJ|_dl~aX)myGy z$QxpBi$%MXY>`D{vQI4&A!oa*J!F2O*m>92u@I6!;Jc=>JB^xdYb%#uCAQSt*9}?y3f56^?Mo zJWGW0gVpoU`6aOjmX#`}O=C*}{gOBxisq|DxP6!Ml{xA?px2Ta`hMhQRHjLt@VsB{ z#|mTA_c+lGzz#?cAhEI5$~s|blA0z!et%mKlr)gK;+iigxUtSy+KF5Z(!Wzn;9z5E z9cF$*w#m9cX^OfH!X8v}ATLn;9h+TNzF;gF^udlOs7_TM!9N~R1cBSp025*gE*omk zVBm;SYr*G}X%*#D;~BpGlhWQIH9+I=|`yp?;7!C7oD0wo^I&?>UjCHKQ zt#}BQ3u;%|-9zatm89O!o`=b&)TRPteybEgeglUNIaalR-3!SX_9AdBS7IRfJuwWb z3*C*NtLC!vLA*N@lhfH)muryB%6d`Pk`aKs;Pb^)iwqh{hkQxm3Ghz@d zjZ$;#aevD29hX`lu~sm$p*kffUGt{Z*&K(Xj*2$j>+Nc>}zRbW{8rWDE0H^%z338^oJA5+eYP~A_Wh!i09!|)Tz zKz7TkwC&3MP?TX${x>H5yjy<^uT(4|oSQ|H!yAfvg>aYQ z0gx4MZG_K2WCr(DMMXkQ+{{Kgy z@x0$)FjkA1pq+Kiy=CG+CVsshyQ!M{pgfzCpRc|QWa|UayNV1ADsQOGAo+fKOSrmD zbVB7-YP_$AqxjH6p!^}V3wG_DBmW|#=Jr50+HPhwM?yqrG=uMhsVj7K1|&y zu;ExMs}7+)dd zL&h|9yF8SBW);+oZvZ)$T~{IBp)|pHuZmF&2hUWuGd2pYzNenR%2{fR$Y=$4#-oW?@&VG*J1CEJZ49SteoSUd6{S`4|Nz?6_X7k!eB+-KtKIr@S%HXoJsgRi}#b zLqs|UYI`Xj9DYeH7M7A#f094PSg(t;_#S95?Q-RHf z(sI!cb8e^$VDcf=f^Sr-sUn*LrANd{to(&$6@1_eb-sn>?eiB^uPFbAB#?*8o>n@T zR`SSS#k<**yaC}`XiZThNiiB86h}pVb+vd>*y?2kjrgZ2gBJs@@B({e00LR1X{WqWh0Oe@hprtq01 zhw>YN^|kVdG6_KUb9#6t5`W~F^4r}5OvWtK9? zdDxK;-mda0$Pu*JI4;Eg0%K3ZGRe}Jwz3`zL~YiB@sG*04~NXw+5=e9$UabD&tU0F zH!VCWGsxh*6RoFka(nl3+A1uwFXV$ShOBIP2oCq!E39&)6ma=J9Pv=Jb#m7V5OzUc z$e}(-pQV`fqWf*~j*IrMIKn=rRP(`zk|NRPv%fF0W#Dx=9*6U%>@&bI#ZhYlfqdDL zfb-++24l-9i=vX-erVsqAZ(S|0E!A68IYGGC30MknL`#p@gT=F4k=jNooqiM$zSNw#Mgr*(Z2}&q zJqNX$<%ZaFko`-MJr9>gt3He!YQHy7_DKO>jDX^D)&nl*Ia=Yjnf4(pXf4hl{sOK{ zp_D;4STf4qBIw0e+Z*j^rnt6GXffv^-Q402NKUVLb@{Y8>yGZ+0zu!)~>4|pQO&5Vb&Q8nO96K#%i@~2{?}KU6?Yl(wGWa{$AH}(| z?2lX7I?#6n-&K&__g>8W+D^;kytR%z=<=px3fJK)U@VauL&-_|@LQ%c6q`R`uVHLG z7|W%fv3jxNH-=tW3o>QA0Wv*~hjGec`wEe5gk@*!G)d*#X_DHE{x9tBP=M+twZbdG z4xJVLVrvGzwT?mx}1W^s$(uKVQ^AMNzc3u+jrVCvR#;UH-D}~BDIlmK8tB@+IKPb z8hTea9%pzyNQ`v>fGJUHHwBA8B#*X*=Q&)Y(3)cQ$*7xj?eKZgVkR`yVa57;63 z22?*Rc_A}g3Wt(xxhZCzwNJLP7_7Kp_lfdu;_3~|4RkD}=tLST`PM#=9mHJ4K^xPe zr{zW_G<@cgeU`w=Aj5AT0$U>-fp{#!(OAGM#daTqZQt4NW95($XJ5o2RWZ0?u`Iyq zAMGs|dlNE}>?`VVJwZk?O3ueizuH3>JA}DSIq4os2&C88hwO5^Zjs}pfUA1FQ#IvV z*du!q4Vv<=&8WZp6pt_m=<}B8K}a5SkrvfC6W*F+e`03 zMHkr*l~Ga?aICTa$R9oiY@0h2bB;Lj$w&HF@?dF8Z5kY3Aq}-s?wFo<8{U<)M{thY z@r1~Zqmkj5Ct%rTIhhRE=kCM@c?XTbbQN}NVy)2koMR~4?RAjS--YsM77ls;4GG4~ z#S$$@yl*&ljyGbg1GEnwHWiHJfp^K%nw|FvTY)%oUVcAlt6-;ShiMSS85Eg*fZ}I^lFcZ_Bi&u*O8XNU=W{52Sz3!57CIgf*%wf* z+lL_ql=YO8g>sL519*416-Y0TB6vWjjNVshth4{fuuG(yytnh$j?)~@*O)uq5h}vA zosNOfi(P_cGo)BNaMsaHz^hMD)Z=|F zW3A@cCDhI6VQcM4aOHyId4A^#RK?jTtG?B7RAg7d$dKGf0c#GeG%6gvTZ-MoLEOh` zp{kR8jY(Vp?H<|??ta118#1psnnC^wi?sW7#|Ddhj}-8IU0mQ|2{Og<#ur1>3HjobqVIIv-dE${0Z3v z>kV?V3_ER7CR*=dFs#C{nf;7xvh`kuy{jBATICK>z_;`2mAQh9D$hO%Vm@}9kiR2B zzv0!#9U2+O)ABH!bk0%8*za7B%NZ8dI3@|~I)v|Vw}Rv;_JKJ2g5yb%{ec-i$2|;5 zZAS#k?PkO}qA3L5RN5N6>$2lxM%qEW(C%W`pw`jI$~vO|XU9oV{*@{tM9e*5f1V;$ zh-D?j+;CJf334m#%U>(hCW%aj+*9_?Zd-`aif|)-V$tqm%z{}N(maL>g0wt=S+S~E zY9fGdwq}F8;Zn1|ikh2`6bM;4a%-fJw~BFEP4S$rjSrM5Wd0aeAIrDVMn*d*3)H~| z;ZIT=>(f-D=E2 zmuOxFX|HM2Ie=m=o2L1fw@@%IUpvLn(^X+<&>R9@uhtZXVcoO~5(~jOPiYkU z|2hbf3y>P1F^AtOdO~gh-tR2c;Jr*)#N?9TIs7(dUHNE0qxrDg0L^QWQ>1`*I?%$g z3lQ*Z4lk8waizw^9wV8Uiu&{3C<>ArWU8|Ahu9RsG{}Yf2b~^Vzi3(w)7FfPS>%x%aSxOvUvnYJvmRP==u0my} z;2-d}R@Sx*S{7=ncQ4e&Npg27pe*&z;aYO8Td!$obdv)1$NhQLBw`3MmEA~`$u)CQ zUoi!9E?V*_(@9JKiGc6qr8eL{s#Rd!8IBs5hM9{w74$PXrgMzJHLT%uG3OP)*k#7S{rB|VSNn3#%hD{_l?>t zt9-8%aKiH!;KLYBe^qPBf_xjJj8rM0GW*ZlExFjJ$Vl>|{{gK+1kxVgqf;uvpQ(Al za$L*Ag|BP#L>2>CHQFZJwqLuCCvWXfYj5H4!&(wg*=7~n8sepJYZB#G-qyAYECI5f zl|rB_G+5(Ij%4`MyV@gGxhL&h`us^e8_3L-LxEl60f#gGax<6`0o45sIhrTR&JDlMeQ4&w_WL zRtBc}mj9lZOl-D7}ioL(m z_E=dmW-QTmnBH0gpBHHc?3kiu08#G`yS~%XSPEt=*XS@W=m+grfpvw9_1Y|){j)|P zv>Pm|(yr18l^%${|E@h@we*$)7Jt%@IPMH@N&1|i9^1S|FDc+my)kCvWm(q+)@65~ z-kQz(|5|@$+|`q&j{kS{XP6(XKgQU8R22O%oA;_QohtA)8q=sij?lt;R zyUXZHZK=_R+U`bgY7-5TkMut+5}fz{s7mmES|rFT1OK5)a2@N3lBQG5Lobxv{JS?E zkJjU90n%Du0!4m38h>r12MMeXl!obHnEaz&Mj65ieKwSZ=}plWs+-F*sW0Xp)^`c` zdUL%GWBnkxp-#stE%mh`>kki5Z^V9VP=HxSwU!~bMln8V3J!#z% zqHCO9Umyf$cpMl6#bJ6Bd=jlUue(94HN-2e$ouekS3QZb!4Td+rvtuFoi;F;iMoWB z@75{vNf_fz>i1z)8@-VL)kXU2_(5;IJ!3=a0HsIj9R%2#t<&BxRKJJ+rSpNhoBf8? z;q#7jzHP2IhM_-QC+10h7XCbCx&x&9P3rt-G4#%Nwycvb4g8Z(IGTo}hZTPJZFG## zzZWP6Z_IbjBQ=HT8YflGR_<_adgIJo)+tk&VZi+0HPNw?-V^;ld(4d;|SK>|{DKaO!jVGJ!n| z`tSNNj;ifzJDfo#sEM3DZOO(t-!Xqr!i+)sXc0&je0wWR<}5cy!uJ&IoTuuhRHi`q zaI(*^XY?8<;m~rn=>-DIfs|+UG0<$O{uvTD6c}aJLv^awAu~E66qXSot(Z&f?8mx_ z+xO~&8JordwBQ63fl$3`ay%Ww-`43cn{*{}FEAXnR+uPI!SGVb>_!zSwWt!ds@|KX3z45HxRp7Fngg?Be+Zm-whxTgb_WVDjV6G68)NG~seekMpas9Mmxr)DxI7PH#$vU~_)P zp5!oEaTuLVD|n9gSY!(3HY*?l{m_g=Pk~-ZF@PIFog{NT&gBA#UZ;yAI?KhViiItm zv3$rH(@1+lNf&1jjtzCLW^6I&SM>}?@1m!o_bYuIgfV0yDCo2`v90HD+H-6t zO=)kqZF1&FHu7=8An#qh4fe@*(hhnPRj%mI{$p%GiY-*rN!>O>Nv!h_H<-LSkGMF? zIT=?y?|hh1rCHV~{UwUq;ra;v>{d>qEr&`qS7a&OF>kGNfkY{Je|Ogmh#EmzLn@;j zB(fdo@9E-sjBQTJW0XL7ZPHE2ryso2Tz)J$ z=^V(|>yY=ka|l$95rS}ZrSm0`?SZ_nozalth4y>Hy`V_yo;A|$cH(*D#dn^!s7i9Kz8L(9JWa5Kg zJ6{plK`8ynnT7)|I!i=Kl$TWpQrhE3Cr#HmSDX`Z<~8SaS?(_dTpEMKmrcM0zdC0# zbstea#NQ3@`J(-hvCp{$l8=+mmi_MRCJKkC2Ir(R1h#+X>{rjAjo~`x8Y!?Nyf%=I zr6gBbAT89+Dz4_D{3Z=}4AO_XqA*5tRf_Cw2tVkg^C7p3&WDaex#;QwT6t<_5?X-nCN8T*PN!@{D~|XRetsq$rO&%iYVq8Iom;w&h?Kl$f`?AS z+PEr2s@u(d$Lhw0k*;s4ZnvN~gc657*F`GZT{+Jc0@vHQ27@muNW*!tu7y;@3s+}b zdSSmrmln)2@WHNhjBYzY6h7eMh)bY4EmsTLp1V{aaZE%U=8|ZC_=htR8s@rYLba8W zu~R;E-i>eMx)z$Id>V^SI%yMGecat1wtw!7s564!rn`<)%Av|B14%0p_GP-v$?LyZ zo9RlYJN>LOoR?j@Q0?#PWswI+0Vkul{Vl?Xi7rYH<+P$oXJ166_e_N|z~n zES-T|hwB+!I@C2?r0QP(R2L=CXfd5N$0ODC(484Y|f3?gdml(FKaSx?1s!$GKM|W1tjpT&<@cXo~(Lx<~ovOy+^BKRY!J>1@ zI+})Mx+@v`E_9)l^2HfzEFS2bYk35hFLpHulJ1iNHvM^mrsB6NU2Z}Cf{=Vupidyv zTjin%`z_vo+C>F`Cl0t`1^DoL&}F_i{yb#AG?M?PKmS$ z(l0B)IO1j3dd4n6Zb!R|SBXVn@;cWckzL07Kczd6_k&`=l1(l;mA-;yemR-aY!6dq z?V9bb{jxli@`$`JI}TUua?NK!wfj;HDmMJdVO|@w+qH$sUlZJG;4c+ZINmdqwA<^t zz}RhSKuPmZtMj6VB9zBq}&y^2FUn&x8d4YP9P&YC5E95SrQmp)~v@y!tqU4#S2vG7U z)k-{g(DgDGcPprTSJ}l8|G<8`g_(!ExHn^zXW4AOI2`S~a zu4Bd9EEO$ZrLsrK>aRkIsD;)8IYrVh(tbN1fV1I>whrszUwJbvIo30$_xYl*Jo|VOX zHl(_p+P7R(1~A0#{VO{~x2&cqXIhrA_BbbIGUq+v(&*^J;=W*&sp|6OX=Exs7;1Mf z2@G1AYtT8*OWYx&>G;PT7i8UIG3c=78h@iCjtgR|q`kQNhLr_FO`M0KTthb< zk0|JWQSMA73jb7>K}QWb$D;CF`|rD3xkaABHgoNCMA8A9N4RSQ=D^$!?G&p1UgfZo z30f?M$2yjXkoLShiI1g2ZngawWOk7nL&brhFqGrmo2+aE?&#=F7Zo}Mm)!~R{H2vd zNPa`0bID})jX;)(zFux}j3ygf7$c#&w|jydvaFTyAf)wim)Pk2M7e?aPRdv~=XA$n z=e}+V^bJu;chl_K2&F;%yD>^b-F+3R-^v*6J{Z*O@rR8pDd3smT$%_?lp9p%`6()x4W-V(jZ2XxBw%-m?={o$_h8tq1=r%?X@uS z)6UWxSo55_xj>oV+~LwQP*mnffO#*7_cY@rGMvn#7%o+h@A)aYi zROZeWc{T5o)+ksyn~rkMTdiR@TUNao*J(Dl3@6b&@@W# zN)5&(C)_iv^k&05FEOh3Kjo%+|9c?kN!9=qk99Ux8ClQajE~$)1l9qT&9T!G;uH5* zqR`P>&?B@RMpwJ5L|dnX*reFlxNIuwfMwf4?uJbz?BT*t+l$!cbN69N=c4qLds2{P zoD}d&7QN^7c}Q1C|JoW)b#*}=*m1=Ad*OHP8*(D?mI5iiJEQ7XWLq)h2lpkO%B_xZ zd1*!Q4qo}$?dIv+lpF4Ykk`vL7IK&;5wotl>8+^lP`os_F;sux?8`5YcBd6 z6ma(8xEu5ja?2^%z9Z0+F3QP7t_Ngo4{o=!geF{gOR9MJv6{MGy7?T@yy*xTc;L zMAjE-60NbA==HoKQs&Kj$laN?kTw<5T6$=8M(MXum0qTDDC_W88_&W(HUazjJ+BHf z<(uV<0>k|vj*9gZi&XAv45fD%yffX+Ijj{T8;IpU+Grz_?D3cz8F^4aN{iO@cy^1F zHmkj4dkn6so}TbxWyo`w+03(6pf^=+!!+b?n1hNqh#-%r@a>@?g9Z|OA4)ah8r-5hclUwSd*7-cA*_Do~sVkvt) zCxO(t1T&xIWXIhJZ~WijnKGPkJG_T)hiB?_;_dK?Jmh1OvGYdHEEYWZL^EU3o$}-| zodW&^o_BWUxv7xo&)1Q7U7wr-<;^@BA-&o{MMt5Yx9d0n;$R)WoeSmT+;K-m$vohw~u8g_$$_S)`BhMa@&AVM0 z?vMlG@M{dOlTG%9Ql}myllk_mKYb-$MG@e-7zXS9vR>zj8ai^|#|Q zU4O&v_!fs;4YW+-?w(Q?K5g{cFTs3?KAW-h``{xCDLiZRE?qq1hYj);U^Cq*Jj6E_ z@S!y!FEX|jY7W}M3PY9taQ@wpB<|qAaPQk8e%g697CO_5oFN0nZT<+zXh5qXb1s6) z!Ac;|+h)!9pxePXWTRzzch4Z4w=slv;yWOt%ySk$J{1zi6H9UlW*qiRV)*b!Axq8R zQCiQ&UD#(=NY^0p`y~fLas^&RDeo%qdrsBQnVTrXNAnVYW0DTQ1LW5r`~$oDW~8k? z64F9oyRp>m*=?fkB~V>t)lsF{9Z31%hx|GetDfmVAP-<%Rme$!?ZNh5&wG^gJ>=%w zEqO1tpYGYhaK}d>g9NI0q!(`*^9j_1Nu_YYxe&=}nL#ptp%u`SwHkeIgiuB2ym9U) IdHb_1fry4x}Ir;A;eXuKUww4v=IYS}f3y6kF16}xIki14Fb zh3L1om*|(aMf9xgCi*ZEVVf}Dr}PoohgpGyWGH%%Re|$y&J-xpg>XnbW=zU{ zfhm~R#<_+;-W8Sz$*ZjDP;$uOt9%Odv>Hcs7z*kseQ^Ms8mD?gKLMfjAEr!P3ozYnDLFJstK8Av;LL@W^b#{l}zoZv`yXd$Nl5en3NWLjV zz^ogr8f4rQROon-#o(cCN_&BQ0%^B|SU5hEWy97ycSm&gQhpQI3GlyYwZ`^|%H>dp zDTmmXJ7ndLwjupJ=71C9Sx30s!7`!uU?miWSMjJAF~ko8UfI9)(0H;6w-j=* z!}k2qeillDo}}yC_V}>{42~;G0OOY^H&|BhdNsJP&x1=>p4|RLy*fhHq=~oS+pm?e z{C)|z+)CN@vbPPERj_V9^ghXy?FCOZW&B|&1g;4*dl8<|^or zy;8_$BO&RGG8|8@Q|buv<^0ENPxeOTw&McLc4Z`#hblfCa!z@Zf&VDmgU@eKW-)dZ zN}f@w!t7(L2DZsl4vUU!kHrQ2BjK5^l}Ew<2`hqi-ze?zshvuOAY5;rmEX8Fl$~U& zpz2t~2LrAs3-GDkN``}#!K48DYMWPPSaQG{$+E|)zj8U1L#D14!R;7tU#x#nIV-U5 zAh$JZ1G7I=K1KJ3O1Z$k2Ya6~1cx70-VoUjP(GSH0_mHz!MLMHxfLo`kwQwRgB`Cf z;;Q^Dueu!xz0N3O!)|VCU`LRi`*Y4mg8u_n3*!5zRbbHP${P6wefcLyde-U1s%MqU zBKvPv;q;o&>nPiZM@y7eBKtWjw@)iXhR)eHtjEm(FxYCcPcosn!1!RC*&Si>OnyxAs!#DA!s6$-On08d^KSN!52fJ zxS?8xKloIa$igsCQ#~#~L1#7!ws?gO;H#r{gBw0ohO#o|hUp8OjYN720%5H4uBO5W z1_fb)gn2P)1j7UOsXnKpDn$Tz0!f8#fpjPebZL++1aseD%En>>j7? zW=x0DZr+iQL2(`@wN|xIRt;yytIvwEO0SxbIZW+>@g3A2WX=1PB1jBZ`&No46;^d) z9bkGFbuQrxj8~t;r@N|+LZzBg$ahdKD_vpb2y$7Lq&^f@wP*x+nKNMXHuZercsGsv#AV%ygS1ksIlhuxJ`!{9d zuEDA(ut-emr*0L4972gHwBcW^f=L5aiD77p`m4aIVri1Pn&G@uf(o&Zt0#!h=wa%4 zf!osie8d6#t?C$^!f#H<^L9YrB=v&CYC=j~tq(pjS=}s>*{3wny27kz*?@CJ>L^IP zp|-(armA5givs(E`aLA}mP`zt$!GO}eOj%H4bs)mMHY?8Z)!O--@EF0czC9c4ptXR>uPgwZiYHtWc467S?hv5mZ)!uECz}P=&?(4Jnh%GGzRJ8oDRs7 zrF_V_t<}K$UsVeks}Io)&IkL)77FJ$h}M$kel zHY*I+QFQCsQT*03kmK-#!R!rcPx-!W9=jG6ZBQwE)}e1U!lb%djtH~YOGCMU8e>ue zjmvtv+KYc~f=P`v2ZP^Bt!8lioOTA&PZDd8VQM_Ii%l`fuk99a@7wA_jKxCnF)Izy zhwF_n=N)yVh{d6L8v%`Z>MjP!7ge3V6M#~eCklqQ*F4zjfO^ykr5R2O3ThjUN~GOz z;!$;}2&wC({cwAhHWOB4i*0atLv4=0$7qRx@6^8T2NKdKYJx54TFse8mZm^en;A4Jy~^XF=zB1BEle&E7+2=nJ_^%#sjqJ@KgMht^R zt+cdC++Q+0QeDfE$Pb45v`L}8-+IWdBZZV#gppd&T2xrqowe=SQpn|QNL)n=5FerX zz<*Vp!Xq6exRSs9 zPD(^m;+$16&!gwCAb2G3b%KVK1ck%3POx&8cCONpa|P~YG9RW7*sq8a(Wh%AfB66Z z6KEWNuP@ju#AGnOvS!_}aUdJNRf#>Qn|@F@j!!>NdmYHw`=Bp}EDegBdQFHQq1T17 zH$*oSl@am1DURSn_lLqsS|@yx1E6rTI0Ms%YR`#mAe4t`MX)Ga)OmQEh>0oM zc7YATa!qpymEr4YTr^sn%-CSc+k*EeIqPOSJaLe*UH78zC2dwvWkaysOOKbPY7HRO zkeWluIrZ>A84>tat2`+XhhlkE?F>2Cm+B+f;z`ZvlwzcipC}m$jmM%L+F_okijVGg z+4Uf4y0%4rggy?>Dt#gnQg2#ikP)d?$JyJ&Scd&)Xkr-I4zD9vBPqlEzD-C*{wTR)+bJ`mWa@NTbB;F?1^gEBs9CClM) zx9Cl+xxmIkZm~tXm312JR>qN^sD6g=MHHB@{T8iMrYxn_4sEPF;oZJ=eO$0Zds37~ z(bN+m#Y5^D@}rh3Ebi^*a%vIO(JA6o(6e5EahgR=e`#vaxvgMW&9StM=_)oBwq@wm2> zO@@?pVgx2%qZJq5{#ffKv!@}x(Aop34`>;cF*y<9Q)OCAUkIZO*N=`WSn`=xM_~Vf zgyUjWOjor|0$0LX#->8b1*RV%l61&UNis2WyDuf6#oQJcUFs3o{q1?Sf`9 z?XU9P5ET7vh~7>)MUE(iVa^v?GR2KQOlCVvheC%`YiDh}RAe?JJgRqq_+!?0K@lQ} zu%qC7HsEjO_XjwZ`$e+P9bD|sLBePP>Dw!H;OlY=aMjWb4Au17PWe75?1dHANZ%t6tH(5Oq?&id!Qbv|c5j)|c`*UR;{#D1g+b zTp8fIUtR{O;l>OcQ%ir1vAK{bIXXi6A+G~sw;AF1`_r@qhvcTlP|STL#z0Ykq8ztUnYgQ^fds7~~eRE^vLWs~%n%qYq$Vxj4mcDuvvb zMAd=^VBuK3PS~s4n%d-Y7gIQ(t{{xlZ^>B%=Cz7d)#&C@Au2(Ng4ABR4<8?|FBjQz z2(;91uNBjDk*$D08=W@NlXcoiuY^DcowC`fI%Tt~AdsN^Oa+D;+u=c1_|sTn+X@sT$;+)Q8+Loq5Bm9q)TS9)H=m-BQbRHmfin;t6@Usxe-sx~bNg)-1=sO?6mOXlsyq3PS6^d(wPsY5tdZL*9wA7jlCJ$5Y z^Q@w!p^N0@CVG^z(SS6AKgx%ca3c}>9niOmY#XLDSCKACZ0A3UhxBm~hGn?wK+{wDr)(F#m*z?kf=-L%v~_}#N62k1 zS(y5ZP8;;}?W9JdmlTSz=X8qDZ$as3X)mU>c0I#jMY*dJKJ%si5@Wl8?U!#u$vDXe z$&8$FJ&sQQkpZy@P3nYY{~!(pcX2dSA8|(>yNPl;+Hns|KOr z%RlN<1@l0=tJ1Y^4N49x21s>KKX2$D$u5WhtF65@x- zjUfGTXAI={^x8mpI^u?wu0aA7I}0C`yI^b!&t8T(gI&pFxf|qVe1PLnID&iJELS>3 z`Z%K=Z0YR`$662R^BHXIWyg3uko?Oannksh0lh2fV6QM725?) znIh3oN+n!ipGl~K=K|!uF0ID3^Ibzlb`c7z>VuG? z${MQ4LSapPE%?x*LSmNGkVkc@=zWd$CjBPEPAxp-!X3+9CpnyNFl~mbmI#~oxcWk; zGp?8U%}Y?&P`5BL$92`oE@QdjYRdRb$AbCT708?-wZOe!xgHR(ER#YXf9EQeS8?qS zDwg%Ajd~lnanW7NBz{L_46w9|X*>{jUgenPtS(1{l z;6uVn1>5v4a+>I8EL-3* z$T;T7gK)yvu58AB;euSuF#B8A1cChu(delM@&D2L;*6`V7e)3PCbf38Wk_l}C{S%T zslBTi#o<4cwi4^#bbZbQ@pm*=>K4PupIud{XtFb4924dL(uo?wv=jQP6sRH`OQE^b zC}IMnoz@p)cBnByWFn-U)i2zYjZs>-4$taFea0kANs?wWe9kn|1xmq-bEWD6_~#f3 zqz{p5{#Df6d?W{?q{=Z!A#WMulhwd;RgEV?<@Qp@&6bt1d^5z?G2WBuq)G~d=ocxD z^{8u5fi4{ENXKlXymltv^-Bua)g2FF*T%*kk*QEPO>P0cwem77@*A{;)FApY70v=J zjB24$M=4}qg~KdrZ;TFg?Hp@UoW26AP->3;4#sgorVt<*I4jebMb)Ht^(ZXKHhc_v z?=?E{*-T*5jlkkMDyAk}87jl59>zt9d2nW?L9zd@gAjrc zN+ay&`JpaP5oz^VtZFpN=7=s#tX0L5`gIl2H|XdyVbfH_5PzzTpO?a2d<5UuhLy8>Ja`T{#wu3 zh(Xr$7Pim6u} z8C13;5zyw!;M;jA1_H;8<5=rm<4cA#KV|cO3O}ge`VjcUI1YIO!(%FtAR##~vxa{i zwl$Ro*BDeuypNAZ8TLAZ7OF=4<#%!4CL=*)jUjN#XaG$cI;TU_M590cmS;?L%AKW< zqu##&AH;C-+eQr*)^uI0{h$<5H1f~Kb-CCY&=re;$Bg45koKC;v4jNdf*cKwkBwxU zQ((*%SpZVLHP++i1I8mx)*ST3#`}2qsL@7bEg)sRQU$L?JKIo=rP$aau$GXrK#G8Z zTHyxgaX7=5J~gH}G9{>BY~`JF|<2pyb#vv^%(mhDda%XUmj*~bab*VQKj}d z!;7&=MzH{sjvJXk;(eY=yA9<2#~6;c%egWAX>?gZV`>Yz)A^$x9o0w$2aE;a8)B5e ztW(Cb;CkO!!e4KPIX^pw)3Tmp%z~M}I#j%N&4>_Kd&plG8i3(zTvYWsqB^mAnX%i+ zI$~0`L5CS+T&3{UI>Uyo|1pw)W`7uV{A%=OoiOQDLuMFu%lJiL@sPB|n7VU@Ndc5L zhMyT_bU;%}1qg45AW4w-+p7ctxs-dD|;VVyVo?5*uw%N?!tuY?uz(qEb2?*hqv|mau-SR`Q`EAt#(t9MayyOaVmp=STzeAHS@uMt z2iRkY_OhQK`hY!#Xb1aoqJDcc(fjPjh(_BZiB_{yh+6h=qJ}+`sALZz z&HrW(BzoN*K=kX`c7OWwx!sTGNjr&Xv7JctL%TQ81NOs2-?MuWear4iber9S=vKQs z(fjRgMC0r(ME|Ew#`pgbE$#2p|zZV8F+!TvqV@zH&lpaQ@HJ`jU^wl7J|hlqR8b^VX&e+v=Mh^q(`S*qSlWj0`S4NgNriy)iT~pS~+)EwxO8&({+O z!5Kb7AIPn5#=_aQX6=dx#99@+(S*DY4|g})FxD5Mqs+Q|7}~xh$D0yfZ)Q^QlQ6~w zqfI|7_M24&C|PH|g`f5@n=;m)PwmCT7G^sEHjOiBXBcC)<^MDJKo17rd!z!NFV+2F zFxwb_fq^D5Px5o{@7L$}1_o#6A9JDmGI!ky>C(VI1$i9A=T;cHMwvedRD!qXxo4A( z>YE0ihZfMSq3%uDkC|ElDy z<^bLf0vJ&t9Qs@mWY)fD4R0#^o_GIOi)tfsKOFnWPD0rn@XS*(Lts zXz01yq~4un=30?Gj-_+lQ9<6Sa(D;$H^yMnGIvd4XpB1vpUgEg1@;7(lKTUWs}Yif z!o=(xGn#+&aF|DeFvnriQ1dYnNE&=wD~;z&*XBBXiFVA-m_fNrfasBAm{D0~Ddcf* zsXNUqflY*jrRFH83FZYPcqlL`tH+qsr9%dEFsQjy&Ttbn)^o{yalzDZ%RaL|V`=<; z9X<_-o3MSvvJ1>WCAK|5Y)^44L97)b1L@i1UGFY6?-#gqC*Y4~Or23VouEZ=X#FTfi8o&g4m*`Q z_@Y0|mdh9}Uofk(X&9ew7KqUEO_P%E5b2qJvhL{|a$PR-(?PywaC0uX*8=$wm^715 z9&{;p&?G($PCknolY+DCu9#&u#Mg8Ou;p*&F_EQXLZbVBWa}jk$L{0hndxlibF2oSEUC5&Y&t$ggYe28t|f>PVRvD%zbr9Q}P zjb!&XB7238--1J|u$@;ix6srWnoqdD6WD85IM$?X3N06VgK(DfuhW)3)lG+wEBJ@D zTu_H8t6gaF>Y}s~6PBAjf~Je69?Ju4Fb!B z;$h}#?y+W%kt;dwJ z<|+!}4b5TvyBqivjW}HDyCPG05YsohpOdIGALwaKf!JXz4ylu}pU5_2AkpHbjGb;O zWo&`MK9(2sZ#_=*z2y!ImFV#DIHYv9y5f`q_dHSFNTcVYbinNilY2-Z8{0vt$Lfva zKXPXYavnY0fl`s1*0G(K{;m5QgYyflC`j&Y^`gSKI{?1vRsi!(y8AM=3(~K-2SCv% zAq*co?Or7^g!FQEGe~uKTfwT`?uT*DS$Fer))Q}h?KYUaorZrKQuezeA!7q;1sMa` z6g+gv-CksSU_z+%C4PO?T~lQ5z}8Ei(LfAXklfF*VUglZ#z)KDZwhQL8D_e&Mld zi!$~0O7BBrvK5QXt5`)MI|R{(+;mt}!=l5Y51>%7I)M?VL}GQ-s!m54{j5Nc7a(5x zRf_33^whDO4!Ji~CF*g+XZc~8bdatikgt2&V#mhTL6M5sEZj>+V}9$nNd3EMN1Pt4 z(!#nz{kvJY5mZ2IZC$1IU6>teMZm3=R)6rvh8Z}!y)}ord7*5EqZ{^$w~TO>h>v!s zLv@9!&eA7b9xYo@)0R~S@{%nLNFL)6Q!I&giVmwWRGDTy4JA&h%1*lMz7OA>W>rM& z6PSC_P20(mk3CIc%Qbhy3RC!XhIN=~51+YZAaS*ZJ!7okYW69XkFgTzNiU}i=QV2w zYL8gm95N*p$6~n^&c%k4EvgfxHldbhe{+R8hb*rITZdbTGL?~~(~uTvy^M>Jt;r&_ z`39b`d?eG8)Wtkwl=UL-_4VCwQ=&b_Y8Wc_lR~z(;-e0Q%c)j)XzAKCyD#?zYNhA| zIo+*#y!3JQP08*fg&fu@=MN3a{uDi%2&H=ggWU zrqmf$mdHvVGn(A)*b`P7&P%tZIoX%|Wm3;vQcu_gzdtT`P7Rq=t$6G?-$EzVjgwY7 zywEYtF%1_lu_D8y{!+;LKabNiyt2ab2=YY&aw*FkOQx4&QJno22cNU38Sv;qtAzlc zueBPm%a9hYdw82uMn!{4>Q*TO;vJF~)?cs&Kx&?}9ujY=;W%uAwT7`PkoKT%@s_cM z7{AHdFS4sR_%c0#^joR}^YSe^qP~U&0Xd$^ZBJ2$?aE!&JF-kohBtYGc1v9Hj`b`H zyRoOU{Rq|3UBP?(-nBL|`5S^;27!Drf#W?x#k+mhMaIf8cY{Qh5-&*oVbCV3NE7~6 zyvsLXr}`P_7wA;K5+)GL^N@1HdYwwhx!dSm=K4m9I(R-)sYz^;l|~h)T~cse`~mWR zRU1L_Wvf5VDY9mZj0(o#dKd$0%9~4hsg=giamuW5x}LHBLRvPpWo2xV`cbe`(}QgZkoPS0O+0$YdYy~A9u$45?%;@jWIx}* z%tgDJ8+`@FvB7}<3#R|9W-;in)tbyP_eVlXHLhRrc(D~A*{&69VA6Ff&LIz^U=@@t zWJP+YDf0(Q7Ui2H%-@lD_1+aNSG-^BRn&f=sRija*grbzL*nC3*FSLt#8EvQcFS5L zun;VN-*U0P!oNr0{LETrP=44-h4ve*1C^}I=S!k2K>0C?dIE;)zQ3}QbH{3GaHeGu z%RlCm1)1}munal^(LEQP{BY;>r^rv%Nq#z11(3xxoVyk*s-670(}HZ13k0^N1`;8|E+>jvZtrY zx0d5Q?}b%=ew>{wg}gk3OB1_I@VqThXMRGQK!;*#n&&5h`hE+43U9~T#ph-fR7u3h zDW0nWH2@b%Y7w58>WOtSALPsxui%YzPn|G%q!jYz6Es>~Y&Xx-pM}+4G}RtK%9+CN z!QPiW_sdZPwGPxcNX6xt`JOMFyv?_Zhx+lCc&Hyg2BNF$12K7rXC<9$GlzltF3)#V zJ7_LRTzd7vep;rEl;s}kNNIqjaYht5X-DZ@EY0=Q7N{JYHbidFYVML<;4G%veUMZ`% zW}9aiV@)8}Nv$`8jk1NNkUCwOhYR2GOcAN2w^N)awxaK>C`l?tW3OkvlZ}QI2S`tW z%|q=`s2=ouFUXB({AR#vIvY}%*ZUOaeBc>L<>MEfepobvTI|m|ol!X8sAm%uh|zw@ zs!Oq^iRHxDV$TU)ATIufCi5SpB{V~G_Q!=MJX4&M03BIH2f%I4dZ_EaHKe}CB0=>! zXF$|3=Q*5G>RBkzPara%*C~Iv=(!{cZGBl?YBj-TmpsLy(ympDHZ5AT9O)1EA#-QM zeXu@{jmwTvmSd-Do&!|WMXAg)A)YxSx6eoNBNzpH@qH^s=5hI?|YD*q>P5tFmG#2k-hZ0 zsrw;!QFt{d`NG|k-yVjCLcN=v;bWwbFUGaJP5&URPzvBy!<#6|^n)|GGo)+@Z?Zj) zOs(Q~AiKt@BZJZ7AxQb1jloIr-b~RsB94BAMhDI*hr((?@;>iYEUMw9GpMdv#l5MW z~s7)=Jj@k<)Uo7 z!}Q4Amk3w4a8Huq&6u<#{sJ0a{b0!Ectc@X5!6a9Ay4|6(t>EM3w-+&GQ0{R(# zG2R;^vZ42a9QHSmQ#i;+?*=*iZjdv$;F9kKneP2Qlo~MKdCB{LAX9-^9=YB2%(} zs?qG%=f8-4a)FqnKRDBw9T6)I=S#UpCR9&Ut$OOoScb)K3Q_R!q7&K|y|r&@K5FbW8t+F8f||a4))L|BUXHyV1RRH@aX1cAC+L(y7JrPDo#UH?BAC#uaq^H}A%^B%&h15=^-U5J4SsN&VL%w zhC4Vge7iUzK-+BASQHE%TPxY9k3HUrxIc_Ng$oZxqzSyC zQr?yo@Sdn#GuKmub;E%_~MI>Wn>%4DSx{RC=$q~G9F o;|pjICN;zfUq?tz$7GWEYxRJZtQF{gKZ2S&XQz5z Date: Fri, 20 Dec 2019 12:55:21 +0000 Subject: [PATCH 028/120] Do not continue an ALTER TABLE tree walk of a subquery if a prior error is seen in the tree. Report the problem immediately, without continuing. FossilOrigin-Name: 01ca865f31c0c817ede7f357401ef76cf311ae662397908464f53e1c147f5b6b --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/alter.c | 7 +++++-- test/fuzzdata8.db | Bin 1503232 -> 1528832 bytes 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 348e689bf5..a561736eb0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sin\sbtree.c\sthat\scan\sfail\sif\san\sINSERT\sis\sattempted\son\na\scorrupted\sdatabase\swhile\sin\sPRAGMA\swritable_schema=ON. -D 2019-12-20T12:33:17.322 +C Do\snot\scontinue\san\sALTER\sTABLE\stree\swalk\sof\sa\ssubquery\sif\sa\sprior\serror\nis\sseen\sin\sthe\stree.\s\sReport\sthe\sproblem\simmediately,\swithout\scontinuing. +D 2019-12-20T12:55:21.482 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -461,7 +461,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 14b5516be5b3815d30bf230b619978f6158e754a1d624f70a02cfe2178348b5c +F src/alter.c ca6d2329c9f7a099b3842d301847be462520d1d36ffeea7d8816d8975fe7e9e1 F src/analyze.c b3ceec3fc052df8a96ca8a8c858d455dc5029ba681b4be98bb5c5a9162cfa58c F src/attach.c b30c44333d55a68c0a12920b5b9d40b254cbd3d4509bda77417209eeed8b3d80 F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 @@ -1017,7 +1017,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db d89020bec89dfe98562b15629be034015d12d5d4fc238384be25f2235bf5c985 +F test/fuzzdata8.db 95825a14e741bfa388d38f3cd74b23f2ffff43667d5a9fce152597a10a006898 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P cba2a2a44cdf138a629109bb0ad088ed4ef67fc66bed3e0373554681a39615d2 -R e3918c2a6ba03e1f611ead25e050c496 +P 07beb3629e648e7feae4e786191514339ac1d8f6ba5bb6e7cc8a04bc1f1cd6ab +R 90a0618f94e6c2b48b3e57f071c32644 U drh -Z c83ab72a8d54d736b94a005afabccf03 +Z e9630083ebe8d733d28678003df0c2ce diff --git a/manifest.uuid b/manifest.uuid index 61cfc90be4..9d671b8ad7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -07beb3629e648e7feae4e786191514339ac1d8f6ba5bb6e7cc8a04bc1f1cd6ab \ No newline at end of file +01ca865f31c0c817ede7f357401ef76cf311ae662397908464f53e1c147f5b6b \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 1cbdefc948..3a21d8436e 100644 --- a/src/alter.c +++ b/src/alter.c @@ -1527,8 +1527,11 @@ static void renameTableFunc( assert( pSelect->selFlags & SF_View ); pSelect->selFlags &= ~SF_View; sqlite3SelectPrep(&sParse, pTab->pSelect, &sNC); - if( sParse.nErr ) rc = sParse.rc; - sqlite3WalkSelect(&sWalker, pTab->pSelect); + if( sParse.nErr ){ + rc = sParse.rc; + }else{ + sqlite3WalkSelect(&sWalker, pTab->pSelect); + } } }else{ /* Modify any FK definitions to point to the new table. */ diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 94e0e0bde209eec696534cbe8c0a79bbdb1e9bbc..15870df82ef7f31e03308933d2c9588557839764 100644 GIT binary patch delta 47345 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 AS^xk5 delta 22524 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 From 73b21382d4abf02c435b25c7c1da4dd614023068 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 20 Dec 2019 13:24:11 +0000 Subject: [PATCH 029/120] Ensure fts5 consistently calls sqlite3_value_text() before sqlite3_value_bytes(). This matters when storing blobs in fts5 tables within utf-16 databases. Fix for [cf36cb4e02]. FossilOrigin-Name: c16305eba0eb14368f2631b9a82b7eb4483c93f3b31257ee7c33f9b00c344379 --- ext/fts5/fts5_storage.c | 5 +++-- ext/fts5/test/fts5integrity.test | 17 +++++++++++++++++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/ext/fts5/fts5_storage.c b/ext/fts5/fts5_storage.c index c5bf8024db..27fa45c19b 100644 --- a/ext/fts5/fts5_storage.c +++ b/ext/fts5/fts5_storage.c @@ -738,10 +738,11 @@ int sqlite3Fts5StorageIndexInsert( for(ctx.iCol=0; rc==SQLITE_OK && ctx.iColnCol; ctx.iCol++){ ctx.szCol = 0; if( pConfig->abUnindexed[ctx.iCol]==0 ){ + const char *zText = sqlite3_value_text(apVal[ctx.iCol+2]); + int nText = sqlite3_value_bytes(apVal[ctx.iCol+2]); rc = sqlite3Fts5Tokenize(pConfig, FTS5_TOKENIZE_DOCUMENT, - (const char*)sqlite3_value_text(apVal[ctx.iCol+2]), - sqlite3_value_bytes(apVal[ctx.iCol+2]), + zText, nText, (void*)&ctx, fts5StorageInsertCallback ); diff --git a/ext/fts5/test/fts5integrity.test b/ext/fts5/test/fts5integrity.test index 25c7277305..e8135b078f 100644 --- a/ext/fts5/test/fts5integrity.test +++ b/ext/fts5/test/fts5integrity.test @@ -210,4 +210,21 @@ foreach {tn pgsz} { } {1000} } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 7.0 { + PRAGMA encoding = 'UTF-16'; + CREATE VIRTUAL TABLE vt0 USING fts5(c0); + INSERT INTO vt0 VALUES (x'46f0'); + SELECT quote(c0) FROM vt0; +} {X'46F0'} + +do_execsql_test 7.1 { + UPDATE vt0 SET c0=''; +} + +do_execsql_test 7.2 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} + finish_test diff --git a/manifest b/manifest index a561736eb0..a3be36482a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\scontinue\san\sALTER\sTABLE\stree\swalk\sof\sa\ssubquery\sif\sa\sprior\serror\nis\sseen\sin\sthe\stree.\s\sReport\sthe\sproblem\simmediately,\swithout\scontinuing. -D 2019-12-20T12:55:21.482 +C Ensure\sfts5\sconsistently\scalls\ssqlite3_value_text()\sbefore\ssqlite3_value_bytes().\sThis\smatters\swhen\sstoring\sblobs\sin\sfts5\stables\swithin\sutf-16\sdatabases.\sFix\sfor\s[cf36cb4e02]. +D 2019-12-20T13:24:11.254 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -118,7 +118,7 @@ F ext/fts5/fts5_expr.c 2be456484786333d559dc2987a00f2750981fab91d52db8452a804627 F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 F ext/fts5/fts5_index.c 99b77ae1f503978ca76985bcfff7345c822aed8bbaa8edb3747f804f614685b5 F ext/fts5/fts5_main.c 9db1f173d299466aeff89bd949fb1eb0a181265726fb56f11e07ea292dcc9a73 -F ext/fts5/fts5_storage.c 167e3d8f8052a71032d498e32a2f2ed5ffe489e5d4d47e298adfa02ed55c7882 +F ext/fts5/fts5_storage.c 87cd8365614533537f237c2c12bc47333f6287cc3b4c14ce0cfec831f186180c F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee F ext/fts5/fts5_test_tok.c f96c6e193c466711d6d7828d5f190407fe7ab897062d371426dd3036f01258e7 @@ -182,7 +182,7 @@ F ext/fts5/test/fts5first.test 3fcf2365c00a15fc9704233674789a3b95131d12de18a9b99 F ext/fts5/test/fts5full.test e1701a112354e0ff9a1fdffb0c940c576530c33732ee20ac5e8361777070d717 F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e F ext/fts5/test/fts5hash.test a4cf51acad99bfc43c16fb74f9d22495dc221ae0701fc5e908ca963a9b26a02b -F ext/fts5/test/fts5integrity.test 4317561cd25eca7df16aa1f7d1a700ee958059fa639785f94aba0a84df9ab17b +F ext/fts5/test/fts5integrity.test dea2ea1977a67256aa8346514dccd8f477863edaebf305486ab45dd004b646fd F ext/fts5/test/fts5interrupt.test 09613247b273a99889808ef852898177e671406fe71fdde7ea00e78ea283d227 F ext/fts5/test/fts5lastrowid.test be98fe3e03235296585b72daad7aed5717ba0062bae5e5c18dd6e04e194c6b28 F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc2782680740513c4d1fc114b43d4ad @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 07beb3629e648e7feae4e786191514339ac1d8f6ba5bb6e7cc8a04bc1f1cd6ab -R 90a0618f94e6c2b48b3e57f071c32644 -U drh -Z e9630083ebe8d733d28678003df0c2ce +P 01ca865f31c0c817ede7f357401ef76cf311ae662397908464f53e1c147f5b6b +R 00fcb0f09947c903a1a870a5269ba6c2 +U dan +Z 3880b4023bbe5b3af0421eab38686cc0 diff --git a/manifest.uuid b/manifest.uuid index 9d671b8ad7..f5bf322d5e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -01ca865f31c0c817ede7f357401ef76cf311ae662397908464f53e1c147f5b6b \ No newline at end of file +c16305eba0eb14368f2631b9a82b7eb4483c93f3b31257ee7c33f9b00c344379 \ No newline at end of file From b2ab3dcff084764aeb7a6236f8c457cf34123bc5 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 Dec 2019 14:08:34 +0000 Subject: [PATCH 030/120] Fix harmless compiler warnings. FossilOrigin-Name: 2bbd014c900e0d71fd30ec647739b82c5dc3aa237a0203f5a1db50593dae199e --- ext/fts3/fts3.c | 2 +- ext/fts5/fts5_storage.c | 2 +- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/alter.c | 7 +++---- 5 files changed, 15 insertions(+), 16 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 082d2a8cbf..3808ec2060 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -2545,7 +2545,7 @@ static void fts3PutDeltaVarint3( ** Using this makes it easier to write code that can merge doclists that are ** sorted in either ascending or descending order. */ -// #define DOCID_CMP(i1, i2) ((bDescDoclist?-1:1) * (i64)((u64)i1-i2)) +/* #define DOCID_CMP(i1, i2) ((bDescDoclist?-1:1) * (i64)((u64)i1-i2)) */ #define DOCID_CMP(i1, i2) ((bDescDoclist?-1:1) * (i1>i2?1:((i1==i2)?0:-1))) /* diff --git a/ext/fts5/fts5_storage.c b/ext/fts5/fts5_storage.c index 27fa45c19b..397d419ed9 100644 --- a/ext/fts5/fts5_storage.c +++ b/ext/fts5/fts5_storage.c @@ -738,7 +738,7 @@ int sqlite3Fts5StorageIndexInsert( for(ctx.iCol=0; rc==SQLITE_OK && ctx.iColnCol; ctx.iCol++){ ctx.szCol = 0; if( pConfig->abUnindexed[ctx.iCol]==0 ){ - const char *zText = sqlite3_value_text(apVal[ctx.iCol+2]); + const char *zText = (const char*)sqlite3_value_text(apVal[ctx.iCol+2]); int nText = sqlite3_value_bytes(apVal[ctx.iCol+2]); rc = sqlite3Fts5Tokenize(pConfig, FTS5_TOKENIZE_DOCUMENT, diff --git a/manifest b/manifest index a3be36482a..0b4cac813e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sfts5\sconsistently\scalls\ssqlite3_value_text()\sbefore\ssqlite3_value_bytes().\sThis\smatters\swhen\sstoring\sblobs\sin\sfts5\stables\swithin\sutf-16\sdatabases.\sFix\sfor\s[cf36cb4e02]. -D 2019-12-20T13:24:11.254 +C Fix\sharmless\scompiler\swarnings. +D 2019-12-20T14:08:34.492 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -81,7 +81,7 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c a05938725571651cc9bedc63a52ede4b39277fec17884c8ff6011dab2ff78c75 +F ext/fts3/fts3.c 41acb66ad7bf74c03578efb4441204acfc2dde50dbe008b778d57273fc00e3c6 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h f091030b976045e7df91af2337935952b477cdbd9f48058c44c965684484cb50 F ext/fts3/fts3_aux.c 96708c8b3a7d9b8ca1b68ea2b7e503e283f20e95f145becadedfad096dbd0f34 @@ -118,7 +118,7 @@ F ext/fts5/fts5_expr.c 2be456484786333d559dc2987a00f2750981fab91d52db8452a804627 F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 F ext/fts5/fts5_index.c 99b77ae1f503978ca76985bcfff7345c822aed8bbaa8edb3747f804f614685b5 F ext/fts5/fts5_main.c 9db1f173d299466aeff89bd949fb1eb0a181265726fb56f11e07ea292dcc9a73 -F ext/fts5/fts5_storage.c 87cd8365614533537f237c2c12bc47333f6287cc3b4c14ce0cfec831f186180c +F ext/fts5/fts5_storage.c 517aae1a606c33a5197dfda53bf9eef194e3636818a4cf52324bf91bf70dcd47 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee F ext/fts5/fts5_test_tok.c f96c6e193c466711d6d7828d5f190407fe7ab897062d371426dd3036f01258e7 @@ -461,7 +461,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c ca6d2329c9f7a099b3842d301847be462520d1d36ffeea7d8816d8975fe7e9e1 +F src/alter.c ed16ff55ca0dfe4c1157c0e19557015c48cfa00acfb65de90aea049df8ee2e5e F src/analyze.c b3ceec3fc052df8a96ca8a8c858d455dc5029ba681b4be98bb5c5a9162cfa58c F src/attach.c b30c44333d55a68c0a12920b5b9d40b254cbd3d4509bda77417209eeed8b3d80 F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 01ca865f31c0c817ede7f357401ef76cf311ae662397908464f53e1c147f5b6b -R 00fcb0f09947c903a1a870a5269ba6c2 -U dan -Z 3880b4023bbe5b3af0421eab38686cc0 +P c16305eba0eb14368f2631b9a82b7eb4483c93f3b31257ee7c33f9b00c344379 +R 72d5aa86f1f7f18348aeb1b944e4ef0b +U drh +Z fe665bddd0655063a4499d0272db49cc diff --git a/manifest.uuid b/manifest.uuid index f5bf322d5e..08955f9963 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c16305eba0eb14368f2631b9a82b7eb4483c93f3b31257ee7c33f9b00c344379 \ No newline at end of file +2bbd014c900e0d71fd30ec647739b82c5dc3aa237a0203f5a1db50593dae199e \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 3a21d8436e..a9647a195b 100644 --- a/src/alter.c +++ b/src/alter.c @@ -985,7 +985,6 @@ static void renameColumnIdlistNames( static int renameParseSql( Parse *p, /* Memory to use for Parse object */ const char *zDb, /* Name of schema SQL belongs to */ - int bTable, /* 1 -> RENAME TABLE, 0 -> RENAME COLUMN */ sqlite3 *db, /* Database handle */ const char *zSql, /* SQL to parse */ int bTemp /* True if SQL is from temp schema */ @@ -1306,7 +1305,7 @@ static void renameColumnFunc( #ifndef SQLITE_OMIT_AUTHORIZATION db->xAuth = 0; #endif - rc = renameParseSql(&sParse, zDb, 0, db, zSql, bTemp); + rc = renameParseSql(&sParse, zDb, db, zSql, bTemp); /* Find tokens that need to be replaced. */ memset(&sWalker, 0, sizeof(Walker)); @@ -1510,7 +1509,7 @@ static void renameTableFunc( sWalker.xSelectCallback = renameTableSelectCb; sWalker.u.pRename = &sCtx; - rc = renameParseSql(&sParse, zDb, 1, db, zInput, bTemp); + rc = renameParseSql(&sParse, zDb, db, zInput, bTemp); if( rc==SQLITE_OK ){ int isLegacy = (db->flags & SQLITE_LegacyAlter); @@ -1652,7 +1651,7 @@ static void renameTableTest( if( zDb && zInput ){ int rc; Parse sParse; - rc = renameParseSql(&sParse, zDb, 1, db, zInput, bTemp); + rc = renameParseSql(&sParse, zDb, db, zInput, bTemp); if( rc==SQLITE_OK ){ if( isLegacy==0 && sParse.pNewTable && sParse.pNewTable->pSelect ){ NameContext sNC; From 394aa710f2a56923f02ef4effaeabad3bef93e64 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 20 Dec 2019 14:18:29 +0000 Subject: [PATCH 031/120] Fix a potential problem with ALTER TABLE commands on schemas that contains a triggers or view featuring a sub-query that uses an ON clause with a join that is not a LEFT JOIN. FossilOrigin-Name: 365dd8b663d5a28af33556b2b3820c6b5482114ef741a1d82b55c6e154f3043a --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/alter.c | 1 + test/altertab3.test | 13 +++++++++++++ 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 0b4cac813e..75c61e1170 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings. -D 2019-12-20T14:08:34.492 +C Fix\sa\spotential\sproblem\swith\sALTER\sTABLE\scommands\son\sschemas\sthat\scontains\sa\striggers\sor\sview\sfeaturing\sa\ssub-query\sthat\suses\san\sON\sclause\swith\sa\sjoin\sthat\sis\snot\sa\sLEFT\sJOIN. +D 2019-12-20T14:18:29.607 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -461,7 +461,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c ed16ff55ca0dfe4c1157c0e19557015c48cfa00acfb65de90aea049df8ee2e5e +F src/alter.c bc3e4089d5a708be4f1a8018737f64c2d11cc7ef0abf2e7b5a7f160e566e9d2f F src/analyze.c b3ceec3fc052df8a96ca8a8c858d455dc5029ba681b4be98bb5c5a9162cfa58c F src/attach.c b30c44333d55a68c0a12920b5b9d40b254cbd3d4509bda77417209eeed8b3d80 F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 @@ -637,7 +637,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test 4d8b79b0b88b62b90b710390df14fe99e0a3578345526886eaa550e28e3065dc F test/altertab2.test 8883693952f6d7fb5f754dbf1d694ed780aa883027bef04cb1fb99a3b88c9272 -F test/altertab3.test 231881a8e9c4905a84213476c64c174a119e1ab75ce17d986dcbbacc07b2b544 +F test/altertab3.test 10c32d6251344bdc114d2df27e62cb72b5afc676f20709224d362d0cff0aa3e3 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 547bb700f903107b38611b014ca645d6b5bb819f5210d7bf39c40802aafeb7d7 F test/analyze3.test 01f0b122e3e54ad2544f14f7cc7dcb4c2cb8753cad5e88c6b8d49615b3fd6a2b @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c16305eba0eb14368f2631b9a82b7eb4483c93f3b31257ee7c33f9b00c344379 -R 72d5aa86f1f7f18348aeb1b944e4ef0b -U drh -Z fe665bddd0655063a4499d0272db49cc +P 2bbd014c900e0d71fd30ec647739b82c5dc3aa237a0203f5a1db50593dae199e +R 0edb1929000466763280bc6535083f04 +U dan +Z 68ed7a96bea311c719c5f16d32c1fd41 diff --git a/manifest.uuid b/manifest.uuid index 08955f9963..0703472ec4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2bbd014c900e0d71fd30ec647739b82c5dc3aa237a0203f5a1db50593dae199e \ No newline at end of file +365dd8b663d5a28af33556b2b3820c6b5482114ef741a1d82b55c6e154f3043a \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index a9647a195b..1b0d9e28e1 100644 --- a/src/alter.c +++ b/src/alter.c @@ -775,6 +775,7 @@ static int renameUnmapSelectCb(Walker *pWalker, Select *p){ SrcList *pSrc = p->pSrc; for(i=0; inSrc; i++){ sqlite3RenameTokenRemap(pParse, 0, (void*)pSrc->a[i].zName); + if( sqlite3WalkExpr(pWalker, pSrc->a[i].pOn) ) return WRC_Abort; } } diff --git a/test/altertab3.test b/test/altertab3.test index 88d882fcb4..27bca291fc 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -517,5 +517,18 @@ do_catchsql_test 22.6 { ALTER TABLE t1 RENAME TO t4; } {0 {}} +#------------------------------------------------------------------------ +# +reset_db +do_execsql_test 23.1 { + CREATE TABLE t1(x); + CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN + UPDATE t1 SET (c,d)=((SELECT 1 FROM t1 JOIN t2 ON b=x),1); + END; +} + +do_catchsql_test 23.2 { + ALTER TABLE t1 RENAME TO t1x; +} {1 {error in trigger r1: no such table: main.t2}} finish_test From 40e9c8328ecbad58b01da806e4fec14a9c90856b Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 Dec 2019 14:24:26 +0000 Subject: [PATCH 032/120] Load new dbsqlfuzz test cases into test/fuzzdata8.db. FossilOrigin-Name: 01aeeb5c4c70a0f19651448e94ad5c6810cab3d6957b5bc7a9b4b8e0b887f3de --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1528832 -> 1564672 bytes 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 75c61e1170..de88cfc6df 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spotential\sproblem\swith\sALTER\sTABLE\scommands\son\sschemas\sthat\scontains\sa\striggers\sor\sview\sfeaturing\sa\ssub-query\sthat\suses\san\sON\sclause\swith\sa\sjoin\sthat\sis\snot\sa\sLEFT\sJOIN. -D 2019-12-20T14:18:29.607 +C Load\snew\sdbsqlfuzz\stest\scases\sinto\stest/fuzzdata8.db. +D 2019-12-20T14:24:26.858 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1017,7 +1017,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db 95825a14e741bfa388d38f3cd74b23f2ffff43667d5a9fce152597a10a006898 +F test/fuzzdata8.db bbe69fc3534e5e68ef211481e145aa9aac678dacb8dbc0c4f3177db0d40e099e F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2bbd014c900e0d71fd30ec647739b82c5dc3aa237a0203f5a1db50593dae199e -R 0edb1929000466763280bc6535083f04 -U dan -Z 68ed7a96bea311c719c5f16d32c1fd41 +P 365dd8b663d5a28af33556b2b3820c6b5482114ef741a1d82b55c6e154f3043a +R 391bc913242d8068669e26730228b553 +U drh +Z f7fd0aeb069aafb626c2df863cafb54d diff --git a/manifest.uuid b/manifest.uuid index 0703472ec4..655d321725 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -365dd8b663d5a28af33556b2b3820c6b5482114ef741a1d82b55c6e154f3043a \ No newline at end of file +01aeeb5c4c70a0f19651448e94ad5c6810cab3d6957b5bc7a9b4b8e0b887f3de \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 15870df82ef7f31e03308933d2c9588557839764..bf72ac52c27021e9af06290e2220452473e1386a 100644 GIT binary patch delta 44084 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%0D&%4;@( z*t`bu==y|GADQPUvv?0&gi||eA^78RS0X`4FGw}WW6Czj{?Sqs;x4$lAkZ!k${uq176{(jg%XZhNTSyb#1Vk=$$)c=L z8D)?$Tj!TZM-GGh5G_Br9x{ID!bzp7@5Ir669`D4%GmcO*II#JyN?~WSFOJ{rWV-2$W(EcfU|sJcc%LQ@;pbU&$K>g-zWfRO-a*u2 z{9vA7*f-AIoF9ToM`HMYFIB`U)7)1S4q*>-)0ULkZrYL(4MB>n7sjo2ucT~^M{h^# zTKCTsFz6~tT&2yyyH+N&)j~I+ty*AFMJ<3jZa?V&7Nxo?3X}&)oGLAVj2-rRkaSuu z{!3$9=DO$Owsdzdy-J6)+-?%FPJrma)}9>cMQh0wE8PQ_Oy?<3sy%PCRtiIxx;gaW zjBLiWpSb%nIujxD7ds6atKBr6XbTA+N$=sJ^={h!-42>nbcehIRpuv31!&*mUZ}8P zuwn-_UWYAxyhG8v)BTGex2Ezt0xRJs*jW9>^P`6b@?$XzdaL}n6!Od0zEuLS=RWsl z%8#ITqAQp@P#M?%s^k1)sw%@c-Z|I9y?DC}XY{?VxT zWi3h7ZmzUfQD_bi(Uk;1rq~5(YK2 zzU-ueepUT_eMWNu}|Q^=^ki2@EKe5gkHM;w|d zC`BrdQ_|$Z)q#Cm6K50JggDX|TMo-l>^27YZIM+zJsa>Yxht#L3;1-;wGyc-* zWf)}E6}iJ{tbgG)@%9t^%HP^&&iQB>7|n_Q4?pA`pBLNK%#t07sEnqg1Hc{aYYBrh zpwSG~zT1;!B$W)x_!pJ1{1{f|aAvMcz#nH)h7S#t>8-4p52*|%s#)d!9gr<`s8M|T z1I*`eu3G~Mmy%5(3*>D6Y#6I@pc!Xeb;0U-5rfq=wws+=A|4@C58rV&J8zWVLhnSM zp~KU_`y$yfmz2Y|uVAgR@)Z8l-tv;LCwb=mtj+T-GauPUB* zHhNf>ku&qklcMem@WAbLAN@YALT0S6%~ai|zt7V(_K_^*o0$r1OkPTvVcN|8a0TU} zt)miWmxtMda&R`lL^1jRojc)(F%2HCUB$AXytaWB5Ihc_Xb(kCgpLtQ2U)Mz(R-a`KwTS6hvI$7;5xX#M817=RGDOfR;hsWNqggH?f>Y@orw5&4 zOAy2DJq)tHvN_`9ge^|WtpR<~IvMZHJ{c9}$)LbwxZtABU`t+Uo{S$wtQ1Ve%DWi9 zsyX%FOB=uh>B3pWAsC>o*-^{l6XhA4v9-k zxSU8WRr*fHSFtN7Wj(e^#_B{vTRbj8Gp6WNQm#-5SFxMlz*6~jX z^$1Z1R{D9$C6*`g9KQ}TaJ=z#;4+r;txfu-U=&tL+jOriq{PbA@>p#okZ~JP6vRp; z+KHk3xI=-v!CED3D))|c=~1$D9nJZy-JsqgOGD)E^encJE)yU1Q=P&N5FopFe7}B8 zmWKJNMQj*_;7-kWDEo%5%4KI!TJ!6vGGxDKK?@g4s(}gRr+h=7=L{;um{;9PSj1|0 ROuG(Q^N}>|xcG*_{{dZK`X~SZ From 8c7715d1cc8736c72a1d628a1aa1509c1cc1dc3b Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 Dec 2019 14:37:56 +0000 Subject: [PATCH 033/120] Improved assert() statements on the OP_Column opcode. FossilOrigin-Name: c538601e4c979ee59f18d19e6eb6296cebfa580fb029a18d5a3f0dd9393acb75 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index de88cfc6df..b1fe521203 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Load\snew\sdbsqlfuzz\stest\scases\sinto\stest/fuzzdata8.db. -D 2019-12-20T14:24:26.858 +C Improved\sassert()\sstatements\son\sthe\sOP_Column\sopcode. +D 2019-12-20T14:37:56.333 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -599,7 +599,7 @@ F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c ab3f6e647235fe4fa16b71496468313a1da435eb3a2125c3ffdbb0be0d1cbcba +F src/vdbe.c d25f832beebc6d6ff8b43cbf1bf4365956f093bf4d0d23b3d013fb9508651b53 F src/vdbe.h fdbc0a11e5768a702b46ce63286f60e22e71351a29bd98b3666405e1fccc7802 F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 365dd8b663d5a28af33556b2b3820c6b5482114ef741a1d82b55c6e154f3043a -R 391bc913242d8068669e26730228b553 +P 01aeeb5c4c70a0f19651448e94ad5c6810cab3d6957b5bc7a9b4b8e0b887f3de +R 8c8e8e6b8d389d9f08b357f1209875c4 U drh -Z f7fd0aeb069aafb626c2df863cafb54d +Z 5d106434f9ac2c247c34a9b8c32a6030 diff --git a/manifest.uuid b/manifest.uuid index 655d321725..09a7c7d32f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -01aeeb5c4c70a0f19651448e94ad5c6810cab3d6957b5bc7a9b4b8e0b887f3de \ No newline at end of file +c538601e4c979ee59f18d19e6eb6296cebfa580fb029a18d5a3f0dd9393acb75 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 33c5882bca..feb14a879d 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2549,7 +2549,9 @@ case OP_Column: { u32 t; /* A type code from the record header */ Mem *pReg; /* PseudoTable input register */ + assert( pOp->p1>=0 && pOp->p1nCursor ); pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); p2 = pOp->p2; /* If the cursor cache is stale (meaning it is not currently point at @@ -2561,7 +2563,6 @@ case OP_Column: { assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); pDest = &aMem[pOp->p3]; memAboutToChange(p, pDest); - assert( pOp->p1>=0 && pOp->p1nCursor ); assert( pC!=0 ); assert( p2nField ); aOffset = pC->aOffset; From 8cc8feae7eccac1a43e00e5d7325b07767e92a3b Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 Dec 2019 15:35:56 +0000 Subject: [PATCH 034/120] When computing dependencies on WHERE-clause terms, be sure to take into account the FILTER clause of aggregate functions. Problem reported by Manuel Rigger. FossilOrigin-Name: 3cc2b5709e66ef605c3b85ed13ae6cc9c3090e864ebc18859db36284b8f715b6 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/whereexpr.c | 3 ++- test/window1.test | 18 +++++++++++++++++- 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index b1fe521203..eb74291d04 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sassert()\sstatements\son\sthe\sOP_Column\sopcode. -D 2019-12-20T14:37:56.333 +C When\scomputing\sdependencies\son\sWHERE-clause\sterms,\sbe\ssure\sto\stake\sinto\naccount\sthe\sFILTER\sclause\sof\saggregate\sfunctions.\s\sProblem\sreported\sby\nManuel\sRigger. +D 2019-12-20T15:35:56.928 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -616,7 +616,7 @@ F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d F src/where.c c51ebd505c8417285ca1db8f94933a12224bf636ad93f27d821c07f93d59c035 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c 7efa97f4dc2f95548611deba68f0210ab357725899a9bae5391a525e48271875 -F src/whereexpr.c 39b6a538804c6e1248c22b33e09d00f89ae6a099c849c4d841ce3995562287b4 +F src/whereexpr.c 989235ee5fade9663a01d9443763a82ba5a72619bf3edda67ebd043936d33575 F src/window.c da010455914c81037dcb5b0c6f4273f8a32c94567865c46a60060b937b018a96 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1713,7 +1713,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 6db2c38a0830af8554936a563df92e67962cc379253854cd10d0c3cf0a3120c4 +F test/window1.test 29efd3d6c18ea920ae6493f26cae3fc5724912ee049fd3d8eb61753660052f70 F test/window2.tcl 66db96fd9fd202bc31ee7f8ce7904cb469564864cff3f74e009bfef8102333f4 F test/window2.test af2a001ded703bb8f2474fb0edfef170d5aba00f5c1f2aa9f65935b5da13df90 F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 01aeeb5c4c70a0f19651448e94ad5c6810cab3d6957b5bc7a9b4b8e0b887f3de -R 8c8e8e6b8d389d9f08b357f1209875c4 +P c538601e4c979ee59f18d19e6eb6296cebfa580fb029a18d5a3f0dd9393acb75 +R 93922e08170562eb45b7f86f942f7f77 U drh -Z 5d106434f9ac2c247c34a9b8c32a6030 +Z da9c8af8c1fef7d6d29a0c0ec9b2e494 diff --git a/manifest.uuid b/manifest.uuid index 09a7c7d32f..088c3de3ee 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c538601e4c979ee59f18d19e6eb6296cebfa580fb029a18d5a3f0dd9393acb75 \ No newline at end of file +3cc2b5709e66ef605c3b85ed13ae6cc9c3090e864ebc18859db36284b8f715b6 \ No newline at end of file diff --git a/src/whereexpr.c b/src/whereexpr.c index 16bbf4468a..a3d5e94f07 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -1516,9 +1516,10 @@ Bitmask sqlite3WhereExprUsageNN(WhereMaskSet *pMaskSet, Expr *p){ mask |= sqlite3WhereExprListUsage(pMaskSet, p->x.pList); } #ifndef SQLITE_OMIT_WINDOWFUNC - if( p->op==TK_FUNCTION && p->y.pWin ){ + if( (p->op==TK_FUNCTION || p->op==TK_AGG_FUNCTION) && p->y.pWin ){ mask |= sqlite3WhereExprListUsage(pMaskSet, p->y.pWin->pPartition); mask |= sqlite3WhereExprListUsage(pMaskSet, p->y.pWin->pOrderBy); + mask |= sqlite3WhereExprUsage(pMaskSet, p->y.pWin->pFilter); } #endif return mask; diff --git a/test/window1.test b/test/window1.test index 1e64d75799..7647cb84dd 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1329,6 +1329,22 @@ do_execsql_test 37.20 { SELECT c FROM v0 WHERE c BETWEEN -10 AND 20; } {} - +# 2019-20-20 mrigger reported problem with a FILTER clause on an aggregate +# in a join. +# +reset_db +do_execsql_test 38.10 { + CREATE TABLE t0(c0); + CREATE TABLE t1(c0, c1 UNIQUE); + INSERT INTO t0(c0) VALUES(1); + INSERT INTO t1(c0,c1) VALUES(2,3); + SELECT COUNT(*) FROM t0, t1 WHERE (SELECT AVG(0) FILTER(WHERE t1.c1)); +} {0} +do_execsql_test 38.20 { + SELECT COUNT(*), AVG(1) FILTER(WHERE t1.c1) FROM t0, t1; +} {1 1.0} +do_execsql_test 38.30 { + SELECT COUNT(*) FROM t0, t1 WHERE (SELECT AVG(1) FILTER(WHERE t1.c1)); +} {1} finish_test From 5d732723403f9400c683763690c8e40be02ae01e Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 Dec 2019 17:25:10 +0000 Subject: [PATCH 035/120] Debugging improvement: when tracing the VDBE, output the register value for OP_Cast after the cast is completed. FossilOrigin-Name: dc5f1d282d1e75f8a3791b0c95cb8f143b2a956323cb6c889d76d20db7f89257 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index eb74291d04..653a78ea70 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\scomputing\sdependencies\son\sWHERE-clause\sterms,\sbe\ssure\sto\stake\sinto\naccount\sthe\sFILTER\sclause\sof\saggregate\sfunctions.\s\sProblem\sreported\sby\nManuel\sRigger. -D 2019-12-20T15:35:56.928 +C Debugging\simprovement:\swhen\stracing\sthe\sVDBE,\soutput\sthe\sregister\svalue\sfor\nOP_Cast\safter\sthe\scast\sis\scompleted. +D 2019-12-20T17:25:10.286 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -599,7 +599,7 @@ F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c d25f832beebc6d6ff8b43cbf1bf4365956f093bf4d0d23b3d013fb9508651b53 +F src/vdbe.c c1e35ead7ef20b5cfedd30c45b9b7eceb7fa88145bf46c11c528775318e78950 F src/vdbe.h fdbc0a11e5768a702b46ce63286f60e22e71351a29bd98b3666405e1fccc7802 F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c538601e4c979ee59f18d19e6eb6296cebfa580fb029a18d5a3f0dd9393acb75 -R 93922e08170562eb45b7f86f942f7f77 +P 3cc2b5709e66ef605c3b85ed13ae6cc9c3090e864ebc18859db36284b8f715b6 +R 9e43484acafe6a0d962660ec9bb40f72 U drh -Z da9c8af8c1fef7d6d29a0c0ec9b2e494 +Z 4ad802d8ad13720d0d254b6c0f8e1806 diff --git a/manifest.uuid b/manifest.uuid index 088c3de3ee..d338501840 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3cc2b5709e66ef605c3b85ed13ae6cc9c3090e864ebc18859db36284b8f715b6 \ No newline at end of file +dc5f1d282d1e75f8a3791b0c95cb8f143b2a956323cb6c889d76d20db7f89257 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index feb14a879d..2b5686cd63 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -1869,6 +1869,7 @@ case OP_Cast: { /* in1 */ sqlite3VdbeMemCast(pIn1, pOp->p2, encoding); UPDATE_MAX_BLOBSIZE(pIn1); if( rc ) goto abort_due_to_error; + REGISTER_TRACE(pOp->p1, pIn1); break; } #endif /* SQLITE_OMIT_CAST */ From e99cb2da5fc664c2e40304868e3d0815b18f7614 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Fri, 20 Dec 2019 17:41:15 +0000 Subject: [PATCH 036/120] Export the public RBU entry points from the Win32 DLL. FossilOrigin-Name: e62d1791f428b7a9bb14a59483f12d8ee08afbf4061a5e3be8f64787444301e7 --- Makefile.msc | 15 ++++++++++++++- autoconf/Makefile.msc | 15 ++++++++++++++- manifest | 18 +++++++++--------- manifest.uuid | 2 +- tool/mkmsvcmin.tcl | 2 +- 5 files changed, 39 insertions(+), 13 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index 1f7cec129e..d0b7860d90 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -248,6 +248,12 @@ OPTIMIZATIONS = 2 SESSION = 0 !ENDIF +# Set this to non-0 to enable support for the rbu extension. +# +!IFNDEF RBU +RBU = 0 +!ENDIF + # Set the source code file to be used by executables and libraries when # they need the amalgamation. # @@ -364,6 +370,13 @@ OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_SESSION=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_PREUPDATE_HOOK=1 !ENDIF +# Should the rbu extension be enabled? If so, add compilation options +# to enable it. +# +!IF $(RBU)!=0 +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_RBU=1 +!ENDIF + # These are the "extended" SQLite compilation options used when compiling for # the Windows 10 platform. # @@ -1742,7 +1755,7 @@ $(SQLITE3DLL): $(LIBOBJ) $(LIBRESOBJS) $(CORE_LINK_DEP) sqlite3.def: libsqlite3.lib echo EXPORTS > sqlite3.def dumpbin /all libsqlite3.lib \ - | $(TCLSH_CMD) $(TOP)\tool\replace.tcl include "^\s+1 _?(sqlite3(?:session|changeset|changegroup|rebaser)?_[^@]*)(?:@\d+)?$$" \1 \ + | $(TCLSH_CMD) $(TOP)\tool\replace.tcl include "^\s+1 _?(sqlite3(?:session|changeset|changegroup|rebaser|rbu)?_[^@]*)(?:@\d+)?$$" \1 \ | sort >> sqlite3.def # <> diff --git a/autoconf/Makefile.msc b/autoconf/Makefile.msc index 52c14c6976..37a3c1b18a 100644 --- a/autoconf/Makefile.msc +++ b/autoconf/Makefile.msc @@ -210,6 +210,12 @@ OPTIMIZATIONS = 2 SESSION = 0 !ENDIF +# Set this to non-0 to enable support for the rbu extension. +# +!IFNDEF RBU +RBU = 0 +!ENDIF + # Set the source code file to be used by executables and libraries when # they need the amalgamation. # @@ -295,6 +301,13 @@ OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_SESSION=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_PREUPDATE_HOOK=1 !ENDIF +# Should the rbu extension be enabled? If so, add compilation options +# to enable it. +# +!IF $(RBU)!=0 +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_RBU=1 +!ENDIF + # These are the "extended" SQLite compilation options used when compiling for # the Windows 10 platform. # @@ -977,7 +990,7 @@ Replace.exe: sqlite3.def: Replace.exe $(LIBOBJ) echo EXPORTS > sqlite3.def dumpbin /all $(LIBOBJ) \ - | .\Replace.exe "^\s+/EXPORT:_?(sqlite3(?:session|changeset|changegroup|rebaser)?_[^@,]*)(?:@\d+|,DATA)?$$" $$1 true \ + | .\Replace.exe "^\s+/EXPORT:_?(sqlite3(?:session|changeset|changegroup|rebaser|rbu)?_[^@,]*)(?:@\d+|,DATA)?$$" $$1 true \ | sort >> sqlite3.def $(SQLITE3EXE): shell.c $(SHELL_CORE_DEP) $(LIBRESOBJS) $(SHELL_CORE_SRC) $(SQLITE3H) diff --git a/manifest b/manifest index 653a78ea70..f072e0a0e7 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Debugging\simprovement:\swhen\stracing\sthe\sVDBE,\soutput\sthe\sregister\svalue\sfor\nOP_Cast\safter\sthe\scast\sis\scompleted. -D 2019-12-20T17:25:10.286 +C Export\sthe\spublic\sRBU\sentry\spoints\sfrom\sthe\sWin32\sDLL. +D 2019-12-20T17:41:15.560 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F Makefile.in d3a862c9742f5a08230a3b295c0a47fd3067f19356dc39935280135f90474b04 F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc 0b0acbf34bb238170bdf1fd343a1fd37bc81c042ce029c1cc53fe15b5d4ed07b +F Makefile.msc fab23c6b10cb6f06a7e9c407fc2e35cb184a6d653f1b793bda87fcee2eafa4f6 F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a F VERSION 081500f0aeaadc989d85aafbc717af45512018aebc73d89e5c2368fe62a600ff F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -15,7 +15,7 @@ F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 F autoconf/Makefile.am e14b629addaa1ce372b72043f28f40de2e32b7e211b6e0fc18dbb87989197e40 F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.msc 492ea431c411378094593a5225b9a02645455a5d87a26d018b5461b723e52125 +F autoconf/Makefile.msc 1d1e4af61289c62b94aa65a93afcd3dfa4b53e4195908980e0b138203e71e1c9 F autoconf/README.first 6c4f34fe115ff55d4e8dbfa3cecf04a0188292f7 F autoconf/README.txt 4f04b0819303aabaa35fff5f7b257fb0c1ef95f1 F autoconf/configure.ac 308de24343e76ecfbe9a67f8fcd4c5216b790d230c5d9ce10210b7d5965d6192 @@ -1781,7 +1781,7 @@ F tool/mkautoconfamal.sh 422fc365358a2e92876ffc62971a0ff28ed472fc8bcf9de0df921c7 F tool/mkccode.tcl 86463e68ce9c15d3041610fedd285ce32a5cf7a58fc88b3202b8b76837650dbe x F tool/mkctimec.tcl dd183b73ae1c28249669741c250525f0407e579a70482371668fd5f130d9feb3 F tool/mkkeywordhash.c 27ffc6f6e7e3ecbfc5bca1f1f11a09fc5badf6d67557a5fb2d3b069dbed90617 -F tool/mkmsvcmin.tcl cad0c7b54d7dd92bc87d59f36d4cc4f070eb2e625f14159dc2f5c4204e6a13ea +F tool/mkmsvcmin.tcl 6ecab9fe22c2c8de4d82d4c46797bda3d2deac8e763885f5a38d0c44a895ab33 F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3cc2b5709e66ef605c3b85ed13ae6cc9c3090e864ebc18859db36284b8f715b6 -R 9e43484acafe6a0d962660ec9bb40f72 -U drh -Z 4ad802d8ad13720d0d254b6c0f8e1806 +P dc5f1d282d1e75f8a3791b0c95cb8f143b2a956323cb6c889d76d20db7f89257 +R 8d20ce65ce8b3a258ac21b4b684c5925 +U mistachkin +Z a0bcb3089620c4d448f1bba178e307bd diff --git a/manifest.uuid b/manifest.uuid index d338501840..54eb94f691 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dc5f1d282d1e75f8a3791b0c95cb8f143b2a956323cb6c889d76d20db7f89257 \ No newline at end of file +e62d1791f428b7a9bb14a59483f12d8ee08afbf4061a5e3be8f64787444301e7 \ No newline at end of file diff --git a/tool/mkmsvcmin.tcl b/tool/mkmsvcmin.tcl index 764641faee..ef948a05c9 100644 --- a/tool/mkmsvcmin.tcl +++ b/tool/mkmsvcmin.tcl @@ -83,7 +83,7 @@ Replace.exe: sqlite3.def: Replace.exe $(LIBOBJ) echo EXPORTS > sqlite3.def dumpbin /all $(LIBOBJ) \\ - | .\Replace.exe "^\s+/EXPORT:_?(sqlite3(?:session|changeset|changegroup|rebaser)?_[^@,]*)(?:@\d+|,DATA)?$$" $$1 true \\ + | .\Replace.exe "^\s+/EXPORT:_?(sqlite3(?:session|changeset|changegroup|rebaser|rbu)?_[^@,]*)(?:@\d+|,DATA)?$$" $$1 true \\ | sort >> sqlite3.def }]] From 42ae633ab92023e93c0c4b1f365595f9b88e2b3b Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 20 Dec 2019 19:41:01 +0000 Subject: [PATCH 037/120] Fix two more cases in fts5 where sqlite3_value_bytes() was being called before sqlite3_value_text(). Fix for e431c355. FossilOrigin-Name: a1ba9a37d7a68a6d31f8197c6350589ebe6a12f4e3c193a178dd7ead8bcd565a --- ext/fts5/fts5_storage.c | 10 ++++++---- ext/fts5/test/fts5integrity.test | 13 ++++++++++--- manifest | 16 ++++++++-------- manifest.uuid | 2 +- 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/ext/fts5/fts5_storage.c b/ext/fts5/fts5_storage.c index 397d419ed9..22f90c0ef8 100644 --- a/ext/fts5/fts5_storage.c +++ b/ext/fts5/fts5_storage.c @@ -613,10 +613,11 @@ int sqlite3Fts5StorageRebuild(Fts5Storage *p){ for(ctx.iCol=0; rc==SQLITE_OK && ctx.iColnCol; ctx.iCol++){ ctx.szCol = 0; if( pConfig->abUnindexed[ctx.iCol]==0 ){ + const char *zText = (const char*)sqlite3_column_text(pScan, ctx.iCol+1); + int nText = sqlite3_column_bytes(pScan, ctx.iCol+1); rc = sqlite3Fts5Tokenize(pConfig, FTS5_TOKENIZE_DOCUMENT, - (const char*)sqlite3_column_text(pScan, ctx.iCol+1), - sqlite3_column_bytes(pScan, ctx.iCol+1), + zText, nText, (void*)&ctx, fts5StorageInsertCallback ); @@ -911,10 +912,11 @@ int sqlite3Fts5StorageIntegrity(Fts5Storage *p){ rc = sqlite3Fts5TermsetNew(&ctx.pTermset); } if( rc==SQLITE_OK ){ + const char *zText = (const char*)sqlite3_column_text(pScan, i+1); + int nText = sqlite3_column_bytes(pScan, i+1); rc = sqlite3Fts5Tokenize(pConfig, FTS5_TOKENIZE_DOCUMENT, - (const char*)sqlite3_column_text(pScan, i+1), - sqlite3_column_bytes(pScan, i+1), + zText, nText, (void*)&ctx, fts5StorageIntegrityCallback ); diff --git a/ext/fts5/test/fts5integrity.test b/ext/fts5/test/fts5integrity.test index e8135b078f..5b0cc95866 100644 --- a/ext/fts5/test/fts5integrity.test +++ b/ext/fts5/test/fts5integrity.test @@ -218,12 +218,19 @@ do_execsql_test 7.0 { INSERT INTO vt0 VALUES (x'46f0'); SELECT quote(c0) FROM vt0; } {X'46F0'} - do_execsql_test 7.1 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} +do_execsql_test 7.2 { + INSERT INTO vt0(vt0) VALUES('rebuild'); +} +do_execsql_test 7.3 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} +do_execsql_test 7.4 { UPDATE vt0 SET c0=''; } - -do_execsql_test 7.2 { +do_execsql_test 7.5 { INSERT INTO vt0(vt0) VALUES('integrity-check'); } diff --git a/manifest b/manifest index f072e0a0e7..0a2cc8d36f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Export\sthe\spublic\sRBU\sentry\spoints\sfrom\sthe\sWin32\sDLL. -D 2019-12-20T17:41:15.560 +C Fix\stwo\smore\scases\sin\sfts5\swhere\ssqlite3_value_bytes()\swas\sbeing\scalled\sbefore\ssqlite3_value_text().\sFix\sfor\se431c355. +D 2019-12-20T19:41:01.504 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -118,7 +118,7 @@ F ext/fts5/fts5_expr.c 2be456484786333d559dc2987a00f2750981fab91d52db8452a804627 F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 F ext/fts5/fts5_index.c 99b77ae1f503978ca76985bcfff7345c822aed8bbaa8edb3747f804f614685b5 F ext/fts5/fts5_main.c 9db1f173d299466aeff89bd949fb1eb0a181265726fb56f11e07ea292dcc9a73 -F ext/fts5/fts5_storage.c 517aae1a606c33a5197dfda53bf9eef194e3636818a4cf52324bf91bf70dcd47 +F ext/fts5/fts5_storage.c 3ecda8edadc1f62a355d6789776be0da609f8658c50d72e422674093ab7e1528 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee F ext/fts5/fts5_test_tok.c f96c6e193c466711d6d7828d5f190407fe7ab897062d371426dd3036f01258e7 @@ -182,7 +182,7 @@ F ext/fts5/test/fts5first.test 3fcf2365c00a15fc9704233674789a3b95131d12de18a9b99 F ext/fts5/test/fts5full.test e1701a112354e0ff9a1fdffb0c940c576530c33732ee20ac5e8361777070d717 F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e F ext/fts5/test/fts5hash.test a4cf51acad99bfc43c16fb74f9d22495dc221ae0701fc5e908ca963a9b26a02b -F ext/fts5/test/fts5integrity.test dea2ea1977a67256aa8346514dccd8f477863edaebf305486ab45dd004b646fd +F ext/fts5/test/fts5integrity.test 1bcd3c04c5ad6bc0370278281682be5d51a0f4522ef5b60b005fa1c0c7b1b433 F ext/fts5/test/fts5interrupt.test 09613247b273a99889808ef852898177e671406fe71fdde7ea00e78ea283d227 F ext/fts5/test/fts5lastrowid.test be98fe3e03235296585b72daad7aed5717ba0062bae5e5c18dd6e04e194c6b28 F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc2782680740513c4d1fc114b43d4ad @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P dc5f1d282d1e75f8a3791b0c95cb8f143b2a956323cb6c889d76d20db7f89257 -R 8d20ce65ce8b3a258ac21b4b684c5925 -U mistachkin -Z a0bcb3089620c4d448f1bba178e307bd +P e62d1791f428b7a9bb14a59483f12d8ee08afbf4061a5e3be8f64787444301e7 +R 83476bba8ae2cf801d14b711beef14b7 +U dan +Z cc23e8046b671a0f1fdecd77a8b35986 diff --git a/manifest.uuid b/manifest.uuid index 54eb94f691..22681e8a21 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e62d1791f428b7a9bb14a59483f12d8ee08afbf4061a5e3be8f64787444301e7 \ No newline at end of file +a1ba9a37d7a68a6d31f8197c6350589ebe6a12f4e3c193a178dd7ead8bcd565a \ No newline at end of file From 879f1a1ea6fa4a18219e5c3270f036be26409f6d Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 20 Dec 2019 20:03:21 +0000 Subject: [PATCH 038/120] Fix a bad interaction between RBU and [df51ae19]. FossilOrigin-Name: 0b9d8a1202c4220fd2ef299b6194533c1bf4018a0cd2d13da7e22c1a7de05ffa --- ext/rbu/sqlite3rbu.c | 2 +- manifest | 15 ++++++++------- manifest.uuid | 2 +- src/pager.c | 2 +- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/ext/rbu/sqlite3rbu.c b/ext/rbu/sqlite3rbu.c index 5c2ae95453..b2e23b1654 100644 --- a/ext/rbu/sqlite3rbu.c +++ b/ext/rbu/sqlite3rbu.c @@ -4959,7 +4959,7 @@ static const char *rbuMainToWal(const char *zName, int flags){ }else{ while( *z==0 ) z++; } - z += (n + 8 + 1); + z += (n + 8 + 2); return z; } diff --git a/manifest b/manifest index 0a2cc8d36f..4dbd3db5ae 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\stwo\smore\scases\sin\sfts5\swhere\ssqlite3_value_bytes()\swas\sbeing\scalled\sbefore\ssqlite3_value_text().\sFix\sfor\se431c355. -D 2019-12-20T19:41:01.504 +C Fix\sa\sbad\sinteraction\sbetween\sRBU\sand\s[df51ae19]. +D 2019-12-20T20:03:21.799 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -366,7 +366,7 @@ F ext/rbu/rbuvacuum.test 55e101e90168c2b31df6c9638fe73dc7f7cc666b6142266d1563697 F ext/rbu/rbuvacuum2.test b8e5b51dc8b2c0153373d024c0936be3f66f9234acbd6d0baab0869d56b14e6b F ext/rbu/rbuvacuum3.test 8addd82e4b83b4c93fa47428eae4fd0dbf410f8512c186f38e348feb49ba03dc F ext/rbu/rbuvacuum4.test a78898e438a44803eb2bc897ba3323373c9f277418e2d6d76e90f2f1dbccfd10 -F ext/rbu/sqlite3rbu.c f3a3e09f575157052813be667d6ab3b54f47fb02e6e1c9f767ad7bb8f1fb90b3 +F ext/rbu/sqlite3rbu.c 4e9a59aa80c03350a0ca5faa454dec894906537fbd98b3231604cc33baf174c8 F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812 F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15 @@ -514,7 +514,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 3e0e519f27683083a465e948e056759a8340728c222b5c394a135e0c57c220bc F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 30f20d2263d3717f41a0d9a40f7a3d0f48ce1cfab461b875c6187ead9d6ad1c7 +F src/pager.c d8909ace5b55a5bec49f1f1f1e67e7ac7370767507588462b723594350e2aac9 F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 F src/parse.y c8d2de64db469fd56e0fa24da46cd8ec8523eb98626567d2708df371b47fdc3f F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 @@ -1852,7 +1852,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 e62d1791f428b7a9bb14a59483f12d8ee08afbf4061a5e3be8f64787444301e7 -R 83476bba8ae2cf801d14b711beef14b7 +P a1ba9a37d7a68a6d31f8197c6350589ebe6a12f4e3c193a178dd7ead8bcd565a +R de245bd90e2a11fcca5b93be06aab877 +T +closed 8394c626c45a2b915ae854408ff91a09a1315ee65a06c7dcad11f48fda317a6b U dan -Z cc23e8046b671a0f1fdecd77a8b35986 +Z 51144caceb2c2758c3978f6b539555d7 diff --git a/manifest.uuid b/manifest.uuid index 22681e8a21..502fa2f04a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a1ba9a37d7a68a6d31f8197c6350589ebe6a12f4e3c193a178dd7ead8bcd565a \ No newline at end of file +0b9d8a1202c4220fd2ef299b6194533c1bf4018a0cd2d13da7e22c1a7de05ffa \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 9d4922c4a3..3cd0835b5a 100644 --- a/src/pager.c +++ b/src/pager.c @@ -4813,7 +4813,7 @@ int sqlite3PagerOpen( z += strlen(z)+1; nUri++; } - nUriByte = (int)(&z[2] - zUri); + nUriByte = (int)(&z[1] - zUri); assert( nUriByte>=1 ); if( rc==SQLITE_OK && nPathname+8>pVfs->mxPathname ){ /* This branch is taken when the journal path required by From a513e591ae72d296d68a8d84eec80d72bc2f2bd9 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 Dec 2019 20:08:56 +0000 Subject: [PATCH 039/120] Debugging enhancment: Show the Expr.y.pTab pointer on TK_COLUMN nodes of an expression tree in the treeview. FossilOrigin-Name: 64154ac450e4366d18e7e867841877a69c1f978d3ba9b8754cc133248966731d --- manifest | 15 +++++++-------- manifest.uuid | 2 +- src/treeview.c | 5 +++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 4dbd3db5ae..4c5247ea7f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbad\sinteraction\sbetween\sRBU\sand\s[df51ae19]. -D 2019-12-20T20:03:21.799 +C Debugging\senhancment:\s\sShow\sthe\sExpr.y.pTab\spointer\son\sTK_COLUMN\snodes\sof\nan\sexpression\stree\sin\sthe\streeview. +D 2019-12-20T20:08:56.865 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -592,7 +592,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 7b17f6e2f20f6cbcb0b215025a86b7457c38451fc7622f705e553d7a488c572d -F src/treeview.c 41d928f04d65931b15f629b4938e9f2c7dc259f02eef34cb2cc6e293f5af813f +F src/treeview.c 7a8097cff1584acd0a228817103513bf1d1bf5ba91ff142b99c83e406c0968f3 F src/trigger.c 681ccdb910a87243940d63f99b26190d9c5d2534c2ded3c0825b7c0e315a342e F src/update.c 07a50767f7d3e26d4c887c31cd66448d700d3215caea6023acf7269336097df7 F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 @@ -1852,8 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a1ba9a37d7a68a6d31f8197c6350589ebe6a12f4e3c193a178dd7ead8bcd565a -R de245bd90e2a11fcca5b93be06aab877 -T +closed 8394c626c45a2b915ae854408ff91a09a1315ee65a06c7dcad11f48fda317a6b -U dan -Z 51144caceb2c2758c3978f6b539555d7 +P 0b9d8a1202c4220fd2ef299b6194533c1bf4018a0cd2d13da7e22c1a7de05ffa +R a7dcec9aea796d0ba16e01020696fa29 +U drh +Z 0651a4695143e634bba264926350256b diff --git a/manifest.uuid b/manifest.uuid index 502fa2f04a..e425365389 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0b9d8a1202c4220fd2ef299b6194533c1bf4018a0cd2d13da7e22c1a7de05ffa \ No newline at end of file +64154ac450e4366d18e7e867841877a69c1f978d3ba9b8754cc133248966731d \ No newline at end of file diff --git a/src/treeview.c b/src/treeview.c index 5b9e064540..f10e48ae1a 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -432,8 +432,9 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ sqlite3TreeViewLine(pView, "COLUMN(%d)%s%s", pExpr->iColumn, zFlgs, zOp2); }else{ - sqlite3TreeViewLine(pView, "{%d:%d}%s", - pExpr->iTable, pExpr->iColumn, zFlgs); + sqlite3TreeViewLine(pView, "{%d:%d} pTab=%p%s", + pExpr->iTable, pExpr->iColumn, + pExpr->y.pTab, zFlgs); } if( ExprHasProperty(pExpr, EP_FixedCol) ){ sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); From 67b9ba1732c7ed1c561ed124b4eaaaa0b7081c2e Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 Dec 2019 20:45:02 +0000 Subject: [PATCH 040/120] Apply real affinity to generated columns of type REAL that are extract from an index. Ticket [e0a8120553f4b082] FossilOrigin-Name: 728ad39e3bd07a2503a95c68ed5bbc3f28fd97551d59f12a5fab25dc68227e99 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 9 +++++++-- test/gencol1.test | 18 ++++++++++++++++++ 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 4c5247ea7f..9e62066612 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Debugging\senhancment:\s\sShow\sthe\sExpr.y.pTab\spointer\son\sTK_COLUMN\snodes\sof\nan\sexpression\stree\sin\sthe\streeview. -D 2019-12-20T20:08:56.865 +C Apply\sreal\saffinity\sto\sgenerated\scolumns\sof\stype\sREAL\sthat\sare\sextract\sfrom\nan\sindex.\s\sTicket\s[e0a8120553f4b082] +D 2019-12-20T20:45:02.088 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 5099de2d6cca77f7c3b5131e0035787fc64ca3d27c267020e7e8bec0e226336c +F src/expr.c f384985519fdc748d1c3e37b387825d601c2b076517c921db673b1dd368fe68c F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1022,7 +1022,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test 69008f45faa46b7293cc6ce1236f356a7aff6061b0547334786b54a49b2f98cb +F test/gencol1.test 895f7ff4b4d7db83257e0a2756791d77e993d3fa7a2671a73eb7ecbaa60832c4 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0b9d8a1202c4220fd2ef299b6194533c1bf4018a0cd2d13da7e22c1a7de05ffa -R a7dcec9aea796d0ba16e01020696fa29 +P 64154ac450e4366d18e7e867841877a69c1f978d3ba9b8754cc133248966731d +R d8823f12dd9a0a2e718c870018b32a4b U drh -Z 0651a4695143e634bba264926350256b +Z e546dd09b712fccc4b4a1d30d53b8302 diff --git a/manifest.uuid b/manifest.uuid index e425365389..456fe48333 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -64154ac450e4366d18e7e867841877a69c1f978d3ba9b8754cc133248966731d \ No newline at end of file +728ad39e3bd07a2503a95c68ed5bbc3f28fd97551d59f12a5fab25dc68227e99 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 6ea8ff73f0..e1efeba2b0 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3609,6 +3609,7 @@ expr_code_doover: } case TK_COLUMN: { int iTab = pExpr->iTable; + int iReg; if( ExprHasProperty(pExpr, EP_FixedCol) ){ /* This COLUMN expression is really a constant due to WHERE clause ** constraints, and that constant is coded by the pExpr->pLeft @@ -3616,8 +3617,8 @@ expr_code_doover: ** datatype by applying the Affinity of the table column to the ** constant. */ - int iReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft,target); int aff; + iReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft,target); if( pExpr->y.pTab ){ aff = sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn); }else{ @@ -3685,9 +3686,13 @@ expr_code_doover: iTab = pParse->iSelfTab - 1; } } - return sqlite3ExprCodeGetColumn(pParse, pExpr->y.pTab, + iReg = sqlite3ExprCodeGetColumn(pParse, pExpr->y.pTab, pExpr->iColumn, iTab, target, pExpr->op2); + if( pExpr->y.pTab==0 && pExpr->affExpr==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg); + } + return iReg; } case TK_INTEGER: { codeInteger(pParse, pExpr, 0, target); diff --git a/test/gencol1.test b/test/gencol1.test index 1deb38686f..a49a7136f8 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -442,5 +442,23 @@ do_execsql_test gencol1-16.40 { SELECT c0, c1, c2 FROM t0 LEFT JOIN t1 ON c0=c1; } {0 {} {}} +# 2019-12-20 ticket e0a8120553f4b082 +# Generated columns with REAL affinity need to have an OP_RealAffinity +# opcode applied, even when the column value is extracted from an index. +# +reset_db +do_execsql_test gencol1-17.10 { + CREATE TABLE t0(c0 REAL AS(1) UNIQUE, c1 INT); + INSERT INTO t0 VALUES(''); + SELECT quote(c0), quote(c1) from t0; +} {1.0 ''} +do_execsql_test gencol1-17.20 { + SELECT *, (1 BETWEEN CAST(t0.c0 AS TEXT) AND t0.c0) FROM t0; +} {1.0 {} 0} +do_execsql_test gencol1-17.30 { + SELECT * FROM t0 WHERE (1 BETWEEN CAST(t0.c0 AS TEXT) AND t0.c0); +} {} + + finish_test From ed0c34857ae209d2272e9f625359196fd4342e58 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 Dec 2019 22:46:41 +0000 Subject: [PATCH 041/120] Do not try to access a generated column through an index if the collating sequence for the generated column is non-standard. Part 2 of ticket [e0a8120553f4b082] FossilOrigin-Name: 056bb8dcbdc45989c5c6e86d2966200062e3c01c382ec52aae37c828104b4496 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wherecode.c | 12 +++++++++++- test/gencol1.test | 11 +++++++++++ 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 9e62066612..cda6e79652 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Apply\sreal\saffinity\sto\sgenerated\scolumns\sof\stype\sREAL\sthat\sare\sextract\sfrom\nan\sindex.\s\sTicket\s[e0a8120553f4b082] -D 2019-12-20T20:45:02.088 +C Do\snot\stry\sto\saccess\sa\sgenerated\scolumn\sthrough\san\sindex\sif\sthe\scollating\nsequence\sfor\sthe\sgenerated\scolumn\sis\snon-standard.\nPart\s2\sof\sticket\s[e0a8120553f4b082] +D 2019-12-20T22:46:41.121 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -615,7 +615,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d F src/where.c c51ebd505c8417285ca1db8f94933a12224bf636ad93f27d821c07f93d59c035 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 -F src/wherecode.c 7efa97f4dc2f95548611deba68f0210ab357725899a9bae5391a525e48271875 +F src/wherecode.c 9c2757cb4380104f4e230a8c68e219da0289f9f2d050bff1923ba50991ea64e1 F src/whereexpr.c 989235ee5fade9663a01d9443763a82ba5a72619bf3edda67ebd043936d33575 F src/window.c da010455914c81037dcb5b0c6f4273f8a32c94567865c46a60060b937b018a96 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1022,7 +1022,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test 895f7ff4b4d7db83257e0a2756791d77e993d3fa7a2671a73eb7ecbaa60832c4 +F test/gencol1.test 681db71d41ca4c6c09efb5213aad766425bdd001865cf35e65d91ded4dd2984d F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 64154ac450e4366d18e7e867841877a69c1f978d3ba9b8754cc133248966731d -R d8823f12dd9a0a2e718c870018b32a4b +P 728ad39e3bd07a2503a95c68ed5bbc3f28fd97551d59f12a5fab25dc68227e99 +R cfaa4a73c5ab8e91e0e8aea15aa1b6a1 U drh -Z e546dd09b712fccc4b4a1d30d53b8302 +Z c7accbd12333ca8b3a817093296c39eb diff --git a/manifest.uuid b/manifest.uuid index 456fe48333..357a08a153 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -728ad39e3bd07a2503a95c68ed5bbc3f28fd97551d59f12a5fab25dc68227e99 \ No newline at end of file +056bb8dcbdc45989c5c6e86d2966200062e3c01c382ec52aae37c828104b4496 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 59546c43c9..a054a930f6 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1190,7 +1190,17 @@ static void whereIndexExprTrans( x.pIdxExpr = aColExpr->a[iIdxCol].pExpr; w.xExprCallback = whereIndexExprTransNode; #ifndef SQLITE_OMIT_GENERATED_COLUMNS - }else if( iRef>=0 && (pTab->aCol[iRef].colFlags & COLFLAG_VIRTUAL)!=0 ){ + }else if( iRef>=0 + && (pTab->aCol[iRef].colFlags & COLFLAG_VIRTUAL)!=0 + && (pTab->aCol[iRef].zColl==0 + || sqlite3StrICmp(pTab->aCol[iRef].zColl, sqlite3StrBINARY)==0) + ){ + /* Check to see if there are direct references to generated columns + ** that are contained in the index. Pulling the generated column + ** out of the index is an optimization only - the main table is always + ** available if the index cannot be used. To avoid unnecessary + ** complication, omit this optimization if the collating sequence for + ** the column is non-standard */ x.iTabCol = iRef; w.xExprCallback = whereIndexExprTransColumn; #endif /* SQLITE_OMIT_GENERATED_COLUMNS */ diff --git a/test/gencol1.test b/test/gencol1.test index a49a7136f8..3e864a52b4 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -458,6 +458,17 @@ do_execsql_test gencol1-17.20 { do_execsql_test gencol1-17.30 { SELECT * FROM t0 WHERE (1 BETWEEN CAST(t0.c0 AS TEXT) AND t0.c0); } {} +do_execsql_test gencol1-17.40 { + CREATE TABLE t1(a TEXT AS(b) COLLATE nocase, b TEXT, c INT, d DEFAULT 1); + INSERT INTO t1(b,c) VALUES('abc',11),('DEF',22),('ghi',33); + SELECT a FROM t1 WHERE b='DEF' AND a='def'; +} {DEF} +do_execsql_test gencol1-17.50 { + CREATE INDEX t1bca ON t1(b,c,a); + SELECT a FROM t1 WHERE b='DEF' AND a='def'; +} {DEF} + + From b0cbcd0edf4af5afa382ccdf18845ea9fe13e4a9 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 21 Dec 2019 14:09:30 +0000 Subject: [PATCH 042/120] When a corrupt schema is loaded using writable_schema=ON, the CHECK constraints (or other expressions in the table definition) might not be fully resolved. Ensure that the code generator can deal with this if the table is subsequently used in a DML statement. dbsqlfuzz find. FossilOrigin-Name: ea721b34477ab8b49d182352c4bc198245933b850e9b6248b4f97600e80bb44b --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 14 ++++++++++---- test/fuzzdata8.db | Bin 1564672 -> 1569792 bytes 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index cda6e79652..7d2ddd7bc5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\stry\sto\saccess\sa\sgenerated\scolumn\sthrough\san\sindex\sif\sthe\scollating\nsequence\sfor\sthe\sgenerated\scolumn\sis\snon-standard.\nPart\s2\sof\sticket\s[e0a8120553f4b082] -D 2019-12-20T22:46:41.121 +C When\sa\scorrupt\sschema\sis\sloaded\susing\swritable_schema=ON,\sthe\sCHECK\sconstraints\n(or\sother\sexpressions\sin\sthe\stable\sdefinition)\smight\snot\sbe\sfully\sresolved.\nEnsure\sthat\sthe\scode\sgenerator\scan\sdeal\swith\sthis\sif\sthe\stable\sis\ssubsequently\nused\sin\sa\sDML\sstatement.\s\sdbsqlfuzz\sfind. +D 2019-12-21T14:09:30.906 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c f384985519fdc748d1c3e37b387825d601c2b076517c921db673b1dd368fe68c +F src/expr.c d1031aaefc3d8697f30f418494ec491e729c2423af7f426041bb7525c41d3ad5 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1017,7 +1017,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db bbe69fc3534e5e68ef211481e145aa9aac678dacb8dbc0c4f3177db0d40e099e +F test/fuzzdata8.db 34eb781c21f70c47501167b184a48a3fa8ff05ce9bc41b93dc48721e553c3c5e F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 728ad39e3bd07a2503a95c68ed5bbc3f28fd97551d59f12a5fab25dc68227e99 -R cfaa4a73c5ab8e91e0e8aea15aa1b6a1 +P 056bb8dcbdc45989c5c6e86d2966200062e3c01c382ec52aae37c828104b4496 +R 3d66cf80146322364a240ad41d3a3004 U drh -Z c7accbd12333ca8b3a817093296c39eb +Z d7946e0fe8abc0809f4706cc432866a0 diff --git a/manifest.uuid b/manifest.uuid index 357a08a153..f33a4854bd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -056bb8dcbdc45989c5c6e86d2966200062e3c01c382ec52aae37c828104b4496 \ No newline at end of file +ea721b34477ab8b49d182352c4bc198245933b850e9b6248b4f97600e80bb44b \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index e1efeba2b0..21fa97d8ec 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3649,9 +3649,14 @@ expr_code_doover: Table *pTab = pExpr->y.pTab; int iSrc; int iCol = pExpr->iColumn; + if( pTab==0 ){ + assert( CORRUPT_DB ); + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + return target; + } assert( pTab!=0 ); assert( iCol>=XN_ROWID ); - assert( iColy.pTab->nCol ); + assert( iColnCol ); if( iCol<0 ){ return -1-pParse->iSelfTab; } @@ -3717,9 +3722,10 @@ expr_code_doover: default: { /* Make NULL the default case so that if a bug causes an illegal ** Expr node to be passed into this function, it will be handled - ** sanely and not crash. But keep an assert() to bring the problem - ** to the attention of the developers. */ - assert( op==TK_NULL ); + ** sanely and not crash. This comes up, for example, if a corrupt + ** database schema is loaded using PRAGMA writable_schema=ON. */ + assert( op==TK_NULL || CORRUPT_DB ); + testcase( op!=TK_NULL ); sqlite3VdbeAddOp2(v, OP_Null, 0, target); return target; } diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index bf72ac52c27021e9af06290e2220452473e1386a..caba53a7744bca52e6dd45a8d54eda48e5d7a61d 100644 GIT binary patch delta 10605 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 sA0fJnqls8REzGwFO4r Date: Sat, 21 Dec 2019 19:37:09 +0000 Subject: [PATCH 043/120] When creating a new virtual table, ensure that the OP_ParseSchema opcode processes the correct entry in the sqlite_master table even if there is a second entry with the same name and table values due to database corruption and the use of writable_schema=ON. Dbsqlfuzz find. FossilOrigin-Name: 4dbb6e1cb094f3428c74ea8bdd86ab63341fecce978a062968ca01423f382e90 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vtab.c | 4 ++-- test/fuzzdata8.db | Bin 1569792 -> 1570816 bytes 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 7d2ddd7bc5..748e86e511 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sa\scorrupt\sschema\sis\sloaded\susing\swritable_schema=ON,\sthe\sCHECK\sconstraints\n(or\sother\sexpressions\sin\sthe\stable\sdefinition)\smight\snot\sbe\sfully\sresolved.\nEnsure\sthat\sthe\scode\sgenerator\scan\sdeal\swith\sthis\sif\sthe\stable\sis\ssubsequently\nused\sin\sa\sDML\sstatement.\s\sdbsqlfuzz\sfind. -D 2019-12-21T14:09:30.906 +C When\screating\sa\snew\svirtual\stable,\sensure\sthat\sthe\sOP_ParseSchema\sopcode\nprocesses\sthe\scorrect\sentry\sin\sthe\ssqlite_master\stable\seven\sif\sthere\sis\na\ssecond\sentry\swith\sthe\ssame\sname\sand\stable\svalues\sdue\sto\sdatabase\scorruption\nand\sthe\suse\sof\swritable_schema=ON.\s\sDbsqlfuzz\sfind. +D 2019-12-21T19:37:09.876 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -608,7 +608,7 @@ F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b F src/vdbemem.c 2eb00a4d1a7d2c97510a4d1ccaf4e12c9143f2ced1c6b96b5eddc372183c9121 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vtab.c 2736f853a1bd270581f76bae8e5d2e840b6258f3d85c1fa382e9454b3c414d1d +F src/vtab.c a2fead3e97fca54fcf3f3db784e17c9ee2d39a0c5ad323e9d514855106300a86 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 15a2845769f51ba132f9cf0b2c7a6887a91fc8437892dbcce9fcdc68b66d60a1 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a @@ -1017,7 +1017,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db 34eb781c21f70c47501167b184a48a3fa8ff05ce9bc41b93dc48721e553c3c5e +F test/fuzzdata8.db 0e29cbd9b2a34aadd76fb5be963e810f61545487ccb44503e5335acb1634338e F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 056bb8dcbdc45989c5c6e86d2966200062e3c01c382ec52aae37c828104b4496 -R 3d66cf80146322364a240ad41d3a3004 +P ea721b34477ab8b49d182352c4bc198245933b850e9b6248b4f97600e80bb44b +R 1ee05353a832e121d716fae7817e6737 U drh -Z d7946e0fe8abc0809f4706cc432866a0 +Z c87c6f8bffb8cbc230edd05dbc19e5de diff --git a/manifest.uuid b/manifest.uuid index f33a4854bd..2c9d9909d3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ea721b34477ab8b49d182352c4bc198245933b850e9b6248b4f97600e80bb44b \ No newline at end of file +4dbb6e1cb094f3428c74ea8bdd86ab63341fecce978a062968ca01423f382e90 \ No newline at end of file diff --git a/src/vtab.c b/src/vtab.c index 64125e769b..082b56edb0 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -484,13 +484,13 @@ void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ zStmt, pParse->regRowid ); - sqlite3DbFree(db, zStmt); v = sqlite3GetVdbe(pParse); sqlite3ChangeCookie(pParse, iDb); sqlite3VdbeAddOp0(v, OP_Expire); - zWhere = sqlite3MPrintf(db, "name='%q' AND type='table'", pTab->zName); + zWhere = sqlite3MPrintf(db, "name=%Q AND sql=%Q", pTab->zName, zStmt); sqlite3VdbeAddParseSchemaOp(v, iDb, zWhere); + sqlite3DbFree(db, zStmt); iReg = ++pParse->nMem; sqlite3VdbeLoadString(v, iReg, pTab->zName); diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index caba53a7744bca52e6dd45a8d54eda48e5d7a61d..15eb1017a4b1005d1ea1136c7ca2000b2b5a1841 100644 GIT binary patch delta 19054 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 delta 19108 zcmeIacX(9A7eBmn%l5l_clYjwo`ld_c7f0X3B8j@6;KjD6r>~qic*pbh#(3HfgF^U zNSBgefJ2o;kuC%TM5H7NqSQo1Y`}YFfr#b%zVBb}@1K|FxhLe7na`;+bLLD^ONOL= zKP0W9YpcN^-#7gAFFL(mBer!*!UhxTmti;OrL-2B2@QpMLJc8Is32&9Lof>h`;+~` zO4xOFgSM>=ibejbI6EAnU_=vd*k6 zYsH!{KdZy4J?U9$uXivQq*i)+qK)--MC78YZHyrYY^?O zM-c6-S0&m|4<}kfuR=5>RIfxo%Ig)0y7dYMgK%FjPxQ7PLiC#MA$m@C6Fs7x}3mlTH#6 zCZ<5{AlEZ_i>xCV>pSD2?X8D4MwdXBNS8#HOqY=^6J2I}XtRhr1Yta6?HAt1<;N^9 zh-?C6x3dfZ|DWb4I2LMhK!eZB@p!M$Vli0>u7L>)48j6*)sklmruPS>NQP}K!L`>s z5%PEV+z|JoWhgk0TBgdc5Tw_D-7_!273VA;nPr1y_^=Cqbu=EhWoaTn>TyBhJibcT z8&I&$vVy<)oVfjaOJ7-L^m=UB>&*rEb$V?oBwFQghW#T+OI2pYsSu>Fc^xb-K2y$#O~6F-1E z-EE7oWp(Qzfz8Dpakhih)mdvegPi%cPVhsrtsHc#Yu&-#f#+Wq7em%p)={uyysb0# ztZ&^Wuy>)y09zPV^II>AY#z*?E7pdjs% zYyy;yfgh~DGkg$hl?Ao{a&B3@SiZgWy2vshr_>sUeL7onM79uf?pkGrmLAsM1-1x2 z|IM0!!{e+gM3#wCAFJOinc{%JGZ;gh+R=yCd_>#4hL4J38 zrHqmnZJ6|`wZ4g2arsnhq98A$m$RX?yS-~(!i6j`BXyOVyT%7l8fQP3S2)ej@{Vtp z7^rVqe_|_9pKeWIcxjYfVEE?S)@h8b0)3WsK0N%uUKQ1`_E{`1cX}Ml$WNNc+gY8r zxy~~zVlX14$R`A$e)Dlf;Z=e+FM)o0oiSAj9Y1v#u7{ zI+T`LABt=}oS5Y(hn2Fd*F^Rq#QOx|X_fVRk!^r28?3z`OwVTK`fh)=!4v{Uj`Vd{ts^N%SYrffNlMVXy=rU1O!*x5Y z{RKIT5at5wFTM*&BWzVLXOFdy$hJV6hH`bRop0S>mhF;ZPfPyc3>AsH=$ow& zJIuBll3sDOz~7Epts>h7``)s}LUe@n(=vmti?yTWx&jx&cGx$UKd#9izbJYjAR?PtWqdu$s}o(RPVp-SgISjO~DZ8T^|_Ye(1@Z5xKSFIYF5nS#r%T89d9 z9yPlgjz4cr#hKq*Q$)50rJG!od!cVfYbZvPSc^pVG4$4NC1bS;F2{2D-X2k3}d$1RuPS`4K^|rm({j4X6B>2th!S&{0xEL zgaD|Cwy)sBI=1p0)TeYEL#N$VDnjZkn~e+ma|~-CGcsqFZ4TrP6=U&4z(!H&IDxm_ zL_+8h*$H%(3x2fV(MN^g>SybYajk55B0Gt$fwp%ag8>4Q50TYuw(ae06z{&klas{0 z)O@)0Acl3deaqNsa7_^xL0mQK4QO-9`a0h4VKWNs47gIoX4s0tmB`MbYo=I>VZFY# zF9r4`?7Lw70%BgHrh5jgt*|gje2GDWSkm+ILAI$9b3>&B+iuHO+s(R5GTihcX~V)G z;dRM@_Y!SpK|V#ip2xs0TWyB*U$C7O*w^5iWqXJl62&SEUXHLX!tJAMJs7(H=^k4p z3>$6xR%92!HP5yhBb(X$3?{deRiyA)L1334y`s&7ArovjMRplnnYLTdvZ1v(qc>_=M%o)=|198GZm(EH%R1 zowiZ#0P_~$j7 zNn(Fe2(o=>X5}&GXIl#>8WzJ$Y%vH>5 z806kyageZ5s|ZC)OkrhDfu2_2y_z83Ykvkespj4ysdC{X3C4A^)a8=5@i;6&`#;f$Ps5raF*thnXSa7r_V9?yw4w_KRSL z)>l{!JlNdcN?QIa@ug(G+c`DC`3NT#bTIjQzUVSRptLlA-F5x{n#* z^k~)^uE%OF=+)J3h9Q-_cJy_%|G;Q+W)QW!z)MXTw(Mc2X_psEN7_GQcsSnPLSQ~D z9b^AAs37V(1WJ?bF+i%ZV$T8gZ6Zm%bfW#!wFd{=t#U=la3wl#%LqTCh%M3-U#yrH zGb*1#!5_8&#>}+eVHv%uSK>WZ0_OwUD|r{IM+h0?#@>e?&e})u`<1~d*h}(CcBwS$ zSobOPI?HT%`L8sfxvxR20)emXH8NU$yak3#GHZ~VVU2q-?f6jGKFPjAlBx9z!?4uF zYyv%UnXz!1J(9_^0ujR@-R%g;$bZp|^;7Lf{yYbECcA8_=hN4mS@{n?zRl??3_9LRP z&hRDy|1fytto?cLf58f2-Iw-OIDWM~O%Uof%Ggq`DwLdME1>*9dl>Zp+Wsz%UvEz{ zvidMCz^-x+Me@)PmN`)QgUhJ_q(871!ovo>-dJ;+{er+EA-frC4kRW{G9sE0w1Blc02MjzGE zLrKqlIp@Q`e~49qn6^qec=o7$jZ}|b&Tzfx#d62&H$)bdQ82kO^f<;g;ITq`Q;{{v z$bP0NwmfY=B(kO%1xXdK$~pU0ku}5l>+Q(`PP}BFC$kn3K+J>@8DUP7W}tuc0~FO)%Ad*5|bezE@| zvlvXjYI|9LINkdk?NoAVzgduxYBSP>r;FT_g7HDOvb7d17IYQ z65V`WCsHav><9)**?T+1y<7z32nML4K zzcO8vyU?dSA-#vv31jLj-N>Hv$iU)$xA!g+Q4*}^Lb9LSRGH0sL13`*3clJ*scV*M zNQNJw^scQlEN?{(h|Fe!I3znH9Wj&->|)_A_}Yz#f~jT$wM;^~;@KtH5Z!&*to z*CKl!6BaqL2-{}mGR$~QNo7OOpQ|)x*z9%XsF5W?vF4bGvs0DHA{z?XagI*dZKkqA zWW(TOCubxi+!A|W>TG3($c97sv+`<4YiYDV(J2Sw$aj_Z1@;0;Y03*Lt#ighlWkJD#uJL2@>Bo zl`F&91;_4D7Ktnwk`GItz{9bQsjzIh*c^wHcg*DL6Y&)ce4`}&1J?}3#zWvcB^%;e zIaJ6$sD?wr57cp*;J6H}*NUAmf4y=xXoVBNrAQMX>kUU1Zr-STA8d6ZxLi^>^xx+8 zmG76L@p7WvgJsrroZ_9n3hbgZ7>SLQCN>GT1RT8tNb6{~KyFj1EiS)A5s$r&TcR9h z25~nWxv;N=v8dtMnX}v<8^$HtOx?P znP-9sr(k-VGoFF7rlS=62{KKpYB`!P+;K-~V3g}fhHEKYyK5k3kaG{j-4|Ox$#2?3 z9xPs?D+OK6%_9VE;Qg`Sccm?3sjwxh3KJ&sQ#sP&7uW%+buo@cl|}w&tNi>x?#L zBdBYXfsob38S}sR3-Hh8VE7@$D8i*l%mg1xjywG3+mQ5;wyDgnt5KHDAkHo0>{An^ zuC^?r3H9HBMFfG(gMwa;Hn4oG<5HOsXA9iJg44J8pl6F?G3-`8jI$b)Y!uy4s7h`K+awO< ztuBCqA&xfKuDv7Q#1=yOpW<&wRz;qcW>P9*$}VwIQ1^?V^f#pt<}Vi=JbI4BxOhjN zKv}fX`wB(;pulshORwVmevS#WTEJ4~;P=~^t7TffO(1Qh(~DuRJEjF&Ta2YLf1FgJ z)Pf|x)Ch`>D@XpzkRU8W3CM)t4NXc*yvh9`_EL`O{5}d{^ z+3D09K>W*&&2k2Dw=|=8WC$evu9cLr6UngeSjT3@mO;r8$1z&rI~s{>ImCab?Zmwk z934fPyTxDEXoWS&@vX?RAp4M*fN?jKmuR8kml|`aWkdEc8Y=R?&?ppq?TE`PRTkq$ z-O=ADu52<41JjiyloQBOJh*iZ#SF^S#orL4q2#_=l~y)l9E@G5EP$*C$%0v*I}*q^ z&dCzQ-63c7*Wi2^#MQv&NDZOzj>8XybJdEFRVYP4;cD`-+^$YLq%y|+fd zfB124-H-3Ca=aqSA5hmDGWL1AIOwV)TUgM`&26A@P-`2x$5mxP{X>x;`7t%#@jdxv zOUat~xuYwGy@`9Fo8jQ&j#aFTt=#{`LVf`0;62vmtuKL{ZnZpaIk9`B?}X;X;oqD9qRf2PU3TeUcMbR zXE>gLqDf3f3LEb*B*>L`-f+udF#uEVIcC7v-3}vue9qB9q_p9d&&5J4ETxeK2VZhb zH?oF!`HCYwG0!Z< z_H;%=%qi{1pbU{@*jg~{3-}xQ{Q(Z9tw`3omCHRJV*5E~K-fhonh({D!Rc_QXuj{L zYLXjKT6`QIZjv%eM$m%#u`vJ{!v}oCp|qp;DP*@d?t;)o(jZtd$Ki$01J0Y6)6qzS zSi&LaBHqV-NcS7_A!(SJ24Szri^&<)Dfp7ZxrDLLAic4%HKd;K86omRmlYq3PzCz5 zifb_Dx}3c!dx=|CducXO*o7=UEXI5q$F}e;pcKa(=S<%EK}gJy`{ST;&J!k?JoENz z9P$9Pb@7%85ULqxa;%@wbp#VPdJmI(TycKSA$ALj^(g4Qqueyr_R{t5Zm0*1k(zg8yJM9IYJ<7t{M-i&q~cWuF1hBk3)8M z^+yiLDsFG){7jOgC{Gw$hU1-au!B<;#y6=ro*MN#uY!gD}W>UoIpt=Yj(*xPPwVkxq9`5WcQaUqG-$~Qhmz*?>y#RrLvm5pr?cB<9 zn1Lwg8#pb=`KF2IDp%NQX2f;xhzZ3`nii)nQB$GKE_EE&ToLG-r3#RHz&YqIiy44b zr#XumE2ibH^eYz4RR3TYc3-swCHoB|DC)~NZl-e~&uONga?-dp+ezcrRSaBm9;LuE zOsbA|1l7edOYN1xzeFvB%b&}^Ip}wAvc54EV`Oz2jct*}Buw3-e!`qh{oFMg`WyM1 z5Ugu(GGJT_X?c_uDw!jzcwn(JT4djYYn@CgS;|%N1C*}uzJ+tMoHn!Ef~IBNf`Ug9 z{6dzI+pQ917R4JMb=7G_b2XS8&zxg&LQw(biRhifuz74(aL{>%{e=4x)mS0u zsz|OH5tRJTklkDIVA6FbE#p&Hk{Z=9k{Kh9J1H{Xh2mM#UQDW`zQJHwvDyaTIOUwf z^OWo-`5_d|mBJt)R-$ZbhFl2~&N#=KSW7%{!RZ&}QsU~jZOQ6$Nq%)`p(%L(Mbk( zniywb(QRi0WA`CG;9OV+YZlqa0yzzD{pj>D_5hPL-gO(r2XS9H`)~i%xx*+$ONJ6Y zMWv+iV~tg!B`@ukHq%?t;&@`2m(Ag^5(5UwhqHnu}Tx?JG3bksrF$CoZM)g3q|Lgufno; zbr#MIsIrN&L+Q=bv7$^B1(KQ(zNATJ1D^&7!z2YR%#g#NFqwvsDjTJXfAJKQF&`;t zai5+eRfln%jJ5v~Ig-fNFeH=O!|j}=#p!v{I7nF{*^u~sQ)C_}eN}D&h5e+3uZ?)hn`!5WY^X4!Ow=FDASx(R8olNOiBkDgj&T-HCDUsHbQp_=;kL zJMGLaAkYJOYnA`f29P$+p)FYjlN?L4Y+D&zVCK+W{qz{ga2K+tS|2$H4}CTH{9B@W z5pwtJPo$N&c8WS!BvUJ}IG;s|Fl#7<3k8aEErjj!+957as?8%jRAq_8YYictB9~^gW4O~98u@;o7JJ9ypwjr($t$KR&!ga+JNzns1k!7)`Ij! zQe)hEMr|ixiB3_F->r?MW_7FZXj~6n;%p9gE~xMGCw0gxos@%LrP4-VT}Zz}X*LRA zQ^|D?s{X(9x|3t*$Lhh!DChEE-vX#DXt}sOL+uI)*VW39_L523o~y1k%57;!^iho9 zQn3W3Ld7={Wp^f1e&KJUQ#|JHB&-k*QVzzHGgjn7*yD*3kG{4b1C;N5Tdq(0CF+5H zOinOqsk2k?orcI-n;(*sb#c!LtX|4_PB*ZOt7Sc0H^vHOcKH!;O?ORW2lx zn&cbRTdfj`6if6i7<@OrTV7d_A=xh2+O7TaGoqQ!g+I_pW(P55tfj)bb|Q9s?!naZ#p1 zCaEiN3q5%FWE*k|+sq)_?9WwP2td|=@ z*q8EREDUqein1$&Tc!FKsOG9*mO4p>Pae6;{Ccht=I+}@=^aTIkG38C^<5_fnOBDO zz-e<_(JjNs-|NT{{Lz^ z;s2?c4j1)vB{Sn%122K3TE~c#)#3{AJuyRkSA0v<#mVACahy0(940;|_7~&DZej45 zUe>ADO+KSfCVEtVgJ^+H^>XrNeG<`CI+fVT@9PtZrs)%i&eF#dP1UJLPadx)6CIhM+Vp3M z8ubB0ncknQ`ggq_(Vz9cL`(HPL}%%}iRyYh(TRE-(b0NOqC@rWM4#8Y678eYHjLCw z??m)J>ONC=;phLsy3Z6|`1yaZ?vqzvOnR#Bvo{-ng`b#c{7=$dvKZ}J2 z_+1{TFfGwFUZAa=!Xu_G5Vprv8($snde_7TyByIfG% zU#Wm?4wwoaw?rXt1=~KsRV>Stw%QT?B#Z?^+=SquO(r2FV8J|B8-^5xw@_R>V4}J+ zgOrE`3+OHs)~5oGKYlaSWl$~CwQT!L*GrPzT{7f%c+y-o9xI0}FQ<2-dbOx0cY~ei zf=mV|4G&hDV8R^N(!WABEnHrJz(Lmutg_ujX>{sX3<9T+Ymi1j;Hc{aXa;p5>ys>?r=-$N0%ASFFfhhQJ9|EogAxG#NrixccIs z>s*sea!<){%=FU^ zf-4M+M_dUwbB8NMUephpm_HPp3vzNnLcTLSHF?-lW z#Yqz&ag*eOe1}ct{0(6^=X2NVCOM9B9NnIDJ`89qS^zE2x@K8k{h$V=aSZ$8|MoDA z!=un3y#}tyE-yyLx=so(?w~6jNUCpgppzhboNEX^{EQn<(8BUBx!Tc|4rGt#_Ya#Y z&>U%x>s<)z<|=||CtTCP`LSyu|Mm^a+!8kMFLq6XaYIB4Ucc%pFVF_hmW7r849Qd} zQNCL-Vb||nJ56jV#?N!*1jqAYxSHkCA!nQ`9;oY{u=OWbFE$P17r109RlV!_U0^8? zzs5BQr~K-oNmeSPpLCT#nCLcBQJ|}vS&o+s=gW+YN)Tl?mGV#sm1dx1c2nKTOqA^W z=bI?0?s68^8!DG~=bPVJW!0aN42R0H5?H;0`#h7U)2Fjhs>DB;gHjm(`8FPD?QTL- z%7*TFkQME2h`(2NTd2?%w$ycpVvOL)r_}G)?kTiM?yiLXI_@`FW-WIF|FsInHFLiv z;Eo3FZjAOyVyd|ZV}jqkQUuZOc0oy1cNMD3b4TO2#%{{y%*Vh&4_Q!T9e4fAW^Nhf zR_+HPONT8r+%G~&YxlFfb0bafBB*QXDkSLP3pfPXWSBPC9U^45cb9(zfL`iG zduI*YooPN=)vfaGx&vW2&$YJ@vg^7d;X-S7)khDA!E$&fKyt(*J>AV26$^()xU2EL zXjz)j-YwznCT>b>6T~JgGtOPBjL-Q3p6TaqK${+q;1KIA1=u*wO$+`y?iT!iF5XUi zmO0=Fy08hJ!@*hPd*nNA;+%wLax8;;=Ti~Xp<`XpWnUmag`EOM)YoR+qgk0TS4U%@cDLrhEvU%g>cr$fLM;7FEVq>Jt>NSxvRfPH|{Om0dmA%37cjJH#jL)jICvg(nv==Y)^`=-oyo=AsS{UHeD zTgKLK0SyySo#uWosPwf^OdwFzJte`uzUNTZLHE6Gs_0tkUQ1QWSUlSk8f3CON4KB9 z@gc@9^;9O-MtkD%mDTQa0mM~qjXy7<%2|&^%v|RVdBiJWIvT{d3F8yo!$lyeEY8ez zo1r=>hHGLDWksgB<1@FqYdrcS^(%L(03|xvf9m`0Q26*g_wT&hT!?+o{Q^{8;{Fy1 zA_{B^hSzaZ{TA8OXF_Ja+w-UabrYA}#cOT_Hy?0QA*;BbxTLP^0*CiG%RJ<+Sq5)+ z5Z*Sf0F8_EkqFJ1g`^LzF3#2~Pbm}m??Le)6gP9<;NmO^>iH@CLCH?{X%2b^#HKuE z1c{Nh0+;R>ynD&*U~K0j|0iU9Xqaj5p2ISWp7Qzuq)ZYqT)*ZnPgPVgGu`iUMd>d5SSLS5ypi!I&a+QxUi-R5Qebi9_#DseS z+oC+jMfM5C_VMfs+L)WmrEaF=F+v1)v4q;5`xtKVd_%@y_Jm+ex+h;if0Vlh%d~qc zl!^OLP}~PFeuBFaSwo2DTXvA+sLmDCI%o^;WtQ_qKq$D2gHFQj^IUKSa~NC~C=_rD zcqGQ;aL)pP9RdH>?ss?(6gz_f%wOL)^H^|19nUhdidvqU zywh`x$CW6~PgVZE+FZlaSY|y>oifxrf~b#kpdo)5iJaNkQ!)4s|Cnl(7PuWab)jcU z@a;m_Qp>#)D6j+#DQF$DIa?0=@_A2f25r7}w@31J4`U}`^LyO>V?24B=S;XUjBpkX z_0W7Rb&aPS?r-a9!)QN)05s>IEkT3X71Y=ln7q(Ku0_TYWU#k%x_O`>#$Ivv692&( z#~ECpp5ZNpb5_0dO*>qopbcGnUz2RtR$i&SLs-wf7c zwC_!zt>(MI>)pj}+zuT!#Sg6CTr6(@Kqm#O^-<=+>$f92L*gt1xfZb1Xvk~zg= z!$Z^D&Hm}PJnquG_!}sgPLVg}l6xCI`=;kZfi_7_Cc4jYCk<9GNLRT0%5zOTvaDw? zZk{KPD!wtSj+=_HDbCatGSfU-nP86x1$*u3;d!w~hL3oNp^#S#yDjzXAoxo?!SG%M z^QXFFs1mO3-^K-sD^%S}>|Cd+b*~^Tu#?Q>C}|g15(iwfUp!TfVt;Ay&3xzQcFGkp=5wy!QmG?D@67iq~7&3 zgd~TrDXiG*>503GJdLbW#CGSpM`iL|YW`11Jm?95v=3QRNE^T=;=!AqRwC_EjInFq z;CCgS$|8FJIVIi^H0|`zd6WT~4)Z;}1bqIkXO$pG4`GX_^@0i|HU$%Y^{nLe+WDs~ zl++S58n=`F@QlV+A9(J|G8M+%dI5<&n}9Qn+7zZxskbcB1_J$S7=ZYLo(&LlmK-+U zthEybsR<;XCm-2-$J3*XPaDHkiZ(=GGNeDN(%BzXD=^ba?P58tswfN8pc&$Zb8%PF z3PsvF2tVqf&A>2it4KxG1x~FEs5R`t?&bf?9K$2<>yGLt$%%Zx5($QKREf~YiGF*0PTTvOPbur46#6KR%O>j2Wo}^LY zFDXC;@BRoo6^K>zNsu#4i<32KpaLXU)aK&+;o1aB?_*$^7DnPcPc`gQMrv>I%zoHU z9-3i~)@qyO=Osf(6mVpi-GOkkwPG&iSsgTGFWk@Q6~@zd0y& zI`=7uLU95eY%7s8l><93vM@OLjhD_SP0=p%oPK&Zi6|*m%iuZv^y-=yj*roj@$H$~ z>n2u>e@&`+hg4&!?)NtdmL5QQWi1A~r)fxudx(F<oLTiT-%q@)v4 z8pPC)ys-Y7)*q4zrS%Z^onpo3Hfw7bRiY&~c6xYaU~P=a)jkzj0~~mpo_!xDzIL@OWPyMiIgFZrqyK>F3i`aGfQB12R%VD+;ax+_4!2Gz~tHl zw;=>}(!nOed!Ev<2ed1UGVs|)B(jp2s#0Hg_L!t`{7nVc7-Cl|UxDKq6>5~h1cG@P z5>IF!FiJ?DqJ6g8IT}@L9ag9qFjq^ay2`T>9}49ru;qqQ7ZPr3eR1Y#Erlwyk^SzV zqe$u-%4|&9sUsOuSP0m-wd z_Ac$1)Q5I>mDFIV3FN*)wJ^^g)jr_jt`3EtDO)+>yHw#_hM9|YCEx9QgmF~RH(Fup z4^&?W(Rtbgj=3)qQc6ffJrnwI)WHGRL=qvW1L_UaHFdRg*=TYHQ^f zWU{jtN$zn`;QOdN(0-xBKj?=|H6gC0+4)}#0Wnk^pJU!Nd{?0Kh~{K}NB<9b^Kt~a z9h4r|lAu+Nw!e&%claRW(de@uS z2+Zm1jT7zN=#@TAn=}eEY}O27J{D-Zxx4qFnT)x9JOMrr( z?S*)HiZ|LWkChCoM^XdTu*Dp2UuJn>{v@3kT``g0gFSD1+ggUrnW&GJ3>o8|+^Phf z=6ZL?Jaar8veLvGc;_9jW`c@Wr3kFC(0kFuUV`jyUOJ<()JtbHMnbsFIRF#(c$ZV+ zE?`vA@v-+uN+k4_BrelYps$gs@Mx9y3(Cb|aSc}}dG7Pl$5_1HTUDUK>g37NT&j&% zn?lMlx#THrE6creFlV!OfYD5*dm}n(tpKqj9sPOH6D=#3ZTAjkGNt9@aZr%#3ZcWR zUS0=qT(;wyUEb#yCF8R1sWe#Z@zV4m8IqPrZ{xgt??jO@b8T99BOlcl7A8w4QT@#O zj)~q`c8s()Vbfqe3GJVIe-dP#W}gVG)KnYtYxu@vR-t#8$XhEgRCW z;-%9dlOgFXI>TiD!88RzKQL1<(+}Qx0-FNq6P+}rxas{~6sCq{bgEJx85sfN<8-Z2*AE0W>2#3*px4QUH;d(BOP zNB^;K8T*4Le)&Otc{;?JwaBuG+D7!rzFPtvsxNAzh4C52QM_aJX_RP#Sf`Ip@W$Fl zK$6SX3=o!@>A530URChK^~aPj4+hx8AUi=_bOl=H=jGNr-g z*^s#0RzELS>q|=nemrRVKxJ4ktjvML2ka#r*V&gYnua!MPA|U=iAcu>6OQH!;n zfi4FE`W0TB;HyD(zW)T7^)HZ9Imqm%L4NQw$eCPll->GEaI<|snc1tjC*9Xhke3j) zHF-MC7t3^-7}V)nNZu8)A6IM)IYf!e_kH6TTL-a6e8+**IS&(-@ov}u6W)jaf)|wG zhNt0ed>UR*ubZBRm+K=hn}n@*_$D!H&auk+YyXtzYQmfgfehc#yj1PY$H3{V8n5P* zw?ILC-#UofYNDF62EN0OH~`{c6@UB@6io1TgVb)mRERm^JHd@}XmAwG12r$C1nPfm zuf`2Dc=|%#3gLBq;ZWyt$XW3B@d0FgWPbtgeeR<_aj*?sHVP$A&WBb5GTYB-eoj@h z2`9O9wnO?YvQV;J`l|(}&iDen^ftbV@+#%3eWQUaxDU*?DRgkEIoa^`3qC4-qSV!Y z+R3he*~#vI8uXrjDr4_|E92v*m9ei(8D{MIt8XVA?|)hue{x%S{jsg=Ao+dzKk)7U z7d|@V|96Kw@K1aP{~O<-r|}&w!}lZz9QixGrZ)K#!u9$8z;*mzxK8{NSK&W#o&0ZH zr=G_3#lLW!ei|3|G2C50q`e>?BXnQ>4|M1Lh3>0=qC5XjbYK5Bx(iREyZAJ^UE2i#;;Rby;^vU0jNO7_w1;N; zl%8<;Vn}oD;J|R#S0Mpfk5&*`LvCJ3Z}E1ZHpDlTsy-TvpsJth5UT;j)Rslvt}(`orevi3OA7M%%+5Gc2^rJ8Sh5Oo)U z@;E2=DV6_$v>N~PH^{E+n*aoIFGdxI92clGwSnJviW0zIc!P_uKd`|}-v-K?{SeZJ w{$3Q&0jvsq01d*V!bjnDh-fnDDJ1kIRJoS!TZaDQAym Date: Sat, 21 Dec 2019 20:43:34 +0000 Subject: [PATCH 044/120] Fix a spurious report of corruption from the fts3/4 integrity-check triggered by using the languageid option. FossilOrigin-Name: 70815e273f511481c310dc33b3b49079901d891078fad49b663fbce06c77ecc2 --- ext/fts3/fts3.c | 2 +- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/fts4langid.test | 15 +++++++++++++++ 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 3808ec2060..77738eb543 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -2960,7 +2960,7 @@ static int fts3SegReaderCursor( ** Fts3SegReaderPending might segfault, as the data structures used by ** fts4aux are not completely populated. So it's easiest to filter these ** calls out here. */ - if( iLevel<0 && p->aIndex ){ + if( iLevel<0 && p->aIndex && p->iPrevLangid==iLangid ){ Fts3SegReader *pSeg = 0; rc = sqlite3Fts3SegReaderPending(p, iIndex, zTerm, nTerm, isPrefix||isScan, &pSeg); if( rc==SQLITE_OK && pSeg ){ diff --git a/manifest b/manifest index 748e86e511..23ffdc1cab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\screating\sa\snew\svirtual\stable,\sensure\sthat\sthe\sOP_ParseSchema\sopcode\nprocesses\sthe\scorrect\sentry\sin\sthe\ssqlite_master\stable\seven\sif\sthere\sis\na\ssecond\sentry\swith\sthe\ssame\sname\sand\stable\svalues\sdue\sto\sdatabase\scorruption\nand\sthe\suse\sof\swritable_schema=ON.\s\sDbsqlfuzz\sfind. -D 2019-12-21T19:37:09.876 +C Fix\sa\sspurious\sreport\sof\scorruption\sfrom\sthe\sfts3/4\sintegrity-check\striggered\sby\susing\sthe\slanguageid\soption. +D 2019-12-21T20:43:34.290 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -81,7 +81,7 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 41acb66ad7bf74c03578efb4441204acfc2dde50dbe008b778d57273fc00e3c6 +F ext/fts3/fts3.c 52c09f459364732b5df73eff0373f991fd6af8f0f60fcdbb4b649205e88a7568 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h f091030b976045e7df91af2337935952b477cdbd9f48058c44c965684484cb50 F ext/fts3/fts3_aux.c 96708c8b3a7d9b8ca1b68ea2b7e503e283f20e95f145becadedfad096dbd0f34 @@ -981,7 +981,7 @@ F test/fts4docid.test e33c383cfbdff0284685604d256f347a18fdbf01 F test/fts4growth.test 289833c34ad45a5e6e6133b53b6a71647231fb89d36ddcb8d9c87211b6721d7f F test/fts4growth2.test 13ad4e76451af6e6906c95cdc725d01b00044269 F test/fts4incr.test 4e353a0bd886ea984e56fce9e77724fc923b8d0d -F test/fts4langid.test 2168ba330af34f8a1c8832de0aab4c4b6fa195a16419c9c0c8aad59ceb6ff714 +F test/fts4langid.test 89e623218935507bca69d076ca254a7a8969dfc681c282b6374feaea8c7de784 F test/fts4lastrowid.test 185835895948d5325c7710649824042373b2203149abe8024a9319d25234dfd7 F test/fts4merge.test e2b2ec21e287d54ec09824ccfb41e66896eeca568fc818ba0e0eb2efd94c35d2 F test/fts4merge2.test 5faa558d1b672f82b847d2a337465fa745e46891 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ea721b34477ab8b49d182352c4bc198245933b850e9b6248b4f97600e80bb44b -R 1ee05353a832e121d716fae7817e6737 -U drh -Z c87c6f8bffb8cbc230edd05dbc19e5de +P 4dbb6e1cb094f3428c74ea8bdd86ab63341fecce978a062968ca01423f382e90 +R b83529402a1382deba0ebd29b205e608 +U dan +Z f272e387242ffee6d2c1dbe670e8f4ec diff --git a/manifest.uuid b/manifest.uuid index 2c9d9909d3..428d796c17 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4dbb6e1cb094f3428c74ea8bdd86ab63341fecce978a062968ca01423f382e90 \ No newline at end of file +70815e273f511481c310dc33b3b49079901d891078fad49b663fbce06c77ecc2 \ No newline at end of file diff --git a/test/fts4langid.test b/test/fts4langid.test index 9fffe95219..45e851f940 100644 --- a/test/fts4langid.test +++ b/test/fts4langid.test @@ -489,4 +489,19 @@ foreach lid [list 4 [expr 1<<30]] { SELECT count(*) FROM t6_segments; } {1 2} } + +reset_db +do_execsql_test 6.0 { + CREATE VIRTUAL TABLE vt0 USING fts4(c0, languageid="lid"); + INSERT INTO vt0 VALUES ('a'), ('b'); + BEGIN; + UPDATE vt0 SET lid = 1 WHERE lid=0; +} +do_execsql_test 6.1 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} +do_execsql_test 6.2 { + COMMIT; + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} finish_test From 7a1d7c39682f332bd3660ea6a4ae079b9d0a8041 Mon Sep 17 00:00:00 2001 From: dan Date: Sun, 22 Dec 2019 14:29:55 +0000 Subject: [PATCH 045/120] Fix "PRAGMA data_version" so that it works the same way with locking_mode=PERSIST and journal_mode=PERSIST configured. Fix for 7a458c2a5f. FossilOrigin-Name: 45748e2db028ffbda5d3e747493721a5a89af3fbc06823081a2f27f570e40e73 --- ext/fts5/test/fts5integrity.test | 21 +++++++++++++++++++++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/pager.c | 2 +- test/pragma3.test | 29 +++++++++++++++++++++++++++++ 5 files changed, 60 insertions(+), 10 deletions(-) diff --git a/ext/fts5/test/fts5integrity.test b/ext/fts5/test/fts5integrity.test index 5b0cc95866..72cdeb3e30 100644 --- a/ext/fts5/test/fts5integrity.test +++ b/ext/fts5/test/fts5integrity.test @@ -211,6 +211,7 @@ foreach {tn pgsz} { } #------------------------------------------------------------------------- +# reset_db do_execsql_test 7.0 { PRAGMA encoding = 'UTF-16'; @@ -234,4 +235,24 @@ do_execsql_test 7.5 { INSERT INTO vt0(vt0) VALUES('integrity-check'); } +#------------------------------------------------------------------------- +# Ticket 7a458c2a5f4 +# +reset_db +do_execsql_test 8.0 { + PRAGMA locking_mode = EXCLUSIVE; + PRAGMA journal_mode = PERSIST; + CREATE VIRTUAL TABLE vt0 USING fts5(c0); +} {exclusive persist} +do_execsql_test 8.1 { + PRAGMA data_version +} {1} +do_execsql_test 8.2 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); + PRAGMA data_version; +} {1} +do_execsql_test 8.1 { + INSERT INTO vt0(vt0, rank) VALUES('usermerge', 2); +} + finish_test diff --git a/manifest b/manifest index 23ffdc1cab..e07014ccae 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sspurious\sreport\sof\scorruption\sfrom\sthe\sfts3/4\sintegrity-check\striggered\sby\susing\sthe\slanguageid\soption. -D 2019-12-21T20:43:34.290 +C Fix\s"PRAGMA\sdata_version"\sso\sthat\sit\sworks\sthe\ssame\sway\swith\slocking_mode=PERSIST\sand\sjournal_mode=PERSIST\sconfigured.\sFix\sfor\s7a458c2a5f. +D 2019-12-22T14:29:55.590 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -182,7 +182,7 @@ F ext/fts5/test/fts5first.test 3fcf2365c00a15fc9704233674789a3b95131d12de18a9b99 F ext/fts5/test/fts5full.test e1701a112354e0ff9a1fdffb0c940c576530c33732ee20ac5e8361777070d717 F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e F ext/fts5/test/fts5hash.test a4cf51acad99bfc43c16fb74f9d22495dc221ae0701fc5e908ca963a9b26a02b -F ext/fts5/test/fts5integrity.test 1bcd3c04c5ad6bc0370278281682be5d51a0f4522ef5b60b005fa1c0c7b1b433 +F ext/fts5/test/fts5integrity.test c354fd693d9fb14018b33113aa2331265d915d51f67067a2cfa7873894c9ecf0 F ext/fts5/test/fts5interrupt.test 09613247b273a99889808ef852898177e671406fe71fdde7ea00e78ea283d227 F ext/fts5/test/fts5lastrowid.test be98fe3e03235296585b72daad7aed5717ba0062bae5e5c18dd6e04e194c6b28 F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc2782680740513c4d1fc114b43d4ad @@ -514,7 +514,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 3e0e519f27683083a465e948e056759a8340728c222b5c394a135e0c57c220bc F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c d8909ace5b55a5bec49f1f1f1e67e7ac7370767507588462b723594350e2aac9 +F src/pager.c 7e371809d86b3f60d523396612b8fde4c8d3529bea90b04fad0f6be2703159a4 F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 F src/parse.y c8d2de64db469fd56e0fa24da46cd8ec8523eb98626567d2708df371b47fdc3f F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 @@ -1229,7 +1229,7 @@ F test/permutations.test 8587800fe1a0eb01456a3f4500b821e54e3347e78acf11dbf05f499 F test/pg_common.tcl 222a1bad1c41c308fa366313cd7b51b3be7e9b21c8736a421b974ac941693b54 F test/pragma.test 59becdfd720b80d463ab750f69f7118fde10dfd556aa5d554f3bf6b7e5ea7533 F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f -F test/pragma3.test 8300aa9c63cff1027006ca34bf413a148abbd6dcd471fa9a1ded322fe18c0df9 +F test/pragma3.test 92a46bbea12322dd94a404f49edcfbfc913a2c98115f0d030a7459bb4712ef31 F test/pragma4.test 10c624e45a83c0096a82a7579a5ff658542391d3b77355192da6572c8c17c00b F test/pragma5.test 2be6a44c91e8585ccb4c71c5f221ccebe0692a49557215a912916ed391188959 F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4dbb6e1cb094f3428c74ea8bdd86ab63341fecce978a062968ca01423f382e90 -R b83529402a1382deba0ebd29b205e608 +P 70815e273f511481c310dc33b3b49079901d891078fad49b663fbce06c77ecc2 +R 254486cb7cd7eb5a4fcc43372628c39f U dan -Z f272e387242ffee6d2c1dbe670e8f4ec +Z 082036cd560f1b9b274ae0feb81ed118 diff --git a/manifest.uuid b/manifest.uuid index 428d796c17..3d4b0b06f9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -70815e273f511481c310dc33b3b49079901d891078fad49b663fbce06c77ecc2 \ No newline at end of file +45748e2db028ffbda5d3e747493721a5a89af3fbc06823081a2f27f570e40e73 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 3cd0835b5a..844ecf804c 100644 --- a/src/pager.c +++ b/src/pager.c @@ -6627,6 +6627,7 @@ int sqlite3PagerCommitPhaseTwo(Pager *pPager){ ** But if (due to a coding error elsewhere in the system) it does get ** called, just return the same error code without doing anything. */ if( NEVER(pPager->errCode) ) return pPager->errCode; + pPager->iDataVersion++; assert( pPager->eState==PAGER_WRITER_LOCKED || pPager->eState==PAGER_WRITER_FINISHED @@ -6655,7 +6656,6 @@ int sqlite3PagerCommitPhaseTwo(Pager *pPager){ } PAGERTRACE(("COMMIT %d\n", PAGERID(pPager))); - pPager->iDataVersion++; rc = pager_end_transaction(pPager, pPager->setMaster, 1); return pager_error(pPager, rc); } diff --git a/test/pragma3.test b/test/pragma3.test index eebbcbb9c6..c4794c743c 100644 --- a/test/pragma3.test +++ b/test/pragma3.test @@ -255,4 +255,33 @@ if {[permutation]!="inmemory_journal"} { } } +#------------------------------------------------------------------------- +# Check that empty write transactions do not cause the return of "PRAGMA +# data_version" to be decremented with journal_mode=PERSIST and +# locking_mode=EXCLUSIVE +# +foreach {tn sql} { + A { + } + B { + PRAGMA journal_mode = PERSIST; + PRAGMA locking_mode = EXCLUSIVE; + } +} { + reset_db + execsql $sql + + do_execsql_test pragma3-510$tn { + CREATE TABLE t1(x, y); + INSERT INTO t1 VALUES(1, 2); + PRAGMA data_version; + } {1} + + do_execsql_test pragma3-520$tn { + BEGIN EXCLUSIVE; + COMMIT; + PRAGMA data_version; + } {1} +} + finish_test From 69843342de6612381c4388fa94c1e87909ec57f0 Mon Sep 17 00:00:00 2001 From: dan Date: Sun, 22 Dec 2019 17:32:25 +0000 Subject: [PATCH 046/120] Ensure sqlite3WindowRewrite() is called on a SELECT statement before any terms aremoved from it as part of IN() clause processing. Fix for [f00d096ca]. FossilOrigin-Name: 8c856404b4e98d295449a4e89a41495dc007319a8e9c35c1a763718d7c5f67e8 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/wherecode.c | 20 +++++++++++++++++++- test/window2.tcl | 15 +++++++++++++++ test/window2.test | 17 +++++++++++++++++ test/windowfault.test | 19 ++++++++++++++++++- 6 files changed, 79 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index e07014ccae..b880fbc55b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\s"PRAGMA\sdata_version"\sso\sthat\sit\sworks\sthe\ssame\sway\swith\slocking_mode=PERSIST\sand\sjournal_mode=PERSIST\sconfigured.\sFix\sfor\s7a458c2a5f. -D 2019-12-22T14:29:55.590 +C Ensure\ssqlite3WindowRewrite()\sis\scalled\son\sa\sSELECT\sstatement\sbefore\sany\sterms\saremoved\sfrom\sit\sas\spart\sof\sIN()\sclause\sprocessing.\sFix\sfor\s[f00d096ca]. +D 2019-12-22T17:32:25.133 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -615,7 +615,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d F src/where.c c51ebd505c8417285ca1db8f94933a12224bf636ad93f27d821c07f93d59c035 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 -F src/wherecode.c 9c2757cb4380104f4e230a8c68e219da0289f9f2d050bff1923ba50991ea64e1 +F src/wherecode.c 9c274ea84ef8519b37852038fbd610b47f11cf8aaf7651f10125c445fa5a61bd F src/whereexpr.c 989235ee5fade9663a01d9443763a82ba5a72619bf3edda67ebd043936d33575 F src/window.c da010455914c81037dcb5b0c6f4273f8a32c94567865c46a60060b937b018a96 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1714,8 +1714,8 @@ F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc F test/window1.test 29efd3d6c18ea920ae6493f26cae3fc5724912ee049fd3d8eb61753660052f70 -F test/window2.tcl 66db96fd9fd202bc31ee7f8ce7904cb469564864cff3f74e009bfef8102333f4 -F test/window2.test af2a001ded703bb8f2474fb0edfef170d5aba00f5c1f2aa9f65935b5da13df90 +F test/window2.tcl 114b217d4ffff891142023cc5f3131b0dae3ad149ac4b45a6ed9e2ad943f8ce2 +F test/window2.test dea2ffecb7182a385143ea0eb368b6241ee43c5f971f4ad1c4337029cb1fc10a F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 F test/window3.test e9959a993c8a71e96433be8daaa1827d78b8921e4f12debd7bdbeb3c856ef3cb F test/window4.tcl d732df0e81beedc0ba8a563ade68611d322d27303ad0c0c8e4444107c39e84ec @@ -1731,7 +1731,7 @@ F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af F test/windowB.test 7a983ea1cc1cf72be7f378e4b32f6cb2d73014c5cd8b25aaee825164cd4269e5 F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b -F test/windowfault.test a90b397837209f15e54afa62e8be39b2759a0101fae04e05a08bcc50e243a452 +F test/windowfault.test 8e3b69abe0eea9595ba3940afd9c63644e11966ed8815734b67f1479a8e9891a F test/with1.test d32792084dcb5f6c047d77bb8a032822ef9fe050ade07d0aeffa37753a05e3c9 F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab F test/with3.test 7de8dff2891aca0f9453463e4a2d6eb995baf137827d5596116fee53e22a4e29 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 70815e273f511481c310dc33b3b49079901d891078fad49b663fbce06c77ecc2 -R 254486cb7cd7eb5a4fcc43372628c39f +P 45748e2db028ffbda5d3e747493721a5a89af3fbc06823081a2f27f570e40e73 +R da73e6a7c2e1e070e501423e7260ad93 U dan -Z 082036cd560f1b9b274ae0feb81ed118 +Z 34811b059bbbc145cba165593b2e2e94 diff --git a/manifest.uuid b/manifest.uuid index 3d4b0b06f9..e796154ee8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -45748e2db028ffbda5d3e747493721a5a89af3fbc06823081a2f27f570e40e73 \ No newline at end of file +8c856404b4e98d295449a4e89a41495dc007319a8e9c35c1a763718d7c5f67e8 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index a054a930f6..a8ef581da3 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -415,7 +415,25 @@ static Expr *removeUnindexableInClauseTerms( Expr *pX /* The IN expression to be reduced */ ){ sqlite3 *db = pParse->db; - Expr *pNew = sqlite3ExprDup(db, pX, 0); + Expr *pNew; +#ifndef SQLITE_OMIT_WINDOWFUNC + /* The SELECT statement at pX->x.pSelect has already been resolved. This + ** means that its window functions have already been identified and + ** linked into the Select.pWin list. However, if there are multiple + ** window functions and they do not all use the same window frame, only + ** those that use the same window frame as the first resolved are listed + ** in Select.pWin. Any others are delegated to sub-selects created by the + ** call to sqlite3WindowRewrite() made when coding the SELECT statement. + ** But - sqlite3WindowRewrite() is a no-op if Select.pWin==0. And if + ** removing the unindexable terms happens to remove all window functions + ** in the Select.pWin list, then Select.pWin ends up set to NULL - meaning + ** that the other window functions are never processed. To work around + ** this, ensure that sqlite3WindowRewrite() has been called to create the + ** required sub-selects before the unindexable terms are removed. See + ** ticket #f00d096ca. */ + if( sqlite3WindowRewrite(pParse, pX->x.pSelect) ) return 0; +#endif + pNew = sqlite3ExprDup(db, pX, 0); if( db->mallocFailed==0 ){ ExprList *pOrigRhs = pNew->x.pSelect->pEList; /* Original unmodified RHS */ ExprList *pOrigLhs = pNew->pLeft->x.pList; /* Original unmodified LHS */ diff --git a/test/window2.tcl b/test/window2.tcl index 5edc536808..7711a844c6 100644 --- a/test/window2.tcl +++ b/test/window2.tcl @@ -448,6 +448,21 @@ execsql_float_test 5.1 { SELECT avg(x) OVER (ORDER BY y) AS z FROM t1 ORDER BY z; } +========== + +execsql_test 6.0 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0(c0 INTEGER UNIQUE); + INSERT INTO t0 VALUES(0); +} +execsql_test 6.1 { + SELECT DENSE_RANK() OVER(), LAG(0) OVER() FROM t0; +} +execsql_test 6.2 { + SELECT * FROM t0 WHERE + (0, t0.c0) IN (SELECT DENSE_RANK() OVER(), LAG(0) OVER() FROM t0); +} + finish_test diff --git a/test/window2.test b/test/window2.test index 5f028eb72d..2d4d3e8dbd 100644 --- a/test/window2.test +++ b/test/window2.test @@ -930,4 +930,21 @@ do_test 5.1 { set {} {} } {} +#========================================================================== + +do_execsql_test 6.0 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0(c0 INTEGER UNIQUE); + INSERT INTO t0 VALUES(0); +} {} + +do_execsql_test 6.1 { + SELECT DENSE_RANK() OVER(), LAG(0) OVER() FROM t0; +} {1 {}} + +do_execsql_test 6.2 { + SELECT * FROM t0 WHERE + (0, t0.c0) IN (SELECT DENSE_RANK() OVER(), LAG(0) OVER() FROM t0); +} {} + finish_test diff --git a/test/windowfault.test b/test/windowfault.test index e037c467b0..e97544f4c8 100644 --- a/test/windowfault.test +++ b/test/windowfault.test @@ -230,7 +230,7 @@ do_execsql_test 10.0 { CREATE TABLE t2(a, b, c, d); } -do_faultsim_test 1 -faults oom* -prep { +do_faultsim_test 10 -faults oom* -prep { } -body { execsql { SELECT row_number() OVER win @@ -246,4 +246,21 @@ do_faultsim_test 1 -faults oom* -prep { faultsim_test_result {0 {}} } +reset_db +do_execsql_test 11.0 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0(c0 INTEGER UNIQUE); + INSERT INTO t0 VALUES(0); +} {} + +do_faultsim_test 11 -faults oom* -prep { +} -body { + execsql { + SELECT * FROM t0 WHERE + (0, t0.c0) IN (SELECT DENSE_RANK() OVER(), LAG(0) OVER() FROM t0); + } +} -test { + faultsim_test_result {0 {}} +} + finish_test From 9524a7ea9f7c693bd03f8a0df3fdea0d441473d1 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 22 Dec 2019 18:06:49 +0000 Subject: [PATCH 047/120] When parsing a CREATE TABLE from the sqlite_master table, delete the CHECK constraints if there are any errors, since there might otherwise be attempts to use those CHECK constraints if PRAGMA writable_schema=ON is set. This undoes the fix in check-in [ea721b34477ab8b4] for a more general solution. FossilOrigin-Name: a982e6434cd66bfbe94d455f538bcbc4360b91572062d92acae6b77e9560e65d --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/build.c | 6 ++++++ src/expr.c | 14 ++++---------- test/fuzzdata8.db | Bin 1570816 -> 1571840 bytes 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index b880fbc55b..603feeb264 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\ssqlite3WindowRewrite()\sis\scalled\son\sa\sSELECT\sstatement\sbefore\sany\sterms\saremoved\sfrom\sit\sas\spart\sof\sIN()\sclause\sprocessing.\sFix\sfor\s[f00d096ca]. -D 2019-12-22T17:32:25.133 +C When\sparsing\sa\sCREATE\sTABLE\sfrom\sthe\ssqlite_master\stable,\sdelete\sthe\sCHECK\nconstraints\sif\sthere\sare\sany\serrors,\ssince\sthere\smight\sotherwise\sbe\sattempts\nto\suse\sthose\sCHECK\sconstraints\sif\sPRAGMA\swritable_schema=ON\sis\sset.\nThis\sundoes\sthe\sfix\sin\scheck-in\s[ea721b34477ab8b4]\sfor\sa\smore\sgeneral\nsolution. +D 2019-12-22T18:06:49.107 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -471,7 +471,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 716fc9bd12eb7d35e3d66c5c2c81c37df3fdae49cd25bceaff4e7d702d513d80 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c 358e894867394839679982d2fe320fb44fd17c94a87feb898aa066c15a8066ea +F src/build.c 1d999886fa656e6211e14d5402a6f92cadbdaa5d2f4f0597c797f7818d510e33 F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c d1031aaefc3d8697f30f418494ec491e729c2423af7f426041bb7525c41d3ad5 +F src/expr.c b7f3be57e7e6d2d93152cf9313e34f44fa74d3e1f16551c32dabb6be33365f41 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1017,7 +1017,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db 0e29cbd9b2a34aadd76fb5be963e810f61545487ccb44503e5335acb1634338e +F test/fuzzdata8.db f8da99ea7e57a436e300e59b2d5ad0d0f765fcb0468b2c1b1f9b9f03d928e0ef F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 45748e2db028ffbda5d3e747493721a5a89af3fbc06823081a2f27f570e40e73 -R da73e6a7c2e1e070e501423e7260ad93 -U dan -Z 34811b059bbbc145cba165593b2e2e94 +P 8c856404b4e98d295449a4e89a41495dc007319a8e9c35c1a763718d7c5f67e8 +R 97d0a9b1a5feca02a10db862b5a0b13b +U drh +Z 7d30adc64d69bc3b030c80c2e1486537 diff --git a/manifest.uuid b/manifest.uuid index e796154ee8..c082951d96 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8c856404b4e98d295449a4e89a41495dc007319a8e9c35c1a763718d7c5f67e8 \ No newline at end of file +a982e6434cd66bfbe94d455f538bcbc4360b91572062d92acae6b77e9560e65d \ No newline at end of file diff --git a/src/build.c b/src/build.c index 4fa27e5c50..0c8ec9304b 100644 --- a/src/build.c +++ b/src/build.c @@ -2243,6 +2243,12 @@ void sqlite3EndTable( */ if( p->pCheck ){ sqlite3ResolveSelfReference(pParse, p, NC_IsCheck, 0, p->pCheck); + if( pParse->nErr ){ + /* If errors are seen, delete the CHECK constraints now, else they might + ** actually be used if PRAGMA writable_schema=ON is set. */ + sqlite3ExprListDelete(db, p->pCheck); + p->pCheck = 0; + } } #endif /* !defined(SQLITE_OMIT_CHECK) */ #ifndef SQLITE_OMIT_GENERATED_COLUMNS diff --git a/src/expr.c b/src/expr.c index 21fa97d8ec..9603ff45e8 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3649,11 +3649,6 @@ expr_code_doover: Table *pTab = pExpr->y.pTab; int iSrc; int iCol = pExpr->iColumn; - if( pTab==0 ){ - assert( CORRUPT_DB ); - sqlite3VdbeAddOp2(v, OP_Null, 0, target); - return target; - } assert( pTab!=0 ); assert( iCol>=XN_ROWID ); assert( iColnCol ); @@ -3722,10 +3717,9 @@ expr_code_doover: default: { /* Make NULL the default case so that if a bug causes an illegal ** Expr node to be passed into this function, it will be handled - ** sanely and not crash. This comes up, for example, if a corrupt - ** database schema is loaded using PRAGMA writable_schema=ON. */ - assert( op==TK_NULL || CORRUPT_DB ); - testcase( op!=TK_NULL ); + ** sanely and not crash. But keep the assert() to bring the problem + ** to the attention of the developers. */ + assert( op==TK_NULL ); sqlite3VdbeAddOp2(v, OP_Null, 0, target); return target; } @@ -3752,7 +3746,7 @@ expr_code_doover: sqlite3VdbeAddOp2(v, OP_Variable, pExpr->iColumn, target); if( pExpr->u.zToken[1]!=0 ){ const char *z = sqlite3VListNumToName(pParse->pVList, pExpr->iColumn); - assert( pExpr->u.zToken[0]=='?' || strcmp(pExpr->u.zToken, z)==0 ); + assert( pExpr->u.zToken[0]=='?' || (z && !strcmp(pExpr->u.zToken, z)) ); pParse->pVList[0] = 0; /* Indicate VList may no longer be enlarged */ sqlite3VdbeAppendP4(v, (char*)z, P4_STATIC); } diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 15eb1017a4b1005d1ea1136c7ca2000b2b5a1841..8dd6e3a8f12d74bae0614e769de5a157e94cafbe 100644 GIT binary patch delta 4354 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 From db1954be0a639168403ec69639b19e955fc2204d Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 22 Dec 2019 18:23:30 +0000 Subject: [PATCH 048/120] Back out the asserts of check-ins [a500893b6f64aced] and [d9c9fe9f5ad3fc91] as ticket [1b06916e01c82b66] demonstrates a case that refutes them. FossilOrigin-Name: ddb17d92df194337a103c561ef46ced00db5e67e4551e82de7cb5ad7f457dd5f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 7 +------ 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 603feeb264..5d6992fda0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sparsing\sa\sCREATE\sTABLE\sfrom\sthe\ssqlite_master\stable,\sdelete\sthe\sCHECK\nconstraints\sif\sthere\sare\sany\serrors,\ssince\sthere\smight\sotherwise\sbe\sattempts\nto\suse\sthose\sCHECK\sconstraints\sif\sPRAGMA\swritable_schema=ON\sis\sset.\nThis\sundoes\sthe\sfix\sin\scheck-in\s[ea721b34477ab8b4]\sfor\sa\smore\sgeneral\nsolution. -D 2019-12-22T18:06:49.107 +C Back\sout\sthe\sasserts\sof\scheck-ins\s[a500893b6f64aced]\sand\s[d9c9fe9f5ad3fc91]\nas\sticket\s[1b06916e01c82b66]\sdemonstrates\sa\scase\sthat\srefutes\sthem. +D 2019-12-22T18:23:30.350 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -599,7 +599,7 @@ F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c c1e35ead7ef20b5cfedd30c45b9b7eceb7fa88145bf46c11c528775318e78950 +F src/vdbe.c a5883b94f3c300c721422f2df9da531dcf02c9edc804663ebf6820600826ccde F src/vdbe.h fdbc0a11e5768a702b46ce63286f60e22e71351a29bd98b3666405e1fccc7802 F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8c856404b4e98d295449a4e89a41495dc007319a8e9c35c1a763718d7c5f67e8 -R 97d0a9b1a5feca02a10db862b5a0b13b +P a982e6434cd66bfbe94d455f538bcbc4360b91572062d92acae6b77e9560e65d +R 04ec53e6dc7d44d1c22aa14f44994155 U drh -Z 7d30adc64d69bc3b030c80c2e1486537 +Z b849b4ce029d462a595dd5bf3b2ce973 diff --git a/manifest.uuid b/manifest.uuid index c082951d96..eb1aa519b0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a982e6434cd66bfbe94d455f538bcbc4360b91572062d92acae6b77e9560e65d \ No newline at end of file +ddb17d92df194337a103c561ef46ced00db5e67e4551e82de7cb5ad7f457dd5f \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 2b5686cd63..030c263b0d 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2028,12 +2028,7 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ if( (flags1 | flags3)&MEM_Str ){ if( (flags1 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){ applyNumericAffinity(pIn1,0); - assert( flags3==pIn3->flags ); - /* testcase( flags3!=pIn3->flags ); - ** this used to be possible with pIn1==pIn3, but not since - ** the column cache was removed. The following assignment - ** is essentially a no-op. But, it provides defense-in-depth - ** in case our analysis is incorrect, so it is left in. */ + testcase( flags3!=pIn3->flags ); flags3 = pIn3->flags; } if( (flags3 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){ From 6c1c85ca483154aafa41883253a941f196fa6d03 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 22 Dec 2019 18:55:04 +0000 Subject: [PATCH 049/120] Fix to the optimization of check-in [a47efb7c8520a011] that reads the values of expressions used in an index-on-expression directly from the index rather than recomputing the value. If the expression has a top-level COLLATE or unlikely() operator, be sure to clear the corresponding flags prior to converting it into a TK_COLUMN expression. Failure to do this is most likely harmless in production, but might cause an assertion fault in debugging builds. Ticket [b0cb8aff561a6dcd]. Test cases in TH3. FossilOrigin-Name: 56539e1c132632c075efc217ad5951a35e4459605ac128914aec3a7be1e25718 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 3 +++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 5d6992fda0..ea8f8b7844 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Back\sout\sthe\sasserts\sof\scheck-ins\s[a500893b6f64aced]\sand\s[d9c9fe9f5ad3fc91]\nas\sticket\s[1b06916e01c82b66]\sdemonstrates\sa\scase\sthat\srefutes\sthem. -D 2019-12-22T18:23:30.350 +C Fix\sto\sthe\soptimization\sof\scheck-in\s[a47efb7c8520a011]\sthat\sreads\sthe\svalues\nof\sexpressions\sused\sin\san\sindex-on-expression\sdirectly\sfrom\sthe\sindex\srather\nthan\srecomputing\sthe\svalue.\s\sIf\sthe\sexpression\shas\sa\stop-level\sCOLLATE\sor\nunlikely()\soperator,\sbe\ssure\sto\sclear\sthe\scorresponding\sflags\sprior\sto\nconverting\sit\sinto\sa\sTK_COLUMN\sexpression.\s\sFailure\sto\sdo\sthis\sis\smost\slikely\nharmless\sin\sproduction,\sbut\smight\scause\san\sassertion\sfault\sin\sdebugging\sbuilds.\nTicket\s[b0cb8aff561a6dcd].\s\sTest\scases\sin\sTH3. +D 2019-12-22T18:55:04.170 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -615,7 +615,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d F src/where.c c51ebd505c8417285ca1db8f94933a12224bf636ad93f27d821c07f93d59c035 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 -F src/wherecode.c 9c274ea84ef8519b37852038fbd610b47f11cf8aaf7651f10125c445fa5a61bd +F src/wherecode.c c4cb79b7c93d0f4ec93d9d84d10deb61053c8563c12b244292c14f9ad1032093 F src/whereexpr.c 989235ee5fade9663a01d9443763a82ba5a72619bf3edda67ebd043936d33575 F src/window.c da010455914c81037dcb5b0c6f4273f8a32c94567865c46a60060b937b018a96 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a982e6434cd66bfbe94d455f538bcbc4360b91572062d92acae6b77e9560e65d -R 04ec53e6dc7d44d1c22aa14f44994155 +P ddb17d92df194337a103c561ef46ced00db5e67e4551e82de7cb5ad7f457dd5f +R 19b03f420b018ba3e702a8b1fc6e710f U drh -Z b849b4ce029d462a595dd5bf3b2ce973 +Z 7a13e581226b652e9598d2193dc4abae diff --git a/manifest.uuid b/manifest.uuid index eb1aa519b0..61d33c1966 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ddb17d92df194337a103c561ef46ced00db5e67e4551e82de7cb5ad7f457dd5f \ No newline at end of file +56539e1c132632c075efc217ad5951a35e4459605ac128914aec3a7be1e25718 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index a8ef581da3..2f2a27271b 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1145,6 +1145,9 @@ static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ pExpr->iTable = pX->iIdxCur; pExpr->iColumn = pX->iIdxCol; pExpr->y.pTab = 0; + testcase( ExprHasProperty(pExpr, EP_Skip) ); + testcase( ExprHasProperty(pExpr, EP_Unlikely) ); + ExprClearProperty(pExpr, EP_Skip|EP_Unlikely); return WRC_Prune; }else{ return WRC_Continue; From d262c2db8f6ac584d377b347a0dd810f998cbd93 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 22 Dec 2019 19:41:12 +0000 Subject: [PATCH 050/120] In the WHERE clause debugging output (the .wheretrace output) show the parent index of any WhereTerm that is a child. FossilOrigin-Name: 7fc733328c5914c747e048c830522ec13e433c0a86388bae47b198a3e220c6c2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 8 +++++--- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index ea8f8b7844..b4b3b8b6c3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sto\sthe\soptimization\sof\scheck-in\s[a47efb7c8520a011]\sthat\sreads\sthe\svalues\nof\sexpressions\sused\sin\san\sindex-on-expression\sdirectly\sfrom\sthe\sindex\srather\nthan\srecomputing\sthe\svalue.\s\sIf\sthe\sexpression\shas\sa\stop-level\sCOLLATE\sor\nunlikely()\soperator,\sbe\ssure\sto\sclear\sthe\scorresponding\sflags\sprior\sto\nconverting\sit\sinto\sa\sTK_COLUMN\sexpression.\s\sFailure\sto\sdo\sthis\sis\smost\slikely\nharmless\sin\sproduction,\sbut\smight\scause\san\sassertion\sfault\sin\sdebugging\sbuilds.\nTicket\s[b0cb8aff561a6dcd].\s\sTest\scases\sin\sTH3. -D 2019-12-22T18:55:04.170 +C In\sthe\sWHERE\sclause\sdebugging\soutput\s(the\s.wheretrace\soutput)\sshow\sthe\nparent\sindex\sof\sany\sWhereTerm\sthat\sis\sa\schild. +D 2019-12-22T19:41:12.776 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -613,7 +613,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 15a2845769f51ba132f9cf0b2c7a6887a91fc8437892dbcce9fcdc68b66d60a1 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d -F src/where.c c51ebd505c8417285ca1db8f94933a12224bf636ad93f27d821c07f93d59c035 +F src/where.c 25653002490b093b9b752f30ad92b307464b099ad081c4d2fb524719427403f2 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c c4cb79b7c93d0f4ec93d9d84d10deb61053c8563c12b244292c14f9ad1032093 F src/whereexpr.c 989235ee5fade9663a01d9443763a82ba5a72619bf3edda67ebd043936d33575 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ddb17d92df194337a103c561ef46ced00db5e67e4551e82de7cb5ad7f457dd5f -R 19b03f420b018ba3e702a8b1fc6e710f +P 56539e1c132632c075efc217ad5951a35e4459605ac128914aec3a7be1e25718 +R 45007407428301c1a58df1c2c813a372 U drh -Z 7a13e581226b652e9598d2193dc4abae +Z 0ac03f55dc296429a8d1ce916ad4c404 diff --git a/manifest.uuid b/manifest.uuid index 61d33c1966..27ceaf39ac 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -56539e1c132632c075efc217ad5951a35e4459605ac128914aec3a7be1e25718 \ No newline at end of file +7fc733328c5914c747e048c830522ec13e433c0a86388bae47b198a3e220c6c2 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 6a05d0c4da..7d34787696 100644 --- a/src/where.c +++ b/src/where.c @@ -1762,10 +1762,12 @@ static void whereTermPrint(WhereTerm *pTerm, int iTerm){ iTerm, pTerm, zType, zLeft, pTerm->truthProb, pTerm->eOperator, pTerm->wtFlags); if( pTerm->iField ){ - sqlite3DebugPrintf(" iField=%d\n", pTerm->iField); - }else{ - sqlite3DebugPrintf("\n"); + sqlite3DebugPrintf(" iField=%d", pTerm->iField); } + if( pTerm->iParent>=0 ){ + sqlite3DebugPrintf(" iParent=%d", pTerm->iParent); + } + sqlite3DebugPrintf("\n"); sqlite3TreeViewExpr(0, pTerm->pExpr, 0); } } From 6e827fa27de5aa52bff6067e8051f01c019e5d27 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 22 Dec 2019 20:03:29 +0000 Subject: [PATCH 051/120] When constructing the virtual MATCH term of the WHERE clause for a virtual table that is in a LEFT JOIN, be sure to set the correct Expr.iRightJoinTable value. This value does not appear to ever be used, except inside of a single assert(). But it is good to set it correctly, nevertheless. This fixes ticket [7929c1efb2d67e98], which as far as I can tell is completely harmless. FossilOrigin-Name: ef604882a275d3d5ebd4d5a08e3fe43e148f169b7d5c3a81464fbe7f54f3582a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/whereexpr.c | 1 + test/join.test | 14 ++++++++++++++ 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index b4b3b8b6c3..7a4a7f2e9e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sWHERE\sclause\sdebugging\soutput\s(the\s.wheretrace\soutput)\sshow\sthe\nparent\sindex\sof\sany\sWhereTerm\sthat\sis\sa\schild. -D 2019-12-22T19:41:12.776 +C When\sconstructing\sthe\svirtual\sMATCH\sterm\sof\sthe\sWHERE\sclause\sfor\sa\svirtual\ntable\sthat\sis\sin\sa\sLEFT\sJOIN,\sbe\ssure\sto\sset\sthe\scorrect\sExpr.iRightJoinTable\nvalue.\s\sThis\svalue\sdoes\snot\sappear\sto\sever\sbe\sused,\sexcept\sinside\sof\sa\ssingle\nassert().\s\sBut\sit\sis\sgood\sto\sset\sit\scorrectly,\snevertheless.\s\sThis\sfixes\nticket\s[7929c1efb2d67e98],\swhich\sas\sfar\sas\sI\scan\stell\sis\scompletely\sharmless. +D 2019-12-22T20:03:29.348 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -616,7 +616,7 @@ F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d F src/where.c 25653002490b093b9b752f30ad92b307464b099ad081c4d2fb524719427403f2 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c c4cb79b7c93d0f4ec93d9d84d10deb61053c8563c12b244292c14f9ad1032093 -F src/whereexpr.c 989235ee5fade9663a01d9443763a82ba5a72619bf3edda67ebd043936d33575 +F src/whereexpr.c 3d0ff098154bbd96d8e0982b71b9ebae4017d01f409ff518c9417e9607b69689 F src/window.c da010455914c81037dcb5b0c6f4273f8a32c94567865c46a60060b937b018a96 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1084,7 +1084,7 @@ F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b F test/istrue.test 75327829744e65cc8700e69340b8e6c192e10e39dfae7ccb0e970d3c4f49090a -F test/join.test 99e1d82fada7a1df9002a7b1160bd231c91077b9372492d5e18bfa1d1694d43c +F test/join.test d7e315cd05f03d442c22bb5506edff2e688d27e6e10c91657daf48a08b8573fe F test/join2.test 10f7047e723ebd68b2f47189be8eed20451a6f665d8bf46f1774c640d1062417 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 56539e1c132632c075efc217ad5951a35e4459605ac128914aec3a7be1e25718 -R 45007407428301c1a58df1c2c813a372 +P 7fc733328c5914c747e048c830522ec13e433c0a86388bae47b198a3e220c6c2 +R 35709e798d183e48c9968b7861e639d6 U drh -Z 0ac03f55dc296429a8d1ce916ad4c404 +Z 77efee16c8a9a17028736710581eb2ca diff --git a/manifest.uuid b/manifest.uuid index 27ceaf39ac..fc715d0d55 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7fc733328c5914c747e048c830522ec13e433c0a86388bae47b198a3e220c6c2 \ No newline at end of file +ef604882a275d3d5ebd4d5a08e3fe43e148f169b7d5c3a81464fbe7f54f3582a \ No newline at end of file diff --git a/src/whereexpr.c b/src/whereexpr.c index a3d5e94f07..d16f89a7b2 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -1298,6 +1298,7 @@ static void exprAnalyze( 0, sqlite3ExprDup(db, pRight, 0)); if( ExprHasProperty(pExpr, EP_FromJoin) && pNewExpr ){ ExprSetProperty(pNewExpr, EP_FromJoin); + pNewExpr->iRightJoinTable = pExpr->iRightJoinTable; } idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); testcase( idxNew==0 ); diff --git a/test/join.test b/test/join.test index 3b8936fc0e..5b6f63d5ad 100644 --- a/test/join.test +++ b/test/join.test @@ -988,4 +988,18 @@ do_execsql_test join-22.10 { SELECT DISTINCT c FROM t0 LEFT JOIN (SELECT a+1 AS c FROM t0) ORDER BY c ; } {11} +# 2019-12-22 ticket 7929c1efb2d67e98 +# +reset_db +do_execsql_test join-23.10 { + CREATE TABLE t0(c0); + INSERT INTO t0(c0) VALUES(123); + CREATE VIEW v0(c0) AS SELECT 0 GROUP BY 1; + SELECT t0.c0, v0.c0, vt0.name + FROM v0, t0 LEFT JOIN pragma_table_info('t0') AS vt0 + ON vt0.name LIKE 'c0' + WHERE v0.c0 == 0; +} {123 0 c0} + + finish_test From 5d762b2d1d5abc0fe8f438ee7e588bb29f830ab8 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 22 Dec 2019 20:29:25 +0000 Subject: [PATCH 052/120] Make a hard copy of strings in constraint checks prior to applying OP_RealAffinity, to avoid problems with a pointer accounting assert. This change is not strictly necessary - the correct answer is obtained without it and no UB occurs - however the pointer accounting asserts are useful to prevent other problems so it is a simple matter to bring this piece into compliance. Ticket [5ad2aa6921faa1ee] FossilOrigin-Name: 89a9dad6330270a4c3b962f86a208088d2ea9883c7d291351a77f058e0ed8b0c --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 2 +- test/update.test | 16 +++++++++++++++- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 7a4a7f2e9e..9a6b33a79f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sconstructing\sthe\svirtual\sMATCH\sterm\sof\sthe\sWHERE\sclause\sfor\sa\svirtual\ntable\sthat\sis\sin\sa\sLEFT\sJOIN,\sbe\ssure\sto\sset\sthe\scorrect\sExpr.iRightJoinTable\nvalue.\s\sThis\svalue\sdoes\snot\sappear\sto\sever\sbe\sused,\sexcept\sinside\sof\sa\ssingle\nassert().\s\sBut\sit\sis\sgood\sto\sset\sit\scorrectly,\snevertheless.\s\sThis\sfixes\nticket\s[7929c1efb2d67e98],\swhich\sas\sfar\sas\sI\scan\stell\sis\scompletely\sharmless. -D 2019-12-22T20:03:29.348 +C Make\sa\shard\scopy\sof\sstrings\sin\sconstraint\schecks\sprior\sto\sapplying\nOP_RealAffinity,\sto\savoid\sproblems\swith\sa\spointer\saccounting\sassert.\nThis\schange\sis\snot\sstrictly\snecessary\s-\sthe\scorrect\sanswer\sis\sobtained\nwithout\sit\sand\sno\sUB\soccurs\s-\showever\sthe\spointer\saccounting\sasserts\sare\nuseful\sto\sprevent\sother\sproblems\sso\sit\sis\sa\ssimple\smatter\sto\sbring\sthis\npiece\sinto\scompliance.\s\sTicket\s[5ad2aa6921faa1ee] +D 2019-12-22T20:29:25.187 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c b7f3be57e7e6d2d93152cf9313e34f44fa74d3e1f16551c32dabb6be33365f41 +F src/expr.c 59c52601a6276a1da8d871f878f9423128e35954a13e1aa4157255f32a31a6f9 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1604,7 +1604,7 @@ F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2 F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97 F test/unordered.test ffeea7747d5ba962a8009a20b7e53d68cbae05b063604c68702c5998eb50c981 -F test/update.test 6a1193fbcb4546b4467d24635b1504b8e746b41d3b66dc6ace07581a62ce58fb +F test/update.test 127fc037887808a9ff2d6a7dd9e524c215c939d15f8878dd3ee0169ad50f7b19 F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 F test/upsert1.test 0b740c8488fd2f5a06ac317c9913f7ef1eda8282f2db58b544b89480c51efab3 F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7fc733328c5914c747e048c830522ec13e433c0a86388bae47b198a3e220c6c2 -R 35709e798d183e48c9968b7861e639d6 +P ef604882a275d3d5ebd4d5a08e3fe43e148f169b7d5c3a81464fbe7f54f3582a +R 0f642e7ac4e801ecd80846fa4200e152 U drh -Z 77efee16c8a9a17028736710581eb2ca +Z 76d5702a8b98bb19970567fedd1c9377 diff --git a/manifest.uuid b/manifest.uuid index fc715d0d55..35d9750785 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ef604882a275d3d5ebd4d5a08e3fe43e148f169b7d5c3a81464fbe7f54f3582a \ No newline at end of file +89a9dad6330270a4c3b962f86a208088d2ea9883c7d291351a77f058e0ed8b0c \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 9603ff45e8..1536c5073e 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3674,7 +3674,7 @@ expr_code_doover: }else #endif /* SQLITE_OMIT_GENERATED_COLUMNS */ if( pCol->affinity==SQLITE_AFF_REAL ){ - sqlite3VdbeAddOp2(v, OP_SCopy, iSrc, target); + sqlite3VdbeAddOp2(v, OP_Copy, iSrc, target); sqlite3VdbeAddOp1(v, OP_RealAffinity, target); return target; }else{ diff --git a/test/update.test b/test/update.test index 76aba65cda..8b96b6658b 100644 --- a/test/update.test +++ b/test/update.test @@ -656,6 +656,20 @@ do_execsql_test update-17.10 { SELECT * FROM t1; } {2 3} - +# 2019-12-22 ticket 5ad2aa6921faa1ee +# Make a hard-copy of values that need to be run through OP_RealAffinity +# rather than a soft-copy. This is not strictly necessary, but it avoids +# a memory-accounting assert(). +# +reset_db +do_execsql_test update-18.10 { + PRAGMA encoding = 'UTF16'; + CREATE TABLE t0(c0 REAL, c1); + INSERT INTO t0(c0,c1) VALUES('xyz',11),('uvw',22); + CREATE INDEX i0 ON t0(c1) WHERE c0 GLOB 3; + CREATE INDEX i1 ON t0(c0,c1) WHERE typeof(c0)='text' AND typeof(c1)='integer'; + UPDATE t0 SET c1=345; + SELECT * FROM t0; +} {xyz 345 uvw 345} finish_test From 4799488e163c02508894a7c71f256605f45d9645 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 22 Dec 2019 23:48:36 +0000 Subject: [PATCH 053/120] Change the code generator for the IN operator so that it avoids creating OP_Eq and OP_Ne opcode with the same P1 and P3 arguments. This enables us to back out check-in [ddb17d92df194337] and also fix ticket [188f912b51cd802]. FossilOrigin-Name: 9ab985a9c8160b905730678f40ed440a246cdec549c798bafefaed5abbc0437f --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 16 +++++++++++----- src/vdbe.c | 7 ++++++- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 9a6b33a79f..d6d5fbd324 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sa\shard\scopy\sof\sstrings\sin\sconstraint\schecks\sprior\sto\sapplying\nOP_RealAffinity,\sto\savoid\sproblems\swith\sa\spointer\saccounting\sassert.\nThis\schange\sis\snot\sstrictly\snecessary\s-\sthe\scorrect\sanswer\sis\sobtained\nwithout\sit\sand\sno\sUB\soccurs\s-\showever\sthe\spointer\saccounting\sasserts\sare\nuseful\sto\sprevent\sother\sproblems\sso\sit\sis\sa\ssimple\smatter\sto\sbring\sthis\npiece\sinto\scompliance.\s\sTicket\s[5ad2aa6921faa1ee] -D 2019-12-22T20:29:25.187 +C Change\sthe\scode\sgenerator\sfor\sthe\sIN\soperator\sso\sthat\sit\savoids\screating\nOP_Eq\sand\sOP_Ne\sopcode\swith\sthe\ssame\sP1\sand\sP3\sarguments.\s\sThis\senables\sus\nto\sback\sout\scheck-in\s[ddb17d92df194337]\sand\salso\sfix\sticket\s[188f912b51cd802]. +D 2019-12-22T23:48:36.594 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 59c52601a6276a1da8d871f878f9423128e35954a13e1aa4157255f32a31a6f9 +F src/expr.c 210669714d4f9420b97d2577581ebad7a2da6e87b37b44f62ac67f44a41ca4ab F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -599,7 +599,7 @@ F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c a5883b94f3c300c721422f2df9da531dcf02c9edc804663ebf6820600826ccde +F src/vdbe.c c1e35ead7ef20b5cfedd30c45b9b7eceb7fa88145bf46c11c528775318e78950 F src/vdbe.h fdbc0a11e5768a702b46ce63286f60e22e71351a29bd98b3666405e1fccc7802 F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ef604882a275d3d5ebd4d5a08e3fe43e148f169b7d5c3a81464fbe7f54f3582a -R 0f642e7ac4e801ecd80846fa4200e152 +P 89a9dad6330270a4c3b962f86a208088d2ea9883c7d291351a77f058e0ed8b0c +R 22f0b35f3db7fedb6dbdf818d6863c3f U drh -Z 76d5702a8b98bb19970567fedd1c9377 +Z ccb160bfdbbe5ddc520bc949ac9c71d3 diff --git a/manifest.uuid b/manifest.uuid index 35d9750785..219c11bcc4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -89a9dad6330270a4c3b962f86a208088d2ea9883c7d291351a77f058e0ed8b0c \ No newline at end of file +9ab985a9c8160b905730678f40ed440a246cdec549c798bafefaed5abbc0437f \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 1536c5073e..8f7c798cc3 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3187,15 +3187,21 @@ static void sqlite3ExprCodeIN( sqlite3VdbeAddOp3(v, OP_BitAnd, regCkNull, r2, regCkNull); } if( iinExpr-1 || destIfNull!=destIfFalse ){ - sqlite3VdbeAddOp4(v, OP_Eq, rLhs, labelOk, r2, + int op = rLhs!=r2 ? OP_Eq : OP_NotNull; + sqlite3VdbeAddOp4(v, op, rLhs, labelOk, r2, (void*)pColl, P4_COLLSEQ); - VdbeCoverageIf(v, iinExpr-1); - VdbeCoverageIf(v, ii==pList->nExpr-1); + VdbeCoverageIf(v, iinExpr-1 && op==OP_Eq); + VdbeCoverageIf(v, ii==pList->nExpr-1 && op==OP_Eq); + VdbeCoverageIf(v, iinExpr-1 && op==OP_NotNull); + VdbeCoverageIf(v, ii==pList->nExpr-1 && op==OP_NotNull); sqlite3VdbeChangeP5(v, zAff[0]); }else{ + int op = rLhs!=r2 ? OP_Ne : OP_IsNull; assert( destIfNull==destIfFalse ); - sqlite3VdbeAddOp4(v, OP_Ne, rLhs, destIfFalse, r2, - (void*)pColl, P4_COLLSEQ); VdbeCoverage(v); + sqlite3VdbeAddOp4(v, op, rLhs, destIfFalse, r2, + (void*)pColl, P4_COLLSEQ); + VdbeCoverageIf(v, op==OP_Ne); + VdbeCoverageIf(v, op==OP_IsNull); sqlite3VdbeChangeP5(v, zAff[0] | SQLITE_JUMPIFNULL); } sqlite3ReleaseTempReg(pParse, regToFree); diff --git a/src/vdbe.c b/src/vdbe.c index 030c263b0d..2b5686cd63 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2028,7 +2028,12 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ if( (flags1 | flags3)&MEM_Str ){ if( (flags1 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){ applyNumericAffinity(pIn1,0); - testcase( flags3!=pIn3->flags ); + assert( flags3==pIn3->flags ); + /* testcase( flags3!=pIn3->flags ); + ** this used to be possible with pIn1==pIn3, but not since + ** the column cache was removed. The following assignment + ** is essentially a no-op. But, it provides defense-in-depth + ** in case our analysis is incorrect, so it is left in. */ flags3 = pIn3->flags; } if( (flags3 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){ From 13d795026705020e58603a4005c99ad0fbfb73b2 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 23 Dec 2019 02:18:49 +0000 Subject: [PATCH 054/120] Enhance the sqlite3VdbeMemAboutToChange() shallow-copy validation mechanism by adding the new OP_ReleaseReg opcode to tell MemAboutToChange() that a range of registers is no longer needed so that the source register can be freely changed. This is a change to debugging and test builds only and does not impact release builds. Fix for ticket [c62c5e58524b204d] and [5ad2aa6921faa1ee]. The previous fix to ticket [5ad2aa6921faa1ee] is backed out by this change since this change is a better fix. FossilOrigin-Name: 36fdeb4f0a66970a35de688b617f90899c89cfdfab659f864df99aa7ebf854ea --- manifest | 20 ++++++------- manifest.uuid | 2 +- src/expr.c | 18 +++++++---- src/vdbe.c | 78 +++++++++++++++++++++++++++++++++++++++++++----- src/vdbe.h | 5 ++++ src/vdbeaux.c | 23 ++++++++++++++ test/update.test | 12 ++++++++ 7 files changed, 134 insertions(+), 24 deletions(-) diff --git a/manifest b/manifest index d6d5fbd324..7b3bdf63e7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sthe\scode\sgenerator\sfor\sthe\sIN\soperator\sso\sthat\sit\savoids\screating\nOP_Eq\sand\sOP_Ne\sopcode\swith\sthe\ssame\sP1\sand\sP3\sarguments.\s\sThis\senables\sus\nto\sback\sout\scheck-in\s[ddb17d92df194337]\sand\salso\sfix\sticket\s[188f912b51cd802]. -D 2019-12-22T23:48:36.594 +C Enhance\sthe\ssqlite3VdbeMemAboutToChange()\sshallow-copy\svalidation\smechanism\nby\sadding\sthe\snew\sOP_ReleaseReg\sopcode\sto\stell\sMemAboutToChange()\sthat\sa\nrange\sof\sregisters\sis\sno\slonger\sneeded\sso\sthat\sthe\ssource\sregister\scan\sbe\nfreely\schanged.\s\sThis\sis\sa\schange\sto\sdebugging\sand\stest\sbuilds\sonly\sand\ndoes\snot\simpact\srelease\sbuilds.\s\sFix\sfor\sticket\n[c62c5e58524b204d]\sand\s[5ad2aa6921faa1ee].\s\sThe\sprevious\sfix\sto\sticket\n[5ad2aa6921faa1ee]\sis\sbacked\sout\sby\sthis\schange\ssince\sthis\schange\sis\sa\sbetter\nfix. +D 2019-12-23T02:18:49.115 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 210669714d4f9420b97d2577581ebad7a2da6e87b37b44f62ac67f44a41ca4ab +F src/expr.c 0f38befff4c3794ec051eee3e8a555f73559aab1aa506dd0abc63949358c9ebc F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -599,11 +599,11 @@ F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c c1e35ead7ef20b5cfedd30c45b9b7eceb7fa88145bf46c11c528775318e78950 -F src/vdbe.h fdbc0a11e5768a702b46ce63286f60e22e71351a29bd98b3666405e1fccc7802 +F src/vdbe.c 979cb8e16e4aebd9f1838260902225c68e706f6ab92781fc119937907140cb89 +F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 -F src/vdbeaux.c 858bb43a9d98846cc23fa8c8d0970ada805dd75bc6a01b69e972da608f7f59b1 +F src/vdbeaux.c e041d20b5000abbd651f7d470c66eaa13e868f58a13c1a940b4d426c6d0d43b5 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c 2eb00a4d1a7d2c97510a4d1ccaf4e12c9143f2ced1c6b96b5eddc372183c9121 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be @@ -1604,7 +1604,7 @@ F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2 F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97 F test/unordered.test ffeea7747d5ba962a8009a20b7e53d68cbae05b063604c68702c5998eb50c981 -F test/update.test 127fc037887808a9ff2d6a7dd9e524c215c939d15f8878dd3ee0169ad50f7b19 +F test/update.test 6fdd76fdf3194fb10ee184b3b2999c61d10d2a0b825dbcaa2d08ff394f3e26e3 F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 F test/upsert1.test 0b740c8488fd2f5a06ac317c9913f7ef1eda8282f2db58b544b89480c51efab3 F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 89a9dad6330270a4c3b962f86a208088d2ea9883c7d291351a77f058e0ed8b0c -R 22f0b35f3db7fedb6dbdf818d6863c3f +P 9ab985a9c8160b905730678f40ed440a246cdec549c798bafefaed5abbc0437f +R 6c6b2e22daef2e006951b2518e920f13 U drh -Z ccb160bfdbbe5ddc520bc949ac9c71d3 +Z 39eb7f22f14aaa3d3fa5e8c0432689d5 diff --git a/manifest.uuid b/manifest.uuid index 219c11bcc4..0ac42976c8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9ab985a9c8160b905730678f40ed440a246cdec549c798bafefaed5abbc0437f \ No newline at end of file +36fdeb4f0a66970a35de688b617f90899c89cfdfab659f864df99aa7ebf854ea \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 8f7c798cc3..4593ebbc57 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3680,7 +3680,7 @@ expr_code_doover: }else #endif /* SQLITE_OMIT_GENERATED_COLUMNS */ if( pCol->affinity==SQLITE_AFF_REAL ){ - sqlite3VdbeAddOp2(v, OP_Copy, iSrc, target); + sqlite3VdbeAddOp2(v, OP_SCopy, iSrc, target); sqlite3VdbeAddOp1(v, OP_RealAffinity, target); return target; }else{ @@ -4065,8 +4065,12 @@ expr_code_doover: sqlite3VdbeAddFunctionCall(pParse, constMask, r1, target, nFarg, pDef, pExpr->op2); } - if( nFarg && constMask==0 ){ - sqlite3ReleaseTempRange(pParse, r1, nFarg); + if( nFarg ){ + if( constMask==0 ){ + sqlite3ReleaseTempRange(pParse, r1, nFarg); + }else{ + sqlite3VdbeReleaseRegisters(pParse, r1, nFarg, constMask); + } } return target; } @@ -5707,8 +5711,11 @@ int sqlite3GetTempReg(Parse *pParse){ ** purpose. */ void sqlite3ReleaseTempReg(Parse *pParse, int iReg){ - if( iReg && pParse->nTempRegaTempReg) ){ - pParse->aTempReg[pParse->nTempReg++] = iReg; + if( iReg ){ + sqlite3VdbeReleaseRegisters(pParse, iReg, 1, 0); + if( pParse->nTempRegaTempReg) ){ + pParse->aTempReg[pParse->nTempReg++] = iReg; + } } } @@ -5734,6 +5741,7 @@ void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){ sqlite3ReleaseTempReg(pParse, iReg); return; } + sqlite3VdbeReleaseRegisters(pParse, iReg, nReg, 0); if( nReg>pParse->nRangeReg ){ pParse->nRangeReg = nReg; pParse->iRangeReg = iReg; diff --git a/src/vdbe.c b/src/vdbe.c index 2b5686cd63..6bd38c684e 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2130,16 +2130,31 @@ compare_op: /* Opcode: ElseNotEq * P2 * * * ** -** This opcode must immediately follow an OP_Lt or OP_Gt comparison operator. -** If result of an OP_Eq comparison on the same two operands -** would have be NULL or false (0), then then jump to P2. -** If the result of an OP_Eq comparison on the two previous operands -** would have been true (1), then fall through. +** This opcode must follow an OP_Lt or OP_Gt comparison operator. There +** can be zero or more OP_ReleaseReg opcodes intervening, but no other +** opcodes are allowed to occur between this instruction and the previous +** OP_Lt or OP_Gt. Furthermore, the prior OP_Lt or OP_Gt must have the +** SQLITE_STOREP2 bit set in the P5 field. +** +** If result of an OP_Eq comparison on the same two operands as the +** prior OP_Lt or OP_Gt would have been NULL or false (0), then then +** jump to P2. If the result of an OP_Eq comparison on the two previous +** operands would have been true (1), then fall through. */ case OP_ElseNotEq: { /* same as TK_ESCAPE, jump */ - assert( pOp>aOp ); - assert( pOp[-1].opcode==OP_Lt || pOp[-1].opcode==OP_Gt ); - assert( pOp[-1].p5 & SQLITE_STOREP2 ); + +#ifdef SQLITE_DEBUG + /* Verify the preconditions of this opcode - that it follows an OP_Lt or + ** OP_Gt with the SQLITE_STOREP2 flag set, with zero or more intervening + ** OP_ReleaseReg opcodes */ + int iAddr; + for(iAddr = (int)(pOp - aOp) - 1; ALWAYS(iAddr>=0); iAddr--){ + if( aOp[iAddr].opcode==OP_ReleaseReg ) continue; + assert( aOp[iAddr].opcode==OP_Lt || aOp[iAddr].opcode==OP_Gt ); + assert( aOp[iAddr].p5 & SQLITE_STOREP2 ); + break; + } +#endif /* SQLITE_DEBUG */ VdbeBranchTaken(iCompare!=0, 2); if( iCompare!=0 ) goto jump_to_p2; break; @@ -7685,6 +7700,53 @@ case OP_Abortable: { } #endif +#ifdef SQLITE_DEBUG +/* Opcode: ReleaseReg P1 P2 P3 * * +** Synopsis: release r[P1@P2] mask P3 +** +** Release registers from service. Any content that was in the +** the registers is unreliable after this opcode completes. +** +** The registers released will be the P2 registers starting at P1, +** except if bit ii of P3 set, then do not release register P1+ii. +** In other words, P3 is a mask of registers to preserve. +** +** Releasing a register clears the Mem.pScopyFrom pointer. That means +** that if the content of the released register was set using OP_SCopy, +** a change to the value of the source register for the OP_SCopy will no longer +** generate an assertion fault in sqlite3VdbeMemAboutToChange(). +** +** TODO: Released registers ought to also have their datatype set to +** MEM_Undefined so that any subsequent attempt to read the released +** register (before it is reinitialized) will generate an assertion fault. +** However, there are places in the code generator which release registers +** before their are used, under the (valid) assumption that the registers +** will not be reallocated for some other purpose before they are used and +** hence are safe to release. +** +** This opcode is only available in testing and debugging builds. It is +** not generated for release builds. The purpose of this opcode is to help +** validate the generated bytecode. This opcode does not actually contribute +** to computing an answer. +*/ +case OP_ReleaseReg: { + Mem *pMem; + int i; + u32 constMask; + assert( pOp->p1>0 ); + assert( pOp->p1+pOp->p2<=(p->nMem+1 - p->nCursor)+1 ); + pMem = &aMem[pOp->p1]; + constMask = pOp->p3; + for(i=0; ip2; i++, pMem++){ + if( (constMask & MASKBIT32(i))==0 ){ + pMem->pScopyFrom = 0; + /* MemSetTypeFlag(pMem, MEM_Undefined); // See the TODO */ + } + } + break; +} +#endif + /* Opcode: Noop * * * * * ** ** Do nothing. This instruction is often useful as a jump diff --git a/src/vdbe.h b/src/vdbe.h index 3214d5bce3..9b25452e2f 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -232,6 +232,11 @@ void sqlite3VdbeChangeP5(Vdbe*, u16 P5); void sqlite3VdbeJumpHere(Vdbe*, int addr); int sqlite3VdbeChangeToNoop(Vdbe*, int addr); int sqlite3VdbeDeletePriorOpcode(Vdbe*, u8 op); +#ifdef SQLITE_DEBUG + void sqlite3VdbeReleaseRegisters(Parse*,int addr, int n, u32 mask); +#else +# define sqlite3VdbeReleaseRegisters(P,A,N,M) +#endif void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N); void sqlite3VdbeAppendP4(Vdbe*, void *pP4, int p4type); void sqlite3VdbeSetP4KeyInfo(Parse*, Index*); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 8b9488e9e7..ac52303d57 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1186,6 +1186,29 @@ int sqlite3VdbeDeletePriorOpcode(Vdbe *p, u8 op){ } } +#ifdef SQLITE_DEBUG +/* +** Generate an OP_ReleaseReg opcode to indicate that a range of +** registers, except any identified by mask, are no longer in use. +*/ +void sqlite3VdbeReleaseRegisters(Parse *pParse, int iFirst, int N, u32 mask){ + assert( pParse->pVdbe ); + while( N>0 && (mask&1)!=0 ){ + mask >>= 1; + iFirst++; + N--; + } + while( N>0 && N<=32 && (mask & MASKBIT32(N-1))!=0 ){ + mask &= ~MASKBIT32(N-1); + N--; + } + if( N>0 ){ + sqlite3VdbeAddOp3(pParse->pVdbe, OP_ReleaseReg, iFirst, N, *(int*)&mask); + } +} +#endif /* SQLITE_DEBUG */ + + /* ** Change the value of the P4 operand for a specific instruction. ** This routine is useful when a large program is loaded from a diff --git a/test/update.test b/test/update.test index 8b96b6658b..2f36bdf2f7 100644 --- a/test/update.test +++ b/test/update.test @@ -672,4 +672,16 @@ do_execsql_test update-18.10 { SELECT * FROM t0; } {xyz 345 uvw 345} +# 2019-12-22 ticket c62c5e58524b204d +# This is really the same underlying problem as 5ad2aa6921faa1ee +# +reset_db +do_execsql_test update-18.20 { + PRAGMA encoding = 'utf16'; + CREATE TABLE t0(c0 TEXT); + CREATE INDEX i0 ON t0(0 LIKE COALESCE(c0, 0)); + INSERT INTO t0(c0) VALUES (0), (0); + SELECT * FROM t0; +} {0 0} + finish_test From 3d8e7a2f9778f969f57858e89c0fc3aaf862d4f8 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 23 Dec 2019 02:43:52 +0000 Subject: [PATCH 055/120] Change the assert() back into a testcase(). See also check-ins [9ab985a9c8160b90] and [ddb17d92df194337] and other check-ins that those reference. Fix for ticket [9d708e474201c001] FossilOrigin-Name: 2c44c73499154bc57634a54cb743642d0aacc93a1336fbb8bb3eb5dbbf616357 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 7 +------ 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 7b3bdf63e7..07d4615793 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\ssqlite3VdbeMemAboutToChange()\sshallow-copy\svalidation\smechanism\nby\sadding\sthe\snew\sOP_ReleaseReg\sopcode\sto\stell\sMemAboutToChange()\sthat\sa\nrange\sof\sregisters\sis\sno\slonger\sneeded\sso\sthat\sthe\ssource\sregister\scan\sbe\nfreely\schanged.\s\sThis\sis\sa\schange\sto\sdebugging\sand\stest\sbuilds\sonly\sand\ndoes\snot\simpact\srelease\sbuilds.\s\sFix\sfor\sticket\n[c62c5e58524b204d]\sand\s[5ad2aa6921faa1ee].\s\sThe\sprevious\sfix\sto\sticket\n[5ad2aa6921faa1ee]\sis\sbacked\sout\sby\sthis\schange\ssince\sthis\schange\sis\sa\sbetter\nfix. -D 2019-12-23T02:18:49.115 +C Change\sthe\sassert()\sback\sinto\sa\stestcase().\s\sSee\salso\scheck-ins\n[9ab985a9c8160b90]\sand\s[ddb17d92df194337]\sand\sother\scheck-ins\sthat\sthose\nreference.\s\sFix\sfor\sticket\s[9d708e474201c001] +D 2019-12-23T02:43:52.798 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -599,7 +599,7 @@ F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 979cb8e16e4aebd9f1838260902225c68e706f6ab92781fc119937907140cb89 +F src/vdbe.c edbd3ce5a927f54db387f39f385ab2a71c92a11d68e8dbf38295a024df4476bd F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9ab985a9c8160b905730678f40ed440a246cdec549c798bafefaed5abbc0437f -R 6c6b2e22daef2e006951b2518e920f13 +P 36fdeb4f0a66970a35de688b617f90899c89cfdfab659f864df99aa7ebf854ea +R b61ef50f9763d22c9ba3b648f8895f79 U drh -Z 39eb7f22f14aaa3d3fa5e8c0432689d5 +Z 6074358839366f26b48e0a14aadff323 diff --git a/manifest.uuid b/manifest.uuid index 0ac42976c8..12e01de17f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -36fdeb4f0a66970a35de688b617f90899c89cfdfab659f864df99aa7ebf854ea \ No newline at end of file +2c44c73499154bc57634a54cb743642d0aacc93a1336fbb8bb3eb5dbbf616357 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 6bd38c684e..ca765e3074 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2028,12 +2028,7 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ if( (flags1 | flags3)&MEM_Str ){ if( (flags1 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){ applyNumericAffinity(pIn1,0); - assert( flags3==pIn3->flags ); - /* testcase( flags3!=pIn3->flags ); - ** this used to be possible with pIn1==pIn3, but not since - ** the column cache was removed. The following assignment - ** is essentially a no-op. But, it provides defense-in-depth - ** in case our analysis is incorrect, so it is left in. */ + testcase( flags3!=pIn3->flags ); flags3 = pIn3->flags; } if( (flags3 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){ From 0af6ddd3ca07064f529b3b1349a76f466fed1d63 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 23 Dec 2019 03:37:46 +0000 Subject: [PATCH 056/120] Fix the OP_Cast operator so that when casting to TEXT, it always leaves the result in the encoding of the database. Ticket [0911b5d161b039c6]. Test cases in TH3. FossilOrigin-Name: f347744e0d576f0250c29259cca755e57afded8956224114c01603c1bca5b3a4 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/vdbe.c | 5 +++-- src/vdbeInt.h | 2 +- src/vdbemem.c | 7 ++++--- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 07d4615793..fdc335d4e4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sthe\sassert()\sback\sinto\sa\stestcase().\s\sSee\salso\scheck-ins\n[9ab985a9c8160b90]\sand\s[ddb17d92df194337]\sand\sother\scheck-ins\sthat\sthose\nreference.\s\sFix\sfor\sticket\s[9d708e474201c001] -D 2019-12-23T02:43:52.798 +C Fix\sthe\sOP_Cast\soperator\sso\sthat\swhen\scasting\sto\sTEXT,\sit\salways\sleaves\nthe\sresult\sin\sthe\sencoding\sof\sthe\sdatabase.\s\sTicket\s[0911b5d161b039c6].\nTest\scases\sin\sTH3. +D 2019-12-23T03:37:46.033 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -599,13 +599,13 @@ F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c edbd3ce5a927f54db387f39f385ab2a71c92a11d68e8dbf38295a024df4476bd +F src/vdbe.c f23ba176eb57bb3f9516a5021bd2ea1d7066623339556f391e68d99c06f9f877 F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 -F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 +F src/vdbeInt.h 1ccaf470287e2d153b16cf7b0274d436db2c2f74cdf14afd1a0ff4cb51548ae6 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 F src/vdbeaux.c e041d20b5000abbd651f7d470c66eaa13e868f58a13c1a940b4d426c6d0d43b5 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 -F src/vdbemem.c 2eb00a4d1a7d2c97510a4d1ccaf4e12c9143f2ced1c6b96b5eddc372183c9121 +F src/vdbemem.c fa083086758379b52f8771d69424b273c7bd0f94413802404ee32cd5cc7cd870 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c a2fead3e97fca54fcf3f3db784e17c9ee2d39a0c5ad323e9d514855106300a86 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 36fdeb4f0a66970a35de688b617f90899c89cfdfab659f864df99aa7ebf854ea -R b61ef50f9763d22c9ba3b648f8895f79 +P 2c44c73499154bc57634a54cb743642d0aacc93a1336fbb8bb3eb5dbbf616357 +R b6da56a8c5d74a2eb68d71835ddfe15f U drh -Z 6074358839366f26b48e0a14aadff323 +Z 5b15760d80bfee0d0e59d93bf584a88d diff --git a/manifest.uuid b/manifest.uuid index 12e01de17f..9c6e895756 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2c44c73499154bc57634a54cb743642d0aacc93a1336fbb8bb3eb5dbbf616357 \ No newline at end of file +f347744e0d576f0250c29259cca755e57afded8956224114c01603c1bca5b3a4 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index ca765e3074..f7ebc61753 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -1866,9 +1866,10 @@ case OP_Cast: { /* in1 */ pIn1 = &aMem[pOp->p1]; memAboutToChange(p, pIn1); rc = ExpandBlob(pIn1); - sqlite3VdbeMemCast(pIn1, pOp->p2, encoding); - UPDATE_MAX_BLOBSIZE(pIn1); if( rc ) goto abort_due_to_error; + rc = sqlite3VdbeMemCast(pIn1, pOp->p2, encoding); + if( rc ) goto abort_due_to_error; + UPDATE_MAX_BLOBSIZE(pIn1); REGISTER_TRACE(pOp->p1, pIn1); break; } diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 4775f406c2..cc410510ae 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -529,7 +529,7 @@ int sqlite3VdbeBooleanValue(Mem*, int ifNull); void sqlite3VdbeIntegerAffinity(Mem*); int sqlite3VdbeMemRealify(Mem*); int sqlite3VdbeMemNumerify(Mem*); -void sqlite3VdbeMemCast(Mem*,u8,u8); +int sqlite3VdbeMemCast(Mem*,u8,u8); int sqlite3VdbeMemFromBtree(BtCursor*,u32,u32,Mem*); void sqlite3VdbeMemRelease(Mem *p); int sqlite3VdbeMemFinalize(Mem*, FuncDef*); diff --git a/src/vdbemem.c b/src/vdbemem.c index 8ef5a51336..c64901e44d 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -747,8 +747,8 @@ int sqlite3VdbeMemNumerify(Mem *pMem){ ** affinity even if that results in loss of data. This routine is ** used (for example) to implement the SQL "cast()" operator. */ -void sqlite3VdbeMemCast(Mem *pMem, u8 aff, u8 encoding){ - if( pMem->flags & MEM_Null ) return; +int sqlite3VdbeMemCast(Mem *pMem, u8 aff, u8 encoding){ + if( pMem->flags & MEM_Null ) return SQLITE_OK; switch( aff ){ case SQLITE_AFF_BLOB: { /* Really a cast to BLOB */ if( (pMem->flags & MEM_Blob)==0 ){ @@ -779,9 +779,10 @@ void sqlite3VdbeMemCast(Mem *pMem, u8 aff, u8 encoding){ sqlite3ValueApplyAffinity(pMem, SQLITE_AFF_TEXT, encoding); assert( pMem->flags & MEM_Str || pMem->db->mallocFailed ); pMem->flags &= ~(MEM_Int|MEM_Real|MEM_IntReal|MEM_Blob|MEM_Zero); - break; + return sqlite3VdbeChangeEncoding(pMem, encoding); } } + return SQLITE_OK; } /* From 7edce5ecc0aa8dc146ffe07fb2bdbe814f125790 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 23 Dec 2019 13:24:34 +0000 Subject: [PATCH 057/120] Fix a shift-overflow problem in yesterday's check-in [36fdeb4f0a66970a] that OSSFuzz helpfully discovered overnight. Thanks Google. FossilOrigin-Name: bff38e2b5318ed032aaf1d350903c3494b4531f2dc59a6997144ec8e23defef4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index fdc335d4e4..d4ff64b3d9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sOP_Cast\soperator\sso\sthat\swhen\scasting\sto\sTEXT,\sit\salways\sleaves\nthe\sresult\sin\sthe\sencoding\sof\sthe\sdatabase.\s\sTicket\s[0911b5d161b039c6].\nTest\scases\sin\sTH3. -D 2019-12-23T03:37:46.033 +C Fix\sa\sshift-overflow\sproblem\sin\syesterday's\scheck-in\s[36fdeb4f0a66970a]\s\nthat\sOSSFuzz\shelpfully\sdiscovered\sovernight.\s\sThanks\sGoogle. +D 2019-12-23T13:24:34.459 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -599,7 +599,7 @@ F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c f23ba176eb57bb3f9516a5021bd2ea1d7066623339556f391e68d99c06f9f877 +F src/vdbe.c 2efa3b390e921eb101bda51a485aff7b3bbfa61548999b29007e074a260a9767 F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 F src/vdbeInt.h 1ccaf470287e2d153b16cf7b0274d436db2c2f74cdf14afd1a0ff4cb51548ae6 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2c44c73499154bc57634a54cb743642d0aacc93a1336fbb8bb3eb5dbbf616357 -R b6da56a8c5d74a2eb68d71835ddfe15f +P f347744e0d576f0250c29259cca755e57afded8956224114c01603c1bca5b3a4 +R 82c46a83331f8a14030c8919927050ce U drh -Z 5b15760d80bfee0d0e59d93bf584a88d +Z 47df80ba61b143806cc77f81145903b9 diff --git a/manifest.uuid b/manifest.uuid index 9c6e895756..0f6357f561 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f347744e0d576f0250c29259cca755e57afded8956224114c01603c1bca5b3a4 \ No newline at end of file +bff38e2b5318ed032aaf1d350903c3494b4531f2dc59a6997144ec8e23defef4 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index f7ebc61753..e63872d191 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -7734,7 +7734,7 @@ case OP_ReleaseReg: { pMem = &aMem[pOp->p1]; constMask = pOp->p3; for(i=0; ip2; i++, pMem++){ - if( (constMask & MASKBIT32(i))==0 ){ + if( i>=32 || (constMask & MASKBIT32(i))==0 ){ pMem->pScopyFrom = 0; /* MemSetTypeFlag(pMem, MEM_Undefined); // See the TODO */ } From 2811ea6be7f4d63d5cc0992c78db3b1b73112a93 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 23 Dec 2019 14:20:46 +0000 Subject: [PATCH 058/120] For expressions like (x, y) IN (SELECT ...) where the SELECT uses window-functions, require that all columns on the LHS be indexed before an index can be used. Fix for [d9ed4ebe]. FossilOrigin-Name: 0b1dbd60f5db3abe2097dbc0b6de9671685ca5eaf7d3fc8e3f87ff5065a9d114 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/vdbe.c | 1 + src/wherecode.c | 17 ----------------- src/whereexpr.c | 6 +++++- test/window1.test | 11 +++++++++++ 6 files changed, 28 insertions(+), 29 deletions(-) diff --git a/manifest b/manifest index d4ff64b3d9..0317ca1074 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sshift-overflow\sproblem\sin\syesterday's\scheck-in\s[36fdeb4f0a66970a]\s\nthat\sOSSFuzz\shelpfully\sdiscovered\sovernight.\s\sThanks\sGoogle. -D 2019-12-23T13:24:34.459 +C For\sexpressions\slike\s(x,\sy)\sIN\s(SELECT\s...)\swhere\sthe\sSELECT\suses\swindow-functions,\srequire\sthat\sall\scolumns\son\sthe\sLHS\sbe\sindexed\sbefore\san\sindex\scan\sbe\sused.\sFix\sfor\s[d9ed4ebe]. +D 2019-12-23T14:20:46.615 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -599,7 +599,7 @@ F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 2efa3b390e921eb101bda51a485aff7b3bbfa61548999b29007e074a260a9767 +F src/vdbe.c 46695ae07f7b90de64bdfe099ed3c01f701dac3193d219bdb736e5eea11615b3 F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 F src/vdbeInt.h 1ccaf470287e2d153b16cf7b0274d436db2c2f74cdf14afd1a0ff4cb51548ae6 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -615,8 +615,8 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d F src/where.c 25653002490b093b9b752f30ad92b307464b099ad081c4d2fb524719427403f2 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 -F src/wherecode.c c4cb79b7c93d0f4ec93d9d84d10deb61053c8563c12b244292c14f9ad1032093 -F src/whereexpr.c 3d0ff098154bbd96d8e0982b71b9ebae4017d01f409ff518c9417e9607b69689 +F src/wherecode.c bb58d5e6e7f583db5b74e0fd35f1d65fdee67d20553b55cd6098fc3f8148053a +F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 F src/window.c da010455914c81037dcb5b0c6f4273f8a32c94567865c46a60060b937b018a96 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1713,7 +1713,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 29efd3d6c18ea920ae6493f26cae3fc5724912ee049fd3d8eb61753660052f70 +F test/window1.test 31b56e5330440565296d381f57fe5b821dec83102c52b00ed8b9f5af0fd288e0 F test/window2.tcl 114b217d4ffff891142023cc5f3131b0dae3ad149ac4b45a6ed9e2ad943f8ce2 F test/window2.test dea2ffecb7182a385143ea0eb368b6241ee43c5f971f4ad1c4337029cb1fc10a F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f347744e0d576f0250c29259cca755e57afded8956224114c01603c1bca5b3a4 -R 82c46a83331f8a14030c8919927050ce -U drh -Z 47df80ba61b143806cc77f81145903b9 +P bff38e2b5318ed032aaf1d350903c3494b4531f2dc59a6997144ec8e23defef4 +R 418198a4f3930033845edd9b39a82c39 +U dan +Z 04f3211d7072bfd41ad4689f87a37f7f diff --git a/manifest.uuid b/manifest.uuid index 0f6357f561..73021ade3a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bff38e2b5318ed032aaf1d350903c3494b4531f2dc59a6997144ec8e23defef4 \ No newline at end of file +0b1dbd60f5db3abe2097dbc0b6de9671685ca5eaf7d3fc8e3f87ff5065a9d114 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index e63872d191..cac850b3be 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3806,6 +3806,7 @@ case OP_OpenDup: { VdbeCursor *pCx; /* The new cursor */ pOrig = p->apCsr[pOp->p2]; + assert( pOrig ); assert( pOrig->pBtx!=0 ); /* Only ephemeral cursors can be duplicated */ pCx = allocateCursor(p, pOp->p1, pOrig->nField, -1, CURTYPE_BTREE); diff --git a/src/wherecode.c b/src/wherecode.c index 2f2a27271b..d5d3403744 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -416,23 +416,6 @@ static Expr *removeUnindexableInClauseTerms( ){ sqlite3 *db = pParse->db; Expr *pNew; -#ifndef SQLITE_OMIT_WINDOWFUNC - /* The SELECT statement at pX->x.pSelect has already been resolved. This - ** means that its window functions have already been identified and - ** linked into the Select.pWin list. However, if there are multiple - ** window functions and they do not all use the same window frame, only - ** those that use the same window frame as the first resolved are listed - ** in Select.pWin. Any others are delegated to sub-selects created by the - ** call to sqlite3WindowRewrite() made when coding the SELECT statement. - ** But - sqlite3WindowRewrite() is a no-op if Select.pWin==0. And if - ** removing the unindexable terms happens to remove all window functions - ** in the Select.pWin list, then Select.pWin ends up set to NULL - meaning - ** that the other window functions are never processed. To work around - ** this, ensure that sqlite3WindowRewrite() has been called to create the - ** required sub-selects before the unindexable terms are removed. See - ** ticket #f00d096ca. */ - if( sqlite3WindowRewrite(pParse, pX->x.pSelect) ) return 0; -#endif pNew = sqlite3ExprDup(db, pX, 0); if( db->mallocFailed==0 ){ ExprList *pOrigRhs = pNew->x.pSelect->pEList; /* Original unmodified RHS */ diff --git a/src/whereexpr.c b/src/whereexpr.c index d16f89a7b2..cec0aefd8b 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -1355,11 +1355,15 @@ static void exprAnalyze( ** expression). The WhereTerm.iField variable identifies the index within ** the vector on the LHS that the virtual term represents. ** - ** This only works if the RHS is a simple SELECT, not a compound + ** This only works if the RHS is a simple SELECT (not a compound) that does + ** not use window functions. */ if( pWC->op==TK_AND && pExpr->op==TK_IN && pTerm->iField==0 && pExpr->pLeft->op==TK_VECTOR && pExpr->x.pSelect->pPrior==0 +#ifndef SQLITE_OMIT_WINDOWFUNC + && pExpr->x.pSelect->pWin==0 +#endif ){ int i; for(i=0; ipLeft); i++){ diff --git a/test/window1.test b/test/window1.test index 7647cb84dd..fc9d1b4a64 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1347,4 +1347,15 @@ do_execsql_test 38.30 { SELECT COUNT(*) FROM t0, t1 WHERE (SELECT AVG(1) FILTER(WHERE t1.c1)); } {1} +reset_db +do_execsql_test 39.1 { + CREATE TABLE t0(c0 UNIQUE); +} +do_execsql_test 39.2 { + SELECT FIRST_VALUE(0) OVER(); +} {0} +do_execsql_test 39.3 { + SELECT * FROM t0 WHERE(c0, 0) IN(SELECT FIRST_VALUE(0) OVER(), 0); +} + finish_test From 1d24a53125ab15f2d80ff4c64a2b65ed9d9ff44b Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 23 Dec 2019 15:17:11 +0000 Subject: [PATCH 059/120] Fix a case in which SQLite could fail to identify "x BETWEEN ? AND ?" being true as implying that x is not null. Ticket [dfd66334]. FossilOrigin-Name: 2f17974912ec5e99089dc0da803e7ff1bf033377a49762d2689a812c005f2641 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 5 ++++- test/join2.test | 14 ++++++++++++++ test/window1.test | 4 ++++ 5 files changed, 31 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 0317ca1074..e76f120332 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C For\sexpressions\slike\s(x,\sy)\sIN\s(SELECT\s...)\swhere\sthe\sSELECT\suses\swindow-functions,\srequire\sthat\sall\scolumns\son\sthe\sLHS\sbe\sindexed\sbefore\san\sindex\scan\sbe\sused.\sFix\sfor\s[d9ed4ebe]. -D 2019-12-23T14:20:46.615 +C Fix\sa\scase\sin\swhich\sSQLite\scould\sfail\sto\sidentify\s"x\sBETWEEN\s?\sAND\s?"\sbeing\strue\sas\simplying\sthat\sx\sis\snot\snull.\sTicket\s[dfd66334]. +D 2019-12-23T15:17:11.892 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 0f38befff4c3794ec051eee3e8a555f73559aab1aa506dd0abc63949358c9ebc +F src/expr.c ba7bed1c4f5ef0e90d80e9afea6f0cbff22827608ff4251162d16107758b4933 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1085,7 +1085,7 @@ F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b F test/istrue.test 75327829744e65cc8700e69340b8e6c192e10e39dfae7ccb0e970d3c4f49090a F test/join.test d7e315cd05f03d442c22bb5506edff2e688d27e6e10c91657daf48a08b8573fe -F test/join2.test 10f7047e723ebd68b2f47189be8eed20451a6f665d8bf46f1774c640d1062417 +F test/join2.test 659bc6193f5c3fe20fa444dd2c91713db8c33e376b098b860644e175e87b8dbc F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 F test/join5.test 3a96dc62f0b45402d7207e22d1993fe0c2fce1c57644a11439891dd62b990eb7 @@ -1713,7 +1713,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 31b56e5330440565296d381f57fe5b821dec83102c52b00ed8b9f5af0fd288e0 +F test/window1.test 790c9f12bc4c6f789216fb2c38bd1fbf5e191bed8b9a3712326e4af1a50222c0 F test/window2.tcl 114b217d4ffff891142023cc5f3131b0dae3ad149ac4b45a6ed9e2ad943f8ce2 F test/window2.test dea2ffecb7182a385143ea0eb368b6241ee43c5f971f4ad1c4337029cb1fc10a F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bff38e2b5318ed032aaf1d350903c3494b4531f2dc59a6997144ec8e23defef4 -R 418198a4f3930033845edd9b39a82c39 +P 0b1dbd60f5db3abe2097dbc0b6de9671685ca5eaf7d3fc8e3f87ff5065a9d114 +R 3f13118066cf3e145065219b1e28432f U dan -Z 04f3211d7072bfd41ad4689f87a37f7f +Z 5ab62146546bc685f4a7b032d9c74d0c diff --git a/manifest.uuid b/manifest.uuid index 73021ade3a..a458bcced6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0b1dbd60f5db3abe2097dbc0b6de9671685ca5eaf7d3fc8e3f87ff5065a9d114 \ No newline at end of file +2f17974912ec5e99089dc0da803e7ff1bf033377a49762d2689a812c005f2641 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 4593ebbc57..617fcf0633 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5297,7 +5297,10 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ return WRC_Prune; case TK_BETWEEN: - sqlite3WalkExpr(pWalker, pExpr->pLeft); + if( sqlite3WalkExpr(pWalker, pExpr->pLeft)==WRC_Abort ){ + assert( pWalker->eCode ); + return WRC_Abort; + } return WRC_Prune; /* Virtual tables are allowed to use constraints like x=NULL. So diff --git a/test/join2.test b/test/join2.test index 5a70573e0e..bfcecda29b 100644 --- a/test/join2.test +++ b/test/join2.test @@ -279,5 +279,19 @@ do_execsql_test 7.0 { SELECT * FROM test; } {3 4 {} {} {} x 5 6 {} {} {} x} +#------------------------------------------------------------------------- +# Ticket [dfd66334]. +# +reset_db +do_execsql_test 8.0 { + CREATE TABLE t0(c0); + CREATE TABLE t1(c0); +} + +do_execsql_test 8.1 { + SELECT * FROM t0 LEFT JOIN t1 + WHERE (t1.c0 BETWEEN 0 AND 0) > ('' AND t0.c0); +} + finish_test diff --git a/test/window1.test b/test/window1.test index fc9d1b4a64..fc729354bd 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1357,5 +1357,9 @@ do_execsql_test 39.2 { do_execsql_test 39.3 { SELECT * FROM t0 WHERE(c0, 0) IN(SELECT FIRST_VALUE(0) OVER(), 0); } +do_execsql_test 39.4 { + SELECT * FROM t0 WHERE (t0.c0, 1) IN(SELECT NTILE(1) OVER(), 0 FROM t0); +} + finish_test From a2d50283dbb176c6fd5853a3d821f1ace2ef008b Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 23 Dec 2019 18:02:15 +0000 Subject: [PATCH 060/120] Early detection of database corruption in balance_deeper(). FossilOrigin-Name: 61c2233654158e65a3d3baeea947903a919a569fcc4a5b342b2e9a68cec1b6f3 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/btree.c | 33 ++++++++++++++++++++++++++++++--- src/sqliteInt.h | 20 ++++++++++++++++++++ 4 files changed, 59 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index e76f120332..11932bc710 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scase\sin\swhich\sSQLite\scould\sfail\sto\sidentify\s"x\sBETWEEN\s?\sAND\s?"\sbeing\strue\sas\simplying\sthat\sx\sis\snot\snull.\sTicket\s[dfd66334]. -D 2019-12-23T15:17:11.892 +C Early\sdetection\sof\sdatabase\scorruption\sin\sbalance_deeper(). +D 2019-12-23T18:02:15.079 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -468,7 +468,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 716fc9bd12eb7d35e3d66c5c2c81c37df3fdae49cd25bceaff4e7d702d513d80 +F src/btree.c 695bcbc62177cf70faaf6b34f89c22415e5581a13c57d67c862057636d3f09b9 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 F src/build.c 1d999886fa656e6211e14d5402a6f92cadbdaa5d2f4f0597c797f7818d510e33 @@ -532,7 +532,7 @@ F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817de F src/sqlite.h.in 2a23e8161775253d9cf383c2c6aa559005dc787d350dcb0be67a6c4cc3bd1d19 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h 60d92fad64da7c3e77bbc35ee306340814cdaa5df32892b0ec58d306d99b5733 +F src/sqliteInt.h eada1e78b6b950670eb4cc093ce6eb96a7df8bc548cabd7bc6127fa4fbce8ba5 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0b1dbd60f5db3abe2097dbc0b6de9671685ca5eaf7d3fc8e3f87ff5065a9d114 -R 3f13118066cf3e145065219b1e28432f -U dan -Z 5ab62146546bc685f4a7b032d9c74d0c +P 2f17974912ec5e99089dc0da803e7ff1bf033377a49762d2689a812c005f2641 +R 8b7584d5dce9cabfa7788fda2b2b4c7c +U drh +Z 20f6b4d0a1e07f848f9073291aeee414 diff --git a/manifest.uuid b/manifest.uuid index a458bcced6..f3b00eb015 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2f17974912ec5e99089dc0da803e7ff1bf033377a49762d2689a812c005f2641 \ No newline at end of file +61c2233654158e65a3d3baeea947903a919a569fcc4a5b342b2e9a68cec1b6f3 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 98f9ec2d62..52c2ceaffb 100644 --- a/src/btree.c +++ b/src/btree.c @@ -5718,8 +5718,11 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ ** to be invalid here. This can only occur if a second cursor modifies ** the page while cursor pCur is holding a reference to it. Which can ** only happen if the database is corrupt in such a way as to link the - ** page into more than one b-tree structure. */ - testcase( idx>pPage->nCell ); + ** page into more than one b-tree structure. + ** + ** Update 2019-12-23: appears to long longer be possible after the + ** addition of anotherValidCursor() condition on balance_deeper(). */ + harmless( idx>pPage->nCell ); if( idx>=pPage->nCell ){ if( !pPage->leaf ){ @@ -8308,6 +8311,30 @@ static int balance_deeper(MemPage *pRoot, MemPage **ppChild){ return SQLITE_OK; } +/* +** Return SQLITE_CORRUPT if any cursor other than pCur is currently valid +** on the same B-tree as pCur. +** +** This can if a database is corrupt with two or more SQL tables +** pointing to the same b-tree. If an insert occurs on one SQL table +** and causes a BEFORE TRIGGER to do a secondary insert on the other SQL +** table linked to the same b-tree. If the secondary insert causes a +** rebalance, that can change content out from under the cursor on the +** first SQL table, violating invariants on the first insert. +*/ +static int anotherValidCursor(BtCursor *pCur){ + BtCursor *pOther; + for(pOther=pCur->pBt->pCursor; pOther; pOther=pOther->pNext){ + if( pOther!=pCur + && pOther->eState==CURSOR_VALID + && pOther->pPage==pCur->pPage + ){ + return SQLITE_CORRUPT_BKPT; + } + } + return SQLITE_OK; +} + /* ** The page that pCur currently points to has just been modified in ** some way. This function figures out if this modification means the @@ -8335,7 +8362,7 @@ static int balance(BtCursor *pCur){ if( pPage->nOverflow==0 && pPage->nFree<=nMin ){ break; }else if( (iPage = pCur->iPage)==0 ){ - if( pPage->nOverflow ){ + if( pPage->nOverflow && (rc = anotherValidCursor(pCur))==SQLITE_OK ){ /* The root page of the b-tree is overfull. In this case call the ** balance_deeper() function to create a new child for the root-page ** and copy the current contents of the root-page to it. The diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 4b4a9068cc..a8cdb9f6ad 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -446,6 +446,26 @@ # define NEVER(X) (X) #endif +/* +** The harmless(X) macro indicates that expression X is usually false +** but can be true without causing any problems, but we don't know of +** any way to cause X to be true. +** +** In debugging and testing builds, this macro will abort if X is ever +** true. In this way, developers are alerted to a possible test case +** that causes X to be true. If a harmless macro ever fails, that is +** an opportunity to change the macro into a testcase() and add a new +** test case to the test suite. +** +** For normal production builds, harmless(X) is a no-op, since it does +** not matter whether expression X is true or false. +*/ +#ifdef SQLITE_DEBUG +# define harmless(X) assert(!(X)); +#else +# define harmless(X) +#endif + /* ** Some conditionals are optimizations only. In other words, if the ** conditionals are replaced with a constant 1 (true) or 0 (false) then From e2478dfa439d1dee0be7d26ebaf546313c4a2786 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 23 Dec 2019 19:28:34 +0000 Subject: [PATCH 061/120] Do an early close of virtual table cursors to avoid unnecessary cursor contention in UPDATE for some virtual table implementations. Ticket [56a74875be799b85] FossilOrigin-Name: eb95dac7f6482c36853a23234c5ce7af37c7beed8e3675d6a49c4d3a8307e076 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 11932bc710..dd88d21d78 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Early\sdetection\sof\sdatabase\scorruption\sin\sbalance_deeper(). -D 2019-12-23T18:02:15.079 +C Do\san\searly\sclose\sof\svirtual\stable\scursors\sto\savoid\sunnecessary\scursor\ncontention\sin\sUPDATE\sfor\ssome\svirtual\stable\simplementations.\nTicket\s[56a74875be799b85] +D 2019-12-23T19:28:34.435 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -613,7 +613,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 15a2845769f51ba132f9cf0b2c7a6887a91fc8437892dbcce9fcdc68b66d60a1 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d -F src/where.c 25653002490b093b9b752f30ad92b307464b099ad081c4d2fb524719427403f2 +F src/where.c c82db883f6988742c416998b29228ea03788b97cc3d39dd5a6c8da553e278cd0 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c bb58d5e6e7f583db5b74e0fd35f1d65fdee67d20553b55cd6098fc3f8148053a F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2f17974912ec5e99089dc0da803e7ff1bf033377a49762d2689a812c005f2641 -R 8b7584d5dce9cabfa7788fda2b2b4c7c +P 61c2233654158e65a3d3baeea947903a919a569fcc4a5b342b2e9a68cec1b6f3 +R d87e55f8560ad2234e5e7557c4b3d18d U drh -Z 20f6b4d0a1e07f848f9073291aeee414 +Z 20bdde97f18017c70a3591a93bad8703 diff --git a/manifest.uuid b/manifest.uuid index f3b00eb015..7ae48137cd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -61c2233654158e65a3d3baeea947903a919a569fcc4a5b342b2e9a68cec1b6f3 \ No newline at end of file +eb95dac7f6482c36853a23234c5ce7af37c7beed8e3675d6a49c4d3a8307e076 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 7d34787696..c08931aefc 100644 --- a/src/where.c +++ b/src/where.c @@ -5340,13 +5340,16 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ continue; } + if( IsVirtual(pTab) ){ + sqlite3VdbeAddOp1(v, OP_Close, pTabItem->iCursor); + } #ifdef SQLITE_ENABLE_EARLY_CURSOR_CLOSE /* Close all of the cursors that were opened by sqlite3WhereBegin. ** Except, do not close cursors that will be reused by the OR optimization ** (WHERE_OR_SUBCLAUSE). And do not close the OP_OpenWrite cursors ** created for the ONEPASS optimization. */ - if( (pTab->tabFlags & TF_Ephemeral)==0 + else if( (pTab->tabFlags & TF_Ephemeral)==0 && pTab->pSelect==0 && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){ From 192cf36de68b1d29292dbf124e4e824fe93a6f3e Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 23 Dec 2019 20:07:28 +0000 Subject: [PATCH 062/120] Remove an extra deflateInit2() call accidently left in check-in [f5ee30426e8876e7] FossilOrigin-Name: 953e6aa6d9ca09e549c88bc728c322fabdcef581f3b4a7763d95488dddbbd6a5 --- ext/misc/zipfile.c | 1 - manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/ext/misc/zipfile.c b/ext/misc/zipfile.c index 9a0345d9fd..28017fd6d8 100644 --- a/ext/misc/zipfile.c +++ b/ext/misc/zipfile.c @@ -999,7 +999,6 @@ static int zipfileDeflate( int res; str.next_out = aOut; str.avail_out = nAlloc; - deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY); res = deflate(&str, Z_FINISH); if( res==Z_STREAM_END ){ *ppOut = aOut; diff --git a/manifest b/manifest index dd88d21d78..61505c7931 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\san\searly\sclose\sof\svirtual\stable\scursors\sto\savoid\sunnecessary\scursor\ncontention\sin\sUPDATE\sfor\ssome\svirtual\stable\simplementations.\nTicket\s[56a74875be799b85] -D 2019-12-23T19:28:34.435 +C Remove\san\sextra\sdeflateInit2()\scall\saccidently\sleft\sin\ncheck-in\s[f5ee30426e8876e7] +D 2019-12-23T20:07:28.883 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -324,7 +324,7 @@ F ext/misc/vfsstat.c 77b5b4235c9f7f11eddf82487c0a422944ac2f132dafd5af3be7a68a057 F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212 -F ext/misc/zipfile.c 8f965eb309da3ae8c30088f6c3ebdddcdbdf9e0ef24f3bc7ae0756deb93da503 +F ext/misc/zipfile.c dfec5589395fc2272a646fc309935ecb5164934a95757762afa120b72d1d0ba4 F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64 F ext/rbu/rbu.c 8681f6157db6adc82c34af24b14ea8a3be0146ad2a3b6c1d5da6cb8a5796c8ce F ext/rbu/rbu1.test 221d9c18a5e600ac9ac6b1810d99d9f99163a7909ba61597876ab6e4d4beb3d6 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 61c2233654158e65a3d3baeea947903a919a569fcc4a5b342b2e9a68cec1b6f3 -R d87e55f8560ad2234e5e7557c4b3d18d +P eb95dac7f6482c36853a23234c5ce7af37c7beed8e3675d6a49c4d3a8307e076 +R e103f704be27c31cccf26fb6fcbf2a57 U drh -Z 20bdde97f18017c70a3591a93bad8703 +Z 6dbcaeefdeee80cf0d01dc33e5e449fb diff --git a/manifest.uuid b/manifest.uuid index 7ae48137cd..7a65938631 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eb95dac7f6482c36853a23234c5ce7af37c7beed8e3675d6a49c4d3a8307e076 \ No newline at end of file +953e6aa6d9ca09e549c88bc728c322fabdcef581f3b4a7763d95488dddbbd6a5 \ No newline at end of file From 5f0dfc00de8f0755545310de3c940ccb2ed9e624 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 23 Dec 2019 20:41:39 +0000 Subject: [PATCH 063/120] Thoroughly reset the rtree cursor at the start of each VFilter operation, including clearing its cache. This prevents left over pages in the cache which can cause problems on shutdown after a LEFT JOIN. Ticket [5eadca17c4dde90c] FossilOrigin-Name: 4c50afafce8416369f89477ba7fe7d9b047399a5ee5754c73d0e67bbea8d877c --- ext/rtree/geopoly.c | 8 +------- ext/rtree/rtree.c | 27 ++++++++++++++------------- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 23 insertions(+), 28 deletions(-) diff --git a/ext/rtree/geopoly.c b/ext/rtree/geopoly.c index fa58838a31..312f337b16 100644 --- a/ext/rtree/geopoly.c +++ b/ext/rtree/geopoly.c @@ -1345,17 +1345,11 @@ static int geopolyFilter( RtreeNode *pRoot = 0; int rc = SQLITE_OK; int iCell = 0; - sqlite3_stmt *pStmt; rtreeReference(pRtree); /* Reset the cursor to the same state as rtreeOpen() leaves it in. */ - freeCursorConstraints(pCsr); - sqlite3_free(pCsr->aPoint); - pStmt = pCsr->pReadAux; - memset(pCsr, 0, sizeof(RtreeCursor)); - pCsr->base.pVtab = (sqlite3_vtab*)pRtree; - pCsr->pReadAux = pStmt; + resetCursor(pCsr); pCsr->iStrategy = idxNum; if( idxNum==1 ){ diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index b4d15f6cb3..1eef1a1b53 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -1065,9 +1065,12 @@ static int rtreeOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ /* -** Free the RtreeCursor.aConstraint[] array and its contents. +** Reset a cursor back to its initial state. */ -static void freeCursorConstraints(RtreeCursor *pCsr){ +static void resetCursor(RtreeCursor *pCsr){ + Rtree *pRtree = (Rtree *)(pCsr->base.pVtab); + int ii; + sqlite3_stmt *pStmt; if( pCsr->aConstraint ){ int i; /* Used to iterate through constraint array */ for(i=0; inConstraint; i++){ @@ -1080,6 +1083,13 @@ static void freeCursorConstraints(RtreeCursor *pCsr){ sqlite3_free(pCsr->aConstraint); pCsr->aConstraint = 0; } + for(ii=0; iiaNode[ii]); + sqlite3_free(pCsr->aPoint); + pStmt = pCsr->pReadAux; + memset(pCsr, 0, sizeof(RtreeCursor)); + pCsr->base.pVtab = (sqlite3_vtab*)pRtree; + pCsr->pReadAux = pStmt; + } /* @@ -1087,13 +1097,10 @@ static void freeCursorConstraints(RtreeCursor *pCsr){ */ static int rtreeClose(sqlite3_vtab_cursor *cur){ Rtree *pRtree = (Rtree *)(cur->pVtab); - int ii; RtreeCursor *pCsr = (RtreeCursor *)cur; assert( pRtree->nCursor>0 ); - freeCursorConstraints(pCsr); + resetCursor(pCsr); sqlite3_finalize(pCsr->pReadAux); - sqlite3_free(pCsr->aPoint); - for(ii=0; iiaNode[ii]); sqlite3_free(pCsr); pRtree->nCursor--; nodeBlobReset(pRtree); @@ -1799,17 +1806,11 @@ static int rtreeFilter( int ii; int rc = SQLITE_OK; int iCell = 0; - sqlite3_stmt *pStmt; rtreeReference(pRtree); /* Reset the cursor to the same state as rtreeOpen() leaves it in. */ - freeCursorConstraints(pCsr); - sqlite3_free(pCsr->aPoint); - pStmt = pCsr->pReadAux; - memset(pCsr, 0, sizeof(RtreeCursor)); - pCsr->base.pVtab = (sqlite3_vtab*)pRtree; - pCsr->pReadAux = pStmt; + resetCursor(pCsr); pCsr->iStrategy = idxNum; if( idxNum==1 ){ diff --git a/manifest b/manifest index 61505c7931..c90dd789d3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sextra\sdeflateInit2()\scall\saccidently\sleft\sin\ncheck-in\s[f5ee30426e8876e7] -D 2019-12-23T20:07:28.883 +C Thoroughly\sreset\sthe\srtree\scursor\sat\sthe\sstart\sof\seach\sVFilter\soperation,\nincluding\sclearing\sits\scache.\s\sThis\sprevents\sleft\sover\spages\sin\sthe\scache\nwhich\scan\scause\sproblems\son\sshutdown\safter\sa\sLEFT\sJOIN.\nTicket\s[5eadca17c4dde90c] +D 2019-12-23T20:41:39.904 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -379,8 +379,8 @@ F ext/repair/test/checkfreelist01.test 3e8aa6aeb4007680c94a8d07b41c339aa635cc782 F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c335096108c12c01bddbadcec F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 -F ext/rtree/geopoly.c c591164125808f8bba9659e92665b78412cd263e654b6f05294f3a8da7cdd9fb -F ext/rtree/rtree.c 26fcb3f7a92fda9afcf5eee684cc3188b7367da69bc9c374492d844fb8ed4e25 +F ext/rtree/geopoly.c 4f176fa4d954997e8880f8b75e15b578765b4f471e359b73020b3d4e1defe958 +F ext/rtree/rtree.c 84b939a9a558edd0461bb976b98f60012e3e574b3b17a0f44533d6f2a9aa2f2e F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 4092a8bd2b5eafc4fafe4fe9024249c12b13e4bab23c2c3eaff57412fdf805fa F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P eb95dac7f6482c36853a23234c5ce7af37c7beed8e3675d6a49c4d3a8307e076 -R e103f704be27c31cccf26fb6fcbf2a57 +P 953e6aa6d9ca09e549c88bc728c322fabdcef581f3b4a7763d95488dddbbd6a5 +R ca340be656fb975dcd1521355f675df7 U drh -Z 6dbcaeefdeee80cf0d01dc33e5e449fb +Z 22698fecf79ba95f8e537178f371e71c diff --git a/manifest.uuid b/manifest.uuid index 7a65938631..227d56ff79 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -953e6aa6d9ca09e549c88bc728c322fabdcef581f3b4a7763d95488dddbbd6a5 \ No newline at end of file +4c50afafce8416369f89477ba7fe7d9b047399a5ee5754c73d0e67bbea8d877c \ No newline at end of file From d8f2d46cbc9925e034a68aaaf60aad788d9373c1 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 23 Dec 2019 21:04:33 +0000 Subject: [PATCH 064/120] Fix the zipfile() function in the zipfile extension so that it is able to deal with goofy filenames that contain embedded zeros. FossilOrigin-Name: cc0fb00a128fd0773db5ff7891f7aa577a3671d570166d2cbb30df922344adcf --- ext/misc/zipfile.c | 4 ++-- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/misc/zipfile.c b/ext/misc/zipfile.c index 28017fd6d8..ec820038e2 100644 --- a/ext/misc/zipfile.c +++ b/ext/misc/zipfile.c @@ -1632,7 +1632,7 @@ static int zipfileUpdate( zFree = sqlite3_mprintf("%s/", zPath); if( zFree==0 ){ rc = SQLITE_NOMEM; } zPath = (const char*)zFree; - nPath++; + nPath = (int)strlen(zPath); } } @@ -2033,11 +2033,11 @@ void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){ }else{ if( zName[nName-1]!='/' ){ zName = zFree = sqlite3_mprintf("%s/", zName); - nName++; if( zName==0 ){ rc = SQLITE_NOMEM; goto zipfile_step_out; } + nName = (int)strlen(zName); }else{ while( nName>1 && zName[nName-2]=='/' ) nName--; } diff --git a/manifest b/manifest index c90dd789d3..65200c2912 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Thoroughly\sreset\sthe\srtree\scursor\sat\sthe\sstart\sof\seach\sVFilter\soperation,\nincluding\sclearing\sits\scache.\s\sThis\sprevents\sleft\sover\spages\sin\sthe\scache\nwhich\scan\scause\sproblems\son\sshutdown\safter\sa\sLEFT\sJOIN.\nTicket\s[5eadca17c4dde90c] -D 2019-12-23T20:41:39.904 +C Fix\sthe\szipfile()\sfunction\sin\sthe\szipfile\sextension\sso\sthat\sit\sis\sable\sto\ndeal\swith\sgoofy\sfilenames\sthat\scontain\sembedded\szeros. +D 2019-12-23T21:04:33.977 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -324,7 +324,7 @@ F ext/misc/vfsstat.c 77b5b4235c9f7f11eddf82487c0a422944ac2f132dafd5af3be7a68a057 F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212 -F ext/misc/zipfile.c dfec5589395fc2272a646fc309935ecb5164934a95757762afa120b72d1d0ba4 +F ext/misc/zipfile.c 46b8022d5c4f118995c3e7228542215204dacc9c1c4e9872710900ec276d6db3 F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64 F ext/rbu/rbu.c 8681f6157db6adc82c34af24b14ea8a3be0146ad2a3b6c1d5da6cb8a5796c8ce F ext/rbu/rbu1.test 221d9c18a5e600ac9ac6b1810d99d9f99163a7909ba61597876ab6e4d4beb3d6 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 953e6aa6d9ca09e549c88bc728c322fabdcef581f3b4a7763d95488dddbbd6a5 -R ca340be656fb975dcd1521355f675df7 +P 4c50afafce8416369f89477ba7fe7d9b047399a5ee5754c73d0e67bbea8d877c +R 29d7c3cbcd5652a73d3305fec9c54b58 U drh -Z 22698fecf79ba95f8e537178f371e71c +Z b32fa973d6865a272376759a8cfda3e5 diff --git a/manifest.uuid b/manifest.uuid index 227d56ff79..c0b77ea9f0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4c50afafce8416369f89477ba7fe7d9b047399a5ee5754c73d0e67bbea8d877c \ No newline at end of file +cc0fb00a128fd0773db5ff7891f7aa577a3671d570166d2cbb30df922344adcf \ No newline at end of file From 1e490c4ca6b43a9cf8637d695907888349f69bec Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 23 Dec 2019 21:11:15 +0000 Subject: [PATCH 065/120] Test case for the zipfile-extension bug fix of the previous check-in. FossilOrigin-Name: bc8bfc7fcdf33f6855584e10e9260073430517ff3268cf0c7988dcc4cd785391 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/zipfile.test | 12 ++++++++++++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 65200c2912..a959069d12 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\szipfile()\sfunction\sin\sthe\szipfile\sextension\sso\sthat\sit\sis\sable\sto\ndeal\swith\sgoofy\sfilenames\sthat\scontain\sembedded\szeros. -D 2019-12-23T21:04:33.977 +C Test\scase\sfor\sthe\szipfile-extension\sbug\sfix\sof\sthe\sprevious\scheck-in. +D 2019-12-23T21:11:15.463 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1748,7 +1748,7 @@ F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912ade F test/writecrash.test f1da7f7adfe8d7f09ea79b42e5ca6dcc41102f27f8e334ad71539501ddd910cc F test/zeroblob.test 07a5b11ab591d1f26c626945fb7f228f68b993533b2ada77273edf6ee29db174 F test/zerodamage.test 9c41628db7e8d9e8a0181e59ea5f189df311a9f6ce99cc376dc461f66db6f8dc -F test/zipfile.test daab4c9be151934fd6bbc71a0d2520351efc61719eabbf545920f953883d172a +F test/zipfile.test 330bec11cee9da4da1a48e648b6d445b9334044089da62e9521803566a36dde2 F test/zipfile2.test 9903388a602a3834189857a985106ff95c3bba6a3969e0134127df991889db5d F test/zipfilefault.test 44d4d7a7f7cca7521d569d7f71026b241d65a6b1757aa409c1a168827edbbc2c F tool/GetFile.cs 47852aa0d806fe47ed1ac5138bdce7f000fe87aaa7f28107d0cb1e26682aeb44 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4c50afafce8416369f89477ba7fe7d9b047399a5ee5754c73d0e67bbea8d877c -R 29d7c3cbcd5652a73d3305fec9c54b58 +P cc0fb00a128fd0773db5ff7891f7aa577a3671d570166d2cbb30df922344adcf +R 01755885676b946174adbb226548e4c0 U drh -Z b32fa973d6865a272376759a8cfda3e5 +Z 9cbb5c3517ed7c9d1c8f71b1fd10d978 diff --git a/manifest.uuid b/manifest.uuid index c0b77ea9f0..565704d085 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cc0fb00a128fd0773db5ff7891f7aa577a3671d570166d2cbb30df922344adcf \ No newline at end of file +bc8bfc7fcdf33f6855584e10e9260073430517ff3268cf0c7988dcc4cd785391 \ No newline at end of file diff --git a/test/zipfile.test b/test/zipfile.test index a37e8139be..e4b80884e0 100644 --- a/test/zipfile.test +++ b/test/zipfile.test @@ -808,5 +808,17 @@ do_execsql_test 13.10 { quote(data),quote(method) FROM t1; } {'' 10 10 2 X'3130' X'3130' 0} +# 2019-12-23 Yongheng and Rui fuzzer +# Run using valgrind to see the problem. +# +do_execsql_test 14.10 { + DROP TABLE t1; + CREATE TABLE t1(x char); + INSERT INTO t1(x) VALUES('1'); + INSERT INTO t1(x) SELECT zipfile(x, 'xyz') FROM t1; + INSERT INTO t1(x) SELECT zipfile(x, 'uvw') FROM t1; + SELECT count(*) FROM t1; + PRAGMA integrity_check; +} {3 ok} finish_test From 22c04f819934ada3af6b712d9797ce34c58c813a Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 24 Dec 2019 01:53:05 +0000 Subject: [PATCH 066/120] Allow comparison operators of a register against itself. Ticket [188f912b51cd802a], FossilOrigin-Name: 401c9d30e06191d938503aae024bc453d960fa64dc812ed86c661f94533247fd --- manifest | 14 +++++----- manifest.uuid | 2 +- src/vdbe.c | 6 +++-- test/check.test | 69 ++++++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 78 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index a959069d12..c5320f7e41 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Test\scase\sfor\sthe\szipfile-extension\sbug\sfix\sof\sthe\sprevious\scheck-in. -D 2019-12-23T21:11:15.463 +C Allow\scomparison\soperators\sof\sa\sregister\sagainst\sitself.\nTicket\s[188f912b51cd802a], +D 2019-12-24T01:53:05.662 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -599,7 +599,7 @@ F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 46695ae07f7b90de64bdfe099ed3c01f701dac3193d219bdb736e5eea11615b3 +F src/vdbe.c 8691c41f61e27f2f36c3c6559ab5aa32a7d552c4fedf1d618f24dd7a58670a8b F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 F src/vdbeInt.h 1ccaf470287e2d153b16cf7b0274d436db2c2f74cdf14afd1a0ff4cb51548ae6 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -728,7 +728,7 @@ F test/capi3d.test aba917805573a03deed961a21f07a5a84505ad0a616f7e3fc1508844a15bc F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe F test/cast.test 3619f0c58c2e4b2a94aa86e75607e497d34ef40ab74418e71aef7b4ca5155895 F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef -F test/check.test 25c6035302c846c7ff8e681cf8284473f6f01be94d327de60a688ad84ab01f8b +F test/check.test b21a76546c2115af2674280566a8eba577e72adfec330c3d9a8a466d41f8eb0d F test/checkfault.test da6cb3d50247169efcb20bdf57863a3ccfa1d27d9e55cd324f0680096970f014 F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760 F test/close.test eccbad8ecd611d974cbf47278c3d4e5874faf02d811338d5d348af42d56d647c @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P cc0fb00a128fd0773db5ff7891f7aa577a3671d570166d2cbb30df922344adcf -R 01755885676b946174adbb226548e4c0 +P bc8bfc7fcdf33f6855584e10e9260073430517ff3268cf0c7988dcc4cd785391 +R 053d1dee3c90f1c568a1ca6324c56ed1 U drh -Z 9cbb5c3517ed7c9d1c8f71b1fd10d978 +Z c118a2c355c191018c74d0b27b1f15e8 diff --git a/manifest.uuid b/manifest.uuid index 565704d085..2a46db63f1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bc8bfc7fcdf33f6855584e10e9260073430517ff3268cf0c7988dcc4cd785391 \ No newline at end of file +401c9d30e06191d938503aae024bc453d960fa64dc812ed86c661f94533247fd \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index cac850b3be..05e26e57da 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2052,9 +2052,11 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ sqlite3VdbeMemStringify(pIn1, encoding, 1); testcase( (flags1&MEM_Dyn) != (pIn1->flags&MEM_Dyn) ); flags1 = (pIn1->flags & ~MEM_TypeMask) | (flags1 & MEM_TypeMask); - assert( pIn1!=pIn3 ); } - if( (flags3 & MEM_Str)==0 && (flags3&(MEM_Int|MEM_Real|MEM_IntReal))!=0 ){ + if( (flags3 & MEM_Str)==0 + && (flags3&(MEM_Int|MEM_Real|MEM_IntReal))!=0 + && pIn1!=pIn3 + ){ testcase( pIn3->flags & MEM_Int ); testcase( pIn3->flags & MEM_Real ); testcase( pIn3->flags & MEM_IntReal ); diff --git a/test/check.test b/test/check.test index ac0a9ac6ba..3e16b9dcf5 100644 --- a/test/check.test +++ b/test/check.test @@ -11,7 +11,6 @@ # This file implements regression tests for SQLite library. The # focus of this file is testing CHECK constraints # -# $Id: check.test,v 1.13 2009/06/05 17:09:12 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -536,7 +535,71 @@ do_execsql_test 11.6 { INSERT INTO t2(b, a) VALUES(2, 'abc'); } -finish_test - +# 2019-12-24 ticket b383b90278186263 +# +reset_db +do_execsql_test 12.10 { + CREATE TABLE t1(a TEXT, CHECK(a=+a)); + INSERT INTO t1(a) VALUES(NULL),('xyz'),(5),(x'303132'),(4.75); + SELECT quote(a) FROM t1 ORDER BY rowid; +} {NULL 'xyz' '5' X'303132' '4.75'} +do_execsql_test 12.20 { + DROP TABLE t1; + CREATE TABLE t1(a TEXT, CHECK(a<>+a)); + INSERT INTO t1(a) VALUES(NULL); +} {} +do_catchsql_test 12.21 { + INSERT INTO t1(a) VALUES('xyz'); +} {1 {CHECK constraint failed: t1}} +do_catchsql_test 12.22 { + INSERT INTO t1(a) VALUES(123); +} {1 {CHECK constraint failed: t1}} +do_execsql_test 12.30 { + DROP TABLE t1; + CREATE TABLE t1(a TEXT, CHECK(NOT(a=+a))); + INSERT INTO t1(a) VALUES(NULL); +} {} +do_catchsql_test 12.31 { + INSERT INTO t1(a) VALUES('xyz'); +} {1 {CHECK constraint failed: t1}} +do_catchsql_test 12.32 { + INSERT INTO t1(a) VALUES(123); +} {1 {CHECK constraint failed: t1}} +do_execsql_test 12.40 { + DROP TABLE t1; + CREATE TABLE t1(a TEXT, CHECK(NOT(a<>+a))); + INSERT INTO t1(a) VALUES(NULL),('xyz'),(5),(x'303132'),(4.75); + SELECT quote(a) FROM t1 ORDER BY rowid; +} {NULL 'xyz' '5' X'303132' '4.75'} +do_execsql_test 12.50 { + DROP TABLE t1; + CREATE TABLE t1(a TEXT, CHECK(a BETWEEN 0 AND +a)); + INSERT INTO t1(a) VALUES(NULL),('xyz'),(5),(x'303132'),(4.75); + SELECT quote(a) FROM t1 ORDER BY rowid; +} {NULL 'xyz' '5' X'303132' '4.75'} +do_execsql_test 12.60 { + DROP TABLE t1; + CREATE TABLE t1(a TEXT, CHECK(a NOT BETWEEN 0 AND +a)); + INSERT INTO t1(a) VALUES(NULL); + SELECT quote(a) FROM t1 ORDER BY rowid; +} {NULL} +do_catchsql_test 12.61 { + INSERT INTO t1(a) VALUES(456); +} {1 {CHECK constraint failed: t1}} +do_execsql_test 12.70 { + DROP TABLE t1; + CREATE TABLE t1(a TEXT, CHECK(a BETWEEN +a AND 999999)); + INSERT INTO t1(a) VALUES(NULL),(5); + SELECT quote(a) FROM t1 ORDER BY rowid; +} {NULL '5'} +do_execsql_test 12.80 { + DROP TABLE t1; + CREATE TABLE t1(a TEXT, CHECK(a NOT BETWEEN +a AND 999999)); + INSERT INTO t1(a) VALUES(NULL); + SELECT quote(a) FROM t1 ORDER BY rowid; +} {NULL} +do_catchsql_test 12.81 { + INSERT INTO t1(a) VALUES(456); +} {1 {CHECK constraint failed: t1}} finish_test From 34da2a4806336001082c522b833fac4fb8a814e7 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 24 Dec 2019 13:41:33 +0000 Subject: [PATCH 067/120] Convert an ALWAYS() into an assert() with an extra error term. Dbsqlfuzz find, with test case in TH3. FossilOrigin-Name: b473ad35c5ce355853e1805a5c0658bda1500775f22f59c6b6759ae990e65aca --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c5320f7e41..689b8742db 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\scomparison\soperators\sof\sa\sregister\sagainst\sitself.\nTicket\s[188f912b51cd802a], -D 2019-12-24T01:53:05.662 +C Convert\san\sALWAYS()\sinto\san\sassert()\swith\san\sextra\serror\sterm.\nDbsqlfuzz\sfind,\swith\stest\scase\sin\sTH3. +D 2019-12-24T13:41:33.515 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -613,7 +613,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 15a2845769f51ba132f9cf0b2c7a6887a91fc8437892dbcce9fcdc68b66d60a1 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d -F src/where.c c82db883f6988742c416998b29228ea03788b97cc3d39dd5a6c8da553e278cd0 +F src/where.c ac6704a7c5758d603ceaa0d6fcb9cd2d34b57cd3a6a7b598b3eddea558bc54ed F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c bb58d5e6e7f583db5b74e0fd35f1d65fdee67d20553b55cd6098fc3f8148053a F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bc8bfc7fcdf33f6855584e10e9260073430517ff3268cf0c7988dcc4cd785391 -R 053d1dee3c90f1c568a1ca6324c56ed1 +P 401c9d30e06191d938503aae024bc453d960fa64dc812ed86c661f94533247fd +R 7bfc5184e8e7362443b5d6dff6be172e U drh -Z c118a2c355c191018c74d0b27b1f15e8 +Z 7327fcfaeb195a694e2119a9482b57cd diff --git a/manifest.uuid b/manifest.uuid index 2a46db63f1..eedb68f236 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -401c9d30e06191d938503aae024bc453d960fa64dc812ed86c661f94533247fd \ No newline at end of file +b473ad35c5ce355853e1805a5c0658bda1500775f22f59c6b6759ae990e65aca \ No newline at end of file diff --git a/src/where.c b/src/where.c index c08931aefc..af490390c5 100644 --- a/src/where.c +++ b/src/where.c @@ -801,7 +801,8 @@ static void constructAutomaticIndex( idxCols |= cMask; pIdx->aiColumn[n] = pTerm->u.leftColumn; pColl = sqlite3ExprCompareCollSeq(pParse, pX); - pIdx->azColl[n] = ALWAYS(pColl) ? pColl->zName : sqlite3StrBINARY; + assert( pColl!=0 || pParse->nErr>0 ); /* TH3 collate01.800 */ + pIdx->azColl[n] = pColl ? pColl->zName : sqlite3StrBINARY; n++; } } From c26e78d275134213fa35956b969efa9d5834a664 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 24 Dec 2019 14:27:03 +0000 Subject: [PATCH 068/120] Fix a spurious report of corruption that could be made by the fts5 integrity-check in SQLITE_DEBUG builds if the fts5 index contains malformed utf text. FossilOrigin-Name: a11b393dc2c882cf0b3c47c3405bf43ca1d6459605bd39cccce4d32da653a72d --- ext/fts5/fts5_index.c | 41 +++++++++++++++++++++++++++++++++++-- ext/fts5/test/fts5misc.test | 15 ++++++++++++++ manifest | 16 +++++++-------- manifest.uuid | 2 +- 4 files changed, 63 insertions(+), 11 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 015696f7b6..427594aff7 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -5723,6 +5723,37 @@ static int fts5QueryCksum( return rc; } +/* +** Check if buffer z[], size n bytes, contains as series of valid utf-8 +** encoded codepoints. If so, return 0. Otherwise, if the buffer does not +** contain valid utf-8, return non-zero. +*/ +static int fts5TestUtf8(const char *z, int n){ + assert( n>0 ); + int i = 0; + while( i=n || (z[i+1] & 0xC0)!=0x80 ) return 1; + i += 2; + }else + if( (z[i] & 0xF0)==0xE0 ){ + if( i+2>=n || (z[i+1] & 0xC0)!=0x80 || (z[i+2] & 0xC0)!=0x80 ) return 1; + i += 3; + }else + if( (z[i] & 0xF8)==0xF0 ){ + if( i+3>=n || (z[i+1] & 0xC0)!=0x80 || (z[i+2] & 0xC0)!=0x80 ) return 1; + if( (z[i+2] & 0xC0)!=0x80 ) return 1; + i += 3; + }else{ + return 1; + } + } + + return 0; +} /* ** This function is also purely an internal test. It does not contribute to @@ -5763,8 +5794,14 @@ static void fts5TestTerm( ** This check may only be performed if the hash table is empty. This ** is because the hash table only supports a single scan query at ** a time, and the multi-iter loop from which this function is called - ** is already performing such a scan. */ - if( p->nPendingData==0 ){ + ** is already performing such a scan. + ** + ** Also only do this if buffer zTerm contains nTerm bytes of valid + ** utf-8. Otherwise, the last part of the buffer contents might contain + ** a non-utf-8 sequence that happens to be a prefix of a valid utf-8 + ** character stored in the main fts index, which will cause the + ** test to fail. */ + if( p->nPendingData==0 && 0==fts5TestUtf8(zTerm, nTerm) ){ if( iIdx>0 && rc==SQLITE_OK ){ int f = flags|FTS5INDEX_QUERY_TEST_NOIDX; ck2 = 0; diff --git a/ext/fts5/test/fts5misc.test b/ext/fts5/test/fts5misc.test index e2f4b2d09c..d117205bb3 100644 --- a/ext/fts5/test/fts5misc.test +++ b/ext/fts5/test/fts5misc.test @@ -250,6 +250,21 @@ do_execsql_test 9.2 { -4764623217061966105 8324454597464624651 } +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 10.0 { + CREATE VIRTUAL TABLE vt1 USING fts5(c1, c2, prefix = 1, tokenize = "ascii"); + INSERT INTO vt1 VALUES (x'e4', '䔬'); +} + +do_execsql_test 10.1 { + SELECT quote(CAST(c1 AS blob)), quote(CAST(c2 AS blob)) FROM vt1 +} {X'E4' X'E494AC'} + +do_execsql_test 10.2 { + INSERT INTO vt1(vt1) VALUES('integrity-check'); +} finish_test diff --git a/manifest b/manifest index 689b8742db..5f1dc5644d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Convert\san\sALWAYS()\sinto\san\sassert()\swith\san\sextra\serror\sterm.\nDbsqlfuzz\sfind,\swith\stest\scase\sin\sTH3. -D 2019-12-24T13:41:33.515 +C Fix\sa\sspurious\sreport\sof\scorruption\sthat\scould\sbe\smade\sby\sthe\sfts5\sintegrity-check\sin\sSQLITE_DEBUG\sbuilds\sif\sthe\sfts5\sindex\scontains\smalformed\sutf\stext. +D 2019-12-24T14:27:03.948 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -116,7 +116,7 @@ F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6 F ext/fts5/fts5_config.c b447948f35ad3354e8fe5e242e0a7e7b5b941555400b9404259944e3aa570037 F ext/fts5/fts5_expr.c 2be456484786333d559dc2987a00f2750981fab91d52db8452a8046278c5f22e F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 -F ext/fts5/fts5_index.c 99b77ae1f503978ca76985bcfff7345c822aed8bbaa8edb3747f804f614685b5 +F ext/fts5/fts5_index.c d0b7e5e79c136c6e27c96c8e8b5db7db8ec750edda427008afbec07b813178d4 F ext/fts5/fts5_main.c 9db1f173d299466aeff89bd949fb1eb0a181265726fb56f11e07ea292dcc9a73 F ext/fts5/fts5_storage.c 3ecda8edadc1f62a355d6789776be0da609f8658c50d72e422674093ab7e1528 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -189,7 +189,7 @@ F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc27826807405 F ext/fts5/test/fts5matchinfo.test 50d86da66ec5b27603dcd90ba0227f5d9deb10351cbc52974a88e24f6fc9b076 F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6 F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 -F ext/fts5/test/fts5misc.test a5b53328b5b79275915de8f67ae85905eb2133d8dbcc808411f67c094b1bd347 +F ext/fts5/test/fts5misc.test b294b1d7ad814da30e473905a8165de1bfe137822d243f2ab8cbf20ecc37bd1e F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581 F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 401c9d30e06191d938503aae024bc453d960fa64dc812ed86c661f94533247fd -R 7bfc5184e8e7362443b5d6dff6be172e -U drh -Z 7327fcfaeb195a694e2119a9482b57cd +P b473ad35c5ce355853e1805a5c0658bda1500775f22f59c6b6759ae990e65aca +R 88e0f620d2e9b56c3b0053f9411f1c0c +U dan +Z 0716b408ff1a9ce855db0a1c4ccdfffe diff --git a/manifest.uuid b/manifest.uuid index eedb68f236..83c2c41554 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b473ad35c5ce355853e1805a5c0658bda1500775f22f59c6b6759ae990e65aca \ No newline at end of file +a11b393dc2c882cf0b3c47c3405bf43ca1d6459605bd39cccce4d32da653a72d \ No newline at end of file From 4eac5f04ab996fc5bf262edfcead84bc4e8a3ccb Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 24 Dec 2019 15:01:17 +0000 Subject: [PATCH 069/120] Extra defense against problems following an OOM. dbsqlfuzz find. Also import the latest dbsqlfuzz test cases. FossilOrigin-Name: 0a70f5ddaf3567f335cc0fd0fcd5303e2afb5e38a6388faddf5cab1f2a74e3dd --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 5 ++++- test/fuzzdata8.db | Bin 1571840 -> 1607680 bytes 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 5f1dc5644d..8b62b2ce6a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sspurious\sreport\sof\scorruption\sthat\scould\sbe\smade\sby\sthe\sfts5\sintegrity-check\sin\sSQLITE_DEBUG\sbuilds\sif\sthe\sfts5\sindex\scontains\smalformed\sutf\stext. -D 2019-12-24T14:27:03.948 +C Extra\sdefense\sagainst\sproblems\sfollowing\san\sOOM.\s\sdbsqlfuzz\sfind.\s\sAlso\nimport\sthe\slatest\sdbsqlfuzz\stest\scases. +D 2019-12-24T15:01:17.851 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c ba7bed1c4f5ef0e90d80e9afea6f0cbff22827608ff4251162d16107758b4933 +F src/expr.c 518e46716bcf072b41e3e88209965e2495f4c7888f2f698ff00b3e415738912d F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1017,7 +1017,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db f8da99ea7e57a436e300e59b2d5ad0d0f765fcb0468b2c1b1f9b9f03d928e0ef +F test/fuzzdata8.db 7fd98a5d4c281d993950212507ad56a55ace0cf3083785eb3366aad9ebd8041c F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b473ad35c5ce355853e1805a5c0658bda1500775f22f59c6b6759ae990e65aca -R 88e0f620d2e9b56c3b0053f9411f1c0c -U dan -Z 0716b408ff1a9ce855db0a1c4ccdfffe +P a11b393dc2c882cf0b3c47c3405bf43ca1d6459605bd39cccce4d32da653a72d +R 27ce7f877a564e4328201c0fcf5cd524 +U drh +Z 02d9d6056c86e58fa1f721e17435d869 diff --git a/manifest.uuid b/manifest.uuid index 83c2c41554..f01574c641 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a11b393dc2c882cf0b3c47c3405bf43ca1d6459605bd39cccce4d32da653a72d \ No newline at end of file +0a70f5ddaf3567f335cc0fd0fcd5303e2afb5e38a6388faddf5cab1f2a74e3dd \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 617fcf0633..601574e68e 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2207,7 +2207,9 @@ int sqlite3ExprCanBeNull(const Expr *p){ case TK_COLUMN: return ExprHasProperty(p, EP_CanBeNull) || p->y.pTab==0 || /* Reference to column of index on expression */ - (p->iColumn>=0 && p->y.pTab->aCol[p->iColumn].notNull==0); + (p->iColumn>=0 + && ALWAYS(p->y.pTab->aCol!=0) /* Defense against OOM problems */ + && p->y.pTab->aCol[p->iColumn].notNull==0); default: return 1; } @@ -3224,6 +3226,7 @@ static void sqlite3ExprCodeIN( }else{ destStep2 = destStep6 = sqlite3VdbeMakeLabel(pParse); } + if( pParse->nErr ) goto sqlite3ExprCodeIN_finished; for(i=0; ipLeft, i); if( sqlite3ExprCanBeNull(p) ){ diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 8dd6e3a8f12d74bae0614e769de5a157e94cafbe..7247ea141662d090df2375bb219475c6802ce5e7 100644 GIT binary patch delta 30564 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 UXPZRgQ4@mal4ACPyulCu4-=&haR2}S delta 22522 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 &UE0jp+ClXTl>{Re5bF(}GW!#I=r($BzWJ68Gy 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 Date: Tue, 24 Dec 2019 15:35:53 +0000 Subject: [PATCH 070/120] Fix an assert() added as part of commit [a11b393dc] that can fail if fts5 database records are corrupt. FossilOrigin-Name: 4630c1ec013a4c2e54a34c9a64b2c803ac3912450de660497eb34ee21c91f426 --- ext/fts5/fts5_index.c | 2 +- ext/fts5/test/fts5corrupt3.test | 223 ++++++++++++++++++++++++++++++++ manifest | 16 +-- manifest.uuid | 2 +- 4 files changed, 233 insertions(+), 10 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 427594aff7..011011431f 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -5729,7 +5729,7 @@ static int fts5QueryCksum( ** contain valid utf-8, return non-zero. */ static int fts5TestUtf8(const char *z, int n){ - assert( n>0 ); + assert_nc( n>0 ); int i = 0; while( i.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4f 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 OARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 46 45 58 4e 4f 43 41 53 45 17 LE RTRFEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 49 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 IABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 57 42 49 NABLE GEOPOLYWBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 42 41 53 45 E GEOPOLYXNOBASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 b7 4e 41 42 4c 45 20 44 42 53 ...1...NABLE DBS +| 3904: 54 41 54 20 66 54 41 42 58 52 54 52 49 4d 11 06 TAT fTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 62 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XbTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 52 02 4a 4e 41 52 59 27 20160609R.JNARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 04 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 5d 69 71 a5 uild....opti]iq. +| end crash-41234e232809e7.db +.testctrl prng_seed 1 db +}]} {} + +do_catchsql_test 68.1 { + PRAGMA reverse_unordered_selects=ON; + INSERT INTO t1(t1) SELECT x FROM t2; +} {1 {database disk image is malformed}} + + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 8b62b2ce6a..1ba8629a6d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Extra\sdefense\sagainst\sproblems\sfollowing\san\sOOM.\s\sdbsqlfuzz\sfind.\s\sAlso\nimport\sthe\slatest\sdbsqlfuzz\stest\scases. -D 2019-12-24T15:01:17.851 +C Fix\san\sassert()\sadded\sas\spart\sof\scommit\s[a11b393dc]\sthat\scan\sfail\sif\sfts5\sdatabase\srecords\sare\scorrupt. +D 2019-12-24T15:35:53.224 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -116,7 +116,7 @@ F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6 F ext/fts5/fts5_config.c b447948f35ad3354e8fe5e242e0a7e7b5b941555400b9404259944e3aa570037 F ext/fts5/fts5_expr.c 2be456484786333d559dc2987a00f2750981fab91d52db8452a8046278c5f22e F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 -F ext/fts5/fts5_index.c d0b7e5e79c136c6e27c96c8e8b5db7db8ec750edda427008afbec07b813178d4 +F ext/fts5/fts5_index.c 784559cf785ea1a7ff99c65724f39e45a1e74b627e458928a1e96859594c7140 F ext/fts5/fts5_main.c 9db1f173d299466aeff89bd949fb1eb0a181265726fb56f11e07ea292dcc9a73 F ext/fts5/fts5_storage.c 3ecda8edadc1f62a355d6789776be0da609f8658c50d72e422674093ab7e1528 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -157,7 +157,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 213506436fb2c87567b8e31f6d43ab30aab99354cec74ed679f22aad0cdbf283 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 5aaa2f8b44a85246a2ea76db1695bde38a75802979f3961702afa8f322d331c8 +F ext/fts5/test/fts5corrupt3.test fab4ea761b2df254fb3909423989320772a3a757de4d151ddcfa2a40a3b93328 F ext/fts5/test/fts5corrupt4.test ea805c4d7c68b5f185b9db5d2060a7ae5875339738dd48203c92162f41e7ca91 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a11b393dc2c882cf0b3c47c3405bf43ca1d6459605bd39cccce4d32da653a72d -R 27ce7f877a564e4328201c0fcf5cd524 -U drh -Z 02d9d6056c86e58fa1f721e17435d869 +P 0a70f5ddaf3567f335cc0fd0fcd5303e2afb5e38a6388faddf5cab1f2a74e3dd +R c925e095c0b909e03163107ccc245144 +U dan +Z 4752e99a5dbec9811e8b98a3225a221a diff --git a/manifest.uuid b/manifest.uuid index f01574c641..3ee85c7b1c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0a70f5ddaf3567f335cc0fd0fcd5303e2afb5e38a6388faddf5cab1f2a74e3dd \ No newline at end of file +4630c1ec013a4c2e54a34c9a64b2c803ac3912450de660497eb34ee21c91f426 \ No newline at end of file From 3fee9de239901b9e71110c448e5876617e3b2940 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 24 Dec 2019 16:20:05 +0000 Subject: [PATCH 071/120] Fix another case where malformed utf-8 was being mishandled in fts5. Fix for [df46a6f3]. FossilOrigin-Name: 1c0a05b09a97e6e2e9b11c31ed6ec7e6484686614b587ebfd0cfe27d973ba461 --- ext/fts5/fts5_index.c | 7 +++++-- ext/fts5/test/fts5misc.test | 17 +++++++++++++++++ manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 011011431f..2293343705 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -5318,10 +5318,13 @@ int sqlite3Fts5IndexCharlenToBytelen( for(i=0; i=nByte ) return 0; /* Input contains fewer than nChar chars */ if( (unsigned char)p[n++]>=0xc0 ){ - if( n>=nByte ) break; + if( n>=nByte ) return 0; while( (p[n] & 0xc0)==0x80 ){ n++; - if( n>=nByte ) break; + if( n>=nByte ){ + if( i+1==nChar ) break; + return 0; + } } } } diff --git a/ext/fts5/test/fts5misc.test b/ext/fts5/test/fts5misc.test index d117205bb3..04cdfba611 100644 --- a/ext/fts5/test/fts5misc.test +++ b/ext/fts5/test/fts5misc.test @@ -266,5 +266,22 @@ do_execsql_test 10.2 { INSERT INTO vt1(vt1) VALUES('integrity-check'); } +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 11.0 { + CREATE VIRTUAL TABLE vt0 USING fts5( + c0, prefix = 71, tokenize = "porter ascii", prefix = 9 + ); +} {} + +do_execsql_test 11.1 { + BEGIN; + INSERT INTO vt0(c0) VALUES (x'e8'); +} +do_execsql_test 11.2 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} + finish_test diff --git a/manifest b/manifest index 1ba8629a6d..01406c6bb6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sadded\sas\spart\sof\scommit\s[a11b393dc]\sthat\scan\sfail\sif\sfts5\sdatabase\srecords\sare\scorrupt. -D 2019-12-24T15:35:53.224 +C Fix\sanother\scase\swhere\smalformed\sutf-8\swas\sbeing\smishandled\sin\sfts5.\sFix\sfor\s[df46a6f3]. +D 2019-12-24T16:20:05.755 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -116,7 +116,7 @@ F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6 F ext/fts5/fts5_config.c b447948f35ad3354e8fe5e242e0a7e7b5b941555400b9404259944e3aa570037 F ext/fts5/fts5_expr.c 2be456484786333d559dc2987a00f2750981fab91d52db8452a8046278c5f22e F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 -F ext/fts5/fts5_index.c 784559cf785ea1a7ff99c65724f39e45a1e74b627e458928a1e96859594c7140 +F ext/fts5/fts5_index.c f704b61e134109de766ce98100a35204ec3e64efc37bf87b30e04ce17755452d F ext/fts5/fts5_main.c 9db1f173d299466aeff89bd949fb1eb0a181265726fb56f11e07ea292dcc9a73 F ext/fts5/fts5_storage.c 3ecda8edadc1f62a355d6789776be0da609f8658c50d72e422674093ab7e1528 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -189,7 +189,7 @@ F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc27826807405 F ext/fts5/test/fts5matchinfo.test 50d86da66ec5b27603dcd90ba0227f5d9deb10351cbc52974a88e24f6fc9b076 F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6 F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 -F ext/fts5/test/fts5misc.test b294b1d7ad814da30e473905a8165de1bfe137822d243f2ab8cbf20ecc37bd1e +F ext/fts5/test/fts5misc.test bd6256df641e76fc0ccd9558707e39fed80c033ce3abb8c9a162cd68e0c18dda F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581 F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0a70f5ddaf3567f335cc0fd0fcd5303e2afb5e38a6388faddf5cab1f2a74e3dd -R c925e095c0b909e03163107ccc245144 +P 4630c1ec013a4c2e54a34c9a64b2c803ac3912450de660497eb34ee21c91f426 +R 1a8908752b44d0f45dd43aab7ad0fcac U dan -Z 4752e99a5dbec9811e8b98a3225a221a +Z 13978aa5759e244af756578de8231027 diff --git a/manifest.uuid b/manifest.uuid index 3ee85c7b1c..caf9d30c2d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4630c1ec013a4c2e54a34c9a64b2c803ac3912450de660497eb34ee21c91f426 \ No newline at end of file +1c0a05b09a97e6e2e9b11c31ed6ec7e6484686614b587ebfd0cfe27d973ba461 \ No newline at end of file From a194d3152c9d78090524290aef5a014b66abb7b4 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 24 Dec 2019 18:53:13 +0000 Subject: [PATCH 072/120] Make the zipfile() extension function more robust against zero-length filenames. FossilOrigin-Name: b9c2005f0291d58d7f3bfd4a2286eb6563e9c9433519c3329035f325fc723445 --- ext/misc/zipfile.c | 4 ++-- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ext/misc/zipfile.c b/ext/misc/zipfile.c index ec820038e2..e24865020c 100644 --- a/ext/misc/zipfile.c +++ b/ext/misc/zipfile.c @@ -2025,13 +2025,13 @@ void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){ ** at the end of the path. Or, if this is not a directory and the path ** ends in '/' it is an error. */ if( bIsDir==0 ){ - if( zName[nName-1]=='/' ){ + if( nName>0 && zName[nName-1]=='/' ){ zErr = sqlite3_mprintf("non-directory name must not end with /"); rc = SQLITE_ERROR; goto zipfile_step_out; } }else{ - if( zName[nName-1]!='/' ){ + if( nName==0 || zName[nName-1]!='/' ){ zName = zFree = sqlite3_mprintf("%s/", zName); if( zName==0 ){ rc = SQLITE_NOMEM; diff --git a/manifest b/manifest index 01406c6bb6..7980796dd8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\scase\swhere\smalformed\sutf-8\swas\sbeing\smishandled\sin\sfts5.\sFix\sfor\s[df46a6f3]. -D 2019-12-24T16:20:05.755 +C Make\sthe\szipfile()\sextension\sfunction\smore\srobust\sagainst\szero-length\sfilenames. +D 2019-12-24T18:53:13.812 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -324,7 +324,7 @@ F ext/misc/vfsstat.c 77b5b4235c9f7f11eddf82487c0a422944ac2f132dafd5af3be7a68a057 F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212 -F ext/misc/zipfile.c 46b8022d5c4f118995c3e7228542215204dacc9c1c4e9872710900ec276d6db3 +F ext/misc/zipfile.c 010d67eeca123e3a89ab4144221bc4da66455fc964053602af5bb63584110bc7 F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64 F ext/rbu/rbu.c 8681f6157db6adc82c34af24b14ea8a3be0146ad2a3b6c1d5da6cb8a5796c8ce F ext/rbu/rbu1.test 221d9c18a5e600ac9ac6b1810d99d9f99163a7909ba61597876ab6e4d4beb3d6 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4630c1ec013a4c2e54a34c9a64b2c803ac3912450de660497eb34ee21c91f426 -R 1a8908752b44d0f45dd43aab7ad0fcac -U dan -Z 13978aa5759e244af756578de8231027 +P 1c0a05b09a97e6e2e9b11c31ed6ec7e6484686614b587ebfd0cfe27d973ba461 +R 933ae05740077a8424843ac050f8609d +U drh +Z 953d680bd67e02f4ea8af1d20d201007 diff --git a/manifest.uuid b/manifest.uuid index caf9d30c2d..789a9a1b82 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1c0a05b09a97e6e2e9b11c31ed6ec7e6484686614b587ebfd0cfe27d973ba461 \ No newline at end of file +b9c2005f0291d58d7f3bfd4a2286eb6563e9c9433519c3329035f325fc723445 \ No newline at end of file From 4fcce747e2a36ff3c8ad5dc0dcfed358522a269f Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 24 Dec 2019 20:51:01 +0000 Subject: [PATCH 073/120] Fix a problem causing fts5 integrity-check failures if numeric values are inserted into a table within a utf-16 database. Fix for [752fdbf6]. FossilOrigin-Name: bae060f382e4386c0793db4aa280fe9cd4893307d17a1801a17218ae4dc031c2 --- ext/fts5/fts5_index.c | 2 +- ext/fts5/test/fts5misc.test | 15 ++++++++++++++- manifest | 16 ++++++++-------- manifest.uuid | 2 +- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 2293343705..eb20af8166 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -5937,8 +5937,8 @@ static void fts5IndexIntegrityCheckSegment( i64 iRow; /* Rowid for this leaf */ Fts5Data *pLeaf; /* Data for this leaf */ + const char *zIdxTerm = (const char*)sqlite3_column_blob(pStmt, 1); int nIdxTerm = sqlite3_column_bytes(pStmt, 1); - const char *zIdxTerm = (const char*)sqlite3_column_text(pStmt, 1); int iIdxLeaf = sqlite3_column_int(pStmt, 2); int bIdxDlidx = sqlite3_column_int(pStmt, 3); diff --git a/ext/fts5/test/fts5misc.test b/ext/fts5/test/fts5misc.test index 04cdfba611..9a61210c65 100644 --- a/ext/fts5/test/fts5misc.test +++ b/ext/fts5/test/fts5misc.test @@ -274,7 +274,6 @@ do_execsql_test 11.0 { c0, prefix = 71, tokenize = "porter ascii", prefix = 9 ); } {} - do_execsql_test 11.1 { BEGIN; INSERT INTO vt0(c0) VALUES (x'e8'); @@ -283,5 +282,19 @@ do_execsql_test 11.2 { INSERT INTO vt0(vt0) VALUES('integrity-check'); } +#------------------------------------------------------------------------- +# Ticket [752fdbf6] +# +reset_db +do_execsql_test 11.0 { + PRAGMA encoding = 'UTF-16'; + CREATE VIRTUAL TABLE vt0 USING fts5(c0, c1); + INSERT INTO vt0(vt0, rank) VALUES('pgsz', '37'); + INSERT INTO vt0(c0, c1) VALUES (0.66077, 1957391816); +} +do_execsql_test 11.1 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} + finish_test diff --git a/manifest b/manifest index 7980796dd8..5400b3ceeb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sthe\szipfile()\sextension\sfunction\smore\srobust\sagainst\szero-length\sfilenames. -D 2019-12-24T18:53:13.812 +C Fix\sa\sproblem\scausing\sfts5\sintegrity-check\sfailures\sif\snumeric\svalues\sare\sinserted\sinto\sa\stable\swithin\sa\sutf-16\sdatabase.\sFix\sfor\s[752fdbf6]. +D 2019-12-24T20:51:01.789 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -116,7 +116,7 @@ F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6 F ext/fts5/fts5_config.c b447948f35ad3354e8fe5e242e0a7e7b5b941555400b9404259944e3aa570037 F ext/fts5/fts5_expr.c 2be456484786333d559dc2987a00f2750981fab91d52db8452a8046278c5f22e F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 -F ext/fts5/fts5_index.c f704b61e134109de766ce98100a35204ec3e64efc37bf87b30e04ce17755452d +F ext/fts5/fts5_index.c e3573c88ce8238f7a5892c777a9ddf646c1355012780337d783fb2dfc3dca650 F ext/fts5/fts5_main.c 9db1f173d299466aeff89bd949fb1eb0a181265726fb56f11e07ea292dcc9a73 F ext/fts5/fts5_storage.c 3ecda8edadc1f62a355d6789776be0da609f8658c50d72e422674093ab7e1528 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -189,7 +189,7 @@ F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc27826807405 F ext/fts5/test/fts5matchinfo.test 50d86da66ec5b27603dcd90ba0227f5d9deb10351cbc52974a88e24f6fc9b076 F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6 F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 -F ext/fts5/test/fts5misc.test bd6256df641e76fc0ccd9558707e39fed80c033ce3abb8c9a162cd68e0c18dda +F ext/fts5/test/fts5misc.test 1da7c54fff4c3584dbf60a770e997792459c5930dc36b5182d68595e39bbf8f9 F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581 F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1c0a05b09a97e6e2e9b11c31ed6ec7e6484686614b587ebfd0cfe27d973ba461 -R 933ae05740077a8424843ac050f8609d -U drh -Z 953d680bd67e02f4ea8af1d20d201007 +P b9c2005f0291d58d7f3bfd4a2286eb6563e9c9433519c3329035f325fc723445 +R 7f0e48842e6b5bcfdbb69ec084979d12 +U dan +Z 93c602bc1993059f2ccb7d930f69aa4d diff --git a/manifest.uuid b/manifest.uuid index 789a9a1b82..f1d185a745 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b9c2005f0291d58d7f3bfd4a2286eb6563e9c9433519c3329035f325fc723445 \ No newline at end of file +bae060f382e4386c0793db4aa280fe9cd4893307d17a1801a17218ae4dc031c2 \ No newline at end of file From c7a5ff45b92fbd2db1beba2411fdc0bf07874d0b Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 24 Dec 2019 21:01:37 +0000 Subject: [PATCH 074/120] Backout the early VTable cursor close change from yesterday, as Yongheng and Rui have found a test case for which it fails. The new test case is added to fuzzcheck. FossilOrigin-Name: ddb10f0374e66886d0681937b14cf0b4f100f03d3955b45b6c508dc6d9e36976 --- manifest | 17 +++++++++-------- manifest.uuid | 2 +- src/where.c | 5 +---- test/fuzzdata8.db | Bin 1607680 -> 1608704 bytes 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 5400b3ceeb..7f3882aa04 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\scausing\sfts5\sintegrity-check\sfailures\sif\snumeric\svalues\sare\sinserted\sinto\sa\stable\swithin\sa\sutf-16\sdatabase.\sFix\sfor\s[752fdbf6]. -D 2019-12-24T20:51:01.789 +C Backout\sthe\searly\sVTable\scursor\sclose\schange\sfrom\syesterday,\sas\sYongheng\sand\nRui\shave\sfound\sa\stest\scase\sfor\swhich\sit\sfails.\s\sThe\snew\stest\scase\sis\sadded\nto\sfuzzcheck. +D 2019-12-24T21:01:37.072 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -613,7 +613,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 15a2845769f51ba132f9cf0b2c7a6887a91fc8437892dbcce9fcdc68b66d60a1 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d -F src/where.c ac6704a7c5758d603ceaa0d6fcb9cd2d34b57cd3a6a7b598b3eddea558bc54ed +F src/where.c 58653781a4b31fa16b95b953591fdc1f1ed5ff77574e59b90a27da3819b60a46 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c bb58d5e6e7f583db5b74e0fd35f1d65fdee67d20553b55cd6098fc3f8148053a F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 @@ -1017,7 +1017,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db 7fd98a5d4c281d993950212507ad56a55ace0cf3083785eb3366aad9ebd8041c +F test/fuzzdata8.db 5666148e99337de4f87c2df75c6ca2cc48ed813f6defc79c4982df37ffec81bc F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1852,7 +1852,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 b9c2005f0291d58d7f3bfd4a2286eb6563e9c9433519c3329035f325fc723445 -R 7f0e48842e6b5bcfdbb69ec084979d12 -U dan -Z 93c602bc1993059f2ccb7d930f69aa4d +P bae060f382e4386c0793db4aa280fe9cd4893307d17a1801a17218ae4dc031c2 +Q -eb95dac7f6482c36853a23234c5ce7af37c7beed8e3675d6a49c4d3a8307e076 +R 056e130351576a95134652be2c0d73eb +U drh +Z 0627f3ed229bfb4c9422500dce5b2813 diff --git a/manifest.uuid b/manifest.uuid index f1d185a745..d75c569f0c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bae060f382e4386c0793db4aa280fe9cd4893307d17a1801a17218ae4dc031c2 \ No newline at end of file +ddb10f0374e66886d0681937b14cf0b4f100f03d3955b45b6c508dc6d9e36976 \ No newline at end of file diff --git a/src/where.c b/src/where.c index af490390c5..830dbfde3a 100644 --- a/src/where.c +++ b/src/where.c @@ -5341,16 +5341,13 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ continue; } - if( IsVirtual(pTab) ){ - sqlite3VdbeAddOp1(v, OP_Close, pTabItem->iCursor); - } #ifdef SQLITE_ENABLE_EARLY_CURSOR_CLOSE /* Close all of the cursors that were opened by sqlite3WhereBegin. ** Except, do not close cursors that will be reused by the OR optimization ** (WHERE_OR_SUBCLAUSE). And do not close the OP_OpenWrite cursors ** created for the ONEPASS optimization. */ - else if( (pTab->tabFlags & TF_Ephemeral)==0 + if( (pTab->tabFlags & TF_Ephemeral)==0 && pTab->pSelect==0 && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){ diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 7247ea141662d090df2375bb219475c6802ce5e7..f3f4d2eb93a1035613734586363d77ca2d6a9e00 100644 GIT binary patch delta 19662 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 X^W#xrn=mjgoXS&|Nxnz<_jUgt=f^7z delta 19335 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 Date: Tue, 24 Dec 2019 21:42:22 +0000 Subject: [PATCH 075/120] Fix a minor performance regression from check-in [401c9d30e06191d9] FossilOrigin-Name: 76f54ee86777cbf530654323c953388ef64d0608516722d2522be6c859fa1382 --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/vdbe.c | 10 ++++------ 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 7f3882aa04..405691aeec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Backout\sthe\searly\sVTable\scursor\sclose\schange\sfrom\syesterday,\sas\sYongheng\sand\nRui\shave\sfound\sa\stest\scase\sfor\swhich\sit\sfails.\s\sThe\snew\stest\scase\sis\sadded\nto\sfuzzcheck. -D 2019-12-24T21:01:37.072 +C Fix\sa\sminor\sperformance\sregression\sfrom\scheck-in\s[401c9d30e06191d9] +D 2019-12-24T21:42:22.593 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -599,7 +599,7 @@ F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 8691c41f61e27f2f36c3c6559ab5aa32a7d552c4fedf1d618f24dd7a58670a8b +F src/vdbe.c 8b0f3445b75be6aa381a961a3206decf6e169c5b5625349fcb7e287e9deffa14 F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 F src/vdbeInt.h 1ccaf470287e2d153b16cf7b0274d436db2c2f74cdf14afd1a0ff4cb51548ae6 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -1852,8 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bae060f382e4386c0793db4aa280fe9cd4893307d17a1801a17218ae4dc031c2 -Q -eb95dac7f6482c36853a23234c5ce7af37c7beed8e3675d6a49c4d3a8307e076 -R 056e130351576a95134652be2c0d73eb +P ddb10f0374e66886d0681937b14cf0b4f100f03d3955b45b6c508dc6d9e36976 +R 5b1079c8a384ce37450b3fecba55c04d U drh -Z 0627f3ed229bfb4c9422500dce5b2813 +Z b050346f80259aa216b8caa58ba47eb4 diff --git a/manifest.uuid b/manifest.uuid index d75c569f0c..7fc9e7916d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ddb10f0374e66886d0681937b14cf0b4f100f03d3955b45b6c508dc6d9e36976 \ No newline at end of file +76f54ee86777cbf530654323c953388ef64d0608516722d2522be6c859fa1382 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 05e26e57da..d1416028b2 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2052,11 +2052,9 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ sqlite3VdbeMemStringify(pIn1, encoding, 1); testcase( (flags1&MEM_Dyn) != (pIn1->flags&MEM_Dyn) ); flags1 = (pIn1->flags & ~MEM_TypeMask) | (flags1 & MEM_TypeMask); + if( pIn1==pIn3 ) flags3 = flags1 | MEM_Str; } - if( (flags3 & MEM_Str)==0 - && (flags3&(MEM_Int|MEM_Real|MEM_IntReal))!=0 - && pIn1!=pIn3 - ){ + if( (flags3 & MEM_Str)==0 && (flags3&(MEM_Int|MEM_Real|MEM_IntReal))!=0 ){ testcase( pIn3->flags & MEM_Int ); testcase( pIn3->flags & MEM_Real ); testcase( pIn3->flags & MEM_IntReal ); @@ -2089,10 +2087,10 @@ compare_op: } /* Undo any changes made by applyAffinity() to the input registers. */ - assert( (pIn1->flags & MEM_Dyn) == (flags1 & MEM_Dyn) ); - pIn1->flags = flags1; assert( (pIn3->flags & MEM_Dyn) == (flags3 & MEM_Dyn) ); pIn3->flags = flags3; + assert( (pIn1->flags & MEM_Dyn) == (flags1 & MEM_Dyn) ); + pIn1->flags = flags1; if( pOp->p5 & SQLITE_STOREP2 ){ pOut = &aMem[pOp->p2]; From a9ebfe20309d5aeec90337099a27e68454d16ff6 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 25 Dec 2019 23:54:21 +0000 Subject: [PATCH 076/120] When the sqlite3WindowRewrite() routine detects and error, have it convert the SELECT statement into just "SELECT null" so that it does not leave the parse tree in a goofy state that can cause problems with subsequent code before the stack has a chance to unwind and report the error. Ticket [d87336c81c7d0873] FossilOrigin-Name: fa58aad48a788802b13a819e49f9b8787f713bbe395c46c7295e821c52c81738 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/expr.c | 7 +++++-- src/select.c | 27 +++++++++++++++++++++++---- src/sqliteInt.h | 3 ++- src/window.c | 12 +++++++++--- test/window1.test | 11 ++++++++++- 7 files changed, 60 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index 405691aeec..c938290f74 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sminor\sperformance\sregression\sfrom\scheck-in\s[401c9d30e06191d9] -D 2019-12-24T21:42:22.593 +C When\sthe\ssqlite3WindowRewrite()\sroutine\sdetects\sand\serror,\shave\sit\sconvert\nthe\sSELECT\sstatement\sinto\sjust\s"SELECT\snull"\sso\sthat\sit\sdoes\snot\sleave\sthe\nparse\stree\sin\sa\sgoofy\sstate\sthat\scan\scause\sproblems\swith\ssubsequent\scode\nbefore\sthe\sstack\shas\sa\schance\sto\sunwind\sand\sreport\sthe\serror.\nTicket\s[d87336c81c7d0873] +D 2019-12-25T23:54:21.640 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 518e46716bcf072b41e3e88209965e2495f4c7888f2f698ff00b3e415738912d +F src/expr.c 3a27de3630d2dec266423505f1ad38484096df4b6d80cf5c90076340d6b2b810 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -527,12 +527,12 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 86a7773d2892227ba9ad1721c41bb03c501830f1bf6de5f78dd0062b82e10c9d F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c b895d809b93596c828c4cd79f4da96d48bf1969414877bb4313770000ea736cc +F src/select.c 338c1e7e2d88f1ecc47b3f0b1af73522baffe5b6461d86510bec80b70d9eb63f F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817ded F src/sqlite.h.in 2a23e8161775253d9cf383c2c6aa559005dc787d350dcb0be67a6c4cc3bd1d19 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h eada1e78b6b950670eb4cc093ce6eb96a7df8bc548cabd7bc6127fa4fbce8ba5 +F src/sqliteInt.h 3e235c7a406630bff9fe7183d9af5d4ce21a9b7acb77bf1b82a0caa130a5f687 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -617,7 +617,7 @@ F src/where.c 58653781a4b31fa16b95b953591fdc1f1ed5ff77574e59b90a27da3819b60a46 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c bb58d5e6e7f583db5b74e0fd35f1d65fdee67d20553b55cd6098fc3f8148053a F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 -F src/window.c da010455914c81037dcb5b0c6f4273f8a32c94567865c46a60060b937b018a96 +F src/window.c a5b69ea3cd22555d390582771173a68c1b798a0847aef3bd9eb51792bc6fcacb F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1713,7 +1713,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 790c9f12bc4c6f789216fb2c38bd1fbf5e191bed8b9a3712326e4af1a50222c0 +F test/window1.test 7968f1baa13e4f4399a65a21ae9c324a073c28c684adcda2ddf1ea25741d1faa F test/window2.tcl 114b217d4ffff891142023cc5f3131b0dae3ad149ac4b45a6ed9e2ad943f8ce2 F test/window2.test dea2ffecb7182a385143ea0eb368b6241ee43c5f971f4ad1c4337029cb1fc10a F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ddb10f0374e66886d0681937b14cf0b4f100f03d3955b45b6c508dc6d9e36976 -R 5b1079c8a384ce37450b3fecba55c04d +P 76f54ee86777cbf530654323c953388ef64d0608516722d2522be6c859fa1382 +R c46405001dbbf37c4a4da195980c58c5 U drh -Z b050346f80259aa216b8caa58ba47eb4 +Z 7b421b0b8aa6e2e1e8fb7d8227a85505 diff --git a/manifest.uuid b/manifest.uuid index 7fc9e7916d..0ca15f04c1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -76f54ee86777cbf530654323c953388ef64d0608516722d2522be6c859fa1382 \ No newline at end of file +fa58aad48a788802b13a819e49f9b8787f713bbe395c46c7295e821c52c81738 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 601574e68e..7901608d2d 100644 --- a/src/expr.c +++ b/src/expr.c @@ -594,6 +594,7 @@ static void codeVectorCompare( int addrDone = sqlite3VdbeMakeLabel(pParse); int isCommuted = ExprHasProperty(pExpr,EP_Commuted); + if( pParse->nErr ) return; if( nLeft!=sqlite3ExprVectorSize(pRight) ){ sqlite3ErrorMsg(pParse, "row value misused"); return; @@ -2686,8 +2687,10 @@ static char *exprINAffinity(Parse *pParse, Expr *pExpr){ ** "sub-select returns N columns - expected M" */ void sqlite3SubselectError(Parse *pParse, int nActual, int nExpect){ - const char *zFmt = "sub-select returns %d columns - expected %d"; - sqlite3ErrorMsg(pParse, zFmt, nActual, nExpect); + if( pParse->nErr==0 ){ + const char *zFmt = "sub-select returns %d columns - expected %d"; + sqlite3ErrorMsg(pParse, zFmt, nActual, nExpect); + } } #endif diff --git a/src/select.c b/src/select.c index 6fff2883ec..60744e825a 100644 --- a/src/select.c +++ b/src/select.c @@ -84,7 +84,10 @@ struct SortCtx { /* ** Delete all the content of a Select structure. Deallocate the structure -** itself only if bFree is true. +** itself depending on the value of bFree +** +** If bFree==1, call sqlite3DbFree() on the p object. +** If bFree==0, Leave the first Select object unfreed */ static void clearSelect(sqlite3 *db, Select *p, int bFree){ while( p ){ @@ -188,6 +191,20 @@ void sqlite3SelectDelete(sqlite3 *db, Select *p){ if( OK_IF_ALWAYS_TRUE(p) ) clearSelect(db, p, 1); } +/* +** Delete all the substructure for p, but keep p allocated. Redefine +** p to be a single SELECT where every column of the result set has a +** value of NULL. +*/ +void sqlite3SelectReset(Parse *pParse, Select *p){ + if( ALWAYS(p) ){ + clearSelect(pParse->db, p, 0); + memset(&p->iLimit, 0, sizeof(Select) - offsetof(Select,iLimit)); + p->pEList = sqlite3ExprListAppend(pParse, 0, + sqlite3ExprAlloc(pParse->db,TK_NULL,0,0)); + } +} + /* ** Return a pointer to the right-most SELECT statement in a compound. */ @@ -2711,9 +2728,9 @@ static int multiSelect( ** it is that we currently need. */ assert( unionTab==dest.iSDParm || dest.eDest!=priorOp ); - if( dest.eDest!=priorOp ){ + assert( p->pEList || db->mallocFailed ); + if( dest.eDest!=priorOp && db->mallocFailed==0 ){ int iCont, iBreak, iStart; - assert( p->pEList ); iBreak = sqlite3VdbeMakeLabel(pParse); iCont = sqlite3VdbeMakeLabel(pParse); computeLimitRegisters(pParse, p, iBreak); @@ -5738,7 +5755,9 @@ int sqlite3Select( } #ifndef SQLITE_OMIT_WINDOWFUNC - if( sqlite3WindowRewrite(pParse, p) ){ + rc = sqlite3WindowRewrite(pParse, p); + if( rc ){ + assert( pParse->nErr>0 ); goto select_end; } #if SELECTTRACE_ENABLED diff --git a/src/sqliteInt.h b/src/sqliteInt.h index a8cdb9f6ad..c1ed684ffc 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2918,13 +2918,13 @@ struct Upsert { ** sequences for the ORDER BY clause. */ struct Select { - ExprList *pEList; /* The fields of the result */ u8 op; /* One of: TK_UNION TK_ALL TK_INTERSECT TK_EXCEPT */ LogEst nSelectRow; /* Estimated number of result rows */ u32 selFlags; /* Various SF_* values */ int iLimit, iOffset; /* Memory registers holding LIMIT & OFFSET counters */ u32 selId; /* Unique identifier number for this SELECT */ int addrOpenEphm[2]; /* OP_OpenEphem opcodes related to this select */ + ExprList *pEList; /* The fields of the result */ SrcList *pSrc; /* The FROM clause */ Expr *pWhere; /* The WHERE clause */ ExprList *pGroupBy; /* The GROUP BY clause */ @@ -4092,6 +4092,7 @@ int sqlite3Select(Parse*, Select*, SelectDest*); Select *sqlite3SelectNew(Parse*,ExprList*,SrcList*,Expr*,ExprList*, Expr*,ExprList*,u32,Expr*); void sqlite3SelectDelete(sqlite3*, Select*); +void sqlite3SelectReset(Parse*, Select*); Table *sqlite3SrcListLookup(Parse*, SrcList*); int sqlite3IsReadOnly(Parse*, Table*, int); void sqlite3OpenTable(Parse*, int iCur, int iDb, Table*, int); diff --git a/src/window.c b/src/window.c index f4e12f5fdb..ab8f2c867a 100644 --- a/src/window.c +++ b/src/window.c @@ -1021,6 +1021,9 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ pSub->selFlags |= SF_Expanded; pTab2 = sqlite3ResultSetOfSelect(pParse, pSub, SQLITE_AFF_NONE); if( pTab2==0 ){ + /* Might actually be some other kind of error, but in that case + ** pParse->nErr will be set, so if SQLITE_NOMEM is set, we will get + ** the correct error message regardless. */ rc = SQLITE_NOMEM; }else{ memcpy(pTab, pTab2, sizeof(Table)); @@ -1039,9 +1042,12 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ sqlite3DbFree(db, pTab); } - if( rc && pParse->nErr==0 ){ - assert( pParse->db->mallocFailed ); - return sqlite3ErrorToParser(pParse->db, SQLITE_NOMEM); + if( rc ){ + if( pParse->nErr==0 ){ + assert( pParse->db->mallocFailed ); + sqlite3ErrorToParser(pParse->db, SQLITE_NOMEM); + } + sqlite3SelectReset(pParse, p); } return rc; } diff --git a/test/window1.test b/test/window1.test index fc729354bd..4249a58e83 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1329,7 +1329,7 @@ do_execsql_test 37.20 { SELECT c FROM v0 WHERE c BETWEEN -10 AND 20; } {} -# 2019-20-20 mrigger reported problem with a FILTER clause on an aggregate +# 2019-12-20 mrigger reported problem with a FILTER clause on an aggregate # in a join. # reset_db @@ -1361,5 +1361,14 @@ do_execsql_test 39.4 { SELECT * FROM t0 WHERE (t0.c0, 1) IN(SELECT NTILE(1) OVER(), 0 FROM t0); } +# 2019-12-25 ticket d87336c81c7d0873 +# +reset_db +do_catchsql_test 40.1 { + CREATE VIRTUAL TABLE t0 USING rtree(c0, c1, c2); + SELECT * FROM t0 + WHERE ((0,0) IN (SELECT COUNT(*),LAG(5)OVER(PARTITION BY 0) FROM t0),0)<=(c1,0); +} {1 {1st ORDER BY term out of range - should be between 1 and 3}} + finish_test From e86f3402ac8a1fc965a57749467bc87e199aa793 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 26 Dec 2019 00:20:56 +0000 Subject: [PATCH 077/120] Disables the optimization that tries to pull the value of an expression from an index on that expression if the expression is a constant. FossilOrigin-Name: e5fd8b50500f9225e435ef5afee98e3c2cccd22785f99c718d7e6c9b5b653c56 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index c938290f74..9bfbd55787 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sthe\ssqlite3WindowRewrite()\sroutine\sdetects\sand\serror,\shave\sit\sconvert\nthe\sSELECT\sstatement\sinto\sjust\s"SELECT\snull"\sso\sthat\sit\sdoes\snot\sleave\sthe\nparse\stree\sin\sa\sgoofy\sstate\sthat\scan\scause\sproblems\swith\ssubsequent\scode\nbefore\sthe\sstack\shas\sa\schance\sto\sunwind\sand\sreport\sthe\serror.\nTicket\s[d87336c81c7d0873] -D 2019-12-25T23:54:21.640 +C Disables\sthe\soptimization\sthat\stries\sto\spull\sthe\svalue\sof\san\sexpression\nfrom\san\sindex\son\sthat\sexpression\sif\sthe\sexpression\sis\sa\sconstant. +D 2019-12-26T00:20:56.165 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -615,7 +615,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d F src/where.c 58653781a4b31fa16b95b953591fdc1f1ed5ff77574e59b90a27da3819b60a46 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 -F src/wherecode.c bb58d5e6e7f583db5b74e0fd35f1d65fdee67d20553b55cd6098fc3f8148053a +F src/wherecode.c d42d3e0fe93786621b84dec8065e1dc6b324d7c5934df52f141555843b6aef4e F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 F src/window.c a5b69ea3cd22555d390582771173a68c1b798a0847aef3bd9eb51792bc6fcacb F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 76f54ee86777cbf530654323c953388ef64d0608516722d2522be6c859fa1382 -R c46405001dbbf37c4a4da195980c58c5 +P fa58aad48a788802b13a819e49f9b8787f713bbe395c46c7295e821c52c81738 +R 23cede26d783f7f8444bfd01b22a435c U drh -Z 7b421b0b8aa6e2e1e8fb7d8227a85505 +Z 433fcc770d9a07273e25c3f3a5f0cde4 diff --git a/manifest.uuid b/manifest.uuid index 0ca15f04c1..1033ed44a3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fa58aad48a788802b13a819e49f9b8787f713bbe395c46c7295e821c52c81738 \ No newline at end of file +e5fd8b50500f9225e435ef5afee98e3c2cccd22785f99c718d7e6c9b5b653c56 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index d5d3403744..a24dea82ee 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1192,6 +1192,7 @@ static void whereIndexExprTrans( if( iRef==XN_EXPR ){ assert( aColExpr->a[iIdxCol].pExpr!=0 ); x.pIdxExpr = aColExpr->a[iIdxCol].pExpr; + if( sqlite3ExprIsConstant(x.pIdxExpr) ) continue; w.xExprCallback = whereIndexExprTransNode; #ifndef SQLITE_OMIT_GENERATED_COLUMNS }else if( iRef>=0 From aaa5ba0609cfcf1b78c5806497b5620b76b8730d Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 26 Dec 2019 00:53:43 +0000 Subject: [PATCH 078/120] Fix an incorrect assert() added by check-in [fa58aad48a788802]. Problem found by dbsqlfuzz. FossilOrigin-Name: a17b29f08c888301911c35096899f10d24192c8ecec467cddde5401b6bd1903f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 9bfbd55787..4c15ca405f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disables\sthe\soptimization\sthat\stries\sto\spull\sthe\svalue\sof\san\sexpression\nfrom\san\sindex\son\sthat\sexpression\sif\sthe\sexpression\sis\sa\sconstant. -D 2019-12-26T00:20:56.165 +C Fix\san\sincorrect\sassert()\sadded\sby\scheck-in\s[fa58aad48a788802].\nProblem\sfound\sby\sdbsqlfuzz. +D 2019-12-26T00:53:43.165 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -527,7 +527,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 86a7773d2892227ba9ad1721c41bb03c501830f1bf6de5f78dd0062b82e10c9d F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 338c1e7e2d88f1ecc47b3f0b1af73522baffe5b6461d86510bec80b70d9eb63f +F src/select.c 83e3aba723cd50134b8af4b18433f46123c31889a39c8b4ac28cccedbdf070e8 F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817ded F src/sqlite.h.in 2a23e8161775253d9cf383c2c6aa559005dc787d350dcb0be67a6c4cc3bd1d19 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fa58aad48a788802b13a819e49f9b8787f713bbe395c46c7295e821c52c81738 -R 23cede26d783f7f8444bfd01b22a435c +P e5fd8b50500f9225e435ef5afee98e3c2cccd22785f99c718d7e6c9b5b653c56 +R e37ba228c630cd4605b508bda7f68f0a U drh -Z 433fcc770d9a07273e25c3f3a5f0cde4 +Z 8900acbd27e9c6ec95e7c332f76f4626 diff --git a/manifest.uuid b/manifest.uuid index 1033ed44a3..f25cc4c69b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e5fd8b50500f9225e435ef5afee98e3c2cccd22785f99c718d7e6c9b5b653c56 \ No newline at end of file +a17b29f08c888301911c35096899f10d24192c8ecec467cddde5401b6bd1903f \ No newline at end of file diff --git a/src/select.c b/src/select.c index 60744e825a..5afd6b76ce 100644 --- a/src/select.c +++ b/src/select.c @@ -5757,7 +5757,7 @@ int sqlite3Select( #ifndef SQLITE_OMIT_WINDOWFUNC rc = sqlite3WindowRewrite(pParse, p); if( rc ){ - assert( pParse->nErr>0 ); + assert( db->mallocFailed || pParse->nErr>0 ); goto select_end; } #if SELECTTRACE_ENABLED From 0b12613a006a69d05f4db3efd5c4190ef6a7bee9 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 26 Dec 2019 00:54:39 +0000 Subject: [PATCH 079/120] Fix an FTS3 test case that depends on the ICU extension so that it only runs if SQLite is compiled with ICU. FossilOrigin-Name: 19c6240bdbb022b2af463e59d873280d0f2385bf30e22b9aad5fc9677a99f251 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fts3corrupt4.test | 20 +++++++++++--------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index 4c15ca405f..7f8d886f9d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sincorrect\sassert()\sadded\sby\scheck-in\s[fa58aad48a788802].\nProblem\sfound\sby\sdbsqlfuzz. -D 2019-12-26T00:53:43.165 +C Fix\san\sFTS3\stest\scase\sthat\sdepends\son\sthe\sICU\sextension\sso\sthat\sit\sonly\nruns\sif\sSQLite\sis\scompiled\swith\sICU. +D 2019-12-26T00:54:39.512 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -939,7 +939,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test ce7f7b5eaeee5f1804584d061b978d85e64abf2af9adaa7577589fac6f7eae01 F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 00ecd7605d5b1478252a3b7c2465de2d427906b8cb73b7acb92628bab81f9903 +F test/fts3corrupt4.test 5ac8c0378dab68808f080d03d8525d2262879cb23db1bc5eb138e141a4f2010c F test/fts3corrupt5.test 0549f85ec4bd22e992f645f13c59b99d652f2f5e643dac75568bfd23a6db7ed5 F test/fts3cov.test 7eacdbefd756cfa4dc2241974e3db2834e9b372ca215880e00032222f32194cf F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e5fd8b50500f9225e435ef5afee98e3c2cccd22785f99c718d7e6c9b5b653c56 -R e37ba228c630cd4605b508bda7f68f0a +P a17b29f08c888301911c35096899f10d24192c8ecec467cddde5401b6bd1903f +R a75701d36c619093c505c10a200bb09a U drh -Z 8900acbd27e9c6ec95e7c332f76f4626 +Z 3b858163913ef79a9404892a8faf03a5 diff --git a/manifest.uuid b/manifest.uuid index f25cc4c69b..a4a7547a74 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a17b29f08c888301911c35096899f10d24192c8ecec467cddde5401b6bd1903f \ No newline at end of file +19c6240bdbb022b2af463e59d873280d0f2385bf30e22b9aad5fc9677a99f251 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index a30fd74473..c244076c52 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -5769,15 +5769,17 @@ do_catchsql_test 32.1 { #------------------------------------------------------------------------- # -reset_db -do_catchsql_test 33.0 { - CREATE VIRTUAL TABLE f USING fts3(a,b,tokenize=icu); - CREATE TABLE 'f_docsize'(docid INTEGER PRIMARY KEY, size BLOB); - CREATE TABLE 'f_stat'(id INTEGER PRIMARY KEY, value BLOB); - INSERT INTO f VALUES (1, '1234'); - INSERT INTO f_stat VALUES (1,x'0000000165656565db6569746565c5c52bc5c5c53e3a003bc502ffffffffc5c5c53e3a003bc502fffffffffb8b2afbfb6565f0740100650000000165656565db6569746565c5c52bc5c5c53e3a003bc502ffffffffc5c5c53e3a003b8b00c5c5c5c5c5bfc5'); - INSERT INTO f(f) VALUES ('merge=198,49'); -} {1 {database disk image is malformed}} +ifcapable icu { + reset_db + do_catchsql_test 33.0 { + CREATE VIRTUAL TABLE f USING fts3(a,b,tokenize=icu); + CREATE TABLE 'f_docsize'(docid INTEGER PRIMARY KEY, size BLOB); + CREATE TABLE 'f_stat'(id INTEGER PRIMARY KEY, value BLOB); + INSERT INTO f VALUES (1, '1234'); + INSERT INTO f_stat VALUES (1,x'0000000165656565db6569746565c5c52bc5c5c53e3a003bc502ffffffffc5c5c53e3a003bc502fffffffffb8b2afbfb6565f0740100650000000165656565db6569746565c5c52bc5c5c53e3a003bc502ffffffffc5c5c53e3a003b8b00c5c5c5c5c5bfc5'); + INSERT INTO f(f) VALUES ('merge=198,49'); + } {1 {database disk image is malformed}} +} #------------------------------------------------------------------------- # From 96e8eebf96fb2fe0f5ab91526fa6ea2b5486f559 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 26 Dec 2019 00:56:50 +0000 Subject: [PATCH 080/120] =?UTF-8?q?In=20the=20xAccess()=20method=20of=20th?= =?UTF-8?q?e=20unix=20VFS,=20return=20true=20if=20the=20named=20object=20i?= =?UTF-8?q?s=20a=20directory,=20regardless=20of=20what=20stat()=20reports?= =?UTF-8?q?=20as=20the=20st=5Fsize=20for=20the=20object.=20=20Different=20?= =?UTF-8?q?filesystems=20report=20st=5Fsize=20differently=20for=20director?= =?UTF-8?q?ies.=20Problem=20reported=20on=20the=20mailing=20list=20by=20St?= =?UTF-8?q?efan=20Br=C3=BCns.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FossilOrigin-Name: c8c6dd0e6582ec9103d007b294c42bb1820be1fa7dab85d873b04e0b90571626 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/os_unix.c | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 7f8d886f9d..7c65222f6f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sFTS3\stest\scase\sthat\sdepends\son\sthe\sICU\sextension\sso\sthat\sit\sonly\nruns\sif\sSQLite\sis\scompiled\swith\sICU. -D 2019-12-26T00:54:39.512 +C In\sthe\sxAccess()\smethod\sof\sthe\sunix\sVFS,\sreturn\strue\sif\sthe\snamed\sobject\nis\sa\sdirectory,\sregardless\sof\swhat\sstat()\sreports\sas\sthe\sst_size\sfor\sthe\nobject.\s\sDifferent\sfilesystems\sreport\sst_size\sdifferently\sfor\sdirectories.\nProblem\sreported\son\sthe\smailing\slist\sby\sStefan\sBrüns. +D 2019-12-26T00:56:50.470 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -511,7 +511,7 @@ F src/os.c 669cc3839cc35d20f81faf0be1ab6d4581cea35e9d8f3a9d48a98d6571f7c285 F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c 3e0e519f27683083a465e948e056759a8340728c222b5c394a135e0c57c220bc +F src/os_unix.c d403950128240f11da7588e30a3b4a4a34e69caf7c60937e970fb85b2860ca42 F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 7e371809d86b3f60d523396612b8fde4c8d3529bea90b04fad0f6be2703159a4 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a17b29f08c888301911c35096899f10d24192c8ecec467cddde5401b6bd1903f -R a75701d36c619093c505c10a200bb09a +P 19c6240bdbb022b2af463e59d873280d0f2385bf30e22b9aad5fc9677a99f251 +R 8837e847635b56c67cd3f8e441421593 U drh -Z 3b858163913ef79a9404892a8faf03a5 +Z 3bdf5efde545225029d73b71afc615d9 diff --git a/manifest.uuid b/manifest.uuid index a4a7547a74..7616f22256 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -19c6240bdbb022b2af463e59d873280d0f2385bf30e22b9aad5fc9677a99f251 \ No newline at end of file +c8c6dd0e6582ec9103d007b294c42bb1820be1fa7dab85d873b04e0b90571626 \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index 18f2afcb66..e6d58811c3 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -6259,7 +6259,8 @@ static int unixAccess( if( flags==SQLITE_ACCESS_EXISTS ){ struct stat buf; - *pResOut = (0==osStat(zPath, &buf) && buf.st_size>0); + *pResOut = 0==osStat(zPath, &buf) && + (S_ISDIR(buf.st_mode) || buf.st_size>0); }else{ *pResOut = osAccess(zPath, W_OK|R_OK)==0; } From 0bb7af44a35bd5d19e11feeedc7a0b1d609920ab Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 26 Dec 2019 01:02:02 +0000 Subject: [PATCH 081/120] Add two new fuzzer test cases from dbsqlfuzz. FossilOrigin-Name: f8d5586a8ceca985dcb2d63d0fbad9e271e9e1664720ee698d4947acd5dcc543 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1608704 -> 1616896 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 7c65222f6f..cd93ed6733 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sxAccess()\smethod\sof\sthe\sunix\sVFS,\sreturn\strue\sif\sthe\snamed\sobject\nis\sa\sdirectory,\sregardless\sof\swhat\sstat()\sreports\sas\sthe\sst_size\sfor\sthe\nobject.\s\sDifferent\sfilesystems\sreport\sst_size\sdifferently\sfor\sdirectories.\nProblem\sreported\son\sthe\smailing\slist\sby\sStefan\sBrüns. -D 2019-12-26T00:56:50.470 +C Add\stwo\snew\sfuzzer\stest\scases\sfrom\sdbsqlfuzz. +D 2019-12-26T01:02:02.907 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1017,7 +1017,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db 5666148e99337de4f87c2df75c6ca2cc48ed813f6defc79c4982df37ffec81bc +F test/fuzzdata8.db 858bd9bef8b8941c8dae34d983daacbd2c1d1917e58fba4b795c44da9840e8ef F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 19c6240bdbb022b2af463e59d873280d0f2385bf30e22b9aad5fc9677a99f251 -R 8837e847635b56c67cd3f8e441421593 +P c8c6dd0e6582ec9103d007b294c42bb1820be1fa7dab85d873b04e0b90571626 +R 6f423d5340ee156dec438c1b5bdc24e1 U drh -Z 3bdf5efde545225029d73b71afc615d9 +Z 53045fa65cdb9a572496969d31562b16 diff --git a/manifest.uuid b/manifest.uuid index 7616f22256..173b60a84c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c8c6dd0e6582ec9103d007b294c42bb1820be1fa7dab85d873b04e0b90571626 \ No newline at end of file +f8d5586a8ceca985dcb2d63d0fbad9e271e9e1664720ee698d4947acd5dcc543 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index f3f4d2eb93a1035613734586363d77ca2d6a9e00..ab151b55bb93894600201c97957aafa7704c5246 100644 GIT binary patch delta 26678 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 delta 22570 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 From fa53284777ce9aed6a0153ce66d472128845f87c Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 26 Dec 2019 01:10:17 +0000 Subject: [PATCH 082/120] Makefile.in fix so that it works on systems that require a .EXE suffix on executables. FossilOrigin-Name: f482a4cdfa768941e22c399de8ec29a55e729529eeae86d3832077ad1bef22f3 --- Makefile.in | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Makefile.in b/Makefile.in index 015796b65e..e4b824365d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1177,7 +1177,7 @@ FTS5_SRC = \ $(TOP)/ext/fts5/fts5_varint.c \ $(TOP)/ext/fts5/fts5_vocab.c \ -fts5parse.c: $(TOP)/ext/fts5/fts5parse.y lemon +fts5parse.c: $(TOP)/ext/fts5/fts5parse.y lemon$(BEXE) cp $(TOP)/ext/fts5/fts5parse.y . rm -f fts5parse.h ./lemon$(BEXE) $(OPTS) -S fts5parse.y diff --git a/manifest b/manifest index cd93ed6733..ff363e591b 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Add\stwo\snew\sfuzzer\stest\scases\sfrom\sdbsqlfuzz. -D 2019-12-26T01:02:02.907 +C Makefile.in\sfix\sso\sthat\sit\sworks\son\ssystems\sthat\srequire\sa\s.EXE\ssuffix\non\sexecutables. +D 2019-12-26T01:10:17.023 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in d3a862c9742f5a08230a3b295c0a47fd3067f19356dc39935280135f90474b04 +F Makefile.in 9dfc7936f675785309b74d09202bb656732325e65df889e5aaa18cc8932e5b0c F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 F Makefile.msc fab23c6b10cb6f06a7e9c407fc2e35cb184a6d653f1b793bda87fcee2eafa4f6 F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c8c6dd0e6582ec9103d007b294c42bb1820be1fa7dab85d873b04e0b90571626 -R 6f423d5340ee156dec438c1b5bdc24e1 +P f8d5586a8ceca985dcb2d63d0fbad9e271e9e1664720ee698d4947acd5dcc543 +R 6af373fa92486883d456e9ecb1d65e03 U drh -Z 53045fa65cdb9a572496969d31562b16 +Z 626f0d7b9b28ef5ff11b6bda2814f398 diff --git a/manifest.uuid b/manifest.uuid index 173b60a84c..5e0932a5a2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f8d5586a8ceca985dcb2d63d0fbad9e271e9e1664720ee698d4947acd5dcc543 \ No newline at end of file +f482a4cdfa768941e22c399de8ec29a55e729529eeae86d3832077ad1bef22f3 \ No newline at end of file From e752040c099f4137c7cbab3c4a51c684ed8173be Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 26 Dec 2019 14:36:31 +0000 Subject: [PATCH 083/120] Fix an assert() in fts5 that could fail if an xSavepoint() call on another vtab fails. FossilOrigin-Name: a5d7f5d24a239f729de0b8aa5becf5af35ba87160565ee0713c335b8d1bbf12d --- ext/fts5/fts5_main.c | 5 +- ext/fts5/test/fts5savepoint.test | 85 ++++++++++++++++++++++++++++++++ manifest | 15 +++--- manifest.uuid | 2 +- 4 files changed, 98 insertions(+), 9 deletions(-) create mode 100644 ext/fts5/test/fts5savepoint.test diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 0980c5b4d1..347bf7f23e 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -289,7 +289,10 @@ static void fts5CheckTransactionState(Fts5FullTable *p, int op, int iSavepoint){ case FTS5_ROLLBACKTO: assert( p->ts.eState==1 ); assert( iSavepoint>=-1 ); - assert( iSavepoint<=p->ts.iSavepoint ); + /* The following assert() can fail if another vtab strikes an error + ** within an xSavepoint() call then SQLite calls xRollbackTo() - without + ** having called xSavepoint() on this vtab. */ + /* assert( iSavepoint<=p->ts.iSavepoint ); */ p->ts.iSavepoint = iSavepoint; break; } diff --git a/ext/fts5/test/fts5savepoint.test b/ext/fts5/test/fts5savepoint.test new file mode 100644 index 0000000000..e431f9f5fd --- /dev/null +++ b/ext/fts5/test/fts5savepoint.test @@ -0,0 +1,85 @@ +# 2019 Dec 26 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# + +source [file join [file dirname [info script]] fts5_common.tcl] +set testprefix fts5savepoint + +# If SQLITE_ENABLE_FTS5 is defined, omit this file. +ifcapable !fts5 { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE ft USING fts5(c); + BEGIN; + SAVEPOINT one; + INSERT INTO ft VALUES('a'); + SAVEPOINT two; + INSERT INTO ft VALUES('b'); + RELEASE two; + SAVEPOINT four; + INSERT INTO ft VALUES('c'); + RELEASE four; + SAVEPOINT three; + INSERT INTO ft VALUES('d'); + ROLLBACK TO three; + COMMIT; + SELECT * FROM ft +} {a b c} + +reset_db +do_catchsql_test 2.0 { + CREATE VIRTUAL TABLE ft1 USING fts5(c); + CREATE VIRTUAL TABLE ft2 USING fts5(c); + DROP TABLE ft2_idx; + BEGIN; + INSERT INTO ft2 VALUES('a'); + INSERT INTO ft1 VALUES('a'); + SAVEPOINT two; + INSERT INTO ft1 VALUES('b'); + COMMIT; +} {1 {SQL logic error}} + +reset_db +ifcapable fts3 { + do_execsql_test 3.0 { + CREATE VIRTUAL TABLE vt0 USING fts5(c0); + CREATE VIRTUAL TABLE vt1 USING fts4(c0); + INSERT INTO vt1(c0) VALUES(0); + } + + do_execsql_test 3.1 { + BEGIN; + UPDATE vt1 SET c0 = 0; + INSERT INTO vt1(c0) VALUES (0), (0); + UPDATE vt0 SET c0 = 0; + INSERT INTO vt1(c0) VALUES (0); + UPDATE vt1 SET c0 = 0; + INSERT INTO vt1(vt1) VALUES('automerge=1'); + UPDATE vt1 SET c0 = 0; + } + + do_catchsql_test 3.2 { + DROP TABLE vt1; + } {1 {SQL logic error}} + + do_execsql_test 3.3 { + SAVEPOINT x; + INSERT INTO vt0 VALUES('x'); + COMMIT; + INSERT INTO vt0(vt0) VALUES('integrity-check'); + } +} + +finish_test + diff --git a/manifest b/manifest index ff363e591b..a88718c571 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Makefile.in\sfix\sso\sthat\sit\sworks\son\ssystems\sthat\srequire\sa\s.EXE\ssuffix\non\sexecutables. -D 2019-12-26T01:10:17.023 +C Fix\san\sassert()\sin\sfts5\sthat\scould\sfail\sif\san\sxSavepoint()\scall\son\sanother\svtab\sfails. +D 2019-12-26T14:36:31.110 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -117,7 +117,7 @@ F ext/fts5/fts5_config.c b447948f35ad3354e8fe5e242e0a7e7b5b941555400b9404259944e F ext/fts5/fts5_expr.c 2be456484786333d559dc2987a00f2750981fab91d52db8452a8046278c5f22e F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 F ext/fts5/fts5_index.c e3573c88ce8238f7a5892c777a9ddf646c1355012780337d783fb2dfc3dca650 -F ext/fts5/fts5_main.c 9db1f173d299466aeff89bd949fb1eb0a181265726fb56f11e07ea292dcc9a73 +F ext/fts5/fts5_main.c e881a2ea0bf01b3a3ff0bc1b31373c58fd54b6c9f3c43ea3d431bea4e5d4025e F ext/fts5/fts5_storage.c 3ecda8edadc1f62a355d6789776be0da609f8658c50d72e422674093ab7e1528 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -205,6 +205,7 @@ F ext/fts5/test/fts5rank.test c9fd4a1e36b4fa92d572ec13d846469b97da249d1c2f7fd3ee F ext/fts5/test/fts5rebuild.test 55d6f17715cddbf825680dd6551efbc72ed916d8cf1cde40a46fc5d785b451e7 F ext/fts5/test/fts5restart.test 835ecc8f449e3919f72509ab58056d0cedca40d1fe04108ccf8ac4c2ba41f415 F ext/fts5/test/fts5rowid.test b8790ec170a8dc1942a15aef3db926a5f3061b1ff171013003d8297203a20ad6 +F ext/fts5/test/fts5savepoint.test fc02929f238d02a22df4172625704e029f7c1e0e92e332d654375690f8e6e43f F ext/fts5/test/fts5simple.test a298670508c1458b88ce6030440f26a30673931884eb5f4094ac1773b3ba217b F ext/fts5/test/fts5simple2.test 258a1b0c590409bfa5271e872c79572b319d2a56554d0585f68f146a0da603f0 F ext/fts5/test/fts5simple3.test d5c74a9d3ca71bd5dd5cacb7c55b86ea12cdddfc8b1910e3de2995206898380f @@ -1852,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f8d5586a8ceca985dcb2d63d0fbad9e271e9e1664720ee698d4947acd5dcc543 -R 6af373fa92486883d456e9ecb1d65e03 -U drh -Z 626f0d7b9b28ef5ff11b6bda2814f398 +P f482a4cdfa768941e22c399de8ec29a55e729529eeae86d3832077ad1bef22f3 +R 32c990e2bff4427bef4caf63e3ed3a03 +U dan +Z cc9534888248d78f29ac267262b69129 diff --git a/manifest.uuid b/manifest.uuid index 5e0932a5a2..7562806aef 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f482a4cdfa768941e22c399de8ec29a55e729529eeae86d3832077ad1bef22f3 \ No newline at end of file +a5d7f5d24a239f729de0b8aa5becf5af35ba87160565ee0713c335b8d1bbf12d \ No newline at end of file From d3ee3ad12fd53f0db78a2c07917fb4fc310ca72a Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 26 Dec 2019 23:16:18 +0000 Subject: [PATCH 084/120] An UPDATE of a table that is indexed by a constant virtual column that uses the one-pass optimization might cause the table seek to be omitted before reaching row DELETE/INSERT. Fix this by coding an extra OP_Column in that circumstance. Ticket [ec8abb025e78f40c] FossilOrigin-Name: e54560495926fbb8a2ce829c677a2dd0066e46b7a8d4ada9d8a34a3426959836 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/update.c | 16 ++++++++++++++++ test/gencol1.test | 14 ++++++++++++++ 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index a88718c571..6df02d1d4d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sin\sfts5\sthat\scould\sfail\sif\san\sxSavepoint()\scall\son\sanother\svtab\sfails. -D 2019-12-26T14:36:31.110 +C An\sUPDATE\sof\sa\stable\sthat\sis\sindexed\sby\sa\sconstant\svirtual\scolumn\sthat\suses\nthe\sone-pass\soptimization\smight\scause\sthe\stable\sseek\sto\sbe\somitted\sbefore\nreaching\srow\sDELETE/INSERT.\s\sFix\sthis\sby\scoding\san\sextra\sOP_Column\sin\sthat\ncircumstance.\s\sTicket\s[ec8abb025e78f40c] +D 2019-12-26T23:16:18.411 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -595,7 +595,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 7b17f6e2f20f6cbcb0b215025a86b7457c38451fc7622f705e553d7a488c572d F src/treeview.c 7a8097cff1584acd0a228817103513bf1d1bf5ba91ff142b99c83e406c0968f3 F src/trigger.c 681ccdb910a87243940d63f99b26190d9c5d2534c2ded3c0825b7c0e315a342e -F src/update.c 07a50767f7d3e26d4c887c31cd66448d700d3215caea6023acf7269336097df7 +F src/update.c aed4261a7854ff3031c0d361b04988c8dce5b845a3fb3999fedc51140a836e78 F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 @@ -1023,7 +1023,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test 681db71d41ca4c6c09efb5213aad766425bdd001865cf35e65d91ded4dd2984d +F test/gencol1.test 66b361e39820e28b1be1a50de275d14f5a448c0cbcb71b6d38eedb683391cee4 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f482a4cdfa768941e22c399de8ec29a55e729529eeae86d3832077ad1bef22f3 -R 32c990e2bff4427bef4caf63e3ed3a03 -U dan -Z cc9534888248d78f29ac267262b69129 +P a5d7f5d24a239f729de0b8aa5becf5af35ba87160565ee0713c335b8d1bbf12d +R fcd520b68a69370eded90f42b892c03a +U drh +Z bcd12e97e57353c63ba931e2af882921 diff --git a/manifest.uuid b/manifest.uuid index 7562806aef..f4f8a3c258 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a5d7f5d24a239f729de0b8aa5becf5af35ba87160565ee0713c335b8d1bbf12d \ No newline at end of file +e54560495926fbb8a2ce829c677a2dd0066e46b7a8d4ada9d8a34a3426959836 \ No newline at end of file diff --git a/src/update.c b/src/update.c index 935e1d9377..52ae8a0305 100644 --- a/src/update.c +++ b/src/update.c @@ -800,6 +800,22 @@ void sqlite3Update( /* Delete the index entries associated with the current record. */ sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, aRegIdx, -1); +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + /* If pTab contains one or more virtual columns, then it is possible + ** (though unlikely) that no OP_Column opcodes have been run against + ** the table since the OP_SeekDeferred, meaning that there has not been + ** a seek against the cursor yet. The OP_Delete opcode and OP_Insert + ** opcodes that follow will be needing this seek, so code a bogus + ** OP_Column just to make sure the seek has been done. + ** See ticket ec8abb025e78f40c 2019-12-26 + */ + if( eOnePass!=ONEPASS_OFF && (pTab->tabFlags & TF_HasVirtual)!=0 ){ + int r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_Column, iDataCur, 0, r1); + sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); + } +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + /* If changing the rowid value, or if there are foreign key constraints ** to process, delete the old record. Otherwise, add a noop OP_Delete ** to invoke the pre-update hook. diff --git a/test/gencol1.test b/test/gencol1.test index 3e864a52b4..d4cda59908 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -468,6 +468,20 @@ do_execsql_test gencol1-17.50 { SELECT a FROM t1 WHERE b='DEF' AND a='def'; } {DEF} +# 2019-12-26 ticket ec8abb025e78f40c +# An index on a virtual column with a constant value (why would anybody +# ever do such a thing?) can cause problems for a one-pass DELETE. +# +reset_db +do_execsql_test gencol1-18.10 { + CREATE TABLE t0(c0 UNIQUE AS(0), c1, c2); + INSERT INTO t0(c1) VALUES(0); + SELECT * FROM t0; +} {0 0 {}} +do_execsql_test gencol1-18.20 { + UPDATE t0 SET c1=0, c2=0 WHERE c0>=0; + SELECT * FROM t0; +} {0 0 0} From fe2a3f1d241b21ce93c679b16c717a99f58c6cd7 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 26 Dec 2019 23:40:33 +0000 Subject: [PATCH 085/120] If an UPSERT can cause an Abort due to a constraint failure, make sure the query planner knows this. Ticket [7c13db5c3bf74001]. FossilOrigin-Name: f14ce948662f3445a06d84d4f32d9b81143e0cffaf773d8aa4d3a609bfb9682b --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/upsert.c | 1 + test/upsert1.test | 8 ++++++++ 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 6df02d1d4d..38b5d9c919 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C An\sUPDATE\sof\sa\stable\sthat\sis\sindexed\sby\sa\sconstant\svirtual\scolumn\sthat\suses\nthe\sone-pass\soptimization\smight\scause\sthe\stable\sseek\sto\sbe\somitted\sbefore\nreaching\srow\sDELETE/INSERT.\s\sFix\sthis\sby\scoding\san\sextra\sOP_Column\sin\sthat\ncircumstance.\s\sTicket\s[ec8abb025e78f40c] -D 2019-12-26T23:16:18.411 +C If\san\sUPSERT\scan\scause\san\sAbort\sdue\sto\sa\sconstraint\sfailure,\smake\ssure\nthe\squery\splanner\sknows\sthis.\s\sTicket\s[7c13db5c3bf74001]. +D 2019-12-26T23:40:33.899 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -596,7 +596,7 @@ F src/tokenize.c 7b17f6e2f20f6cbcb0b215025a86b7457c38451fc7622f705e553d7a488c572 F src/treeview.c 7a8097cff1584acd0a228817103513bf1d1bf5ba91ff142b99c83e406c0968f3 F src/trigger.c 681ccdb910a87243940d63f99b26190d9c5d2534c2ded3c0825b7c0e315a342e F src/update.c aed4261a7854ff3031c0d361b04988c8dce5b845a3fb3999fedc51140a836e78 -F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 +F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf @@ -1607,7 +1607,7 @@ F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97 F test/unordered.test ffeea7747d5ba962a8009a20b7e53d68cbae05b063604c68702c5998eb50c981 F test/update.test 6fdd76fdf3194fb10ee184b3b2999c61d10d2a0b825dbcaa2d08ff394f3e26e3 F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 -F test/upsert1.test 0b740c8488fd2f5a06ac317c9913f7ef1eda8282f2db58b544b89480c51efab3 +F test/upsert1.test 88f9e258c6a0eeeb85937b08831e8daad440ba41f125af48439e9d33f266fb18 F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09 F test/upsert3.test 88d7d590a1948a9cb6eac1b54b0642f67a9f35a1fc0f19b200e97d5d39e3179c F test/upsert4.test 25d2a1da92f149331ae0c51ca6e3eee78189577585eab92de149900d62994fa5 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a5d7f5d24a239f729de0b8aa5becf5af35ba87160565ee0713c335b8d1bbf12d -R fcd520b68a69370eded90f42b892c03a +P e54560495926fbb8a2ce829c677a2dd0066e46b7a8d4ada9d8a34a3426959836 +R bdcea74dd1d013c76328f299bf920b0b U drh -Z bcd12e97e57353c63ba931e2af882921 +Z 2beb349752cd943aefda1d019be441ce diff --git a/manifest.uuid b/manifest.uuid index f4f8a3c258..b9a233b257 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e54560495926fbb8a2ce829c677a2dd0066e46b7a8d4ada9d8a34a3426959836 \ No newline at end of file +f14ce948662f3445a06d84d4f32d9b81143e0cffaf773d8aa4d3a609bfb9682b \ No newline at end of file diff --git a/src/upsert.c b/src/upsert.c index 5db4f5fc90..9a33f75d0a 100644 --- a/src/upsert.c +++ b/src/upsert.c @@ -236,6 +236,7 @@ void sqlite3UpsertDoUpdate( VdbeCoverage(v); sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CORRUPT, OE_Abort, 0, "corrupt database", P4_STATIC); + sqlite3MayAbort(pParse); sqlite3VdbeJumpHere(v, i); } } diff --git a/test/upsert1.test b/test/upsert1.test index 6b5be23b70..5250a5d2f5 100644 --- a/test/upsert1.test +++ b/test/upsert1.test @@ -233,4 +233,12 @@ do_catchsql_test upsert1-910 { INSERT INTO t1 VALUES(3) ON CONFLICT(x) DO NOTHING; } {1 {cannot UPSERT a view}} +# 2019-12-26 ticket 7c13db5c3bf74001 +reset_db +do_catchsql_test upsert1-1000 { + CREATE TABLE t0(c0 PRIMARY KEY, c1, c2 UNIQUE) WITHOUT ROWID; + INSERT OR FAIL INTO t0(c2) VALUES (0), (NULL) + ON CONFLICT(c2) DO UPDATE SET c1 = c0; +} {1 {NOT NULL constraint failed: t0.c0}} + finish_test From 8d7f44c03a1522d5f1907e2ce5fb980ab74de088 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 27 Dec 2019 00:19:53 +0000 Subject: [PATCH 086/120] Fix buffer underflows in the zipfile extension associated with zero-length or NULL filename in the ZIP archive. But report on the mailing list by Yongheng and Rui. FossilOrigin-Name: 465a15c5c2077011befa854a77f9d295bb751ef20b7d2937ac0ba47cc84587c9 --- ext/misc/zipfile.c | 14 +++++++++----- manifest | 14 +++++++------- manifest.uuid | 2 +- test/zipfile.test | 15 +++++++++++++++ 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/ext/misc/zipfile.c b/ext/misc/zipfile.c index e24865020c..3262283377 100644 --- a/ext/misc/zipfile.c +++ b/ext/misc/zipfile.c @@ -1433,8 +1433,8 @@ static int zipfileGetMode( ** identical, ignoring any trailing '/' character in either path. */ static int zipfileComparePath(const char *zA, const char *zB, int nB){ int nA = (int)strlen(zA); - if( zA[nA-1]=='/' ) nA--; - if( zB[nB-1]=='/' ) nB--; + if( nA>0 && zA[nA-1]=='/' ) nA--; + if( nB>0 && zB[nB-1]=='/' ) nB--; if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0; return 1; } @@ -1628,11 +1628,15 @@ static int zipfileUpdate( ** '/'. This appears to be required for compatibility with info-zip ** (the unzip command on unix). It does not create directories ** otherwise. */ - if( zPath[nPath-1]!='/' ){ + if( nPath<=0 || zPath[nPath-1]!='/' ){ zFree = sqlite3_mprintf("%s/", zPath); - if( zFree==0 ){ rc = SQLITE_NOMEM; } zPath = (const char*)zFree; - nPath = (int)strlen(zPath); + if( zFree==0 ){ + rc = SQLITE_NOMEM; + nPath = 0; + }else{ + nPath = (int)strlen(zPath); + } } } diff --git a/manifest b/manifest index 38b5d9c919..9cd11108b9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C If\san\sUPSERT\scan\scause\san\sAbort\sdue\sto\sa\sconstraint\sfailure,\smake\ssure\nthe\squery\splanner\sknows\sthis.\s\sTicket\s[7c13db5c3bf74001]. -D 2019-12-26T23:40:33.899 +C Fix\sbuffer\sunderflows\sin\sthe\szipfile\sextension\sassociated\swith\szero-length\nor\sNULL\sfilename\sin\sthe\sZIP\sarchive.\s\sBut\sreport\son\sthe\smailing\slist\sby\nYongheng\sand\sRui. +D 2019-12-27T00:19:53.106 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -325,7 +325,7 @@ F ext/misc/vfsstat.c 77b5b4235c9f7f11eddf82487c0a422944ac2f132dafd5af3be7a68a057 F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212 -F ext/misc/zipfile.c 010d67eeca123e3a89ab4144221bc4da66455fc964053602af5bb63584110bc7 +F ext/misc/zipfile.c 185d060a595c79ebbec904e9d73b97b400dca94d2f910d351d6a8b5fcfe2c3d0 F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64 F ext/rbu/rbu.c 8681f6157db6adc82c34af24b14ea8a3be0146ad2a3b6c1d5da6cb8a5796c8ce F ext/rbu/rbu1.test 221d9c18a5e600ac9ac6b1810d99d9f99163a7909ba61597876ab6e4d4beb3d6 @@ -1749,7 +1749,7 @@ F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912ade F test/writecrash.test f1da7f7adfe8d7f09ea79b42e5ca6dcc41102f27f8e334ad71539501ddd910cc F test/zeroblob.test 07a5b11ab591d1f26c626945fb7f228f68b993533b2ada77273edf6ee29db174 F test/zerodamage.test 9c41628db7e8d9e8a0181e59ea5f189df311a9f6ce99cc376dc461f66db6f8dc -F test/zipfile.test 330bec11cee9da4da1a48e648b6d445b9334044089da62e9521803566a36dde2 +F test/zipfile.test aab99dc488586842bed415a1ce1a2327948064aa660c00243e3f14a1ff1cf282 F test/zipfile2.test 9903388a602a3834189857a985106ff95c3bba6a3969e0134127df991889db5d F test/zipfilefault.test 44d4d7a7f7cca7521d569d7f71026b241d65a6b1757aa409c1a168827edbbc2c F tool/GetFile.cs 47852aa0d806fe47ed1ac5138bdce7f000fe87aaa7f28107d0cb1e26682aeb44 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e54560495926fbb8a2ce829c677a2dd0066e46b7a8d4ada9d8a34a3426959836 -R bdcea74dd1d013c76328f299bf920b0b +P f14ce948662f3445a06d84d4f32d9b81143e0cffaf773d8aa4d3a609bfb9682b +R 61cf5988b65ab0cab19990d9569b78eb U drh -Z 2beb349752cd943aefda1d019be441ce +Z 40ad65760fcadc9cbb252a4c9cb8855e diff --git a/manifest.uuid b/manifest.uuid index b9a233b257..716f5790e2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f14ce948662f3445a06d84d4f32d9b81143e0cffaf773d8aa4d3a609bfb9682b \ No newline at end of file +465a15c5c2077011befa854a77f9d295bb751ef20b7d2937ac0ba47cc84587c9 \ No newline at end of file diff --git a/test/zipfile.test b/test/zipfile.test index e4b80884e0..6ea9ac6a01 100644 --- a/test/zipfile.test +++ b/test/zipfile.test @@ -821,4 +821,19 @@ do_execsql_test 14.10 { PRAGMA integrity_check; } {3 ok} +# 2019-12-26 More problems in zipfile from the Yongheng and Rui fuzzer +# +do_execsql_test 15.10 { + DROP TABLE IF EXISTS t1; + CREATE VIRTUAL TABLE t1 USING zipfile(null); + REPLACE INTO t1 VALUES(null,null,0,null,null,null,null); +} {} +do_execsql_test 15.20 { + DROP TABLE IF EXISTS t2; + CREATE VIRTUAL TABLE t2 USING zipfile(null); + REPLACE INTO t2 values(null,null,null,null,null,10,null); +} {} + + + finish_test From fce8165ec6e6e8faea57e0130cc84ecf104fb471 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 27 Dec 2019 01:50:46 +0000 Subject: [PATCH 087/120] Ensure that the Pager.changeCountDone flag is cleared whenever dropping the write lock, even when transitioning from EXCLUSIVE locking mode into NORMAL locking mode while in WAL mode. Ticket [fb3b3024ea238d5c]. FossilOrigin-Name: 846b1de6e5a9e418f225273dc033234c64c116fcd89c8261522b4902c248451f --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/pager.c | 3 +-- test/exclusive.test | 18 ++++++++++++++++++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 9cd11108b9..9f9d3377cc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sbuffer\sunderflows\sin\sthe\szipfile\sextension\sassociated\swith\szero-length\nor\sNULL\sfilename\sin\sthe\sZIP\sarchive.\s\sBut\sreport\son\sthe\smailing\slist\sby\nYongheng\sand\sRui. -D 2019-12-27T00:19:53.106 +C Ensure\sthat\sthe\sPager.changeCountDone\sflag\sis\scleared\swhenever\sdropping\nthe\swrite\slock,\seven\swhen\stransitioning\sfrom\sEXCLUSIVE\slocking\smode\sinto\nNORMAL\slocking\smode\swhile\sin\sWAL\smode.\s\sTicket\s[fb3b3024ea238d5c]. +D 2019-12-27T01:50:46.455 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -515,7 +515,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c d403950128240f11da7588e30a3b4a4a34e69caf7c60937e970fb85b2860ca42 F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 7e371809d86b3f60d523396612b8fde4c8d3529bea90b04fad0f6be2703159a4 +F src/pager.c b08541016855b06956cb34c4cddd8c9fa97793f3bfdc4f7809f09fda24702435 F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 F src/parse.y c8d2de64db469fd56e0fa24da46cd8ec8523eb98626567d2708df371b47fdc3f F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 @@ -851,7 +851,7 @@ F test/enc4.test c8f1ce3618508fd0909945beb8b8831feef2c020 F test/eqp.test 84879b63e3110552bf8ce648a3507dc3ceb72109ecec83c2aef0db37a27f6382 F test/errmsg.test eae9f091eb39ce7e20305de45d8e5d115b68fa856fba4ea6757b6ca3705ff7f9 F test/eval.test a64c9105d6ff163df7cf09d6ac29cdad5922078c -F test/exclusive.test 1206b87e192497d78c7f35552e86a9d05421498da300fb1cce5ca5351ccde3c3 +F test/exclusive.test d6ccc6acc5d660544f8e0cacaec2c620f8ebb42a764d783ab53430e26057a185 F test/exclusive2.test 984090e8e9d1b331d2e8111daf6e5d61dda0bef7 F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7 F test/exists.test 79a75323c78f02bbe9c251ea502a092f9ef63dac @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f14ce948662f3445a06d84d4f32d9b81143e0cffaf773d8aa4d3a609bfb9682b -R 61cf5988b65ab0cab19990d9569b78eb +P 465a15c5c2077011befa854a77f9d295bb751ef20b7d2937ac0ba47cc84587c9 +R e34584efe34ddbc0b2a2a75619a185e2 U drh -Z 40ad65760fcadc9cbb252a4c9cb8855e +Z bd3a4faab409dc918cd96dcd50ae34d6 diff --git a/manifest.uuid b/manifest.uuid index 716f5790e2..7429355570 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -465a15c5c2077011befa854a77f9d295bb751ef20b7d2937ac0ba47cc84587c9 \ No newline at end of file +846b1de6e5a9e418f225273dc033234c64c116fcd89c8261522b4902c248451f \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 844ecf804c..0fae9ae3d9 100644 --- a/src/pager.c +++ b/src/pager.c @@ -1172,6 +1172,7 @@ static int pagerUnlockDb(Pager *pPager, int eLock){ } IOTRACE(("UNLOCK %p %d\n", pPager, eLock)) } + pPager->changeCountDone = pPager->tempFile; /* ticket fb3b3024ea238d5c */ return rc; } @@ -1893,7 +1894,6 @@ static void pager_unlock(Pager *pPager){ ** code is cleared and the cache reset in the block below. */ assert( pPager->errCode || pPager->eState!=PAGER_ERROR ); - pPager->changeCountDone = 0; pPager->eState = PAGER_OPEN; } @@ -2157,7 +2157,6 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ && (!pagerUseWal(pPager) || sqlite3WalExclusiveMode(pPager->pWal, 0)) ){ rc2 = pagerUnlockDb(pPager, SHARED_LOCK); - pPager->changeCountDone = 0; } pPager->eState = PAGER_READER; pPager->setMaster = 0; diff --git a/test/exclusive.test b/test/exclusive.test index 04de529137..5168fa7482 100644 --- a/test/exclusive.test +++ b/test/exclusive.test @@ -511,6 +511,24 @@ do_execsql_test exclusive-6.5 { SELECT * FROM sqlite_master; } {exclusive} +# 2019-12-26 ticket fb3b3024ea238d5c +do_test exclusive-7.1 { + db close + forcedelete test.db test.db-journal test.db-wal + sqlite3 db test.db + # The following sequence of pragmas would trigger an assert() + # associated with Pager.changeCountDone inside of assert_pager_state(), + # prior to the fix. + db eval { + PRAGMA locking_mode = EXCLUSIVE; + PRAGMA journal_mode = WAL; + PRAGMA locking_mode = NORMAL; + PRAGMA user_version; + PRAGMA journal_mode = DELETE; + } +} {exclusive wal normal 0 delete} + + } ;# atomic_batch_write==0 finish_test From 5e484cb3ebd8fe3f14df1ae07810625202e47a3a Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 27 Dec 2019 08:57:08 +0000 Subject: [PATCH 088/120] When determining if an aggregate within a sub-query should be processed as part of the sub-query or an outer query, consider any FILTER clause in the same way as the arguments to the aggregate. FossilOrigin-Name: 1ffc045d2bbeeda9c13a3a3585538ff6434fc852b0ae6679d3c8b9f606bf92e6 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/expr.c | 5 +++++ test/filter1.test | 20 ++++++++++++++++++++ test/window1.test | 8 ++++---- 5 files changed, 39 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 9f9d3377cc..37b0cb1b86 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\sPager.changeCountDone\sflag\sis\scleared\swhenever\sdropping\nthe\swrite\slock,\seven\swhen\stransitioning\sfrom\sEXCLUSIVE\slocking\smode\sinto\nNORMAL\slocking\smode\swhile\sin\sWAL\smode.\s\sTicket\s[fb3b3024ea238d5c]. -D 2019-12-27T01:50:46.455 +C When\sdetermining\sif\san\saggregate\swithin\sa\ssub-query\sshould\sbe\sprocessed\sas\spart\sof\sthe\ssub-query\sor\san\souter\squery,\sconsider\sany\sFILTER\sclause\sin\sthe\ssame\sway\sas\sthe\sarguments\sto\sthe\saggregate. +D 2019-12-27T08:57:08.228 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,7 +480,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 3a27de3630d2dec266423505f1ad38484096df4b6d80cf5c90076340d6b2b810 +F src/expr.c a01bfcf51be41214319d30abfcdc2a1b4fd0291b5e2a4deeb1f509cc06d59c2c F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -862,7 +862,7 @@ F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 F test/fallocate.test 37a62e396a68eeede8f8d2ecf23573a80faceb630788d314d0a073d862616717 F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3 F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4 -F test/filter1.test fe7fcfeff48ca399fbc9577f55b60c8be8ccfdffc5e3b4ace21dc3c3e59f0f6a +F test/filter1.test 8a6f047a000ef391db2ca17b6beecc0006f4e0f9ca8bbe272b2443c7316e66b1 F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f93393e8 F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a F test/filterfault.test c08fb491d698e8df6c122c98f7db1c65ffcfcad2c1ab0e07fa8a5be1b34eaa8b @@ -1714,7 +1714,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 7968f1baa13e4f4399a65a21ae9c324a073c28c684adcda2ddf1ea25741d1faa +F test/window1.test 7619f715b551abce33397bfb4e50bcb7fc1f49824c0433aacd53e678a1f0153d F test/window2.tcl 114b217d4ffff891142023cc5f3131b0dae3ad149ac4b45a6ed9e2ad943f8ce2 F test/window2.test dea2ffecb7182a385143ea0eb368b6241ee43c5f971f4ad1c4337029cb1fc10a F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 465a15c5c2077011befa854a77f9d295bb751ef20b7d2937ac0ba47cc84587c9 -R e34584efe34ddbc0b2a2a75619a185e2 -U drh -Z bd3a4faab409dc918cd96dcd50ae34d6 +P 846b1de6e5a9e418f225273dc033234c64c116fcd89c8261522b4902c248451f +R a028f2ca6cbb3cdf8afd64108610da66 +U dan +Z 229bcd629c79f0e2caa144fb8641d19d diff --git a/manifest.uuid b/manifest.uuid index 7429355570..e2bdf7e08e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -846b1de6e5a9e418f225273dc033234c64c116fcd89c8261522b4902c248451f \ No newline at end of file +1ffc045d2bbeeda9c13a3a3585538ff6434fc852b0ae6679d3c8b9f606bf92e6 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 7901608d2d..92786732f9 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5492,6 +5492,11 @@ int sqlite3FunctionUsesThisSrc(Expr *pExpr, SrcList *pSrcList){ cnt.nThis = 0; cnt.nOther = 0; sqlite3WalkExprList(&w, pExpr->x.pList); +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + sqlite3WalkExpr(&w, pExpr->y.pWin->pFilter); + } +#endif return cnt.nThis>0 || cnt.nOther==0; } diff --git a/test/filter1.test b/test/filter1.test index eb50963470..ee17099d99 100644 --- a/test/filter1.test +++ b/test/filter1.test @@ -184,4 +184,24 @@ do_execsql_test 5.3 { SELECT count(*) FILTER (WHERE b>2) OVER (ORDER BY b) FROM (SELECT * FROM t1) } {0 1} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 6.0 { + CREATE TABLE t1(a,b); + INSERT INTO t1 VALUES(1,1); + INSERT INTO t1 VALUES(2,2); + CREATE TABLE t2(x,y); + INSERT INTO t2 VALUES(1,1); +} + +do_execsql_test 6.1 { + SELECT (SELECT COUNT(a) FILTER(WHERE x) FROM t2) FROM t1; +} {1 1} +do_execsql_test 6.2 { + SELECT (SELECT COUNT(a+x) FROM t2) FROM t1; +} {1 1} +do_execsql_test 6.3 { + SELECT (SELECT COUNT(a) FROM t2) FROM t1; +} {2} + finish_test diff --git a/test/window1.test b/test/window1.test index 4249a58e83..3797c0c6d8 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1333,19 +1333,19 @@ do_execsql_test 37.20 { # in a join. # reset_db -do_execsql_test 38.10 { +do_catchsql_test 38.10 { CREATE TABLE t0(c0); CREATE TABLE t1(c0, c1 UNIQUE); INSERT INTO t0(c0) VALUES(1); INSERT INTO t1(c0,c1) VALUES(2,3); SELECT COUNT(*) FROM t0, t1 WHERE (SELECT AVG(0) FILTER(WHERE t1.c1)); -} {0} +} {1 {misuse of aggregate: AVG()}} do_execsql_test 38.20 { SELECT COUNT(*), AVG(1) FILTER(WHERE t1.c1) FROM t0, t1; } {1 1.0} -do_execsql_test 38.30 { +do_catchsql_test 38.30 { SELECT COUNT(*) FROM t0, t1 WHERE (SELECT AVG(1) FILTER(WHERE t1.c1)); -} {1} +} {1 {misuse of aggregate: AVG()}} reset_db do_execsql_test 39.1 { From 09bee5743dc30891e08591f237c23c6964c0a0aa Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 27 Dec 2019 13:30:46 +0000 Subject: [PATCH 089/120] Follow-up to check-in [c8c6dd0e6582ec91] - change the xAccess() method to return true if the file exists and it is anything other than a regular file, or if it is a regular file with a non-zero file size. FossilOrigin-Name: 8a39803ef8db4d8cb0d231e66299525fad4e61266ca29b3704aebb88df1c745b --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/os_unix.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 37b0cb1b86..f27e23d7ce 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sdetermining\sif\san\saggregate\swithin\sa\ssub-query\sshould\sbe\sprocessed\sas\spart\sof\sthe\ssub-query\sor\san\souter\squery,\sconsider\sany\sFILTER\sclause\sin\sthe\ssame\sway\sas\sthe\sarguments\sto\sthe\saggregate. -D 2019-12-27T08:57:08.228 +C Follow-up\sto\scheck-in\s[c8c6dd0e6582ec91]\s-\schange\sthe\sxAccess()\smethod\sto\nreturn\strue\sif\sthe\sfile\sexists\sand\sit\sis\sanything\sother\sthan\sa\sregular\sfile,\nor\sif\sit\sis\sa\sregular\sfile\swith\sa\snon-zero\sfile\ssize. +D 2019-12-27T13:30:46.798 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -512,7 +512,7 @@ F src/os.c 669cc3839cc35d20f81faf0be1ab6d4581cea35e9d8f3a9d48a98d6571f7c285 F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c d403950128240f11da7588e30a3b4a4a34e69caf7c60937e970fb85b2860ca42 +F src/os_unix.c ad7640c04eed946052a3b12856362a773d0a717696707313037186df0e2b59f2 F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c b08541016855b06956cb34c4cddd8c9fa97793f3bfdc4f7809f09fda24702435 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 846b1de6e5a9e418f225273dc033234c64c116fcd89c8261522b4902c248451f -R a028f2ca6cbb3cdf8afd64108610da66 -U dan -Z 229bcd629c79f0e2caa144fb8641d19d +P 1ffc045d2bbeeda9c13a3a3585538ff6434fc852b0ae6679d3c8b9f606bf92e6 +R b54a424c126e1e000b0a94ae223fb870 +U drh +Z 3439b330e9610c269373f686cac6131c diff --git a/manifest.uuid b/manifest.uuid index e2bdf7e08e..7c4813f799 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1ffc045d2bbeeda9c13a3a3585538ff6434fc852b0ae6679d3c8b9f606bf92e6 \ No newline at end of file +8a39803ef8db4d8cb0d231e66299525fad4e61266ca29b3704aebb88df1c745b \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index e6d58811c3..07ae4bc03a 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -6260,7 +6260,7 @@ static int unixAccess( if( flags==SQLITE_ACCESS_EXISTS ){ struct stat buf; *pResOut = 0==osStat(zPath, &buf) && - (S_ISDIR(buf.st_mode) || buf.st_size>0); + (!S_ISREG(buf.st_mode) || buf.st_size>0); }else{ *pResOut = osAccess(zPath, W_OK|R_OK)==0; } From d8d2fb92227dcb65004980bf51b6b06fa83db22c Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 27 Dec 2019 15:31:47 +0000 Subject: [PATCH 090/120] Do not mistake constant integers in a PARTITION BY expression for references to ORDER BY style references to values returned by the SELECT statement. FossilOrigin-Name: 45c64d39d5afed7fdc6b1de19408559740d1fba1f5e0269ab68b132366a289e4 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/window.c | 5 +++-- test/window1.test | 43 +++++++++++++++++++++++++++++++++++++------ test/window2.tcl | 26 ++++++++++++++++++++++++++ test/window2.test | 26 ++++++++++++++++++++++++++ 6 files changed, 103 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index f27e23d7ce..33ed82a300 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Follow-up\sto\scheck-in\s[c8c6dd0e6582ec91]\s-\schange\sthe\sxAccess()\smethod\sto\nreturn\strue\sif\sthe\sfile\sexists\sand\sit\sis\sanything\sother\sthan\sa\sregular\sfile,\nor\sif\sit\sis\sa\sregular\sfile\swith\sa\snon-zero\sfile\ssize. -D 2019-12-27T13:30:46.798 +C Do\snot\smistake\sconstant\sintegers\sin\sa\sPARTITION\sBY\sexpression\sfor\sreferences\sto\sORDER\sBY\sstyle\sreferences\sto\svalues\sreturned\sby\sthe\sSELECT\sstatement. +D 2019-12-27T15:31:47.514 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -618,7 +618,7 @@ F src/where.c 58653781a4b31fa16b95b953591fdc1f1ed5ff77574e59b90a27da3819b60a46 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c d42d3e0fe93786621b84dec8065e1dc6b324d7c5934df52f141555843b6aef4e F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 -F src/window.c a5b69ea3cd22555d390582771173a68c1b798a0847aef3bd9eb51792bc6fcacb +F src/window.c c5c7da1a28123a3697f59ad0c90dd0ec3ed820ee34691be31d5cdadbaf2c5c38 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1714,9 +1714,9 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 7619f715b551abce33397bfb4e50bcb7fc1f49824c0433aacd53e678a1f0153d -F test/window2.tcl 114b217d4ffff891142023cc5f3131b0dae3ad149ac4b45a6ed9e2ad943f8ce2 -F test/window2.test dea2ffecb7182a385143ea0eb368b6241ee43c5f971f4ad1c4337029cb1fc10a +F test/window1.test f091ea2dadaca112a0dab983a1055e21eda8d7829f43e73f75fb10651e80cc62 +F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 +F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 F test/window3.test e9959a993c8a71e96433be8daaa1827d78b8921e4f12debd7bdbeb3c856ef3cb F test/window4.tcl d732df0e81beedc0ba8a563ade68611d322d27303ad0c0c8e4444107c39e84ec @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1ffc045d2bbeeda9c13a3a3585538ff6434fc852b0ae6679d3c8b9f606bf92e6 -R b54a424c126e1e000b0a94ae223fb870 -U drh -Z 3439b330e9610c269373f686cac6131c +P 8a39803ef8db4d8cb0d231e66299525fad4e61266ca29b3704aebb88df1c745b +R 2e599939602f27f3650e444e6b56fe0f +U dan +Z 8fb26a7185f0be454adde39ec4ab299d diff --git a/manifest.uuid b/manifest.uuid index 7c4813f799..0eb424b8f1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8a39803ef8db4d8cb0d231e66299525fad4e61266ca29b3704aebb88df1c745b \ No newline at end of file +45c64d39d5afed7fdc6b1de19408559740d1fba1f5e0269ab68b132366a289e4 \ No newline at end of file diff --git a/src/window.c b/src/window.c index ab8f2c867a..83dd40532c 100644 --- a/src/window.c +++ b/src/window.c @@ -894,9 +894,10 @@ static ExprList *exprListAppendList( int i; int nInit = pList ? pList->nExpr : 0; for(i=0; inExpr; i++){ + int iDummy; Expr *pDup = sqlite3ExprDup(pParse->db, pAppend->a[i].pExpr, 0); assert( pDup==0 || !ExprHasProperty(pDup, EP_MemToken) ); - if( bIntToNull && pDup && pDup->op==TK_INTEGER ){ + if( bIntToNull && pDup && sqlite3ExprIsInteger(pDup, &iDummy) ){ pDup->op = TK_NULL; pDup->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse); pDup->u.zToken = 0; @@ -947,7 +948,7 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ /* Create the ORDER BY clause for the sub-select. This is the concatenation ** of the window PARTITION and ORDER BY clauses. Then, if this makes it ** redundant, remove the ORDER BY from the parent SELECT. */ - pSort = sqlite3ExprListDup(db, pMWin->pPartition, 0); + pSort = exprListAppendList(pParse, 0, pMWin->pPartition, 1); pSort = exprListAppendList(pParse, pSort, pMWin->pOrderBy, 1); if( pSort && p->pOrderBy && p->pOrderBy->nExpr<=pSort->nExpr ){ int nSave = pSort->nExpr; diff --git a/test/window1.test b/test/window1.test index 3797c0c6d8..ee4d4dfe16 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1363,12 +1363,43 @@ do_execsql_test 39.4 { # 2019-12-25 ticket d87336c81c7d0873 # -reset_db -do_catchsql_test 40.1 { - CREATE VIRTUAL TABLE t0 USING rtree(c0, c1, c2); - SELECT * FROM t0 - WHERE ((0,0) IN (SELECT COUNT(*),LAG(5)OVER(PARTITION BY 0) FROM t0),0)<=(c1,0); -} {1 {1st ORDER BY term out of range - should be between 1 and 3}} +#reset_db +#do_catchsql_test 40.1 { +# CREATE VIRTUAL TABLE t0 USING rtree(c0, c1, c2); +# SELECT * FROM t0 +# WHERE ((0,0) IN (SELECT COUNT(*),LAG(5)OVER(PARTITION BY 0) FROM t0),0)<=(c1,0); +#} {1 {1st ORDER BY term out of range - should be between 1 and 3}} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 41.1 { + CREATE TABLE t1(a, b, c); + INSERT INTO t1 VALUES(NULL,'bb',355); + INSERT INTO t1 VALUES('CC','aa',158); + INSERT INTO t1 VALUES('GG','bb',929); + INSERT INTO t1 VALUES('FF','Rb',574); +} + +do_execsql_test 41.2 { + SELECT min(c) OVER ( + ORDER BY a RANGE BETWEEN 5.2 PRECEDING AND 0.1 PRECEDING + ) FROM t1 +} {355 158 574 929} + +do_execsql_test 41.2 { + SELECT min(c) OVER ( + ORDER BY a RANGE BETWEEN 5.2 PRECEDING AND 0.1 PRECEDING + ) << 100 FROM t1 +} {0 0 0 0} + +do_execsql_test 41.3 { + SELECT + min(c) OVER win3 << first_value(c) OVER win3, + min(c) OVER win3 << first_value(c) OVER win3 + FROM t1 + WINDOW win3 AS ( + PARTITION BY 6 ORDER BY a RANGE BETWEEN 5.2 PRECEDING AND 0.1 PRECEDING + ); +} {0 0 0 0 0 0 0 0} finish_test diff --git a/test/window2.tcl b/test/window2.tcl index 7711a844c6..4c18b7970d 100644 --- a/test/window2.tcl +++ b/test/window2.tcl @@ -463,6 +463,32 @@ execsql_test 6.2 { (0, t0.c0) IN (SELECT DENSE_RANK() OVER(), LAG(0) OVER() FROM t0); } +========== + +execsql_test 7.0 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(a INTEGER, b INTEGER, c INTEGER); + INSERT INTO t1 VALUES(1, 1, 1); + INSERT INTO t1 VALUES(1, 2, 2); + INSERT INTO t1 VALUES(3, 3, 3); + INSERT INTO t1 VALUES(3, 4, 4); +} + +execsql_test 7.1 { + SELECT c, sum(c) OVER win1 FROM t1 + WINDOW win1 AS (ORDER BY b) +} + +execsql_test 7.2 { + SELECT c, sum(c) OVER win1 FROM t1 + WINDOW win1 AS (PARTITION BY 1 ORDER BY b) +} + +execsql_test 7.3 { + SELECT c, sum(c) OVER win1 FROM t1 + WINDOW win1 AS (ORDER BY 1) +} + finish_test diff --git a/test/window2.test b/test/window2.test index 2d4d3e8dbd..e241d59644 100644 --- a/test/window2.test +++ b/test/window2.test @@ -947,4 +947,30 @@ do_execsql_test 6.2 { (0, t0.c0) IN (SELECT DENSE_RANK() OVER(), LAG(0) OVER() FROM t0); } {} +#========================================================================== + +do_execsql_test 7.0 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(a INTEGER, b INTEGER, c INTEGER); + INSERT INTO t1 VALUES(1, 1, 1); + INSERT INTO t1 VALUES(1, 2, 2); + INSERT INTO t1 VALUES(3, 3, 3); + INSERT INTO t1 VALUES(3, 4, 4); +} {} + +do_execsql_test 7.1 { + SELECT c, sum(c) OVER win1 FROM t1 + WINDOW win1 AS (ORDER BY b) +} {1 1 2 3 3 6 4 10} + +do_execsql_test 7.2 { + SELECT c, sum(c) OVER win1 FROM t1 + WINDOW win1 AS (PARTITION BY 1 ORDER BY b) +} {1 1 2 3 3 6 4 10} + +do_execsql_test 7.3 { + SELECT c, sum(c) OVER win1 FROM t1 + WINDOW win1 AS (ORDER BY 1) +} {1 10 2 10 3 10 4 10} + finish_test From 431704375e0c1bf93902e6ef417c02abe4a35148 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 27 Dec 2019 16:25:56 +0000 Subject: [PATCH 091/120] Fix a problem with window functions in aggregate queries that do not have GROUP BY clauses. FossilOrigin-Name: 99609786f485653464d1caef1d207ae299d28c925bff3e8e94891759b4765dcc --- manifest | 14 ++++++------ manifest.uuid | 2 +- src/window.c | 1 + test/window1.test | 54 +++++++++++++++++++++++++++++++++++++++++------ 4 files changed, 57 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 33ed82a300..2908ea78ff 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\smistake\sconstant\sintegers\sin\sa\sPARTITION\sBY\sexpression\sfor\sreferences\sto\sORDER\sBY\sstyle\sreferences\sto\svalues\sreturned\sby\sthe\sSELECT\sstatement. -D 2019-12-27T15:31:47.514 +C Fix\sa\sproblem\swith\swindow\sfunctions\sin\saggregate\squeries\sthat\sdo\snot\shave\sGROUP\sBY\sclauses. +D 2019-12-27T16:25:56.334 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -618,7 +618,7 @@ F src/where.c 58653781a4b31fa16b95b953591fdc1f1ed5ff77574e59b90a27da3819b60a46 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c d42d3e0fe93786621b84dec8065e1dc6b324d7c5934df52f141555843b6aef4e F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 -F src/window.c c5c7da1a28123a3697f59ad0c90dd0ec3ed820ee34691be31d5cdadbaf2c5c38 +F src/window.c 87795bb8293179cb8a92529264d49bd66b5bcad5e91cfc17dd8d3e66a2a77f88 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1714,7 +1714,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test f091ea2dadaca112a0dab983a1055e21eda8d7829f43e73f75fb10651e80cc62 +F test/window1.test 9f5883b8f97ad81a9ae07cb737d5fd8e4b62a881c1d8a9db7a5aea6f4c6a1179 F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8a39803ef8db4d8cb0d231e66299525fad4e61266ca29b3704aebb88df1c745b -R 2e599939602f27f3650e444e6b56fe0f +P 45c64d39d5afed7fdc6b1de19408559740d1fba1f5e0269ab68b132366a289e4 +R 34b1daea135211dcf75924949664eb09 U dan -Z 8fb26a7185f0be454adde39ec4ab299d +Z 645ab97c8aa78138d63493956dedb7f5 diff --git a/manifest.uuid b/manifest.uuid index 0eb424b8f1..8516e1e393 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -45c64d39d5afed7fdc6b1de19408559740d1fba1f5e0269ab68b132366a289e4 \ No newline at end of file +99609786f485653464d1caef1d207ae299d28c925bff3e8e94891759b4765dcc \ No newline at end of file diff --git a/src/window.c b/src/window.c index 83dd40532c..15a49f4423 100644 --- a/src/window.c +++ b/src/window.c @@ -799,6 +799,7 @@ static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){ } if( iCol<0 ){ Expr *pDup = sqlite3ExprDup(pParse->db, pExpr, 0); + if( pDup && pDup->op==TK_AGG_FUNCTION ) pDup->op = TK_FUNCTION; p->pSub = sqlite3ExprListAppend(pParse, p->pSub, pDup); } if( p->pSub ){ diff --git a/test/window1.test b/test/window1.test index ee4d4dfe16..9978fbc14b 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1363,12 +1363,12 @@ do_execsql_test 39.4 { # 2019-12-25 ticket d87336c81c7d0873 # -#reset_db -#do_catchsql_test 40.1 { -# CREATE VIRTUAL TABLE t0 USING rtree(c0, c1, c2); -# SELECT * FROM t0 -# WHERE ((0,0) IN (SELECT COUNT(*),LAG(5)OVER(PARTITION BY 0) FROM t0),0)<=(c1,0); -#} {1 {1st ORDER BY term out of range - should be between 1 and 3}} +reset_db +do_catchsql_test 40.1 { + CREATE VIRTUAL TABLE t0 USING rtree(c0, c1, c2); + SELECT * FROM t0 + WHERE ((0,0) IN (SELECT COUNT(*),LAG(5)OVER(PARTITION BY 0) FROM t0),0)<=(c1,0); +} {0 {}} #------------------------------------------------------------------------- reset_db @@ -1402,4 +1402,46 @@ do_execsql_test 41.3 { ); } {0 0 0 0 0 0 0 0} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 42.1 { + CREATE TABLE t1(a, b, c); + INSERT INTO t1 VALUES(1, 1, 1); + INSERT INTO t1 VALUES(2, 2, 2); +} +do_execsql_test 42.2 { + SELECT * FROM t1 WHERE (0, 0) IN ( SELECT count(*), 0 FROM t1 ) +} {} +do_execsql_test 42.3 { + SELECT * FROM t1 WHERE (2, 0) IN ( SELECT count(*), 0 FROM t1 ) +} {1 1 1 2 2 2} + +do_execsql_test 42.3 { + SELECT count(*), max(a) OVER () FROM t1 GROUP BY c; +} {1 2 1 2} + +do_execsql_test 42.4 { + SELECT sum(a), max(b) OVER () FROM t1; +} {3 1} + +do_execsql_test 42.5 { + CREATE TABLE t2(a, b); + INSERT INTO t2 VALUES('a', 1); + INSERT INTO t2 VALUES('a', 2); + INSERT INTO t2 VALUES('a', 3); + INSERT INTO t2 VALUES('b', 4); + INSERT INTO t2 VALUES('b', 5); + INSERT INTO t2 VALUES('b', 6); +} + +do_execsql_test 42.6 { + SELECT a, sum(b), sum( sum(b) ) OVER (ORDER BY a) FROM t2 GROUP BY a; +} {a 6 6 b 15 21} + +do_execsql_test 42.7 { + SELECT sum(b), sum( sum(b) ) OVER (ORDER BY a) FROM t2; +} {21 21} + finish_test + + From 6473ba95a0325e21716940299761d6a1a3c43d59 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 27 Dec 2019 18:15:04 +0000 Subject: [PATCH 092/120] Add a missing "ifcapable rtree {...}" line to the window1.test test module. FossilOrigin-Name: 4e6fbb1a5100fe29209bcf668fbecf3a733034b84925265d8a15b0a84baf6cf0 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/window1.test | 20 ++++++++++---------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index 2908ea78ff..5c5ce402e6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\swindow\sfunctions\sin\saggregate\squeries\sthat\sdo\snot\shave\sGROUP\sBY\sclauses. -D 2019-12-27T16:25:56.334 +C Add\sa\smissing\s"ifcapable\srtree\s{...}"\sline\sto\sthe\swindow1.test\stest\smodule. +D 2019-12-27T18:15:04.115 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1714,7 +1714,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 9f5883b8f97ad81a9ae07cb737d5fd8e4b62a881c1d8a9db7a5aea6f4c6a1179 +F test/window1.test 2a017e763831b9efaa994892bd7ae57b4759385cf693d03cb18742319b3a3ff1 F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 45c64d39d5afed7fdc6b1de19408559740d1fba1f5e0269ab68b132366a289e4 -R 34b1daea135211dcf75924949664eb09 -U dan -Z 645ab97c8aa78138d63493956dedb7f5 +P 99609786f485653464d1caef1d207ae299d28c925bff3e8e94891759b4765dcc +R 95c218d09723b1d483737b454f70dbf6 +U drh +Z f71166fb20baf1170bfe0d4ddd209c37 diff --git a/manifest.uuid b/manifest.uuid index 8516e1e393..518fe69038 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -99609786f485653464d1caef1d207ae299d28c925bff3e8e94891759b4765dcc \ No newline at end of file +4e6fbb1a5100fe29209bcf668fbecf3a733034b84925265d8a15b0a84baf6cf0 \ No newline at end of file diff --git a/test/window1.test b/test/window1.test index 9978fbc14b..fca1c79edf 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1361,14 +1361,16 @@ do_execsql_test 39.4 { SELECT * FROM t0 WHERE (t0.c0, 1) IN(SELECT NTILE(1) OVER(), 0 FROM t0); } -# 2019-12-25 ticket d87336c81c7d0873 -# -reset_db -do_catchsql_test 40.1 { - CREATE VIRTUAL TABLE t0 USING rtree(c0, c1, c2); - SELECT * FROM t0 - WHERE ((0,0) IN (SELECT COUNT(*),LAG(5)OVER(PARTITION BY 0) FROM t0),0)<=(c1,0); -} {0 {}} +ifcapable rtree { + # 2019-12-25 ticket d87336c81c7d0873 + # + reset_db + do_catchsql_test 40.1 { + CREATE VIRTUAL TABLE t0 USING rtree(c0, c1, c2); + SELECT * FROM t0 + WHERE ((0,0) IN (SELECT COUNT(*),LAG(5)OVER(PARTITION BY 0) FROM t0),0)<=(c1,0); + } {0 {}} +} #------------------------------------------------------------------------- reset_db @@ -1443,5 +1445,3 @@ do_execsql_test 42.7 { } {21 21} finish_test - - From e3735bf466b8220d126ae7be4b4fc3482a997fdd Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 27 Dec 2019 19:46:07 +0000 Subject: [PATCH 093/120] Fix a problem involving window function aliases being referenced from sub-selects. FossilOrigin-Name: e3b5fc05c00fc58be7a7c94ce1d97a5b05113f39aba03df64aab08364f85616b --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/resolve.c | 4 +++- test/window1.test | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 5c5ce402e6..4467fb0d1d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\smissing\s"ifcapable\srtree\s{...}"\sline\sto\sthe\swindow1.test\stest\smodule. -D 2019-12-27T18:15:04.115 +C Fix\sa\sproblem\sinvolving\swindow\sfunction\saliases\sbeing\sreferenced\sfrom\ssub-selects. +D 2019-12-27T19:46:07.834 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -526,7 +526,7 @@ F src/pragma.h ec3b31eac9b1df040f1cc8cb3d89bc06605c3b4cb3d76f833de8d6d6c3f77f04 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 86a7773d2892227ba9ad1721c41bb03c501830f1bf6de5f78dd0062b82e10c9d +F src/resolve.c e231da7dd307f99772c40e76096abaf05c6fedcb4f1f045de23a61c194df6da6 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 83e3aba723cd50134b8af4b18433f46123c31889a39c8b4ac28cccedbdf070e8 F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817ded @@ -1714,7 +1714,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 2a017e763831b9efaa994892bd7ae57b4759385cf693d03cb18742319b3a3ff1 +F test/window1.test 9b17982e6ffe57604946d3ec4b432a47b6449feb004fa3ae6facc151fc65184b F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 99609786f485653464d1caef1d207ae299d28c925bff3e8e94891759b4765dcc -R 95c218d09723b1d483737b454f70dbf6 -U drh -Z f71166fb20baf1170bfe0d4ddd209c37 +P 4e6fbb1a5100fe29209bcf668fbecf3a733034b84925265d8a15b0a84baf6cf0 +R d631658c66cc50630f2377c6822b52c7 +U dan +Z 7e0f8d6ba4dc51c9e12eed15e2098a4a diff --git a/manifest.uuid b/manifest.uuid index 518fe69038..8286c88569 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4e6fbb1a5100fe29209bcf668fbecf3a733034b84925265d8a15b0a84baf6cf0 \ No newline at end of file +e3b5fc05c00fc58be7a7c94ce1d97a5b05113f39aba03df64aab08364f85616b \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index ea8f00244a..a0f9c0f22f 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -459,7 +459,9 @@ static int lookupName( sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs); return WRC_Abort; } - if( (pNC->ncFlags&NC_AllowWin)==0 && ExprHasProperty(pOrig, EP_Win) ){ + if( ExprHasProperty(pOrig, EP_Win) + && ((pNC->ncFlags&NC_AllowWin)==0 || pNC!=pTopNC ) + ){ sqlite3ErrorMsg(pParse, "misuse of aliased window function %s",zAs); return WRC_Abort; } diff --git a/test/window1.test b/test/window1.test index fca1c79edf..450c649b21 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1444,4 +1444,51 @@ do_execsql_test 42.7 { SELECT sum(b), sum( sum(b) ) OVER (ORDER BY a) FROM t2; } {21 21} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 43.1.1 { + CREATE TABLE t1(x INTEGER PRIMARY KEY); + INSERT INTO t1 VALUES (10); +} +do_catchsql_test 43.1.2 { + SELECT count() OVER() AS m FROM t1 ORDER BY (SELECT m); +} {1 {misuse of aliased window function m}} + +reset_db +do_execsql_test 43.2.1 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b INTEGER); + INSERT INTO t1(a, b) VALUES(1, 10); -- 10 + INSERT INTO t1(a, b) VALUES(2, 15); -- 25 + INSERT INTO t1(a, b) VALUES(3, -5); -- 20 + INSERT INTO t1(a, b) VALUES(4, -5); -- 15 + INSERT INTO t1(a, b) VALUES(5, 20); -- 35 + INSERT INTO t1(a, b) VALUES(6, -11); -- 24 +} + +do_execsql_test 43.2.2 { + SELECT a, sum(b) OVER (ORDER BY a) AS abc FROM t1 ORDER BY 2 +} { + 1 10 4 15 3 20 6 24 2 25 5 35 +} + +do_execsql_test 43.2.3 { + SELECT a, sum(b) OVER (ORDER BY a) AS abc FROM t1 ORDER BY abc +} { + 1 10 4 15 3 20 6 24 2 25 5 35 +} + +do_execsql_test 43.2.4 { + SELECT a, sum(b) OVER (ORDER BY a) AS abc FROM t1 ORDER BY abc+5 +} { + 1 10 4 15 3 20 6 24 2 25 5 35 +} + +do_catchsql_test 43.2.5 { + SELECT a, sum(b) OVER (ORDER BY a) AS abc FROM t1 ORDER BY (SELECT abc) +} {1 {misuse of aliased window function abc}} + +do_catchsql_test 43.2.6 { + SELECT a, 1+sum(b) OVER (ORDER BY a) AS abc FROM t1 ORDER BY (SELECT abc) +} {1 {misuse of aliased window function abc}} + finish_test From b4b36306576fcc053f3e7f9fcfd990340bdb96e8 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 27 Dec 2019 20:06:32 +0000 Subject: [PATCH 094/120] Remove a NEVER() that is no longer true. Fix for [36ffedcb9]. FossilOrigin-Name: 597896ed0ae9e2960a8f39576bd7f77a11dccc1da84b6a44ebb5c38d90ebc330 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 13 +++++++------ test/window1.test | 25 +++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 4467fb0d1d..3dc5335b67 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sinvolving\swindow\sfunction\saliases\sbeing\sreferenced\sfrom\ssub-selects. -D 2019-12-27T19:46:07.834 +C Remove\sa\sNEVER()\sthat\sis\sno\slonger\strue.\sFix\sfor\s[36ffedcb9]. +D 2019-12-27T20:06:32.777 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,7 +480,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c a01bfcf51be41214319d30abfcdc2a1b4fd0291b5e2a4deeb1f509cc06d59c2c +F src/expr.c 188a8c039c95a0b4adb6c9dcde7252810c90e5145333634b924cbe348b187df8 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1714,7 +1714,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 9b17982e6ffe57604946d3ec4b432a47b6449feb004fa3ae6facc151fc65184b +F test/window1.test caf402a9726a7cbc84106c3d3ba833bbff5ae00223d61c02936bf63049564318 F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4e6fbb1a5100fe29209bcf668fbecf3a733034b84925265d8a15b0a84baf6cf0 -R d631658c66cc50630f2377c6822b52c7 +P e3b5fc05c00fc58be7a7c94ce1d97a5b05113f39aba03df64aab08364f85616b +R a966e346a033c0ab1a88c0d109a734aa U dan -Z 7e0f8d6ba4dc51c9e12eed15e2098a4a +Z ba0d31a3cdb9b737f0aa85ce7fe964a5 diff --git a/manifest.uuid b/manifest.uuid index 8286c88569..55ef3d6a91 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e3b5fc05c00fc58be7a7c94ce1d97a5b05113f39aba03df64aab08364f85616b \ No newline at end of file +597896ed0ae9e2960a8f39576bd7f77a11dccc1da84b6a44ebb5c38d90ebc330 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 92786732f9..a5f9a43af6 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5449,12 +5449,13 @@ struct SrcCount { ** Count the number of references to columns. */ static int exprSrcCount(Walker *pWalker, Expr *pExpr){ - /* The NEVER() on the second term is because sqlite3FunctionUsesThisSrc() - ** is always called before sqlite3ExprAnalyzeAggregates() and so the - ** TK_COLUMNs have not yet been converted into TK_AGG_COLUMN. If - ** sqlite3FunctionUsesThisSrc() is used differently in the future, the - ** NEVER() will need to be removed. */ - if( pExpr->op==TK_COLUMN || NEVER(pExpr->op==TK_AGG_COLUMN) ){ + /* There was once a NEVER() on the second term on the grounds that + ** sqlite3FunctionUsesThisSrc() was always called before + ** sqlite3ExprAnalyzeAggregates() and so the TK_COLUMNs have not yet + ** been converted into TK_AGG_COLUMN. But this is no longer true due + ** to window functions - sqlite3WindowRewrite() may now indirectly call + ** FunctionUsesThisSrc() when creating a new sub-select. */ + if( pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN ){ int i; struct SrcCount *p = pWalker->u.pSrcCount; SrcList *pSrc = p->pSrc; diff --git a/test/window1.test b/test/window1.test index 450c649b21..60c23dbda9 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1491,4 +1491,29 @@ do_catchsql_test 43.2.6 { SELECT a, 1+sum(b) OVER (ORDER BY a) AS abc FROM t1 ORDER BY (SELECT abc) } {1 {misuse of aliased window function abc}} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 44.1 { + CREATE TABLE t0(c0); +} + +do_catchsql_test 44.2.1 { + SELECT ntile(0) OVER (); +} {1 {argument of ntile must be a positive integer}} +do_catchsql_test 44.2.2 { + SELECT (0, 0) IN(SELECT MIN(c0), NTILE(0) OVER()) FROM t0; +} {1 {argument of ntile must be a positive integer}} + +do_execsql_test 44.3.1 { + SELECT ntile(1) OVER (); +} {1} +do_execsql_test 44.3.2 { + SELECT (0, 0) IN(SELECT MIN(c0), NTILE(1) OVER()) FROM t0; +} {0} + +do_execsql_test 44.4.2 { + INSERT INTO t0 VALUES(2), (1), (0); + SELECT (0, 1) IN(SELECT MIN(c0), NTILE(1) OVER()) FROM t0; +} {1} + finish_test From a6c1a71cde082e09750465d5675699062922e387 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 27 Dec 2019 20:54:42 +0000 Subject: [PATCH 095/120] Do not attempt to unwind the WITH stack in the Parse object following an error. This fixes a separate case to [de6e6d68]. FossilOrigin-Name: d29edef93451cc67a5d69c1cce1b1832d9ca8fff1f600afdd51338b74d077b92 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 2 +- test/altertab3.test | 22 ++++++++++++++++++++++ 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 3dc5335b67..c699cc6ae0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sNEVER()\sthat\sis\sno\slonger\strue.\sFix\sfor\s[36ffedcb9]. -D 2019-12-27T20:06:32.777 +C Do\snot\sattempt\sto\sunwind\sthe\sWITH\sstack\sin\sthe\sParse\sobject\sfollowing\san\serror.\sThis\sfixes\sa\sseparate\scase\sto\s[de6e6d68]. +D 2019-12-27T20:54:42.382 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -528,7 +528,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c e231da7dd307f99772c40e76096abaf05c6fedcb4f1f045de23a61c194df6da6 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 83e3aba723cd50134b8af4b18433f46123c31889a39c8b4ac28cccedbdf070e8 +F src/select.c e18a64e8d9f468ce9c183ab27ad79658b2aad8128e0dcfcd0c5dfe0132fc1074 F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817ded F src/sqlite.h.in 2a23e8161775253d9cf383c2c6aa559005dc787d350dcb0be67a6c4cc3bd1d19 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -638,7 +638,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test 4d8b79b0b88b62b90b710390df14fe99e0a3578345526886eaa550e28e3065dc F test/altertab2.test 8883693952f6d7fb5f754dbf1d694ed780aa883027bef04cb1fb99a3b88c9272 -F test/altertab3.test 10c32d6251344bdc114d2df27e62cb72b5afc676f20709224d362d0cff0aa3e3 +F test/altertab3.test d58d41201afd64c6176dcc4e71110c600c03841dad1efcc354de2248f6126e70 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 547bb700f903107b38611b014ca645d6b5bb819f5210d7bf39c40802aafeb7d7 F test/analyze3.test 01f0b122e3e54ad2544f14f7cc7dcb4c2cb8753cad5e88c6b8d49615b3fd6a2b @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e3b5fc05c00fc58be7a7c94ce1d97a5b05113f39aba03df64aab08364f85616b -R a966e346a033c0ab1a88c0d109a734aa +P 597896ed0ae9e2960a8f39576bd7f77a11dccc1da84b6a44ebb5c38d90ebc330 +R e2fa6fb2e144752a1d4a9d45874c1bd9 U dan -Z ba0d31a3cdb9b737f0aa85ce7fe964a5 +Z e36f281614de7335dc6fbd6aa6abfc9f diff --git a/manifest.uuid b/manifest.uuid index 55ef3d6a91..dd056531ff 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -597896ed0ae9e2960a8f39576bd7f77a11dccc1da84b6a44ebb5c38d90ebc330 \ No newline at end of file +d29edef93451cc67a5d69c1cce1b1832d9ca8fff1f600afdd51338b74d077b92 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 5afd6b76ce..6298e331f8 100644 --- a/src/select.c +++ b/src/select.c @@ -4978,7 +4978,7 @@ static int selectExpander(Walker *pWalker, Select *p){ /* Process NATURAL keywords, and ON and USING clauses of joins. */ - if( db->mallocFailed || sqliteProcessJoin(pParse, p) ){ + if( pParse->nErr || db->mallocFailed || sqliteProcessJoin(pParse, p) ){ return WRC_Abort; } diff --git a/test/altertab3.test b/test/altertab3.test index 27bca291fc..74b9b1a0f0 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -531,4 +531,26 @@ do_catchsql_test 23.2 { ALTER TABLE t1 RENAME TO t1x; } {1 {error in trigger r1: no such table: main.t2}} +#------------------------------------------------------------------------ +# +reset_db +do_execsql_test 23.1 { + CREATE TABLE v0 (a); + CREATE VIEW v2 (v3) AS + WITH x1 AS (SELECT * FROM v2) + SELECT v3 AS x, v3 AS y FROM v2; +} + +do_catchsql_test 23.2 { + SELECT * FROM v2 +} {1 {view v2 is circularly defined}} + +db close +sqlite3 db test.db + +do_catchsql_test 23.3 { + ALTER TABLE v0 RENAME TO t3 ; +} {1 {error in view v2: view v2 is circularly defined}} + finish_test + From ad5f157791a72c1f2812d8fe76e1522fd7a6cb6b Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 28 Dec 2019 00:36:51 +0000 Subject: [PATCH 096/120] Recompute the values for all generated columns after NOT NULL ON CONFLICT REPLACE constraints fire. Tickets [37823501c68a09f9] and [5fbc159eeb092130]. FossilOrigin-Name: 4cc12c18860bc4801a407cf45e88e23d3d40391f01a461fbac2cac5f102100e1 --- manifest | 16 ++--- manifest.uuid | 2 +- src/insert.c | 152 +++++++++++++++++++++++++++------------------- test/gencol1.test | 75 +++++++++++++++++++++-- 4 files changed, 169 insertions(+), 76 deletions(-) diff --git a/manifest b/manifest index 3dc5335b67..a26fc80d11 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sNEVER()\sthat\sis\sno\slonger\strue.\sFix\sfor\s[36ffedcb9]. -D 2019-12-27T20:06:32.777 +C Recompute\sthe\svalues\sfor\sall\sgenerated\scolumns\safter\s\nNOT\sNULL\sON\sCONFLICT\sREPLACE\sconstraints\sfire.\nTickets\s[37823501c68a09f9]\sand\s[5fbc159eeb092130]. +D 2019-12-28T00:36:51.136 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -489,7 +489,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 831408b14a146e93a4e02ddba54dcdfd8097463b9c00ca2ed9daed790c5d452a +F src/insert.c 5d4959fd82a982669c9322a1c6ef49a99a7c59ccfea80bf79ba0d4fa34a7165a F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da F src/main.c 868ae7db7a54fe859bf2ca8b7a4f24e9fa03a6134abfb7c9801d08411ef5dacb @@ -1023,7 +1023,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test 66b361e39820e28b1be1a50de275d14f5a448c0cbcb71b6d38eedb683391cee4 +F test/gencol1.test f0fdeabdd7e41465f4940c6c6252188a93b0dfb287386bf5fd78a01e53af1768 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e3b5fc05c00fc58be7a7c94ce1d97a5b05113f39aba03df64aab08364f85616b -R a966e346a033c0ab1a88c0d109a734aa -U dan -Z ba0d31a3cdb9b737f0aa85ce7fe964a5 +P 597896ed0ae9e2960a8f39576bd7f77a11dccc1da84b6a44ebb5c38d90ebc330 +R 63edebf0afc8152d09a090e486cf3aae +U drh +Z 208796759029520d88a49c921369035d diff --git a/manifest.uuid b/manifest.uuid index 55ef3d6a91..fd1de4217f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -597896ed0ae9e2960a8f39576bd7f77a11dccc1da84b6a44ebb5c38d90ebc330 \ No newline at end of file +4cc12c18860bc4801a407cf45e88e23d3d40391f01a461fbac2cac5f102100e1 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 019dec42f9..61b13bf2d5 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1502,7 +1502,6 @@ void sqlite3GenerateConstraintChecks( int ix; /* Index loop counter */ int nCol; /* Number of columns */ int onError; /* Conflict resolution strategy */ - int addr1; /* Address of jump instruction */ int seenReplace = 0; /* True if REPLACE is used to resolve INT PK conflict */ int nPkField; /* Number of fields in PRIMARY KEY. 1 for ROWID tables */ Index *pUpIdx = 0; /* Index to which to apply the upsert */ @@ -1546,71 +1545,100 @@ void sqlite3GenerateConstraintChecks( /* Test all NOT NULL constraints. */ if( pTab->tabFlags & TF_HasNotNull ){ - for(i=0; iaCol[i].notNull; - if( onError==OE_None ) continue; /* No NOT NULL on this column */ - if( i==pTab->iPKey ){ - continue; /* ROWID is never NULL */ - } - if( aiChng && aiChng[i]<0 ){ - /* Don't bother checking for NOT NULL on columns that do not change */ - continue; - } - if( overrideError!=OE_Default ){ - onError = overrideError; - }else if( onError==OE_Default ){ - onError = OE_Abort; - } - if( onError==OE_Replace && pTab->aCol[i].pDflt==0 ){ - onError = OE_Abort; - } - assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail - || onError==OE_Ignore || onError==OE_Replace ); - addr1 = 0; - testcase( i!=sqlite3TableColumnToStorage(pTab, i) ); - testcase( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ); - testcase( pTab->aCol[i].colFlags & COLFLAG_STORED ); - iReg = sqlite3TableColumnToStorage(pTab, i) + regNewData + 1; - switch( onError ){ - case OE_Replace: { - assert( onError==OE_Replace ); - addr1 = sqlite3VdbeMakeLabel(pParse); - sqlite3VdbeAddOp2(v, OP_NotNull, iReg, addr1); - VdbeCoverage(v); - if( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)==0 ){ - sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i); - sqlite3VdbeAddOp2(v, OP_NotNull, iReg, addr1); - VdbeCoverage(v); - } + int b2ndPass = 0; /* True if currently running 2nd pass */ + int nSeenReplace = 0; /* Number of ON CONFLICT REPLACE operations */ + int nGenerated = 0; /* Number of generated columns with NOT NULL */ + while(1){ /* Make 2 passes over columns. Exit loop via "break" */ + for(i=0; iaCol[i]; /* The column to check for NOT NULL */ + int isGenerated; /* non-zero if column is generated */ + onError = pCol->notNull; + if( onError==OE_None ) continue; /* No NOT NULL on this column */ + if( i==pTab->iPKey ){ + continue; /* ROWID is never NULL */ + } + isGenerated = pCol->colFlags & COLFLAG_GENERATED; + if( isGenerated && !b2ndPass ){ + nGenerated++; + continue; /* Generated columns processed on 2nd pass */ + } + if( aiChng && aiChng[i]<0 && !isGenerated ){ + /* Do not check NOT NULL on columns that do not change */ + continue; + } + if( overrideError!=OE_Default ){ + onError = overrideError; + }else if( onError==OE_Default ){ onError = OE_Abort; - /* Fall through into the OE_Abort case to generate code that runs - ** if both the input and the default value are NULL */ } - case OE_Abort: - sqlite3MayAbort(pParse); - /* Fall through */ - case OE_Rollback: - case OE_Fail: { - char *zMsg = sqlite3MPrintf(db, "%s.%s", pTab->zName, - pTab->aCol[i].zName); - sqlite3VdbeAddOp3(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL, - onError, iReg); - sqlite3VdbeAppendP4(v, zMsg, P4_DYNAMIC); - sqlite3VdbeChangeP5(v, P5_ConstraintNotNull); - VdbeCoverage(v); - if( addr1 ) sqlite3VdbeResolveLabel(v, addr1); - break; - } - default: { - assert( onError==OE_Ignore ); - sqlite3VdbeAddOp2(v, OP_IsNull, iReg, ignoreDest); - VdbeCoverage(v); - break; + if( onError==OE_Replace ){ + if( b2ndPass /* REPLACE becomes ABORT on the 2nd pass */ + || pCol->pDflt==0 /* REPLACE is ABORT if no DEFAULT value */ + ){ + testcase( pCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pCol->colFlags & COLFLAG_STORED ); + testcase( pCol->colFlags & COLFLAG_GENERATED ); + onError = OE_Abort; + }else{ + assert( !isGenerated ); + } + }else if( b2ndPass && !isGenerated ){ + continue; } + assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail + || onError==OE_Ignore || onError==OE_Replace ); + testcase( i!=sqlite3TableColumnToStorage(pTab, i) ); + iReg = sqlite3TableColumnToStorage(pTab, i) + regNewData + 1; + switch( onError ){ + case OE_Replace: { + int addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, iReg); + VdbeCoverage(v); + assert( (pCol->colFlags & COLFLAG_GENERATED)==0 ); + nSeenReplace++; + sqlite3ExprCode(pParse, pCol->pDflt, iReg); + sqlite3VdbeJumpHere(v, addr1); + break; + } + case OE_Abort: + sqlite3MayAbort(pParse); + /* Fall through */ + case OE_Rollback: + case OE_Fail: { + char *zMsg = sqlite3MPrintf(db, "%s.%s", pTab->zName, + pCol->zName); + sqlite3VdbeAddOp3(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL, + onError, iReg); + sqlite3VdbeAppendP4(v, zMsg, P4_DYNAMIC); + sqlite3VdbeChangeP5(v, P5_ConstraintNotNull); + VdbeCoverage(v); + break; + } + default: { + assert( onError==OE_Ignore ); + sqlite3VdbeAddOp2(v, OP_IsNull, iReg, ignoreDest); + VdbeCoverage(v); + break; + } + } /* end switch(onError) */ + } /* end loop i over columns */ + if( nGenerated==0 && nSeenReplace==0 ){ + /* If there are no generated columns with NOT NULL constraints + ** and no NOT NULL ON CONFLICT REPLACE constraints, then a single + ** pass is sufficient */ + break; } - } - } + if( b2ndPass ) break; /* Never need more than 2 passes */ + b2ndPass = 1; + if( nSeenReplace>0 && (pTab->tabFlags & TF_HasGenerated)!=0 ){ + /* If any NOT NULL ON CONFLICT REPLACE constraints fired on the + ** first pass, recomputed values for all generated columns, as + ** those values might depend on columns affected by the REPLACE. + */ + sqlite3ComputeGeneratedColumns(pParse, regNewData+1, pTab); + } + } /* end of 2-pass loop */ + } /* end if( has-not-null-constraints ) */ /* Test all CHECK constraints */ diff --git a/test/gencol1.test b/test/gencol1.test index d4cda59908..7d0da45821 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -211,16 +211,81 @@ do_catchsql_test gencol1-6.10 { REPLACE INTO t0(c1) VALUES(NULL); } {1 {NOT NULL constraint failed: t0.c0}} -# 2019-11-06 ticket b13b7dce76e9352b34e7 +# 2019-11-06 ticket https://www.sqlite.org/src/info/2399f5986134f79c +# 2019-12-27 ticket https://www.sqlite.org/src/info/5fbc159eeb092130 +# 2019-12-27 ticket https://www.sqlite.org/src/info/37823501c68a09f9 +# +# All of the above tickets deal with NOT NULL ON CONFLICT REPLACE +# constraints on tables that have generated columns. +# +reset_db do_execsql_test gencol1-7.10 { - DROP TABLE IF EXISTS t0; CREATE TABLE t0 (c0 GENERATED ALWAYS AS (1), c1 UNIQUE, c2 UNIQUE); INSERT INTO t0(c1) VALUES (1); SELECT quote(0 = t0.c2 OR t0.c1 BETWEEN t0.c2 AND 1) FROM t0; } {NULL} +do_execsql_test gencol1-7.11 { + DROP TABLE t0; + CREATE TABLE t0(c0 NOT NULL DEFAULT 'xyz', c1 AS(c0) NOT NULL); + REPLACE INTO t0(c0) VALUES(NULL); + SELECT * FROM t0; +} {xyz xyz} +do_execsql_test gencol1-7.12 { + DROP TABLE t0; + CREATE TABLE t0(c0 NOT NULL DEFAULT 'xyz', c1 AS(c0) STORED NOT NULL); + REPLACE INTO t0(c0) VALUES(NULL); + SELECT * FROM t0; +} {xyz xyz} do_execsql_test gencol1-7.20 { - SELECT 99 FROM t0 WHERE 0 = t0.c2 OR t0.c1 BETWEEN t0.c2 AND 1; -} {} + CREATE TABLE t1( + a NOT NULL DEFAULT 'aaa', + b AS(c) NOT NULL, + c NOT NULL DEFAULT 'ccc'); + REPLACE INTO t1(a,c) VALUES(NULL,NULL); + SELECT * FROM t1; +} {aaa ccc ccc} +do_execsql_test gencol1-7.21 { + DROP TABLE t1; + CREATE TABLE t1( + a NOT NULL DEFAULT 'aaa', + b AS(c) STORED NOT NULL, + c NOT NULL DEFAULT 'ccc'); + REPLACE INTO t1(a,c) VALUES(NULL,NULL); + SELECT * FROM t1; +} {aaa ccc ccc} +do_execsql_test gencol1-7.30 { + CREATE TABLE t2( + a NOT NULL DEFAULT 'aaa', + b AS(a) NOT NULL, + c NOT NULL DEFAULT 'ccc'); + REPLACE INTO t2(a,c) VALUES(NULL,NULL); + SELECT * FROM t2; +} {aaa aaa ccc} +do_execsql_test gencol1-7.31 { + DROP TABLE t2; + CREATE TABLE t2( + a NOT NULL DEFAULT 'aaa', + b AS(a) STORED NOT NULL, + c NOT NULL DEFAULT 'ccc'); + REPLACE INTO t2(a,c) VALUES(NULL,NULL); + SELECT * FROM t2; +} {aaa aaa ccc} +do_execsql_test gencol1-7.40 { + CREATE TABLE t3(a NOT NULL DEFAULT 123, b AS(a) UNIQUE); + REPLACE INTO t3 VALUES(NULL); + SELECT * FROM t3; +} {123 123} +do_execsql_test gencol1-7.41 { + SELECT * FROM t3 WHERE b=123; +} {123 123} +do_execsql_test gencol1-7.50 { + CREATE TABLE t4(a NOT NULL DEFAULT 123, b AS(a*10+4) STORED UNIQUE); + REPLACE INTO t4 VALUES(NULL); + SELECT * FROM t4; +} {123 1234} +do_execsql_test gencol1-7.51 { + SELECT * FROM t4 WHERE b=1234; +} {123 1234} # 2019-11-06 ticket 4fc08501f4e56692 do_execsql_test gencol1-8.10 { @@ -245,9 +310,9 @@ do_catchsql_test gencol1-8.20 { # 2019-11-21 Problems in the new generated column logic # reported by Yongheng Chen and Rui Zhong +reset_db do_execsql_test gencol1-9.10 { PRAGMA foreign_keys=OFF; - DROP TABLE t1; CREATE TABLE t1(aa , bb AS (17) UNIQUE); INSERT INTO t1 VALUES(17); CREATE TABLE t2(cc); From d9670abb582fc32dcce08fa143abef5f19029e56 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 28 Dec 2019 01:52:46 +0000 Subject: [PATCH 097/120] When an INSERT is receiving content from a SELECT, run an OP_ReleaseReg opcode at the top of each iteration of the loop in order to prevent spurious OP_SCopy misuse complaints. Ticket [de4b04149b9fdeae] FossilOrigin-Name: 6afadd3b3a40b0ef29fd14fb24c2a4b9479483e5f8b9125ce02d8daae662207f --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/insert.c | 10 ++++++++++ src/vdbe.c | 14 ++++++++++++++ src/where.c | 2 +- test/gencol1.test | 13 +++++++++++-- 6 files changed, 46 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index a26fc80d11..91aa81ad92 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Recompute\sthe\svalues\sfor\sall\sgenerated\scolumns\safter\s\nNOT\sNULL\sON\sCONFLICT\sREPLACE\sconstraints\sfire.\nTickets\s[37823501c68a09f9]\sand\s[5fbc159eeb092130]. -D 2019-12-28T00:36:51.136 +C When\san\sINSERT\sis\sreceiving\scontent\sfrom\sa\sSELECT,\srun\san\sOP_ReleaseReg\sopcode\nat\sthe\stop\sof\seach\siteration\sof\sthe\sloop\sin\sorder\sto\sprevent\sspurious\nOP_SCopy\smisuse\scomplaints.\s\sTicket\s[de4b04149b9fdeae] +D 2019-12-28T01:52:46.568 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -489,7 +489,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 5d4959fd82a982669c9322a1c6ef49a99a7c59ccfea80bf79ba0d4fa34a7165a +F src/insert.c be02cb3503277063879f9c04ce2feb9ffdcdd8f6abd975cc6007f745392b495b F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da F src/main.c 868ae7db7a54fe859bf2ca8b7a4f24e9fa03a6134abfb7c9801d08411ef5dacb @@ -600,7 +600,7 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 8b0f3445b75be6aa381a961a3206decf6e169c5b5625349fcb7e287e9deffa14 +F src/vdbe.c 4d91d635d7aff34e09fade185911c7980fc42f93cc7b18f5387fad5a1166f08c F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 F src/vdbeInt.h 1ccaf470287e2d153b16cf7b0274d436db2c2f74cdf14afd1a0ff4cb51548ae6 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -614,7 +614,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 15a2845769f51ba132f9cf0b2c7a6887a91fc8437892dbcce9fcdc68b66d60a1 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d -F src/where.c 58653781a4b31fa16b95b953591fdc1f1ed5ff77574e59b90a27da3819b60a46 +F src/where.c e221a612fbf63266e9fc00914fb6a511024167c16e4938a5b247b0d41ea15610 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c d42d3e0fe93786621b84dec8065e1dc6b324d7c5934df52f141555843b6aef4e F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 @@ -1023,7 +1023,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test f0fdeabdd7e41465f4940c6c6252188a93b0dfb287386bf5fd78a01e53af1768 +F test/gencol1.test e89eafdf03245e2609ddf6e9b0add37a17ce229095836c409131764c3a5282a5 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 597896ed0ae9e2960a8f39576bd7f77a11dccc1da84b6a44ebb5c38d90ebc330 -R 63edebf0afc8152d09a090e486cf3aae +P 4cc12c18860bc4801a407cf45e88e23d3d40391f01a461fbac2cac5f102100e1 +R 27f90cf00e11bc62225fb137834fb1e7 U drh -Z 208796759029520d88a49c921369035d +Z 9a630124c807dd4207b2667c21867988 diff --git a/manifest.uuid b/manifest.uuid index fd1de4217f..bf344674de 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4cc12c18860bc4801a407cf45e88e23d3d40391f01a461fbac2cac5f102100e1 \ No newline at end of file +6afadd3b3a40b0ef29fd14fb24c2a4b9479483e5f8b9125ce02d8daae662207f \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 61b13bf2d5..423087e37a 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1020,6 +1020,7 @@ void sqlite3Insert( ** goto C ** D: ... */ + sqlite3VdbeReleaseRegisters(pParse, regData, pTab->nCol, 0); addrInsTop = addrCont = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); VdbeCoverage(v); if( ipkColumn>=0 ){ @@ -1280,6 +1281,15 @@ void sqlite3Insert( sqlite3VdbeAddOp1(v, OP_Close, srcTab); }else if( pSelect ){ sqlite3VdbeGoto(v, addrCont); +#ifdef SQLITE_DEBUG + /* If we are jumping back to an OP_Yield that is preceded by an + ** OP_ReleaseReg, set the p5 flag on the OP_Goto so that the + ** OP_ReleaseReg will be included in the loop. */ + if( sqlite3VdbeGetOp(v, addrCont-1)->opcode==OP_ReleaseReg ){ + assert( sqlite3VdbeGetOp(v, addrCont)->opcode==OP_Yield ); + sqlite3VdbeChangeP5(v, 1); + } +#endif sqlite3VdbeJumpHere(v, addrInsTop); } diff --git a/src/vdbe.c b/src/vdbe.c index d1416028b2..23c8b18ac8 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -845,6 +845,20 @@ int sqlite3VdbeExec( ** to the current line should be indented for EXPLAIN output. */ case OP_Goto: { /* jump */ + +#ifdef SQLITE_DEBUG + /* In debuggging mode, when the p5 flags is set on an OP_Goto, that + ** means we should really jump back to the preceeding OP_ReleaseReg + ** instruction. */ + if( pOp->p5 ){ + assert( pOp->p2 < (int)(pOp - aOp) ); + assert( pOp->p2 > 1 ); + pOp = &aOp[pOp->p2 - 2]; + assert( pOp[1].opcode==OP_ReleaseReg ); + goto check_for_interrupt; + } +#endif + jump_to_p2_and_check_for_interrupt: pOp = &aOp[pOp->p2 - 1]; diff --git a/src/where.c b/src/where.c index 830dbfde3a..d2ff9e3cec 100644 --- a/src/where.c +++ b/src/where.c @@ -870,8 +870,8 @@ static void constructAutomaticIndex( pTabItem->fg.viaCoroutine = 0; }else{ sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, SQLITE_STMTSTATUS_AUTOINDEX); } - sqlite3VdbeChangeP5(v, SQLITE_STMTSTATUS_AUTOINDEX); sqlite3VdbeJumpHere(v, addrTop); sqlite3ReleaseTempReg(pParse, regRecord); diff --git a/test/gencol1.test b/test/gencol1.test index 7d0da45821..5276d9694d 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -548,7 +548,16 @@ do_execsql_test gencol1-18.20 { SELECT * FROM t0; } {0 0 0} - - +# 2019-12-27 ticket de4b04149b9fdeae +# +reset_db +do_catchsql_test gencol1-19.10 { + CREATE TABLE t0( + c0 INT AS(2) UNIQUE, + c1 TEXT UNIQUE, + FOREIGN KEY(c0) REFERENCES t0(c1) + ); + INSERT INTO t0(c1) VALUES(0.16334143182538696), (0); +} {1 {UNIQUE constraint failed: t0.c0}} finish_test From b97f3532f55af5faa4d8e6256577437b4e50ec06 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 28 Dec 2019 02:40:49 +0000 Subject: [PATCH 098/120] Convert an assert() back into a conditional. The conditional was converted into an assert() by check-in [6ae4ad6ebee4db88] (2009-05-28) because we were unable to find a test case for it. Yongheng's fuzzer just now found that test case. FossilOrigin-Name: 4d0b9109f7a5312d4e136395e08b11dad64d746bc106ad44d47675e5b1dcb4ef --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 91aa81ad92..7d9ce31808 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\san\sINSERT\sis\sreceiving\scontent\sfrom\sa\sSELECT,\srun\san\sOP_ReleaseReg\sopcode\nat\sthe\stop\sof\seach\siteration\sof\sthe\sloop\sin\sorder\sto\sprevent\sspurious\nOP_SCopy\smisuse\scomplaints.\s\sTicket\s[de4b04149b9fdeae] -D 2019-12-28T01:52:46.568 +C Convert\san\sassert()\sback\sinto\sa\sconditional.\s\sThe\sconditional\swas\sconverted\ninto\san\sassert()\sby\scheck-in\s[6ae4ad6ebee4db88]\s(2009-05-28)\sbecause\swe\swere\nunable\sto\sfind\sa\stest\scase\sfor\sit.\s\sYongheng's\sfuzzer\sjust\snow\nfound\sthat\stest\scase. +D 2019-12-28T02:40:49.716 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,7 +480,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 188a8c039c95a0b4adb6c9dcde7252810c90e5145333634b924cbe348b187df8 +F src/expr.c de4fa05000145cbb6ff29b106e2c7dded5fe3d7882c518b2bc6f63c27891a645 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4cc12c18860bc4801a407cf45e88e23d3d40391f01a461fbac2cac5f102100e1 -R 27f90cf00e11bc62225fb137834fb1e7 +P 6afadd3b3a40b0ef29fd14fb24c2a4b9479483e5f8b9125ce02d8daae662207f +R 4b3499031b2124e5f56fb355fbad44a0 U drh -Z 9a630124c807dd4207b2667c21867988 +Z cf16da0339b8c2d85e2898cd693cab42 diff --git a/manifest.uuid b/manifest.uuid index bf344674de..2c1dd43d79 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6afadd3b3a40b0ef29fd14fb24c2a4b9479483e5f8b9125ce02d8daae662207f \ No newline at end of file +4d0b9109f7a5312d4e136395e08b11dad64d746bc106ad44d47675e5b1dcb4ef \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index a5f9a43af6..76ffea3f17 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2292,7 +2292,7 @@ static Select *isCandidateForInOpt(Expr *pX){ testcase( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Aggregate ); return 0; /* No DISTINCT keyword and no aggregate functions */ } - assert( p->pGroupBy==0 ); /* Has no GROUP BY clause */ + if( p->pGroupBy ) return 0; /* Has no GROUP BY clause */ if( p->pLimit ) return 0; /* Has no LIMIT clause */ if( p->pWhere ) return 0; /* Has no WHERE clause */ pSrc = p->pSrc; From 9a1f2e48534f614638ed86bb3d66b0f2f735d900 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 28 Dec 2019 03:55:50 +0000 Subject: [PATCH 099/120] Fix a faulty assert() associated with query search limiting query plans. FossilOrigin-Name: 0d743585c242ebd898b232f42937a2306752aaed0a6756705e3ef1cf7593aa97 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 7d9ce31808..6845962ad3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Convert\san\sassert()\sback\sinto\sa\sconditional.\s\sThe\sconditional\swas\sconverted\ninto\san\sassert()\sby\scheck-in\s[6ae4ad6ebee4db88]\s(2009-05-28)\sbecause\swe\swere\nunable\sto\sfind\sa\stest\scase\sfor\sit.\s\sYongheng's\sfuzzer\sjust\snow\nfound\sthat\stest\scase. -D 2019-12-28T02:40:49.716 +C Fix\sa\sfaulty\sassert()\sassociated\swith\squery\ssearch\slimiting\squery\splans. +D 2019-12-28T03:55:50.593 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -614,7 +614,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 15a2845769f51ba132f9cf0b2c7a6887a91fc8437892dbcce9fcdc68b66d60a1 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d -F src/where.c e221a612fbf63266e9fc00914fb6a511024167c16e4938a5b247b0d41ea15610 +F src/where.c 2796f052b577e0c28d9e05e7fcbe30917af4a1263117b36a49d99feb01d5e851 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c d42d3e0fe93786621b84dec8065e1dc6b324d7c5934df52f141555843b6aef4e F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6afadd3b3a40b0ef29fd14fb24c2a4b9479483e5f8b9125ce02d8daae662207f -R 4b3499031b2124e5f56fb355fbad44a0 +P 4d0b9109f7a5312d4e136395e08b11dad64d746bc106ad44d47675e5b1dcb4ef +R e95563f4007b963558ff78573e278f30 U drh -Z cf16da0339b8c2d85e2898cd693cab42 +Z b10e6aae64694b8f3d461ddceec41120 diff --git a/manifest.uuid b/manifest.uuid index 2c1dd43d79..27ed8f0e56 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4d0b9109f7a5312d4e136395e08b11dad64d746bc106ad44d47675e5b1dcb4ef \ No newline at end of file +0d743585c242ebd898b232f42937a2306752aaed0a6756705e3ef1cf7593aa97 \ No newline at end of file diff --git a/src/where.c b/src/where.c index d2ff9e3cec..e2c31c64c8 100644 --- a/src/where.c +++ b/src/where.c @@ -3502,7 +3502,8 @@ static int whereLoopAddOr( if( rc==SQLITE_OK ){ rc = whereLoopAddOr(&sSubBuild, mPrereq, mUnusable); } - assert( rc==SQLITE_OK || sCur.n==0 ); + assert( rc==SQLITE_OK || rc==SQLITE_DONE || sCur.n==0 ); + testcase( rc==SQLITE_DONE ); if( sCur.n==0 ){ sSum.n = 0; break; From 5d59102a91c1911bc83a92386b1dff9e15f3a512 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 28 Dec 2019 08:26:47 +0000 Subject: [PATCH 100/120] Fix an assert() failure in altertable3-22.4. FossilOrigin-Name: c566a91d5c4290b0a491a01e85bf8f9fbebf2910e0d478bafc2d22da7f749cae --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index c699cc6ae0..adf8cee3be 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sattempt\sto\sunwind\sthe\sWITH\sstack\sin\sthe\sParse\sobject\sfollowing\san\serror.\sThis\sfixes\sa\sseparate\scase\sto\s[de6e6d68]. -D 2019-12-27T20:54:42.382 +C Fix\san\sassert()\sfailure\sin\saltertable3-22.4. +D 2019-12-28T08:26:47.067 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -472,7 +472,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 695bcbc62177cf70faaf6b34f89c22415e5581a13c57d67c862057636d3f09b9 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c 1d999886fa656e6211e14d5402a6f92cadbdaa5d2f4f0597c797f7818d510e33 +F src/build.c 5aa8776d926954f13ddc37144c765ff8d80e49b74432c0f5a10f29433f0d69a8 F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 597896ed0ae9e2960a8f39576bd7f77a11dccc1da84b6a44ebb5c38d90ebc330 -R e2fa6fb2e144752a1d4a9d45874c1bd9 +P d29edef93451cc67a5d69c1cce1b1832d9ca8fff1f600afdd51338b74d077b92 +R cba70c36e93dfffeaca2b813bf7688d4 U dan -Z e36f281614de7335dc6fbd6aa6abfc9f +Z cffa8180beb2f61f82cbe2ab0339d09f diff --git a/manifest.uuid b/manifest.uuid index dd056531ff..526574e878 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d29edef93451cc67a5d69c1cce1b1832d9ca8fff1f600afdd51338b74d077b92 \ No newline at end of file +c566a91d5c4290b0a491a01e85bf8f9fbebf2910e0d478bafc2d22da7f749cae \ No newline at end of file diff --git a/src/build.c b/src/build.c index 0c8ec9304b..1188d24524 100644 --- a/src/build.c +++ b/src/build.c @@ -2625,7 +2625,10 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ pSelTab = sqlite3ResultSetOfSelect(pParse, pSel, SQLITE_AFF_NONE); #endif pParse->nTab = n; - if( pTable->pCheck ){ + if( pSelTab==0 ){ + pTable->nCol = 0; + nErr++; + }else if( pTable->pCheck ){ /* CREATE VIEW name(arglist) AS ... ** The names of the columns in the table are taken from ** arglist which is stored in pTable->pCheck. The pCheck field @@ -2641,7 +2644,7 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ sqlite3SelectAddColumnTypeAndCollation(pParse, pTable, pSel, SQLITE_AFF_NONE); } - }else if( pSelTab ){ + }else{ /* CREATE VIEW name AS... without an argument list. Construct ** the column names from the SELECT statement that defines the view. */ @@ -2651,9 +2654,6 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ pSelTab->nCol = 0; pSelTab->aCol = 0; assert( sqlite3SchemaMutexHeld(db, 0, pTable->pSchema) ); - }else{ - pTable->nCol = 0; - nErr++; } pTable->nNVCol = pTable->nCol; sqlite3DeleteTable(db, pSelTab); From 7505123fe5394f54e60fbdc0a4c3d87aadef9bb7 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 28 Dec 2019 11:55:44 +0000 Subject: [PATCH 101/120] Two new test cases added to test/fuzzdata8.db. FossilOrigin-Name: 1be2c18f4021e1d0b8412ecb68a599475c717dd97c7db209fc4203358957fd70 --- manifest | 15 +++++++-------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1616896 -> 1620992 bytes 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 9fc921570a..d1c0c6b2fb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Second\sattempt\sto\sfix\sa\sproblem\swith\sunwinding\sthe\sWITH\sstack\sof\sthe\sParse\sobject\sfollowing\san\serror. -D 2019-12-28T09:08:27.061 +C Two\snew\stest\scases\sadded\sto\stest/fuzzdata8.db. +D 2019-12-28T11:55:44.749 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1018,7 +1018,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db 858bd9bef8b8941c8dae34d983daacbd2c1d1917e58fba4b795c44da9840e8ef +F test/fuzzdata8.db a0b7151bf505ee9735f6e5a3f7851ecb35121f1cd731ac677a77ee540f358939 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1853,8 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0d743585c242ebd898b232f42937a2306752aaed0a6756705e3ef1cf7593aa97 d693be375380fbfca426999a77eeecb8453fa77b77f608bfe266945dee1da41d -R 9a4f1ab6b8173f2c45a1b04ce638436e -T +closed d693be375380fbfca426999a77eeecb8453fa77b77f608bfe266945dee1da41d -U dan -Z c71d59a79b1bd1245222b34bfd52bade +P 315d1f1a503e8c186739658c85b92fa3d12514e5baaa26925c85664b5e85d1c0 +R 38094d1bc8d84cfaffe3da68e5a91de4 +U drh +Z 5a6ae9bcb7c62e50f1665981a625d451 diff --git a/manifest.uuid b/manifest.uuid index 6cfac3998a..77f7e4216a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -315d1f1a503e8c186739658c85b92fa3d12514e5baaa26925c85664b5e85d1c0 \ No newline at end of file +1be2c18f4021e1d0b8412ecb68a599475c717dd97c7db209fc4203358957fd70 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index ab151b55bb93894600201c97957aafa7704c5246..e103ef27eb0362154219a22b571dbc4e46d10205 100644 GIT binary patch delta 23825 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 Date: Sat, 28 Dec 2019 12:33:35 +0000 Subject: [PATCH 102/120] If the ".wheretrace 0x10000" bit is set, print WhereTerm.prereqAll and .prereqRight fields in the WhereTerm trace output. FossilOrigin-Name: a4f330b133a36356681dce7d2a65d8ab792620494d6cd4ef4934a97cf3a8e6fc --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 6 +++++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index d1c0c6b2fb..c6cebb057e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Two\snew\stest\scases\sadded\sto\stest/fuzzdata8.db. -D 2019-12-28T11:55:44.749 +C If\sthe\s".wheretrace\s0x10000"\sbit\sis\sset,\sprint\sWhereTerm.prereqAll\nand\s.prereqRight\sfields\sin\sthe\sWhereTerm\strace\soutput. +D 2019-12-28T12:33:35.974 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -614,7 +614,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 15a2845769f51ba132f9cf0b2c7a6887a91fc8437892dbcce9fcdc68b66d60a1 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d -F src/where.c 2796f052b577e0c28d9e05e7fcbe30917af4a1263117b36a49d99feb01d5e851 +F src/where.c 476c0091eb27c99fb481730621838f646fba6d9ebc6e76a97e8caa9b7f08d933 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c d42d3e0fe93786621b84dec8065e1dc6b324d7c5934df52f141555843b6aef4e F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 315d1f1a503e8c186739658c85b92fa3d12514e5baaa26925c85664b5e85d1c0 -R 38094d1bc8d84cfaffe3da68e5a91de4 +P 1be2c18f4021e1d0b8412ecb68a599475c717dd97c7db209fc4203358957fd70 +R 1077f4eb4d5b48d5e8fb352c3adc1164 U drh -Z 5a6ae9bcb7c62e50f1665981a625d451 +Z 26ea5bdabbe48f1cef138e8164f2fb1d diff --git a/manifest.uuid b/manifest.uuid index 77f7e4216a..556a07d0a2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1be2c18f4021e1d0b8412ecb68a599475c717dd97c7db209fc4203358957fd70 \ No newline at end of file +a4f330b133a36356681dce7d2a65d8ab792620494d6cd4ef4934a97cf3a8e6fc \ No newline at end of file diff --git a/src/where.c b/src/where.c index e2c31c64c8..0ea0026f48 100644 --- a/src/where.c +++ b/src/where.c @@ -1759,9 +1759,13 @@ static void whereTermPrint(WhereTerm *pTerm, int iTerm){ sqlite3_snprintf(sizeof(zLeft),zLeft,"left=%d", pTerm->leftCursor); } sqlite3DebugPrintf( - "TERM-%-3d %p %s %-12s prob=%-3d op=0x%03x wtFlags=0x%04x", + "TERM-%-3d %p %s %-12s prob=%-3d op=%03x wtFlags=%04x", iTerm, pTerm, zType, zLeft, pTerm->truthProb, pTerm->eOperator, pTerm->wtFlags); + if( sqlite3WhereTrace & 0x10000 ){ + sqlite3DebugPrintf(" prereq=%llx,%llx", + (u64)pTerm->prereqAll, (u64)pTerm->prereqRight); + } if( pTerm->iField ){ sqlite3DebugPrintf(" iField=%d", pTerm->iField); } From cfcf4de4a636abd966ee1dd724f639a96c1cc3f8 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 28 Dec 2019 13:01:52 +0000 Subject: [PATCH 103/120] Simplifications to the initialization of the sqlite3_index_info structure that is used to communicate with virtual table modules. Avoid adding unused constraints to the sqlite3_index_info structure. Extra constraints are harmless, but might be confusing to people trying to understand the code. FossilOrigin-Name: 5e6357fc953a955d8ebb5c1fcd72e04e4ae5e8bf5941810015c2fbc50de70535 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 30 +++++++++++------------------- 3 files changed, 18 insertions(+), 26 deletions(-) diff --git a/manifest b/manifest index c6cebb057e..6fa51ebc17 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C If\sthe\s".wheretrace\s0x10000"\sbit\sis\sset,\sprint\sWhereTerm.prereqAll\nand\s.prereqRight\sfields\sin\sthe\sWhereTerm\strace\soutput. -D 2019-12-28T12:33:35.974 +C Simplifications\sto\sthe\sinitialization\sof\sthe\ssqlite3_index_info\sstructure\s\nthat\sis\sused\sto\scommunicate\swith\svirtual\stable\smodules.\s\sAvoid\sadding\nunused\sconstraints\sto\sthe\ssqlite3_index_info\sstructure.\s\sExtra\sconstraints\nare\sharmless,\sbut\smight\sbe\sconfusing\sto\speople\strying\sto\sunderstand\sthe\scode. +D 2019-12-28T13:01:52.507 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -614,7 +614,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 15a2845769f51ba132f9cf0b2c7a6887a91fc8437892dbcce9fcdc68b66d60a1 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d -F src/where.c 476c0091eb27c99fb481730621838f646fba6d9ebc6e76a97e8caa9b7f08d933 +F src/where.c 230995f73eded5c3b46cdd6dd9b1862930df2bc402f5e8d2b4bfe64779411685 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c d42d3e0fe93786621b84dec8065e1dc6b324d7c5934df52f141555843b6aef4e F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1be2c18f4021e1d0b8412ecb68a599475c717dd97c7db209fc4203358957fd70 -R 1077f4eb4d5b48d5e8fb352c3adc1164 +P a4f330b133a36356681dce7d2a65d8ab792620494d6cd4ef4934a97cf3a8e6fc +R 9d791d568d34e1fbcc680abee9092a25 U drh -Z 26ea5bdabbe48f1cef138e8164f2fb1d +Z 381500a973c5168ce8cc649911e2754b diff --git a/manifest.uuid b/manifest.uuid index 556a07d0a2..745651a863 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a4f330b133a36356681dce7d2a65d8ab792620494d6cd4ef4934a97cf3a8e6fc \ No newline at end of file +5e6357fc953a955d8ebb5c1fcd72e04e4ae5e8bf5941810015c2fbc50de70535 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 0ea0026f48..69784bc1cc 100644 --- a/src/where.c +++ b/src/where.c @@ -605,7 +605,7 @@ static void translateColumnToCopy( ** are no-ops. */ #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(WHERETRACE_ENABLED) -static void TRACE_IDX_INPUTS(sqlite3_index_info *p){ +static void whereTraceIndexInfoInputs(sqlite3_index_info *p){ int i; if( !sqlite3WhereTrace ) return; for(i=0; inConstraint; i++){ @@ -623,7 +623,7 @@ static void TRACE_IDX_INPUTS(sqlite3_index_info *p){ p->aOrderBy[i].desc); } } -static void TRACE_IDX_OUTPUTS(sqlite3_index_info *p){ +static void whereTraceIndexInfoOutputs(sqlite3_index_info *p){ int i; if( !sqlite3WhereTrace ) return; for(i=0; inConstraint; i++){ @@ -639,8 +639,8 @@ static void TRACE_IDX_OUTPUTS(sqlite3_index_info *p){ sqlite3DebugPrintf(" estimatedRows=%lld\n", p->estimatedRows); } #else -#define TRACE_IDX_INPUTS(A) -#define TRACE_IDX_OUTPUTS(A) +#define whereTraceIndexInfoInputs(A) +#define whereTraceIndexInfoOutputs(A) #endif #ifndef SQLITE_OMIT_AUTOMATIC_INDEX @@ -950,23 +950,14 @@ static sqlite3_index_info *allocateIndexInfo( sqlite3ErrorMsg(pParse, "out of memory"); return 0; } - - /* Initialize the structure. The sqlite3_index_info structure contains - ** many fields that are declared "const" to prevent xBestIndex from - ** changing them. We have to do some funky casting in order to - ** initialize those fields. - */ pHidden = (struct HiddenIndexInfo*)&pIdxInfo[1]; pIdxCons = (struct sqlite3_index_constraint*)&pHidden[1]; pIdxOrderBy = (struct sqlite3_index_orderby*)&pIdxCons[nTerm]; pUsage = (struct sqlite3_index_constraint_usage*)&pIdxOrderBy[nOrderBy]; - *(int*)&pIdxInfo->nConstraint = nTerm; - *(int*)&pIdxInfo->nOrderBy = nOrderBy; - *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint = pIdxCons; - *(struct sqlite3_index_orderby**)&pIdxInfo->aOrderBy = pIdxOrderBy; - *(struct sqlite3_index_constraint_usage**)&pIdxInfo->aConstraintUsage = - pUsage; - + pIdxInfo->nOrderBy = nOrderBy; + pIdxInfo->aConstraint = pIdxCons; + pIdxInfo->aOrderBy = pIdxOrderBy; + pIdxInfo->aConstraintUsage = pUsage; pHidden->pWC = pWC; pHidden->pParse = pParse; for(i=j=0, pTerm=pWC->a; inTerm; i++, pTerm++){ @@ -1026,6 +1017,7 @@ static sqlite3_index_info *allocateIndexInfo( j++; } + pIdxInfo->nConstraint = j; for(i=0; ia[i].pExpr; pIdxOrderBy[i].iColumn = pExpr->iColumn; @@ -1056,9 +1048,9 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ sqlite3_vtab *pVtab = sqlite3GetVTable(pParse->db, pTab)->pVtab; int rc; - TRACE_IDX_INPUTS(p); + whereTraceIndexInfoInputs(p); rc = pVtab->pModule->xBestIndex(pVtab, p); - TRACE_IDX_OUTPUTS(p); + whereTraceIndexInfoOutputs(p); if( rc!=SQLITE_OK && rc!=SQLITE_CONSTRAINT ){ if( rc==SQLITE_NOMEM ){ From 29368eabc54a16b4029e391988539027738e3284 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 28 Dec 2019 13:17:11 +0000 Subject: [PATCH 104/120] Add the --enable-all option to the main configure script as a short-hand to enable FTS4, FTS5, Geopoly/Rtree, JSON, and Sessions. In the amalgamation-autoconf, the --enable-rtree option (which is enabled by default) also now activates Geopoly. FossilOrigin-Name: 52ea0672d7494346c636cd7b05ca42161eb3b07d9378fa9959be9a11de87dbbb --- autoconf/configure.ac | 2 +- configure | 49 ++++++++++++++++++++++++++----------------- configure.ac | 16 +++++++++----- manifest | 16 +++++++------- manifest.uuid | 2 +- 5 files changed, 51 insertions(+), 34 deletions(-) diff --git a/autoconf/configure.ac b/autoconf/configure.ac index 82ab43dfa8..167626d59e 100644 --- a/autoconf/configure.ac +++ b/autoconf/configure.ac @@ -161,7 +161,7 @@ AC_ARG_ENABLE(rtree, [AS_HELP_STRING( [--enable-rtree], [include rtree support [default=yes]])], [], [enable_rtree=yes]) if test x"$enable_rtree" = "xyes"; then - BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_RTREE" + BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_GEOPOLY" fi #----------------------------------------------------------------------- diff --git a/configure b/configure index 299cffa608..1d1a5d2423 100755 --- a/configure +++ b/configure @@ -906,6 +906,7 @@ enable_amalgamation enable_load_extension enable_memsys5 enable_memsys3 +enable_all enable_fts3 enable_fts4 enable_fts5 @@ -1559,6 +1560,7 @@ Optional Features: Disable loading of external extensions --enable-memsys5 Enable MEMSYS5 --enable-memsys3 Enable MEMSYS3 + --enable-all Enable FTS4, FTS5, Geopoly, JSON, RTree, Sessions --enable-fts3 Enable the FTS3 extension --enable-fts4 Enable the FTS4 extension --enable-fts5 Enable the FTS5 extension @@ -3934,13 +3936,13 @@ if ${lt_cv_nm_interface+:} false; then : else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:3937: $ac_compile\"" >&5) + (eval echo "\"\$as_me:3939: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 - (eval echo "\"\$as_me:3940: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval echo "\"\$as_me:3942: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 - (eval echo "\"\$as_me:3943: output\"" >&5) + (eval echo "\"\$as_me:3945: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" @@ -5146,7 +5148,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 5149 "configure"' > conftest.$ac_ext + echo '#line 5151 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -6671,11 +6673,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6674: $lt_compile\"" >&5) + (eval echo "\"\$as_me:6676: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:6678: \$? = $ac_status" >&5 + echo "$as_me:6680: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -7010,11 +7012,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7013: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7015: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:7017: \$? = $ac_status" >&5 + echo "$as_me:7019: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -7115,11 +7117,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7118: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7120: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:7122: \$? = $ac_status" >&5 + echo "$as_me:7124: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -7170,11 +7172,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7173: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7175: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:7177: \$? = $ac_status" >&5 + echo "$as_me:7179: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -9550,7 +9552,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 9553 "configure" +#line 9555 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -9646,7 +9648,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 9649 "configure" +#line 9651 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11450,6 +11452,15 @@ else $as_echo "no" >&6; } fi +######## +# The --enable-extensions argument is short-hand to enable +# multiple extensions. +# Check whether --enable-all was given. +if test "${enable_all+set}" = set; then : + enableval=$enable_all; +fi + + ######### # See whether we should enable Full Text Search extensions # Check whether --enable-fts3 was given. @@ -11465,7 +11476,7 @@ if test "${enable_fts4+set}" = set; then : enableval=$enable_fts4; fi -if test "${enable_fts4}" = "yes" ; then +if test "${enable_fts4}" = "yes" -o "${enable_all}" = "yes" ; then OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_FTS4" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing log" >&5 $as_echo_n "checking for library containing log... " >&6; } @@ -11529,7 +11540,7 @@ if test "${enable_fts5+set}" = set; then : enableval=$enable_fts5; fi -if test "${enable_fts5}" = "yes" ; then +if test "${enable_fts5}" = "yes" -o "${enable_all}" = "yes" ; then OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_FTS5" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing log" >&5 $as_echo_n "checking for library containing log... " >&6; } @@ -11596,7 +11607,7 @@ if test "${enable_json1+set}" = set; then : enableval=$enable_json1; fi -if test "${enable_json1}" = "yes" ; then +if test "${enable_json1}" = "yes" -o "${enable_all}" = "yes" ; then OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_JSON1" fi @@ -11621,7 +11632,7 @@ else enable_geopoly=no fi -if test "${enable_geopoly}" = "yes" ; then +if test "${enable_geopoly}" = "yes" -o "${enable_all}" = "yes" ; then OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_GEOPOLY" enable_rtree=yes fi @@ -11644,7 +11655,7 @@ if test "${enable_session+set}" = set; then : enableval=$enable_session; fi -if test "${enable_session}" = "yes" ; then +if test "${enable_session}" = "yes" -o "${enable_all}" = "yes" ; then OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_SESSION" OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_PREUPDATE_HOOK" fi diff --git a/configure.ac b/configure.ac index 9cf87adcad..ef70a4f0d1 100644 --- a/configure.ac +++ b/configure.ac @@ -613,6 +613,12 @@ else AC_MSG_RESULT([no]) fi +######## +# The --enable-extensions argument is short-hand to enable +# multiple extensions. +AC_ARG_ENABLE(all, AC_HELP_STRING([--enable-all], + [Enable FTS4, FTS5, Geopoly, JSON, RTree, Sessions])) + ######### # See whether we should enable Full Text Search extensions AC_ARG_ENABLE(fts3, AC_HELP_STRING([--enable-fts3], @@ -622,13 +628,13 @@ if test "${enable_fts3}" = "yes" ; then fi AC_ARG_ENABLE(fts4, AC_HELP_STRING([--enable-fts4], [Enable the FTS4 extension])) -if test "${enable_fts4}" = "yes" ; then +if test "${enable_fts4}" = "yes" -o "${enable_all}" = "yes" ; then OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_FTS4" AC_SEARCH_LIBS([log],[m]) fi AC_ARG_ENABLE(fts5, AC_HELP_STRING([--enable-fts5], [Enable the FTS5 extension])) -if test "${enable_fts5}" = "yes" ; then +if test "${enable_fts5}" = "yes" -o "${enable_all}" = "yes" ; then OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_FTS5" AC_SEARCH_LIBS([log],[m]) fi @@ -636,7 +642,7 @@ fi ######### # See whether we should enable JSON1 AC_ARG_ENABLE(json1, AC_HELP_STRING([--enable-json1],[Enable the JSON1 extension])) -if test "${enable_json1}" = "yes" ; then +if test "${enable_json1}" = "yes" -o "${enable_all}" = "yes" ; then OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_JSON1" fi @@ -654,7 +660,7 @@ fi AC_ARG_ENABLE(geopoly, AC_HELP_STRING([--enable-geopoly], [Enable the GEOPOLY extension]), [enable_geopoly=yes],[enable_geopoly=no]) -if test "${enable_geopoly}" = "yes" ; then +if test "${enable_geopoly}" = "yes" -o "${enable_all}" = "yes" ; then OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_GEOPOLY" enable_rtree=yes fi @@ -671,7 +677,7 @@ fi # See whether we should enable the SESSION extension AC_ARG_ENABLE(session, AC_HELP_STRING([--enable-session], [Enable the SESSION extension])) -if test "${enable_session}" = "yes" ; then +if test "${enable_session}" = "yes" -o "${enable_all}" = "yes" ; then OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_SESSION" OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_PREUPDATE_HOOK" fi diff --git a/manifest b/manifest index 6fa51ebc17..48dcf24152 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplifications\sto\sthe\sinitialization\sof\sthe\ssqlite3_index_info\sstructure\s\nthat\sis\sused\sto\scommunicate\swith\svirtual\stable\smodules.\s\sAvoid\sadding\nunused\sconstraints\sto\sthe\ssqlite3_index_info\sstructure.\s\sExtra\sconstraints\nare\sharmless,\sbut\smight\sbe\sconfusing\sto\speople\strying\sto\sunderstand\sthe\scode. -D 2019-12-28T13:01:52.507 +C Add\sthe\s--enable-all\soption\sto\sthe\smain\sconfigure\sscript\sas\sa\sshort-hand\nto\senable\sFTS4,\sFTS5,\sGeopoly/Rtree,\sJSON,\sand\sSessions.\s\sIn\sthe\namalgamation-autoconf,\sthe\s--enable-rtree\soption\s(which\sis\senabled\sby\ndefault)\salso\snow\sactivates\sGeopoly. +D 2019-12-28T13:17:11.914 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -18,7 +18,7 @@ F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a F autoconf/Makefile.msc 1d1e4af61289c62b94aa65a93afcd3dfa4b53e4195908980e0b138203e71e1c9 F autoconf/README.first 6c4f34fe115ff55d4e8dbfa3cecf04a0188292f7 F autoconf/README.txt 4f04b0819303aabaa35fff5f7b257fb0c1ef95f1 -F autoconf/configure.ac 308de24343e76ecfbe9a67f8fcd4c5216b790d230c5d9ce10210b7d5965d6192 +F autoconf/configure.ac 3cd933b959fe514eebd1ca1717dfddbf2c9b825b6bc2c5f744deaf5d63af9288 F autoconf/tea/Makefile.in b438a7020446c8a8156e8d97c8914a04833da6fd F autoconf/tea/README 3e9a3c060f29a44344ab50aec506f4db903fb873 F autoconf/tea/aclocal.m4 52c47aac44ce0ddb1f918b6993e8beb8eee88f43 @@ -34,8 +34,8 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 883205ddf25b46f10c181818bf42c09da9888884af96f79e1719264345053bd6 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc F config.sub c2d0260f17f3e4bc0b6808fccf1b291cb5e9126c14fc5890efc77b9fd0175559 -F configure fdc9f8d53360170679349d8f72fb2e5c79f511424891b7bb8a2f48de41c7a6ef x -F configure.ac 3552d3aecade98a9d4b64bceb48ffb7726cbc85902efde956812942f060fbd0a +F configure aae28230005acf833d466c8a160bd4c70cf42984f5a6756fa327e15e7f473477 x +F configure.ac 798a24cee2879325ca5b688a618199eb32cc77ed8136edbaa43d9137b470d54e F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd F doc/lemon.html 24956ab2995e55fe171e55bdd04f22b553957dc8bb43501dbb9311e30187e0d3 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a4f330b133a36356681dce7d2a65d8ab792620494d6cd4ef4934a97cf3a8e6fc -R 9d791d568d34e1fbcc680abee9092a25 +P 5e6357fc953a955d8ebb5c1fcd72e04e4ae5e8bf5941810015c2fbc50de70535 +R 4c70033507aedd6523a441599c072e7a U drh -Z 381500a973c5168ce8cc649911e2754b +Z 972b6b0655b9fda609bd390c407e9fc7 diff --git a/manifest.uuid b/manifest.uuid index 745651a863..b90483d515 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5e6357fc953a955d8ebb5c1fcd72e04e4ae5e8bf5941810015c2fbc50de70535 \ No newline at end of file +52ea0672d7494346c636cd7b05ca42161eb3b07d9378fa9959be9a11de87dbbb \ No newline at end of file From cacdf20771dfa0e21c642ab264e9a659da3634ca Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 28 Dec 2019 13:39:47 +0000 Subject: [PATCH 105/120] Expose some of the Where data structure debug printing routines to the entire WHERE-clause processing module. FossilOrigin-Name: 85e76887761b5d7e290fb2bac7f9121648f79d67fdd92f624d81632f28620518 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 22 +++++++++++----------- src/whereInt.h | 2 ++ 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index 48dcf24152..1a2bd71a57 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s--enable-all\soption\sto\sthe\smain\sconfigure\sscript\sas\sa\sshort-hand\nto\senable\sFTS4,\sFTS5,\sGeopoly/Rtree,\sJSON,\sand\sSessions.\s\sIn\sthe\namalgamation-autoconf,\sthe\s--enable-rtree\soption\s(which\sis\senabled\sby\ndefault)\salso\snow\sactivates\sGeopoly. -D 2019-12-28T13:17:11.914 +C Expose\ssome\sof\sthe\sWhere\sdata\sstructure\sdebug\sprinting\sroutines\sto\sthe\nentire\sWHERE-clause\sprocessing\smodule. +D 2019-12-28T13:39:47.110 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -614,8 +614,8 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 15a2845769f51ba132f9cf0b2c7a6887a91fc8437892dbcce9fcdc68b66d60a1 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d -F src/where.c 230995f73eded5c3b46cdd6dd9b1862930df2bc402f5e8d2b4bfe64779411685 -F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 +F src/where.c d1d79673b64278bbdefe790c70cb01ee607f79c48163febdf8dee86f6a7e715e +F src/whereInt.h de1b77e416ad5a7cc60a71fc1317484f8d83ca1e52b805dc8c978785a92eeded F src/wherecode.c d42d3e0fe93786621b84dec8065e1dc6b324d7c5934df52f141555843b6aef4e F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 F src/window.c 87795bb8293179cb8a92529264d49bd66b5bcad5e91cfc17dd8d3e66a2a77f88 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5e6357fc953a955d8ebb5c1fcd72e04e4ae5e8bf5941810015c2fbc50de70535 -R 4c70033507aedd6523a441599c072e7a +P 52ea0672d7494346c636cd7b05ca42161eb3b07d9378fa9959be9a11de87dbbb +R 36aa1965ca07c18187e2cc17b34e3feb U drh -Z 972b6b0655b9fda609bd390c407e9fc7 +Z 9b3b04de4e9f091e2c9e4bbb9028222c diff --git a/manifest.uuid b/manifest.uuid index b90483d515..e9516becb7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -52ea0672d7494346c636cd7b05ca42161eb3b07d9378fa9959be9a11de87dbbb \ No newline at end of file +85e76887761b5d7e290fb2bac7f9121648f79d67fdd92f624d81632f28620518 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 69784bc1cc..87d8a5d09c 100644 --- a/src/where.c +++ b/src/where.c @@ -1731,7 +1731,7 @@ static int whereInScanEst( /* ** Print the content of a WhereTerm object */ -static void whereTermPrint(WhereTerm *pTerm, int iTerm){ +void sqlite3WhereTermPrint(WhereTerm *pTerm, int iTerm){ if( pTerm==0 ){ sqlite3DebugPrintf("TERM-%-3d NULL\n", iTerm); }else{ @@ -1777,7 +1777,7 @@ static void whereTermPrint(WhereTerm *pTerm, int iTerm){ void sqlite3WhereClausePrint(WhereClause *pWC){ int i; for(i=0; inTerm; i++){ - whereTermPrint(&pWC->a[i], i); + sqlite3WhereTermPrint(&pWC->a[i], i); } } #endif @@ -1786,7 +1786,7 @@ void sqlite3WhereClausePrint(WhereClause *pWC){ /* ** Print a WhereLoop object for debugging purposes */ -static void whereLoopPrint(WhereLoop *p, WhereClause *pWC){ +void sqlite3WhereLoopPrint(WhereLoop *p, WhereClause *pWC){ WhereInfo *pWInfo = pWC->pWInfo; int nb = 1+(pWInfo->pTabList->nSrc+3)/4; struct SrcList_item *pItem = pWInfo->pTabList->a + p->iTab; @@ -1828,7 +1828,7 @@ static void whereLoopPrint(WhereLoop *p, WhereClause *pWC){ if( p->nLTerm && (sqlite3WhereTrace & 0x100)!=0 ){ int i; for(i=0; inLTerm; i++){ - whereTermPrint(p->aLTerm[i], i); + sqlite3WhereTermPrint(p->aLTerm[i], i); } } } @@ -2147,7 +2147,7 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ #if WHERETRACE_ENABLED /* 0x8 */ if( sqlite3WhereTrace & 0x8 ){ sqlite3DebugPrintf(x?" or-%d: ":" or-X: ", n); - whereLoopPrint(pTemplate, pBuilder->pWC); + sqlite3WhereLoopPrint(pTemplate, pBuilder->pWC); } #endif } @@ -2165,7 +2165,7 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ #if WHERETRACE_ENABLED /* 0x8 */ if( sqlite3WhereTrace & 0x8 ){ sqlite3DebugPrintf(" skip: "); - whereLoopPrint(pTemplate, pBuilder->pWC); + sqlite3WhereLoopPrint(pTemplate, pBuilder->pWC); } #endif return SQLITE_OK; @@ -2181,12 +2181,12 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ if( sqlite3WhereTrace & 0x8 ){ if( p!=0 ){ sqlite3DebugPrintf("replace: "); - whereLoopPrint(p, pBuilder->pWC); + sqlite3WhereLoopPrint(p, pBuilder->pWC); sqlite3DebugPrintf(" with: "); }else{ sqlite3DebugPrintf(" add: "); } - whereLoopPrint(pTemplate, pBuilder->pWC); + sqlite3WhereLoopPrint(pTemplate, pBuilder->pWC); } #endif if( p==0 ){ @@ -2210,7 +2210,7 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ #if WHERETRACE_ENABLED /* 0x8 */ if( sqlite3WhereTrace & 0x8 ){ sqlite3DebugPrintf(" delete: "); - whereLoopPrint(pToDel, pBuilder->pWC); + sqlite3WhereLoopPrint(pToDel, pBuilder->pWC); } #endif whereLoopDelete(db, pToDel); @@ -4829,7 +4829,7 @@ WhereInfo *sqlite3WhereBegin( "ABCDEFGHIJKLMNOPQRSTUVWYXZ"; for(p=pWInfo->pLoops, i=0; p; p=p->pNextLoop, i++){ p->cId = zLabel[i%(sizeof(zLabel)-1)]; - whereLoopPrint(p, sWLB.pWC); + sqlite3WhereLoopPrint(p, sWLB.pWC); } } #endif @@ -4869,7 +4869,7 @@ WhereInfo *sqlite3WhereBegin( } sqlite3DebugPrintf("\n"); for(ii=0; iinLevel; ii++){ - whereLoopPrint(pWInfo->a[ii].pWLoop, sWLB.pWC); + sqlite3WhereLoopPrint(pWInfo->a[ii].pWLoop, sWLB.pWC); } } #endif diff --git a/src/whereInt.h b/src/whereInt.h index e63ca46d53..8d333c032d 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -479,6 +479,8 @@ struct WhereInfo { Bitmask sqlite3WhereGetMask(WhereMaskSet*,int); #ifdef WHERETRACE_ENABLED void sqlite3WhereClausePrint(WhereClause *pWC); +void sqlite3WhereTermPrint(WhereTerm *pTerm, int iTerm); +void sqlite3WhereLoopPrint(WhereLoop *p, WhereClause *pWC); #endif WhereTerm *sqlite3WhereFindTerm( WhereClause *pWC, /* The WHERE clause to be searched */ From 118efd162632298bccba21b71934f666e556f594 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 28 Dec 2019 14:07:22 +0000 Subject: [PATCH 106/120] New enhancements to .wheretrace. The 0x20000 flag shows the WHERE clause before and after coding each loop. The 0x800 flag shows status at the start and at the end of each loop. An extra "C" tag is shown on coded terms. FossilOrigin-Name: 59cc46e5a6d8dbb030f27716ad5446ecccf81cf0cfff95338b9133777f2059e7 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 16 +++++++++------- src/wherecode.c | 31 +++++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 1a2bd71a57..f39579c834 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Expose\ssome\sof\sthe\sWhere\sdata\sstructure\sdebug\sprinting\sroutines\sto\sthe\nentire\sWHERE-clause\sprocessing\smodule. -D 2019-12-28T13:39:47.110 +C New\senhancements\sto\s.wheretrace.\s\sThe\s0x20000\sflag\sshows\sthe\sWHERE\sclause\nbefore\sand\safter\scoding\seach\sloop.\s\sThe\s0x800\sflag\sshows\sstatus\sat\sthe\sstart\nand\sat\sthe\send\sof\seach\sloop.\s\sAn\sextra\s"C"\stag\sis\sshown\son\scoded\sterms. +D 2019-12-28T14:07:22.649 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -614,9 +614,9 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 15a2845769f51ba132f9cf0b2c7a6887a91fc8437892dbcce9fcdc68b66d60a1 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d -F src/where.c d1d79673b64278bbdefe790c70cb01ee607f79c48163febdf8dee86f6a7e715e +F src/where.c 97f19d664256aaf86e4aac1323992c6fda5deb44ed35320539fdb3faa31307b1 F src/whereInt.h de1b77e416ad5a7cc60a71fc1317484f8d83ca1e52b805dc8c978785a92eeded -F src/wherecode.c d42d3e0fe93786621b84dec8065e1dc6b324d7c5934df52f141555843b6aef4e +F src/wherecode.c d074abccfbd4ef2becc34aea640d326ff76709c5867c2b049c719a4ce5b74c06 F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 F src/window.c 87795bb8293179cb8a92529264d49bd66b5bcad5e91cfc17dd8d3e66a2a77f88 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 52ea0672d7494346c636cd7b05ca42161eb3b07d9378fa9959be9a11de87dbbb -R 36aa1965ca07c18187e2cc17b34e3feb +P 85e76887761b5d7e290fb2bac7f9121648f79d67fdd92f624d81632f28620518 +R 1054236a3bfbc2d93687a4e1f244d884 U drh -Z 9b3b04de4e9f091e2c9e4bbb9028222c +Z 90307d93afa9b9f29e276d59812ee8ca diff --git a/manifest.uuid b/manifest.uuid index e9516becb7..b66df9977f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -85e76887761b5d7e290fb2bac7f9121648f79d67fdd92f624d81632f28620518 \ No newline at end of file +59cc46e5a6d8dbb030f27716ad5446ecccf81cf0cfff95338b9133777f2059e7 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 87d8a5d09c..ebd33ba86f 100644 --- a/src/where.c +++ b/src/where.c @@ -1735,12 +1735,13 @@ void sqlite3WhereTermPrint(WhereTerm *pTerm, int iTerm){ if( pTerm==0 ){ sqlite3DebugPrintf("TERM-%-3d NULL\n", iTerm); }else{ - char zType[4]; + char zType[8]; char zLeft[50]; - memcpy(zType, "...", 4); + memcpy(zType, "....", 5); if( pTerm->wtFlags & TERM_VIRTUAL ) zType[0] = 'V'; if( pTerm->eOperator & WO_EQUIV ) zType[1] = 'E'; if( ExprHasProperty(pTerm->pExpr, EP_FromJoin) ) zType[2] = 'L'; + if( pTerm->wtFlags & TERM_CODED ) zType[3] = 'C'; if( pTerm->eOperator & WO_SINGLE ){ sqlite3_snprintf(sizeof(zLeft),zLeft,"left={%d:%d}", pTerm->leftCursor, pTerm->u.leftColumn); @@ -1751,12 +1752,13 @@ void sqlite3WhereTermPrint(WhereTerm *pTerm, int iTerm){ sqlite3_snprintf(sizeof(zLeft),zLeft,"left=%d", pTerm->leftCursor); } sqlite3DebugPrintf( - "TERM-%-3d %p %s %-12s prob=%-3d op=%03x wtFlags=%04x", - iTerm, pTerm, zType, zLeft, pTerm->truthProb, - pTerm->eOperator, pTerm->wtFlags); + "TERM-%-3d %p %s %-12s op=%03x wtFlags=%04x", + iTerm, pTerm, zType, zLeft, pTerm->eOperator, pTerm->wtFlags); + /* The 0x10000 .wheretrace flag causes extra information to be + ** shown about each Term */ if( sqlite3WhereTrace & 0x10000 ){ - sqlite3DebugPrintf(" prereq=%llx,%llx", - (u64)pTerm->prereqAll, (u64)pTerm->prereqRight); + sqlite3DebugPrintf(" prob=%-3d prereq=%llx,%llx", + pTerm->truthProb, (u64)pTerm->prereqAll, (u64)pTerm->prereqRight); } if( pTerm->iField ){ sqlite3DebugPrintf(" iField=%d", pTerm->iField); diff --git a/src/wherecode.c b/src/wherecode.c index a24dea82ee..8495de3781 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1284,6 +1284,17 @@ Bitmask sqlite3WhereCodeOneLoopStart( pLevel->notReady = notReady & ~sqlite3WhereGetMask(&pWInfo->sMaskSet, iCur); bRev = (pWInfo->revMask>>iLevel)&1; VdbeModuleComment((v, "Begin WHERE-loop%d: %s",iLevel,pTabItem->pTab->zName)); +#if WHERETRACE_ENABLED /* 0x20800 */ + if( sqlite3WhereTrace & 0x800 ){ + sqlite3DebugPrintf("Coding level %d: notReady=%llx\n", + iLevel, (u64)notReady); + sqlite3WhereLoopPrint(pLoop, pWC); + } + if( sqlite3WhereTrace & 0x20000 ){ + sqlite3DebugPrintf("Complete WHERE clause before coding:\n"); + sqlite3WhereClausePrint(pWC); + } +#endif /* Create labels for the "break" and "continue" instructions ** for the current loop. Jump to addrBrk to break out of a loop. @@ -2339,6 +2350,10 @@ Bitmask sqlite3WhereCodeOneLoopStart( VdbeNoopComment((v, "WhereTerm[%d] (%p) priority=%d", pWC->nTerm-j, pTerm, iLoop)); } + if( sqlite3WhereTrace & 0x800 ){ + sqlite3DebugPrintf("Coding auxiliary constraint:\n"); + sqlite3WhereTermPrint(pTerm, pWC->nTerm-j); + } #endif sqlite3ExprIfFalse(pParse, pE, addrCont, SQLITE_JUMPIFNULL); if( skipLikeAddr ) sqlite3VdbeJumpHere(v, skipLikeAddr); @@ -2365,6 +2380,12 @@ Bitmask sqlite3WhereCodeOneLoopStart( if( pLevel->iLeftJoin ) continue; pE = pTerm->pExpr; assert( !ExprHasProperty(pE, EP_FromJoin) ); +#ifdef WHERETRACE_ENABLED /* 0x800 */ + if( sqlite3WhereTrace & 0x800 ){ + sqlite3DebugPrintf("Coding transitive constraint:\n"); + sqlite3WhereTermPrint(pTerm, pWC->nTerm-j); + } +#endif assert( (pTerm->prereqRight & pLevel->notReady)!=0 ); pAlt = sqlite3WhereFindTerm(pWC, iCur, pTerm->u.leftColumn, notReady, WO_EQ|WO_IN|WO_IS, 0); @@ -2406,5 +2427,15 @@ Bitmask sqlite3WhereCodeOneLoopStart( } } +#if WHERETRACE_ENABLED /* 0x20800 */ + if( sqlite3WhereTrace & 0x20000 ){ + sqlite3DebugPrintf("Complete WHERE clause after coding level %d:\n",iLevel); + sqlite3WhereClausePrint(pWC); + } + if( sqlite3WhereTrace & 0x800 ){ + sqlite3DebugPrintf("End Coding level %d: notReady=%llx\n", + iLevel, (u64)pLevel->notReady); + } +#endif return pLevel->notReady; } From f1bb31e21950314818d86df25a67457c2a4fa1cf Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 28 Dec 2019 14:33:26 +0000 Subject: [PATCH 107/120] Further improvements to .wheretrace during loop code generation. FossilOrigin-Name: c4d5b75c9381255ec8d9a284eedb6b27be46ca868cae5985cf8a5769b15290c3 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 15 ++++++++++----- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index f39579c834..6a64d35c8d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\senhancements\sto\s.wheretrace.\s\sThe\s0x20000\sflag\sshows\sthe\sWHERE\sclause\nbefore\sand\safter\scoding\seach\sloop.\s\sThe\s0x800\sflag\sshows\sstatus\sat\sthe\sstart\nand\sat\sthe\send\sof\seach\sloop.\s\sAn\sextra\s"C"\stag\sis\sshown\son\scoded\sterms. -D 2019-12-28T14:07:22.649 +C Further\simprovements\sto\s.wheretrace\sduring\sloop\scode\sgeneration. +D 2019-12-28T14:33:26.487 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -616,7 +616,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d F src/where.c 97f19d664256aaf86e4aac1323992c6fda5deb44ed35320539fdb3faa31307b1 F src/whereInt.h de1b77e416ad5a7cc60a71fc1317484f8d83ca1e52b805dc8c978785a92eeded -F src/wherecode.c d074abccfbd4ef2becc34aea640d326ff76709c5867c2b049c719a4ce5b74c06 +F src/wherecode.c 65e1df2a4799851ada548501b19baf513f38e64a9402036e4a91be8feff9fb4f F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 F src/window.c 87795bb8293179cb8a92529264d49bd66b5bcad5e91cfc17dd8d3e66a2a77f88 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 85e76887761b5d7e290fb2bac7f9121648f79d67fdd92f624d81632f28620518 -R 1054236a3bfbc2d93687a4e1f244d884 +P 59cc46e5a6d8dbb030f27716ad5446ecccf81cf0cfff95338b9133777f2059e7 +R 4ed5224f9f23343ff8f97a18a62ae7a0 U drh -Z 90307d93afa9b9f29e276d59812ee8ca +Z 5832f3b0b02728bce6e85899b65adc52 diff --git a/manifest.uuid b/manifest.uuid index b66df9977f..c92b473c14 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -59cc46e5a6d8dbb030f27716ad5446ecccf81cf0cfff95338b9133777f2059e7 \ No newline at end of file +c4d5b75c9381255ec8d9a284eedb6b27be46ca868cae5985cf8a5769b15290c3 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 8495de3781..e9cdc19199 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1286,12 +1286,16 @@ Bitmask sqlite3WhereCodeOneLoopStart( VdbeModuleComment((v, "Begin WHERE-loop%d: %s",iLevel,pTabItem->pTab->zName)); #if WHERETRACE_ENABLED /* 0x20800 */ if( sqlite3WhereTrace & 0x800 ){ - sqlite3DebugPrintf("Coding level %d: notReady=%llx\n", - iLevel, (u64)notReady); + sqlite3DebugPrintf("Coding level %d of %d: notReady=%llx\n", + iLevel, pWInfo->nLevel, (u64)notReady); sqlite3WhereLoopPrint(pLoop, pWC); } if( sqlite3WhereTrace & 0x20000 ){ - sqlite3DebugPrintf("Complete WHERE clause before coding:\n"); + if( iLevel==0 ){ + sqlite3DebugPrintf("WHERE clause being coded:\n"); + sqlite3TreeViewExpr(0, pWInfo->pWhere, 0); + } + sqlite3DebugPrintf("All WHERE-clause terms before coding:\n"); sqlite3WhereClausePrint(pWC); } #endif @@ -2379,13 +2383,13 @@ Bitmask sqlite3WhereCodeOneLoopStart( if( pTerm->leftCursor!=iCur ) continue; if( pLevel->iLeftJoin ) continue; pE = pTerm->pExpr; - assert( !ExprHasProperty(pE, EP_FromJoin) ); #ifdef WHERETRACE_ENABLED /* 0x800 */ if( sqlite3WhereTrace & 0x800 ){ sqlite3DebugPrintf("Coding transitive constraint:\n"); sqlite3WhereTermPrint(pTerm, pWC->nTerm-j); } #endif + assert( !ExprHasProperty(pE, EP_FromJoin) ); assert( (pTerm->prereqRight & pLevel->notReady)!=0 ); pAlt = sqlite3WhereFindTerm(pWC, iCur, pTerm->u.leftColumn, notReady, WO_EQ|WO_IN|WO_IS, 0); @@ -2429,7 +2433,8 @@ Bitmask sqlite3WhereCodeOneLoopStart( #if WHERETRACE_ENABLED /* 0x20800 */ if( sqlite3WhereTrace & 0x20000 ){ - sqlite3DebugPrintf("Complete WHERE clause after coding level %d:\n",iLevel); + sqlite3DebugPrintf("All WHERE-clause terms after coding level %d:\n", + iLevel); sqlite3WhereClausePrint(pWC); } if( sqlite3WhereTrace & 0x800 ){ From 51f2b1719ce6cbc5fba38885b3ddf622f8647ce9 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 28 Dec 2019 15:24:02 +0000 Subject: [PATCH 108/120] Fix an instance where the planner might choose to use the OR-optimization when it adds no benefit. The same quirk causes an assert() to fail. This is not a bug in released versions - without the assert() the library still gets the right answer, it just does so less efficiently than it should. FossilOrigin-Name: f4bed1d7af8a94c6facd567dec5afae8865a5ad76b8834493099e5e30bed1132 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/where.c | 3 ++- test/join.test | 22 ++++++++++++++++++++++ 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 6a64d35c8d..4b5bbd3779 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\simprovements\sto\s.wheretrace\sduring\sloop\scode\sgeneration. -D 2019-12-28T14:33:26.487 +C Fix\san\sinstance\swhere\sthe\splanner\smight\schoose\sto\suse\sthe\sOR-optimization\swhen\sit\sadds\sno\sbenefit.\sThe\ssame\squirk\scauses\san\sassert()\sto\sfail.\sThis\sis\snot\sa\sbug\sin\sreleased\sversions\s-\swithout\sthe\sassert()\sthe\slibrary\sstill\sgets\sthe\sright\sanswer,\sit\sjust\sdoes\sso\sless\sefficiently\sthan\sit\sshould. +D 2019-12-28T15:24:02.563 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -614,7 +614,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 15a2845769f51ba132f9cf0b2c7a6887a91fc8437892dbcce9fcdc68b66d60a1 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d -F src/where.c 97f19d664256aaf86e4aac1323992c6fda5deb44ed35320539fdb3faa31307b1 +F src/where.c 7bb294fdada405412dfd76d351286e0dec3dda07a8e19b0f904b8e8fc0ced41f F src/whereInt.h de1b77e416ad5a7cc60a71fc1317484f8d83ca1e52b805dc8c978785a92eeded F src/wherecode.c 65e1df2a4799851ada548501b19baf513f38e64a9402036e4a91be8feff9fb4f F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 @@ -1085,7 +1085,7 @@ F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b F test/istrue.test 75327829744e65cc8700e69340b8e6c192e10e39dfae7ccb0e970d3c4f49090a -F test/join.test d7e315cd05f03d442c22bb5506edff2e688d27e6e10c91657daf48a08b8573fe +F test/join.test 0e8d3f4092897c717abcaf64e2e7b298e1cb143e2436010c57cfed5596bf6d30 F test/join2.test 659bc6193f5c3fe20fa444dd2c91713db8c33e376b098b860644e175e87b8dbc F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 59cc46e5a6d8dbb030f27716ad5446ecccf81cf0cfff95338b9133777f2059e7 -R 4ed5224f9f23343ff8f97a18a62ae7a0 -U drh -Z 5832f3b0b02728bce6e85899b65adc52 +P c4d5b75c9381255ec8d9a284eedb6b27be46ca868cae5985cf8a5769b15290c3 +R 4484b8000c666fea7b24b9ac04eb1d8e +U dan +Z 3a2b5af54c367ffdd0ebc1f90fbcc7cb diff --git a/manifest.uuid b/manifest.uuid index c92b473c14..c74bd087a3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c4d5b75c9381255ec8d9a284eedb6b27be46ca868cae5985cf8a5769b15290c3 \ No newline at end of file +f4bed1d7af8a94c6facd567dec5afae8865a5ad76b8834493099e5e30bed1132 \ No newline at end of file diff --git a/src/where.c b/src/where.c index ebd33ba86f..244bc57a47 100644 --- a/src/where.c +++ b/src/where.c @@ -2135,6 +2135,8 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ } pBuilder->iPlanLimit--; + whereLoopAdjustCost(pWInfo->pLoops, pTemplate); + /* If pBuilder->pOrSet is defined, then only keep track of the costs ** and prereqs. */ @@ -2158,7 +2160,6 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ /* Look for an existing WhereLoop to replace with pTemplate */ - whereLoopAdjustCost(pWInfo->pLoops, pTemplate); ppPrev = whereLoopFindLesser(&pWInfo->pLoops, pTemplate); if( ppPrev==0 ){ diff --git a/test/join.test b/test/join.test index 5b6f63d5ad..391e0681ce 100644 --- a/test/join.test +++ b/test/join.test @@ -1001,5 +1001,27 @@ do_execsql_test join-23.10 { WHERE v0.c0 == 0; } {123 0 c0} +#------------------------------------------------------------------------- +reset_db +do_execsql_test join-24.1 { + CREATE TABLE t1(a PRIMARY KEY, x); + CREATE TABLE t2(b INT); + CREATE INDEX t1aa ON t1(a, a); + + INSERT INTO t1 VALUES('abc', 'def'); + INSERT INTO t2 VALUES(1); +} + +do_execsql_test join-24.2 { + SELECT * FROM t2 JOIN t1 WHERE a='abc' AND x='def'; +} {1 abc def} +do_execsql_test join-24.3 { + SELECT * FROM t2 JOIN t1 WHERE a='abc' AND x='abc'; +} {} + +do_execsql_test join-24.2 { + SELECT * FROM t2 LEFT JOIN t1 ON a=0 WHERE (x='x' OR x IS NULL); +} {1 {} {}} finish_test + From a4b2df5ce277b5bfb28ceeb1e8d9d052e870b367 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 28 Dec 2019 16:20:23 +0000 Subject: [PATCH 109/120] Disable early coding of transitive constraints at the end of each loop in the WHERE clause processing if the loop being coded is for a LEFT JOIN, even if the loop is part of an OR-clause optimization for virtual tables. Test cases in TH3. FossilOrigin-Name: 9421b442cad9858ec21050c106aa935a1c0723ab08ef9a867a79638b040b6e68 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wherecode.c | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 4b5bbd3779..4c24f6497b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sinstance\swhere\sthe\splanner\smight\schoose\sto\suse\sthe\sOR-optimization\swhen\sit\sadds\sno\sbenefit.\sThe\ssame\squirk\scauses\san\sassert()\sto\sfail.\sThis\sis\snot\sa\sbug\sin\sreleased\sversions\s-\swithout\sthe\sassert()\sthe\slibrary\sstill\sgets\sthe\sright\sanswer,\sit\sjust\sdoes\sso\sless\sefficiently\sthan\sit\sshould. -D 2019-12-28T15:24:02.563 +C Disable\searly\scoding\sof\stransitive\sconstraints\sat\sthe\send\sof\seach\sloop\sin\nthe\sWHERE\sclause\sprocessing\sif\sthe\sloop\sbeing\scoded\sis\sfor\sa\sLEFT\sJOIN,\neven\sif\sthe\sloop\sis\spart\sof\san\sOR-clause\soptimization\sfor\svirtual\stables.\nTest\scases\sin\sTH3. +D 2019-12-28T16:20:23.018 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -616,7 +616,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d F src/where.c 7bb294fdada405412dfd76d351286e0dec3dda07a8e19b0f904b8e8fc0ced41f F src/whereInt.h de1b77e416ad5a7cc60a71fc1317484f8d83ca1e52b805dc8c978785a92eeded -F src/wherecode.c 65e1df2a4799851ada548501b19baf513f38e64a9402036e4a91be8feff9fb4f +F src/wherecode.c 8f4b83ef410a5144bf65e2986d72df5b25c9dd6b0ef1676e9dc8efefdba011f8 F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 F src/window.c 87795bb8293179cb8a92529264d49bd66b5bcad5e91cfc17dd8d3e66a2a77f88 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c4d5b75c9381255ec8d9a284eedb6b27be46ca868cae5985cf8a5769b15290c3 -R 4484b8000c666fea7b24b9ac04eb1d8e -U dan -Z 3a2b5af54c367ffdd0ebc1f90fbcc7cb +P f4bed1d7af8a94c6facd567dec5afae8865a5ad76b8834493099e5e30bed1132 +R f70080212a74811cf1e55e61f62a66ab +U drh +Z 43a1d545f913b52be3ee48c625515a53 diff --git a/manifest.uuid b/manifest.uuid index c74bd087a3..4d2a2dac46 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f4bed1d7af8a94c6facd567dec5afae8865a5ad76b8834493099e5e30bed1132 \ No newline at end of file +9421b442cad9858ec21050c106aa935a1c0723ab08ef9a867a79638b040b6e68 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index e9cdc19199..289eecb306 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1286,8 +1286,8 @@ Bitmask sqlite3WhereCodeOneLoopStart( VdbeModuleComment((v, "Begin WHERE-loop%d: %s",iLevel,pTabItem->pTab->zName)); #if WHERETRACE_ENABLED /* 0x20800 */ if( sqlite3WhereTrace & 0x800 ){ - sqlite3DebugPrintf("Coding level %d of %d: notReady=%llx\n", - iLevel, pWInfo->nLevel, (u64)notReady); + sqlite3DebugPrintf("Coding level %d of %d: notReady=%llx iFrom=%d\n", + iLevel, pWInfo->nLevel, (u64)notReady, pLevel->iFrom); sqlite3WhereLoopPrint(pLoop, pWC); } if( sqlite3WhereTrace & 0x20000 ){ @@ -2381,7 +2381,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) continue; if( (pTerm->eOperator & WO_EQUIV)==0 ) continue; if( pTerm->leftCursor!=iCur ) continue; - if( pLevel->iLeftJoin ) continue; + if( pTabItem->fg.jointype & JT_LEFT ) continue; pE = pTerm->pExpr; #ifdef WHERETRACE_ENABLED /* 0x800 */ if( sqlite3WhereTrace & 0x800 ){ From 4adb1d0000c8bd3d194518bf3e164d90cdecb93b Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 28 Dec 2019 18:08:39 +0000 Subject: [PATCH 110/120] Change an assert() in where.c to a testcase() macro, since the condition may be false. This was a problem with the assert() only, there is no bug in release builds that omit assert(). FossilOrigin-Name: 82be135dee7ccfde5f8a67f3621b7ced449dce89bae9cadf025154a4de848c11 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/wherecode.c | 2 +- test/nulls1.test | 43 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 4c24f6497b..2fbed9f1d1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disable\searly\scoding\sof\stransitive\sconstraints\sat\sthe\send\sof\seach\sloop\sin\nthe\sWHERE\sclause\sprocessing\sif\sthe\sloop\sbeing\scoded\sis\sfor\sa\sLEFT\sJOIN,\neven\sif\sthe\sloop\sis\spart\sof\san\sOR-clause\soptimization\sfor\svirtual\stables.\nTest\scases\sin\sTH3. -D 2019-12-28T16:20:23.018 +C Change\san\sassert()\sin\swhere.c\sto\sa\stestcase()\smacro,\ssince\sthe\scondition\smay\sbe\sfalse.\sThis\swas\sa\sproblem\swith\sthe\sassert()\sonly,\sthere\sis\sno\sbug\sin\srelease\sbuilds\sthat\somit\sassert(). +D 2019-12-28T18:08:39.531 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -616,7 +616,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d F src/where.c 7bb294fdada405412dfd76d351286e0dec3dda07a8e19b0f904b8e8fc0ced41f F src/whereInt.h de1b77e416ad5a7cc60a71fc1317484f8d83ca1e52b805dc8c978785a92eeded -F src/wherecode.c 8f4b83ef410a5144bf65e2986d72df5b25c9dd6b0ef1676e9dc8efefdba011f8 +F src/wherecode.c 3c9b185cdb6950fa1043d324d3e8ef14b07cef4f5cfb475611b6f43480494fb2 F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 F src/window.c 87795bb8293179cb8a92529264d49bd66b5bcad5e91cfc17dd8d3e66a2a77f88 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1191,7 +1191,7 @@ F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 F test/notnull.test a37b663d5bb728d66fc182016613fb8e4a0a4bbf3d75b8876a7527f7d4ed3f18 F test/null.test 0dcce4f04284ec66108c503327ad6d224c0752b3 -F test/nulls1.test c8fc1b223f06e60007e0cd3e498ccb10195cf75a18fc3312508b3cf679ecb806 +F test/nulls1.test fe4153fd59a3786b4b9f3663a3e65a3aa43a318c7b4d7dcb3f6c3ed5652c9095 F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1 F test/numindex1.test 20a5450d4b056e48cd5db30e659f13347a099823 F test/offset1.test f06b83657bcf26f9ce805e67450e189e282143b2 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f4bed1d7af8a94c6facd567dec5afae8865a5ad76b8834493099e5e30bed1132 -R f70080212a74811cf1e55e61f62a66ab -U drh -Z 43a1d545f913b52be3ee48c625515a53 +P 9421b442cad9858ec21050c106aa935a1c0723ab08ef9a867a79638b040b6e68 +R e9385abc46897bbfbfbfbc6bfbcfd8c7 +U dan +Z 8385698bc4652e7f942fce6214733907 diff --git a/manifest.uuid b/manifest.uuid index 4d2a2dac46..f86444f188 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9421b442cad9858ec21050c106aa935a1c0723ab08ef9a867a79638b040b6e68 \ No newline at end of file +82be135dee7ccfde5f8a67f3621b7ced449dce89bae9cadf025154a4de848c11 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 289eecb306..9c51b5669c 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1685,7 +1685,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( ){ assert( bSeekPastNull==0 && nExtraReg==0 && nBtm==0 && nTop==0 ); assert( pRangeEnd==0 && pRangeStart==0 ); - assert( pLoop->nSkip==0 ); + testcase( pLoop->nSkip>0 ); nExtraReg = 1; bSeekPastNull = 1; pLevel->regBignull = regBignull = ++pParse->nMem; diff --git a/test/nulls1.test b/test/nulls1.test index a6bf62c159..9f4402f916 100644 --- a/test/nulls1.test +++ b/test/nulls1.test @@ -255,4 +255,47 @@ do_catchsql_test 8.0 { CREATE TABLE t80(a, b INTEGER, PRIMARY KEY(b NULLS LAST)) WITHOUT ROWID; } {1 {unsupported use of NULLS LAST}} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 9.0 { + CREATE TABLE v0 (c1, c2, c3); + CREATE INDEX v3 ON v0 (c1, c2, c3); +} +do_execsql_test 9.1 { + ANALYZE sqlite_master; + INSERT INTO sqlite_stat1 VALUES('v0','v3','648 324 81'); + ANALYZE sqlite_master; +} + +do_execsql_test 9.2 { + INSERT INTO v0 VALUES + (1, 10, 'b'), + (1, 10, 'd'), + (1, 10, NULL), + (2, 10, 'a'), + (2, 10, NULL), + (1, 10, 'c'), + (2, 10, 'b'), + (1, 10, 'a'), + (1, 10, NULL), + (2, 10, NULL), + (2, 10, 'd'), + (2, 10, 'c'); +} + +do_execsql_test 9.3 { + SELECT c1, c2, ifnull(c3, 'NULL') FROM v0 + WHERE c2=10 ORDER BY c1, c3 NULLS LAST +} { + 1 10 a 1 10 b 1 10 c 1 10 d 1 10 NULL 1 10 NULL + 2 10 a 2 10 b 2 10 c 2 10 d 2 10 NULL 2 10 NULL +} + +do_eqp_test 9.4 { + SELECT c1, c2, ifnull(c3, 'NULL') FROM v0 + WHERE c2=10 ORDER BY c1, c3 NULLS LAST +} {SEARCH TABLE v0 USING COVERING INDEX v3 (ANY(c1) AND c2=?)} + + + finish_test From 997d7434b7688f9fbd48fdacdbf1769e2f4cccbe Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 28 Dec 2019 18:25:51 +0000 Subject: [PATCH 111/120] Do not attempt to flatten compound sub-queries in a FROM clause into the parent if any component of the sub-query uses a window function. FossilOrigin-Name: eeb76f621de2f930a548db0fbb9fe25b4479b73581826b8dfa2e63cd1f1ab783 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 2 ++ test/window1.test | 15 +++++++++++++++ 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 2fbed9f1d1..5dde30505a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\san\sassert()\sin\swhere.c\sto\sa\stestcase()\smacro,\ssince\sthe\scondition\smay\sbe\sfalse.\sThis\swas\sa\sproblem\swith\sthe\sassert()\sonly,\sthere\sis\sno\sbug\sin\srelease\sbuilds\sthat\somit\sassert(). -D 2019-12-28T18:08:39.531 +C Do\snot\sattempt\sto\sflatten\scompound\ssub-queries\sin\sa\sFROM\sclause\sinto\sthe\sparent\sif\sany\scomponent\sof\sthe\ssub-query\suses\sa\swindow\sfunction. +D 2019-12-28T18:25:51.300 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -528,7 +528,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c e231da7dd307f99772c40e76096abaf05c6fedcb4f1f045de23a61c194df6da6 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c e18a64e8d9f468ce9c183ab27ad79658b2aad8128e0dcfcd0c5dfe0132fc1074 +F src/select.c dafb9d298e231a58365074215920431956ca606cd2bcda682b4d3d3e93d4327b F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817ded F src/sqlite.h.in 2a23e8161775253d9cf383c2c6aa559005dc787d350dcb0be67a6c4cc3bd1d19 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1714,7 +1714,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test caf402a9726a7cbc84106c3d3ba833bbff5ae00223d61c02936bf63049564318 +F test/window1.test cd6e2dafaa14ae26c995547013a9765356d910f473664497c926ea3f47510997 F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9421b442cad9858ec21050c106aa935a1c0723ab08ef9a867a79638b040b6e68 -R e9385abc46897bbfbfbfbc6bfbcfd8c7 +P 82be135dee7ccfde5f8a67f3621b7ced449dce89bae9cadf025154a4de848c11 +R 689fc9af6e2b279bc6d7fd22df0aa0f5 U dan -Z 8385698bc4652e7f942fce6214733907 +Z 819583b2c969ec1f752f2ef5cdcbf2f5 diff --git a/manifest.uuid b/manifest.uuid index f86444f188..d61ccdd153 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -82be135dee7ccfde5f8a67f3621b7ced449dce89bae9cadf025154a4de848c11 \ No newline at end of file +eeb76f621de2f930a548db0fbb9fe25b4479b73581826b8dfa2e63cd1f1ab783 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 6298e331f8..327027f02c 100644 --- a/src/select.c +++ b/src/select.c @@ -3669,6 +3669,7 @@ static void substSelect( ** (17d1) aggregate, or ** (17d2) DISTINCT, or ** (17d3) a join. +** (17e) the subquery may not contain window functions ** ** The parent and sub-query may contain WHERE clauses. Subject to ** rules (11), (13) and (14), they may also contain ORDER BY, @@ -3853,6 +3854,7 @@ static int flattenSubquery( if( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))!=0 /* (17b) */ || (pSub1->pPrior && pSub1->op!=TK_ALL) /* (17a) */ || pSub1->pSrc->nSrc<1 /* (17c) */ + || pSub1->pWin /* (17d) */ ){ return 0; } diff --git a/test/window1.test b/test/window1.test index 60c23dbda9..0b7884784f 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1516,4 +1516,19 @@ do_execsql_test 44.4.2 { SELECT (0, 1) IN(SELECT MIN(c0), NTILE(1) OVER()) FROM t0; } {1} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 45.1 { + CREATE TABLE t0(x); + CREATE TABLE t1(a); + INSERT INTO t1 VALUES(1000); + INSERT INTO t1 VALUES(1000); + INSERT INTO t0 VALUES(10000); +} +do_execsql_test 45.2 { + SELECT * FROM ( + SELECT sum (a) OVER() FROM t1 UNION ALL SELECT x FROM t0 + ); +} {2000 2000 10000} + finish_test From be3da24134f53a0c8f10291611af758dc0ced611 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 29 Dec 2019 00:52:41 +0000 Subject: [PATCH 112/120] Add the OP_FinishSeek opcode which completes an OP_DeferredSeek if the seek has not already completed. Also add the sqlite3WhereUsesDeferredSeek() interface to the query planner. The UPDATE implementation adds an OP_FinishSeek before running the final OP_Insert if one is needed. Ticket [ec8abb025e78f40c] and also an assertion fault reported by Yongheng. FossilOrigin-Name: 21ef6e99331210b80fa7c71b4f02e8f768a748d01aef884368af2f6b51a067e0 --- manifest | 32 ++++++++++++++++---------------- manifest.uuid | 2 +- src/btree.c | 1 - src/sqliteInt.h | 1 + src/update.c | 25 +++++++++++-------------- src/vdbe.c | 19 +++++++++++++++++++ src/vdbeInt.h | 1 + src/vdbeaux.c | 4 ++-- src/where.c | 10 +++++++++- src/whereInt.h | 1 + src/wherecode.c | 1 + test/update.test | 17 +++++++++++++++++ 12 files changed, 79 insertions(+), 35 deletions(-) diff --git a/manifest b/manifest index 5dde30505a..2c91266268 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sattempt\sto\sflatten\scompound\ssub-queries\sin\sa\sFROM\sclause\sinto\sthe\sparent\sif\sany\scomponent\sof\sthe\ssub-query\suses\sa\swindow\sfunction. -D 2019-12-28T18:25:51.300 +C Add\sthe\sOP_FinishSeek\sopcode\swhich\scompletes\san\sOP_DeferredSeek\sif\sthe\sseek\nhas\snot\salready\scompleted.\s\sAlso\sadd\sthe\ssqlite3WhereUsesDeferredSeek()\ninterface\sto\sthe\squery\splanner.\s\sThe\sUPDATE\simplementation\sadds\san\nOP_FinishSeek\sbefore\srunning\sthe\sfinal\sOP_Insert\sif\sone\sis\sneeded.\nTicket\s[ec8abb025e78f40c]\sand\salso\san\sassertion\sfault\sreported\sby\sYongheng. +D 2019-12-29T00:52:41.688 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -469,7 +469,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 695bcbc62177cf70faaf6b34f89c22415e5581a13c57d67c862057636d3f09b9 +F src/btree.c e03085a75c1d6cd1db7f458a6e09d7111a4ebe4b7490aafc833ec714158ffdb1 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 F src/build.c 5aa8776d926954f13ddc37144c765ff8d80e49b74432c0f5a10f29433f0d69a8 @@ -533,7 +533,7 @@ F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817de F src/sqlite.h.in 2a23e8161775253d9cf383c2c6aa559005dc787d350dcb0be67a6c4cc3bd1d19 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h 3e235c7a406630bff9fe7183d9af5d4ce21a9b7acb77bf1b82a0caa130a5f687 +F src/sqliteInt.h dcd5b4b29596cb5969586790ae45f75fe8deaf5fde1a90d572ad12b2f970b318 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -595,16 +595,16 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 7b17f6e2f20f6cbcb0b215025a86b7457c38451fc7622f705e553d7a488c572d F src/treeview.c 7a8097cff1584acd0a228817103513bf1d1bf5ba91ff142b99c83e406c0968f3 F src/trigger.c 681ccdb910a87243940d63f99b26190d9c5d2534c2ded3c0825b7c0e315a342e -F src/update.c aed4261a7854ff3031c0d361b04988c8dce5b845a3fb3999fedc51140a836e78 +F src/update.c fae1082d3e28a13a4d4ed7ac35eaeb2f746d736882e46dd653671ab64396d86b F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 4d91d635d7aff34e09fade185911c7980fc42f93cc7b18f5387fad5a1166f08c +F src/vdbe.c 7235823bf9ec3ea298cc5c5e832c026d1cb4838c7507cdf28bf97c829353876a F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 -F src/vdbeInt.h 1ccaf470287e2d153b16cf7b0274d436db2c2f74cdf14afd1a0ff4cb51548ae6 +F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 -F src/vdbeaux.c e041d20b5000abbd651f7d470c66eaa13e868f58a13c1a940b4d426c6d0d43b5 +F src/vdbeaux.c 0a9716e47012ef018038c2e1dab9f701a6fb4429bb3ee1d4d0f49497519ace74 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c fa083086758379b52f8771d69424b273c7bd0f94413802404ee32cd5cc7cd870 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be @@ -614,9 +614,9 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 15a2845769f51ba132f9cf0b2c7a6887a91fc8437892dbcce9fcdc68b66d60a1 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d -F src/where.c 7bb294fdada405412dfd76d351286e0dec3dda07a8e19b0f904b8e8fc0ced41f -F src/whereInt.h de1b77e416ad5a7cc60a71fc1317484f8d83ca1e52b805dc8c978785a92eeded -F src/wherecode.c 3c9b185cdb6950fa1043d324d3e8ef14b07cef4f5cfb475611b6f43480494fb2 +F src/where.c 602e5093556bbd9090c0a9bd834fec0717e3a4b0377a021d38091a6d554a1177 +F src/whereInt.h a727b32260e12707a8c1bc29d7f7e9b6dc1a44551a45093d5968fbe570ff0c56 +F src/wherecode.c a987d22b42e09b06f3a49596e0953b1cd28e568cc656681776edc0026cfac0cc F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 F src/window.c 87795bb8293179cb8a92529264d49bd66b5bcad5e91cfc17dd8d3e66a2a77f88 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1605,7 +1605,7 @@ F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2 F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97 F test/unordered.test ffeea7747d5ba962a8009a20b7e53d68cbae05b063604c68702c5998eb50c981 -F test/update.test 6fdd76fdf3194fb10ee184b3b2999c61d10d2a0b825dbcaa2d08ff394f3e26e3 +F test/update.test 40aa53edd597a4cf16bca3890f429a91999ad7885117918ec8fc9d5d8b41d104 F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 F test/upsert1.test 88f9e258c6a0eeeb85937b08831e8daad440ba41f125af48439e9d33f266fb18 F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 82be135dee7ccfde5f8a67f3621b7ced449dce89bae9cadf025154a4de848c11 -R 689fc9af6e2b279bc6d7fd22df0aa0f5 -U dan -Z 819583b2c969ec1f752f2ef5cdcbf2f5 +P eeb76f621de2f930a548db0fbb9fe25b4479b73581826b8dfa2e63cd1f1ab783 +R af3bb40e1df9ee06fcab6108c3a14e15 +U drh +Z da1bc4514591aa0f5f1f69cf011c69ab diff --git a/manifest.uuid b/manifest.uuid index d61ccdd153..f5441cc065 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eeb76f621de2f930a548db0fbb9fe25b4479b73581826b8dfa2e63cd1f1ab783 \ No newline at end of file +21ef6e99331210b80fa7c71b4f02e8f768a748d01aef884368af2f6b51a067e0 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 52c2ceaffb..eb80816bbb 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8658,7 +8658,6 @@ int sqlite3BtreeInsert( if( flags & BTREE_SAVEPOSITION ){ assert( pCur->curFlags & BTCF_ValidNKey ); assert( pX->nKey==pCur->info.nKey ); - assert( pCur->info.nSize!=0 ); assert( loc==0 ); } #endif diff --git a/src/sqliteInt.h b/src/sqliteInt.h index c1ed684ffc..84f8e1e5c5 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4115,6 +4115,7 @@ int sqlite3WhereOkOnePass(WhereInfo*, int*); #define ONEPASS_OFF 0 /* Use of ONEPASS not allowed */ #define ONEPASS_SINGLE 1 /* ONEPASS valid for a single row update */ #define ONEPASS_MULTI 2 /* ONEPASS is valid for multiple rows */ +int sqlite3WhereUsesDeferredSeek(WhereInfo*); void sqlite3ExprCodeLoadIndexColumn(Parse*, Index*, int, int, int); int sqlite3ExprCodeGetColumn(Parse*, Table*, int, int, int, u8); void sqlite3ExprCodeGetColumnOfTable(Vdbe*, Table*, int, int, int); diff --git a/src/update.c b/src/update.c index 52ae8a0305..8ff92daea9 100644 --- a/src/update.c +++ b/src/update.c @@ -191,6 +191,7 @@ void sqlite3Update( int iPk = 0; /* First of nPk cells holding PRIMARY KEY value */ i16 nPk = 0; /* Number of components of the PRIMARY KEY */ int bReplace = 0; /* True if REPLACE conflict resolution might happen */ + int bFinishSeek = 1; /* The OP_FinishSeek opcode is needed */ /* Register Allocations */ int regRowCount = 0; /* A count of rows changed */ @@ -524,6 +525,7 @@ void sqlite3Update( pWInfo = 0; eOnePass = ONEPASS_SINGLE; sqlite3ExprIfFalse(pParse, pWhere, labelBreak, SQLITE_JUMPIFNULL); + bFinishSeek = 0; }else{ /* Begin the database scan. ** @@ -550,6 +552,7 @@ void sqlite3Update( ** strategy that uses an index for which one or more columns are being ** updated. */ eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); + bFinishSeek = sqlite3WhereUsesDeferredSeek(pWInfo); if( eOnePass!=ONEPASS_SINGLE ){ sqlite3MultiWrite(pParse); if( eOnePass==ONEPASS_MULTI ){ @@ -713,6 +716,7 @@ void sqlite3Update( testcase( i==31 ); testcase( i==32 ); sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, k); + bFinishSeek = 0; }else{ sqlite3VdbeAddOp2(v, OP_Null, 0, k); } @@ -800,21 +804,14 @@ void sqlite3Update( /* Delete the index entries associated with the current record. */ sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, aRegIdx, -1); -#ifndef SQLITE_OMIT_GENERATED_COLUMNS - /* If pTab contains one or more virtual columns, then it is possible - ** (though unlikely) that no OP_Column opcodes have been run against - ** the table since the OP_SeekDeferred, meaning that there has not been - ** a seek against the cursor yet. The OP_Delete opcode and OP_Insert - ** opcodes that follow will be needing this seek, so code a bogus - ** OP_Column just to make sure the seek has been done. - ** See ticket ec8abb025e78f40c 2019-12-26 - */ - if( eOnePass!=ONEPASS_OFF && (pTab->tabFlags & TF_HasVirtual)!=0 ){ - int r1 = sqlite3GetTempReg(pParse); - sqlite3VdbeAddOp3(v, OP_Column, iDataCur, 0, r1); - sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); + /* We must run the OP_FinishSeek opcode to resolve a prior + ** OP_DeferredSeek if there is any possibility that there have been + ** no OP_Column opcodes since the OP_DeferredSeek was issued. But + ** we want to avoid the OP_FinishSeek if possible, as running it + ** costs CPU cycles. */ + if( bFinishSeek ){ + sqlite3VdbeAddOp1(v, OP_FinishSeek, iDataCur); } -#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ /* If changing the rowid value, or if there are foreign key constraints ** to process, delete the old record. Otherwise, add a noop OP_Delete diff --git a/src/vdbe.c b/src/vdbe.c index 23c8b18ac8..0aeaa072cf 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -4827,6 +4827,7 @@ case OP_Insert: { pC = p->apCsr[pOp->p1]; assert( pC!=0 ); assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->deferredMoveto==0 ); assert( pC->uc.pCursor!=0 ); assert( (pOp->p5 & OPFLAG_ISNOOP) || pC->isTable ); assert( pOp->p4type==P4_TABLE || pOp->p4type>=P4_STATIC ); @@ -5700,6 +5701,24 @@ case OP_IdxRowid: { /* out2 */ break; } +/* Opcode: FinishSeek P1 * * * * +** +** If cursor P1 was previously moved via OP_DeferredSeek, complete that +** seek operation now, without further delay. If the cursor seek has +** already occurred, this instruction is a no-op. +*/ +case OP_FinishSeek: { + VdbeCursor *pC; /* The P1 index cursor */ + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + if( pC->deferredMoveto ){ + rc = sqlite3VdbeFinishMoveto(pC); + if( rc ) goto abort_due_to_error; + } + break; +} + /* Opcode: IdxGE P1 P2 P3 P4 P5 ** Synopsis: key=r[P3@P4] ** diff --git a/src/vdbeInt.h b/src/vdbeInt.h index cc410510ae..138377def1 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -483,6 +483,7 @@ struct PreUpdate { void sqlite3VdbeError(Vdbe*, const char *, ...); void sqlite3VdbeFreeCursor(Vdbe *, VdbeCursor*); void sqliteVdbePopStack(Vdbe*,int); +int SQLITE_NOINLINE sqlite3VdbeFinishMoveto(VdbeCursor*); int sqlite3VdbeCursorMoveto(VdbeCursor**, int*); int sqlite3VdbeCursorRestore(VdbeCursor*); u32 sqlite3VdbeSerialTypeLen(u32); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index ac52303d57..9d04c160a2 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -3414,7 +3414,7 @@ void sqlite3VdbeDelete(Vdbe *p){ ** carried out. Seek the cursor now. If an error occurs, return ** the appropriate error code. */ -static int SQLITE_NOINLINE handleDeferredMoveto(VdbeCursor *p){ +int SQLITE_NOINLINE sqlite3VdbeFinishMoveto(VdbeCursor *p){ int res, rc; #ifdef SQLITE_TEST extern int sqlite3_search_count; @@ -3486,7 +3486,7 @@ int sqlite3VdbeCursorMoveto(VdbeCursor **pp, int *piCol){ *piCol = iMap - 1; return SQLITE_OK; } - return handleDeferredMoveto(p); + return sqlite3VdbeFinishMoveto(p); } if( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ){ return handleMovedCursor(p); diff --git a/src/where.c b/src/where.c index 244bc57a47..7c05a58e49 100644 --- a/src/where.c +++ b/src/where.c @@ -120,7 +120,7 @@ int sqlite3WhereBreakLabel(WhereInfo *pWInfo){ /* ** Return ONEPASS_OFF (0) if an UPDATE or DELETE statement is unable to -** operate directly on the rowis returned by a WHERE clause. Return +** operate directly on the rowids returned by a WHERE clause. Return ** ONEPASS_SINGLE (1) if the statement can operation directly because only ** a single row is to be changed. Return ONEPASS_MULTI (2) if the one-pass ** optimization can be used on multiple @@ -147,6 +147,14 @@ int sqlite3WhereOkOnePass(WhereInfo *pWInfo, int *aiCur){ return pWInfo->eOnePass; } +/* +** Return TRUE if the WHERE loop uses the OP_DeferredSeek opcode to move +** the data cursor to the row selected by the index cursor. +*/ +int sqlite3WhereUsesDeferredSeek(WhereInfo *pWInfo){ + return pWInfo->bDeferredSeek; +} + /* ** Move the content of pSrc into pDest */ diff --git a/src/whereInt.h b/src/whereInt.h index 8d333c032d..f500e01d48 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -459,6 +459,7 @@ struct WhereInfo { i8 nOBSat; /* Number of ORDER BY terms satisfied by indices */ u8 sorted; /* True if really sorted (not just grouped) */ u8 eOnePass; /* ONEPASS_OFF, or _SINGLE, or _MULTI */ + u8 bDeferredSeek; /* Uses OP_DeferredSeek */ u8 untestedTerms; /* Not all WHERE terms resolved by outer loop */ u8 eDistinct; /* One of the WHERE_DISTINCT_* values */ u8 bOrderedInnerLoop; /* True if only the inner-most loop is ordered */ diff --git a/src/wherecode.c b/src/wherecode.c index 9c51b5669c..96c2971a5f 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1045,6 +1045,7 @@ static void codeDeferredSeek( assert( iIdxCur>0 ); assert( pIdx->aiColumn[pIdx->nColumn-1]==-1 ); + pWInfo->bDeferredSeek = 1; sqlite3VdbeAddOp3(v, OP_DeferredSeek, iIdxCur, 0, iCur); if( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE) && DbMaskAllZero(sqlite3ParseToplevel(pParse)->writeMask) diff --git a/test/update.test b/test/update.test index 2f36bdf2f7..b49ed6d292 100644 --- a/test/update.test +++ b/test/update.test @@ -684,4 +684,21 @@ do_execsql_test update-18.20 { SELECT * FROM t0; } {0 0} +# 2019-12-28 assertion fault reported by Yongheng +# Similar to ticket ec8abb025e78f40c +# An UPDATE was reaching the OP_Delete after running OP_DeferredSeek +# without ever hitting an OP_Column. The enhanced solution is to +# fix OP_Delete so that it can do the seek itself. +# +reset_db +do_execsql_test update-19.10 { + CREATE TABLE t1( + a TEXT, + b INTEGER PRIMARY KEY UNIQUE + ); + INSERT INTO t1 VALUES(1,2); + UPDATE t1 SET a = quote(b) WHERE b>=2; + SELECT * FROM t1; +} {2 2} + finish_test From 7b14b65d20a2ba85bd90689772f605ba5a32bfed Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 29 Dec 2019 22:08:20 +0000 Subject: [PATCH 113/120] Do not allow triggers that run as part of REPLACE conflict resolution during an UPDATE to modify the the table being updated. Otherwise, those triggers might delete content out from under the update operation, leading to all kinds of problems. Ticket [314cc133e5ada126] FossilOrigin-Name: db4b7e1dc399c1f16b827ac087aa37c0815f4b2f41f1ffad59963eead2ab5562 --- manifest | 26 +++++++++++++------------- manifest.uuid | 2 +- src/btree.c | 15 +++++++++++++++ src/btree.h | 2 ++ src/btreeInt.h | 1 + src/insert.c | 6 ++++++ src/sqlite.h.in | 1 + src/vdbe.c | 30 ++++++++++++++++++++++++++++++ test/conflict3.test | 12 ++++++------ test/update.test | 29 +++++++++++++++++++++++++++++ 10 files changed, 104 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index 2c91266268..0c5039c406 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sOP_FinishSeek\sopcode\swhich\scompletes\san\sOP_DeferredSeek\sif\sthe\sseek\nhas\snot\salready\scompleted.\s\sAlso\sadd\sthe\ssqlite3WhereUsesDeferredSeek()\ninterface\sto\sthe\squery\splanner.\s\sThe\sUPDATE\simplementation\sadds\san\nOP_FinishSeek\sbefore\srunning\sthe\sfinal\sOP_Insert\sif\sone\sis\sneeded.\nTicket\s[ec8abb025e78f40c]\sand\salso\san\sassertion\sfault\sreported\sby\sYongheng. -D 2019-12-29T00:52:41.688 +C Do\snot\sallow\striggers\sthat\srun\sas\spart\sof\sREPLACE\sconflict\sresolution\nduring\san\sUPDATE\sto\smodify\sthe\sthe\stable\sbeing\supdated.\s\sOtherwise,\sthose\ntriggers\smight\sdelete\scontent\sout\sfrom\sunder\sthe\supdate\soperation,\sleading\nto\sall\skinds\sof\sproblems.\s\sTicket\s[314cc133e5ada126] +D 2019-12-29T22:08:20.135 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -469,9 +469,9 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c e03085a75c1d6cd1db7f458a6e09d7111a4ebe4b7490aafc833ec714158ffdb1 -F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 -F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 +F src/btree.c f191aa4d99597a1ad77cb15a9473f1183f2a12a7f1650a7705eaac9085e493bb +F src/btree.h 6111552f19ed7a40f029cf4b33badc6fef9880314fffd80a945f0b7f43ab7471 +F src/btreeInt.h 6794084fad08c9750b45145743c0e3e5c27c94dee89f26dd8df7073314934fd2 F src/build.c 5aa8776d926954f13ddc37144c765ff8d80e49b74432c0f5a10f29433f0d69a8 F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e @@ -489,7 +489,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c be02cb3503277063879f9c04ce2feb9ffdcdd8f6abd975cc6007f745392b495b +F src/insert.c 97afb0bf06d7fd7b820f6de3e42cf60beb5cd10131828c29b131b2614bbb1f39 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da F src/main.c 868ae7db7a54fe859bf2ca8b7a4f24e9fa03a6134abfb7c9801d08411ef5dacb @@ -530,7 +530,7 @@ F src/resolve.c e231da7dd307f99772c40e76096abaf05c6fedcb4f1f045de23a61c194df6da6 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c dafb9d298e231a58365074215920431956ca606cd2bcda682b4d3d3e93d4327b F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817ded -F src/sqlite.h.in 2a23e8161775253d9cf383c2c6aa559005dc787d350dcb0be67a6c4cc3bd1d19 +F src/sqlite.h.in 51f69c62ba3e980aca1e39badcaf9ad13f008774fe1bb8e7f57e3e456c656670 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 F src/sqliteInt.h dcd5b4b29596cb5969586790ae45f75fe8deaf5fde1a90d572ad12b2f970b318 @@ -600,7 +600,7 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 7235823bf9ec3ea298cc5c5e832c026d1cb4838c7507cdf28bf97c829353876a +F src/vdbe.c 28132ce0a4f415a2533c5eea047aa671f8afb99bcf98b88f37d72150af6f3351 F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -750,7 +750,7 @@ F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 87ad5458bb8709312dac0d6755fd30e8e4ca83298d0a9ef6e5c24277a3c3390e F test/conflict.test 58857e2533fb9f2e0358ea7cb191215657846be1dd9da3b3d6df3e750c02ae03 F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c -F test/conflict3.test f62a2d0cad9162a60e6458fc913dff3a2208feca924120c21737cfee65a6a74a +F test/conflict3.test 81865d9599609aca394fb3b9cd5f561d4729ea5b176bece3644f6ecb540f88ac F test/contrib01.test 2a1cbc0f2f48955d7d073f725765da6fbceda6b4 F test/corrupt.test d7cb0300e4a297147b6a05e92a1684bc8973635c3bcaa3d66e983c9cbdbf47a3 F test/corrupt2.test bb50042cf9a1f1023d73af325d47eb02a6bb11e3c52f8812644b220c5d4bca35 @@ -1605,7 +1605,7 @@ F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2 F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97 F test/unordered.test ffeea7747d5ba962a8009a20b7e53d68cbae05b063604c68702c5998eb50c981 -F test/update.test 40aa53edd597a4cf16bca3890f429a91999ad7885117918ec8fc9d5d8b41d104 +F test/update.test e906ca7cb1dc6f52af1ea243e08f727edfa79f924c2691f2f9e72481f847310d F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 F test/upsert1.test 88f9e258c6a0eeeb85937b08831e8daad440ba41f125af48439e9d33f266fb18 F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P eeb76f621de2f930a548db0fbb9fe25b4479b73581826b8dfa2e63cd1f1ab783 -R af3bb40e1df9ee06fcab6108c3a14e15 +P 21ef6e99331210b80fa7c71b4f02e8f768a748d01aef884368af2f6b51a067e0 +R b7ec11b757aee6e4ed77f8bc1e680bf5 U drh -Z da1bc4514591aa0f5f1f69cf011c69ab +Z bc0033b99f278b5e6e67f422296a8976 diff --git a/manifest.uuid b/manifest.uuid index f5441cc065..e8038b4c09 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -21ef6e99331210b80fa7c71b4f02e8f768a748d01aef884368af2f6b51a067e0 \ No newline at end of file +db4b7e1dc399c1f16b827ac087aa37c0815f4b2f41f1ffad59963eead2ab5562 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index eb80816bbb..a137da3c7e 100644 --- a/src/btree.c +++ b/src/btree.c @@ -699,6 +699,9 @@ static int saveCursorPosition(BtCursor *pCur){ assert( 0==pCur->pKey ); assert( cursorHoldsMutex(pCur) ); + if( pCur->curFlags & BTCF_Pinned ){ + return SQLITE_CONSTRAINT_PINNED; + } if( pCur->eState==CURSOR_SKIPNEXT ){ pCur->eState = CURSOR_VALID; }else{ @@ -4562,6 +4565,18 @@ i64 sqlite3BtreeIntegerKey(BtCursor *pCur){ return pCur->info.nKey; } +/* +** Pin or unpin a cursor. +*/ +void sqlite3BtreeCursorPin(BtCursor *pCur){ + assert( (pCur->curFlags & BTCF_Pinned)==0 ); + pCur->curFlags |= BTCF_Pinned; +} +void sqlite3BtreeCursorUnpin(BtCursor *pCur){ + assert( (pCur->curFlags & BTCF_Pinned)!=0 ); + pCur->curFlags &= ~BTCF_Pinned; +} + #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC /* ** Return the offset into the database file for the start of the diff --git a/src/btree.h b/src/btree.h index 4fd281dec1..4bd41f7f37 100644 --- a/src/btree.h +++ b/src/btree.h @@ -306,6 +306,8 @@ int sqlite3BtreeNext(BtCursor*, int flags); int sqlite3BtreeEof(BtCursor*); int sqlite3BtreePrevious(BtCursor*, int flags); i64 sqlite3BtreeIntegerKey(BtCursor*); +void sqlite3BtreeCursorPin(BtCursor*); +void sqlite3BtreeCursorUnpin(BtCursor*); #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC i64 sqlite3BtreeOffset(BtCursor*); #endif diff --git a/src/btreeInt.h b/src/btreeInt.h index 72d877f331..7687a0f1ec 100644 --- a/src/btreeInt.h +++ b/src/btreeInt.h @@ -542,6 +542,7 @@ struct BtCursor { #define BTCF_AtLast 0x08 /* Cursor is pointing ot the last entry */ #define BTCF_Incrblob 0x10 /* True if an incremental I/O handle */ #define BTCF_Multiple 0x20 /* Maybe another cursor on the same btree */ +#define BTCF_Pinned 0x40 /* Cursor is busy and cannot be moved */ /* ** Potential values for BtCursor.eState. diff --git a/src/insert.c b/src/insert.c index 423087e37a..d778e4b457 100644 --- a/src/insert.c +++ b/src/insert.c @@ -2129,9 +2129,15 @@ void sqlite3GenerateConstraintChecks( sqlite3MultiWrite(pParse); nReplaceTrig++; } + if( pTrigger && isUpdate ){ + sqlite3VdbeAddOp1(v, OP_CursorLock, iDataCur); + } sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, regR, nPkField, 0, OE_Replace, (pIdx==pPk ? ONEPASS_SINGLE : ONEPASS_OFF), iThisCur); + if( pTrigger && isUpdate ){ + sqlite3VdbeAddOp1(v, OP_CursorUnlock, iDataCur); + } if( regTrigCnt ){ int addrBypass; /* Jump destination to bypass recheck logic */ diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 944b5be3e5..50976ee163 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -536,6 +536,7 @@ int sqlite3_exec( #define SQLITE_CONSTRAINT_UNIQUE (SQLITE_CONSTRAINT | (8<<8)) #define SQLITE_CONSTRAINT_VTAB (SQLITE_CONSTRAINT | (9<<8)) #define SQLITE_CONSTRAINT_ROWID (SQLITE_CONSTRAINT |(10<<8)) +#define SQLITE_CONSTRAINT_PINNED (SQLITE_CONSTRAINT |(11<<8)) #define SQLITE_NOTICE_RECOVER_WAL (SQLITE_NOTICE | (1<<8)) #define SQLITE_NOTICE_RECOVER_ROLLBACK (SQLITE_NOTICE | (2<<8)) #define SQLITE_WARNING_AUTOINDEX (SQLITE_WARNING | (1<<8)) diff --git a/src/vdbe.c b/src/vdbe.c index 0aeaa072cf..40e022d622 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -7025,6 +7025,36 @@ case OP_Expire: { break; } +/* Opcode: CursorLock P1 * * * * +** +** Lock the btree to which cursor P1 is pointing so that the btree cannot be +** written by an other cursor. +*/ +case OP_CursorLock: { + VdbeCursor *pC; + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + sqlite3BtreeCursorPin(pC->uc.pCursor); + break; +} + +/* Opcode: CursorUnlock P1 * * * * +** +** Unlock the btree to which cursor P1 is pointing so that it can be +** written by other cursors. +*/ +case OP_CursorUnlock: { + VdbeCursor *pC; + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + sqlite3BtreeCursorUnpin(pC->uc.pCursor); + break; +} + #ifndef SQLITE_OMIT_SHARED_CACHE /* Opcode: TableLock P1 P2 P3 P4 * ** Synopsis: iDb=P1 root=P2 write=P3 diff --git a/test/conflict3.test b/test/conflict3.test index cc3a51b850..8eb4c1b0f7 100644 --- a/test/conflict3.test +++ b/test/conflict3.test @@ -380,15 +380,15 @@ ifcapable trigger { INSERT INTO t0 VALUES(0, NULL); } - do_execsql_test 13.1.1 { + do_catchsql_test 13.1.1 { UPDATE OR REPLACE t0 SET c1 = 1; - } + } {1 {constraint failed}} integrity_check 13.1.2 do_execsql_test 13.1.3 { SELECT * FROM t0 - } {} + } {1 {} 0 {}} do_execsql_test 13.2.0 { CREATE TABLE t2 (a PRIMARY KEY, b UNIQUE, c UNIQUE) WITHOUT ROWID; @@ -400,15 +400,15 @@ ifcapable trigger { INSERT INTO t2 VALUES(2, 2, 2); } - do_execsql_test 13.2.1 { + do_catchsql_test 13.2.1 { UPDATE OR REPLACE t2 SET c = 0; - } + } {1 {constraint failed}} integrity_check 13.2.2 do_execsql_test 13.2.3 { SELECT * FROM t2 - } {} + } {1 1 1 2 2 2} do_execsql_test 13.3.0 { CREATE TABLE t1(a, b); diff --git a/test/update.test b/test/update.test index b49ed6d292..dd96124b4d 100644 --- a/test/update.test +++ b/test/update.test @@ -701,4 +701,33 @@ do_execsql_test update-19.10 { SELECT * FROM t1; } {2 2} +# 2019-12-29 ticket https://www.sqlite.org/src/info/314cc133e5ada126 +# REPLACE conflict resolution during an UPDATE causes a DELETE trigger +# to fire. If that DELETE trigger subsequently modifies the row +# being updated, bad things can happen. Prevent this by prohibiting +# triggers from making changes to the table being updated while doing +# REPLACE conflict resolution on the UPDATE. +# +# See also tickets: +# https://www.sqlite.org/src/info/c1e19e12046d23fe 2019-10-25 +# https://www.sqlite.org/src/info/a8a4847a2d96f5de 2019-10-16 +# +reset_db +do_execsql_test update-20.10 { + PRAGMA recursive_triggers = true; + CREATE TABLE t1(a UNIQUE ON CONFLICT REPLACE, b); + INSERT INTO t1(a,b) VALUES(4,12),(9,13); + CREATE INDEX i0 ON t1(b); + CREATE TRIGGER tr0 DELETE ON t1 BEGIN + UPDATE t1 SET b = a; + END; + PRAGMA integrity_check; +} {ok} +do_catchsql_test update-20.20 { + UPDATE t1 SET a=0; +} {1 {constraint failed}} +do_execsql_test update-20.30 { + PRAGMA integrity_check; +} {ok} + finish_test From 2b6e670f73ed38ac4df9144c9569fd76a302a7a8 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 30 Dec 2019 06:55:31 +0000 Subject: [PATCH 114/120] In ALTER TABLE, rename columns and tables in expressions that are optimized out by the "AND 0" optimization. Doing this also fixes an otherwise harmless assert() failure. FossilOrigin-Name: a9e0354c992b0287608ddd18fd35fe7e6102a8f293d6e6e1b3488644bcda8168 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/expr.c | 8 +++++--- test/altertab2.test | 11 +++++------ test/altertab3.test | 34 ++++++++++++++++++++++++++++++++++ 5 files changed, 54 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index 0c5039c406..b8ff4d4e02 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sallow\striggers\sthat\srun\sas\spart\sof\sREPLACE\sconflict\sresolution\nduring\san\sUPDATE\sto\smodify\sthe\sthe\stable\sbeing\supdated.\s\sOtherwise,\sthose\ntriggers\smight\sdelete\scontent\sout\sfrom\sunder\sthe\supdate\soperation,\sleading\nto\sall\skinds\sof\sproblems.\s\sTicket\s[314cc133e5ada126] -D 2019-12-29T22:08:20.135 +C In\sALTER\sTABLE,\srename\scolumns\sand\stables\sin\sexpressions\sthat\sare\soptimized\sout\sby\sthe\s"AND\s0"\soptimization.\sDoing\sthis\salso\sfixes\san\sotherwise\sharmless\sassert()\sfailure. +D 2019-12-30T06:55:31.748 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,7 +480,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c de4fa05000145cbb6ff29b106e2c7dded5fe3d7882c518b2bc6f63c27891a645 +F src/expr.c 3584e19c222f94cd0bb9070318ad270c3ca0d4fe235a6f70a198f16d8faf976f F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -637,8 +637,8 @@ F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test 4d8b79b0b88b62b90b710390df14fe99e0a3578345526886eaa550e28e3065dc -F test/altertab2.test 8883693952f6d7fb5f754dbf1d694ed780aa883027bef04cb1fb99a3b88c9272 -F test/altertab3.test d58d41201afd64c6176dcc4e71110c600c03841dad1efcc354de2248f6126e70 +F test/altertab2.test b0d62f323ca5dab42b0bc028c52e310ebdd13e655e8fac070fe622bad7852c2b +F test/altertab3.test 155b8dc225ce484454a7fb4c8ba745680b6fa0fc3e08919cbbc19f9309d128ff F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 547bb700f903107b38611b014ca645d6b5bb819f5210d7bf39c40802aafeb7d7 F test/analyze3.test 01f0b122e3e54ad2544f14f7cc7dcb4c2cb8753cad5e88c6b8d49615b3fd6a2b @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 21ef6e99331210b80fa7c71b4f02e8f768a748d01aef884368af2f6b51a067e0 -R b7ec11b757aee6e4ed77f8bc1e680bf5 -U drh -Z bc0033b99f278b5e6e67f422296a8976 +P db4b7e1dc399c1f16b827ac087aa37c0815f4b2f41f1ffad59963eead2ab5562 +R d015eff90d79dae7805d6393f409ae2c +U dan +Z 4676afd3b05e3706903e7277aaa2fd67 diff --git a/manifest.uuid b/manifest.uuid index e8038b4c09..9f6809bcbc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -db4b7e1dc399c1f16b827ac087aa37c0815f4b2f41f1ffad59963eead2ab5562 \ No newline at end of file +a9e0354c992b0287608ddd18fd35fe7e6102a8f293d6e6e1b3488644bcda8168 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 76ffea3f17..e0a03d956f 100644 --- a/src/expr.c +++ b/src/expr.c @@ -933,9 +933,11 @@ Expr *sqlite3ExprAnd(Parse *pParse, Expr *pLeft, Expr *pRight){ return pRight; }else if( pRight==0 ){ return pLeft; - }else if( ExprAlwaysFalse(pLeft) || ExprAlwaysFalse(pRight) ){ - sqlite3ExprUnmapAndDelete(pParse, pLeft); - sqlite3ExprUnmapAndDelete(pParse, pRight); + }else if( (ExprAlwaysFalse(pLeft) || ExprAlwaysFalse(pRight)) + && !IN_RENAME_OBJECT + ){ + sqlite3ExprDelete(db, pLeft); + sqlite3ExprDelete(db, pRight); return sqlite3Expr(db, TK_INTEGER, "0"); }else{ return sqlite3PExpr(pParse, TK_AND, pLeft, pRight); diff --git a/test/altertab2.test b/test/altertab2.test index f14dc13ff1..9c1ad58134 100644 --- a/test/altertab2.test +++ b/test/altertab2.test @@ -343,22 +343,21 @@ do_execsql_test 8.4 { CREATE VIEW v4 AS SELECT * FROM t4 WHERE (a=1 AND 0) OR b=2; } -# Do not rename branches of an expression tree that is optimized out by -# the AND optimization. +# Branches of an expression tree that are optimized out by the AND +# optimization are renamed. # do_execsql_test 8.5 { ALTER TABLE t4 RENAME a TO c; SELECT sql FROM sqlite_master WHERE name = 'v4' -} {{CREATE VIEW v4 AS SELECT * FROM t4 WHERE (a=1 AND 0) OR b=2}} -# "a" is not renamed to "c" ---^ +} {{CREATE VIEW v4 AS SELECT * FROM t4 WHERE (c=1 AND 0) OR b=2}} # 2019-06-10 https://www.sqlite.org/src/info/533010b8cacebe82 reset_db -do_execsql_test 8.6 { +do_catchsql_test 8.6 { CREATE TABLE t0(c0); CREATE INDEX i0 ON t0(LIKELIHOOD(1,2) AND 0); ALTER TABLE t0 RENAME TO t1; SELECT sql FROM sqlite_master WHERE name='i0'; -} {{CREATE INDEX i0 ON "t1"(LIKELIHOOD(1,2) AND 0)}} +} {1 {error in index i0: second argument to likelihood() must be a constant between 0.0 and 1.0}} finish_test diff --git a/test/altertab3.test b/test/altertab3.test index 74b9b1a0f0..b39065589c 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -552,5 +552,39 @@ do_catchsql_test 23.3 { ALTER TABLE v0 RENAME TO t3 ; } {1 {error in view v2: view v2 is circularly defined}} +#------------------------------------------------------------------------ +# +reset_db +do_execsql_test 24.1 { + CREATE TABLE v0 (v1); + CREATE TABLE v2 (v3 INTEGER UNIQUE ON CONFLICT ABORT); + CREATE TRIGGER x AFTER INSERT ON v2 WHEN ( + ( SELECT v1 AS PROMO_REVENUE FROM v2 JOIN v0 USING ( VALUE ) ) AND 0 ) + BEGIN + DELETE FROM v2; + END; +} +do_catchsql_test 24.2 { + ALTER TABLE v0 RENAME TO x ; +} {1 {error in trigger x: cannot join using column VALUE - column not present in both tables}} + +do_execsql_test 24.3 { + DROP TRIGGER x; + CREATE TRIGGER x AFTER INSERT ON v2 WHEN ( + 0 AND (SELECT rowid FROM v0) + ) BEGIN + DELETE FROM v2; + END; +} + +do_execsql_test 24.4 { + ALTER TABLE v0 RENAME TO xyz; + SELECT sql FROM sqlite_master WHERE type='trigger' +} {{CREATE TRIGGER x AFTER INSERT ON v2 WHEN ( + 0 AND (SELECT rowid FROM "xyz") + ) BEGIN + DELETE FROM v2; + END}} + finish_test From 9d41af23a48dc343fbe1b2d26b16a2d3fdeb72ca Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 30 Dec 2019 14:32:27 +0000 Subject: [PATCH 115/120] Do not use HIDDEN columns for NATURAL joins. Fix for [7c0e06b16]. FossilOrigin-Name: ab09ef427181130be09a087b7e572ad4cfb6b3e1b459769ee5ebf046b3ead682 --- ext/fts5/test/fts5misc.test | 27 +++++++++++++++++++++++++++ manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 16 ++++++++++------ 4 files changed, 45 insertions(+), 14 deletions(-) diff --git a/ext/fts5/test/fts5misc.test b/ext/fts5/test/fts5misc.test index 9a61210c65..9abc92b23f 100644 --- a/ext/fts5/test/fts5misc.test +++ b/ext/fts5/test/fts5misc.test @@ -296,5 +296,32 @@ do_execsql_test 11.1 { INSERT INTO vt0(vt0) VALUES('integrity-check'); } +#------------------------------------------------------------------------- +# Ticket [7c0e06b16] +# +do_execsql_test 12.0 { + CREATE TABLE t1(a, b, rank); + INSERT INTO t1 VALUES('a', 'hello', ''); + INSERT INTO t1 VALUES('b', 'world', ''); + + CREATE VIRTUAL TABLE ft USING fts5(a); + INSERT INTO ft VALUES('b'); + INSERT INTO ft VALUES('y'); + + CREATE TABLE t2(x, y, ft); + INSERT INTO t2 VALUES(1, 2, 'x'); + INSERT INTO t2 VALUES(3, 4, 'b'); +} + +do_execsql_test 12.1 { + SELECT * FROM t1 NATURAL JOIN ft WHERE ft MATCH('b') +} {b world {}} +do_execsql_test 12.2 { + SELECT * FROM ft NATURAL JOIN t1 WHERE ft MATCH('b') +} {b world {}} +do_execsql_test 12.3 { + SELECT * FROM t2 JOIN ft USING (ft) +} {3 4 b b} + finish_test diff --git a/manifest b/manifest index b8ff4d4e02..6e0bf6dbe3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sALTER\sTABLE,\srename\scolumns\sand\stables\sin\sexpressions\sthat\sare\soptimized\sout\sby\sthe\s"AND\s0"\soptimization.\sDoing\sthis\salso\sfixes\san\sotherwise\sharmless\sassert()\sfailure. -D 2019-12-30T06:55:31.748 +C Do\snot\suse\sHIDDEN\scolumns\sfor\sNATURAL\sjoins.\sFix\sfor\s[7c0e06b16]. +D 2019-12-30T14:32:27.220 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -189,7 +189,7 @@ F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc27826807405 F ext/fts5/test/fts5matchinfo.test 50d86da66ec5b27603dcd90ba0227f5d9deb10351cbc52974a88e24f6fc9b076 F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6 F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 -F ext/fts5/test/fts5misc.test 1da7c54fff4c3584dbf60a770e997792459c5930dc36b5182d68595e39bbf8f9 +F ext/fts5/test/fts5misc.test 088ac5f0f5de1ad45b0f83197ab5263bcae8130156cdc901bff2375ff2b8af86 F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581 F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd @@ -528,7 +528,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c e231da7dd307f99772c40e76096abaf05c6fedcb4f1f045de23a61c194df6da6 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c dafb9d298e231a58365074215920431956ca606cd2bcda682b4d3d3e93d4327b +F src/select.c 71234f813ccb9dc5bc6f3cd365a64bcadf7fc4100adcf201ded96cae8fe33d87 F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817ded F src/sqlite.h.in 51f69c62ba3e980aca1e39badcaf9ad13f008774fe1bb8e7f57e3e456c656670 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P db4b7e1dc399c1f16b827ac087aa37c0815f4b2f41f1ffad59963eead2ab5562 -R d015eff90d79dae7805d6393f409ae2c +P a9e0354c992b0287608ddd18fd35fe7e6102a8f293d6e6e1b3488644bcda8168 +R 12c631b55f929cadc9a16f06264f1b7b U dan -Z 4676afd3b05e3706903e7277aaa2fd67 +Z 065a161e87fc20e8a08ebf4d8e684dfd diff --git a/manifest.uuid b/manifest.uuid index 9f6809bcbc..8cac8f6c9a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a9e0354c992b0287608ddd18fd35fe7e6102a8f293d6e6e1b3488644bcda8168 \ No newline at end of file +ab09ef427181130be09a087b7e572ad4cfb6b3e1b459769ee5ebf046b3ead682 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 327027f02c..d262d97c1a 100644 --- a/src/select.c +++ b/src/select.c @@ -313,7 +313,8 @@ static int tableAndColumnIndex( int N, /* Number of tables in pSrc->a[] to search */ const char *zCol, /* Name of the column we are looking for */ int *piTab, /* Write index of pSrc->a[] here */ - int *piCol /* Write index of pSrc->a[*piTab].pTab->aCol[] here */ + int *piCol, /* Write index of pSrc->a[*piTab].pTab->aCol[] here */ + int bIgnoreHidden /* True to ignore hidden columns */ ){ int i; /* For looping over tables in pSrc */ int iCol; /* Index of column matching zCol */ @@ -321,7 +322,9 @@ static int tableAndColumnIndex( assert( (piTab==0)==(piCol==0) ); /* Both or neither are NULL */ for(i=0; ia[i].pTab, zCol); - if( iCol>=0 ){ + if( iCol>=0 + && (bIgnoreHidden==0 || IsHiddenColumn(&pSrc->a[i].pTab->aCol[iCol])==0) + ){ if( piTab ){ *piTab = i; *piCol = iCol; @@ -486,10 +489,11 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ int iLeft; /* Matching left table */ int iLeftCol; /* Matching column in the left table */ + if( IsHiddenColumn(&pRightTab->aCol[j]) ) continue; zName = pRightTab->aCol[j].zName; - if( tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol) ){ + if( tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol, 1) ){ addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, j, - isOuter, &p->pWhere); + isOuter, &p->pWhere); } } } @@ -529,7 +533,7 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ zName = pList->a[j].zName; iRightCol = columnIndex(pRightTab, zName); if( iRightCol<0 - || !tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol) + || !tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol, 0) ){ sqlite3ErrorMsg(pParse, "cannot join using column %s - column " "not present in both tables", zName); @@ -5087,7 +5091,7 @@ static int selectExpander(Walker *pWalker, Select *p){ if( i>0 && zTName==0 ){ if( (pFrom->fg.jointype & JT_NATURAL)!=0 - && tableAndColumnIndex(pTabList, i, zName, 0, 0) + && tableAndColumnIndex(pTabList, i, zName, 0, 0, 1) ){ /* In a NATURAL join, omit the join columns from the ** table to the right of the join */ From 8d95ed789e7105713996f981fbb37e9e132f7626 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 30 Dec 2019 20:42:17 +0000 Subject: [PATCH 116/120] Fix a typo in a comment. No changes to code. FossilOrigin-Name: d4813a8d813f234e819f8ebefbd3ff96d3d69593cc7d716cf0ad6c1a126da827 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 6e0bf6dbe3..0862ad858b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\suse\sHIDDEN\scolumns\sfor\sNATURAL\sjoins.\sFix\sfor\s[7c0e06b16]. -D 2019-12-30T14:32:27.220 +C Fix\sa\stypo\sin\sa\scomment.\s\sNo\schanges\sto\scode. +D 2019-12-30T20:42:17.433 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -528,7 +528,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c e231da7dd307f99772c40e76096abaf05c6fedcb4f1f045de23a61c194df6da6 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 71234f813ccb9dc5bc6f3cd365a64bcadf7fc4100adcf201ded96cae8fe33d87 +F src/select.c 2a753ec714703c32e4aade5b0115033bbee8a377b215cb0fbe88ab2fa4b3e028 F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817ded F src/sqlite.h.in 51f69c62ba3e980aca1e39badcaf9ad13f008774fe1bb8e7f57e3e456c656670 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a9e0354c992b0287608ddd18fd35fe7e6102a8f293d6e6e1b3488644bcda8168 -R 12c631b55f929cadc9a16f06264f1b7b -U dan -Z 065a161e87fc20e8a08ebf4d8e684dfd +P ab09ef427181130be09a087b7e572ad4cfb6b3e1b459769ee5ebf046b3ead682 +R 4a6240a737256a34f6c9e47fee5dc4f4 +U drh +Z 885cb237882e96af1684f4dbf78e7a24 diff --git a/manifest.uuid b/manifest.uuid index 8cac8f6c9a..6d1479701b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ab09ef427181130be09a087b7e572ad4cfb6b3e1b459769ee5ebf046b3ead682 \ No newline at end of file +d4813a8d813f234e819f8ebefbd3ff96d3d69593cc7d716cf0ad6c1a126da827 \ No newline at end of file diff --git a/src/select.c b/src/select.c index d262d97c1a..247ccfbaae 100644 --- a/src/select.c +++ b/src/select.c @@ -3858,7 +3858,7 @@ static int flattenSubquery( if( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))!=0 /* (17b) */ || (pSub1->pPrior && pSub1->op!=TK_ALL) /* (17a) */ || pSub1->pSrc->nSrc<1 /* (17c) */ - || pSub1->pWin /* (17d) */ + || pSub1->pWin /* (17e) */ ){ return 0; } From 2b173b93fc95656d927fe085c9cefb2ee4554157 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 30 Dec 2019 20:42:53 +0000 Subject: [PATCH 117/120] Put a NEVER() on a defensive branch. FossilOrigin-Name: 40d10e7aad5b899206e45d1f8606470a90a07049e15d94c3811cfe695f3a402e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 0862ad858b..4787ab53ec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stypo\sin\sa\scomment.\s\sNo\schanges\sto\scode. -D 2019-12-30T20:42:17.433 +C Put\sa\sNEVER()\son\sa\sdefensive\sbranch. +D 2019-12-30T20:42:53.391 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,7 +480,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 3584e19c222f94cd0bb9070318ad270c3ca0d4fe235a6f70a198f16d8faf976f +F src/expr.c e3bfa38e343dd9181aca4b08f989738200ff6663fcb701c70e93b787ff1e0ddb F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ab09ef427181130be09a087b7e572ad4cfb6b3e1b459769ee5ebf046b3ead682 -R 4a6240a737256a34f6c9e47fee5dc4f4 +P d4813a8d813f234e819f8ebefbd3ff96d3d69593cc7d716cf0ad6c1a126da827 +R 7c7e328613a2e7bad0a7dbaa467cbb02 U drh -Z 885cb237882e96af1684f4dbf78e7a24 +Z 34edcc088b28c8be45bf2b31cacb6cd0 diff --git a/manifest.uuid b/manifest.uuid index 6d1479701b..bdc8c69972 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d4813a8d813f234e819f8ebefbd3ff96d3d69593cc7d716cf0ad6c1a126da827 \ No newline at end of file +40d10e7aad5b899206e45d1f8606470a90a07049e15d94c3811cfe695f3a402e \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index e0a03d956f..b7be52dc2f 100644 --- a/src/expr.c +++ b/src/expr.c @@ -594,7 +594,7 @@ static void codeVectorCompare( int addrDone = sqlite3VdbeMakeLabel(pParse); int isCommuted = ExprHasProperty(pExpr,EP_Commuted); - if( pParse->nErr ) return; + if( NEVER(pParse->nErr) ) return; if( nLeft!=sqlite3ExprVectorSize(pRight) ){ sqlite3ErrorMsg(pParse, "row value misused"); return; From 0b973c8bffd6686ea9c34c016f361f95719b1190 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 30 Dec 2019 23:41:59 +0000 Subject: [PATCH 118/120] Add an ALWAYS() to a conditional which is apparently always true. FossilOrigin-Name: ea44c607b8038999a6bda4d761d95056aa4058d6c2891b7eee0715a50e703490 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 4787ab53ec..663513ead7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Put\sa\sNEVER()\son\sa\sdefensive\sbranch. -D 2019-12-30T20:42:53.391 +C Add\san\sALWAYS()\sto\sa\sconditional\swhich\sis\sapparently\salways\strue. +D 2019-12-30T23:41:59.425 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -472,7 +472,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c f191aa4d99597a1ad77cb15a9473f1183f2a12a7f1650a7705eaac9085e493bb F src/btree.h 6111552f19ed7a40f029cf4b33badc6fef9880314fffd80a945f0b7f43ab7471 F src/btreeInt.h 6794084fad08c9750b45145743c0e3e5c27c94dee89f26dd8df7073314934fd2 -F src/build.c 5aa8776d926954f13ddc37144c765ff8d80e49b74432c0f5a10f29433f0d69a8 +F src/build.c e63db6c6ceee67aa2dc7fe1b515f013a579bdecae22057d24ba2ec225920ce63 F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d4813a8d813f234e819f8ebefbd3ff96d3d69593cc7d716cf0ad6c1a126da827 -R 7c7e328613a2e7bad0a7dbaa467cbb02 +P 40d10e7aad5b899206e45d1f8606470a90a07049e15d94c3811cfe695f3a402e +R aa5bb4045459c7f606ee53e4249654f3 U drh -Z 34edcc088b28c8be45bf2b31cacb6cd0 +Z 1a7ba8606ff1703aee99c8e566e0a179 diff --git a/manifest.uuid b/manifest.uuid index bdc8c69972..8bc8e822b4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -40d10e7aad5b899206e45d1f8606470a90a07049e15d94c3811cfe695f3a402e \ No newline at end of file +ea44c607b8038999a6bda4d761d95056aa4058d6c2891b7eee0715a50e703490 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 1188d24524..d05871689e 100644 --- a/src/build.c +++ b/src/build.c @@ -2638,7 +2638,7 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ sqlite3ColumnsFromExprList(pParse, pTable->pCheck, &pTable->nCol, &pTable->aCol); if( db->mallocFailed==0 - && pParse->nErr==0 + && ALWAYS(pParse->nErr==0) && pTable->nCol==pSel->pEList->nExpr ){ sqlite3SelectAddColumnTypeAndCollation(pParse, pTable, pSel, From 70d6b8327a70a34644a65e9c2166d35a24787b4f Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 30 Dec 2019 23:50:19 +0000 Subject: [PATCH 119/120] Back out the NEVER() from check-in [40d10e7aad5b8992] because it is reachable after all. Ticket [892575cdba4e1e36] FossilOrigin-Name: f481636f1a0333c6e98906e5d4433bf1d046380bc29c760e8e7e2c2b3530b956 --- manifest | 15 ++++++++------- manifest.uuid | 2 +- src/expr.c | 2 +- test/rowvalue.test | 9 +++++++-- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 663513ead7..9dc48272fc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\san\sALWAYS()\sto\sa\sconditional\swhich\sis\sapparently\salways\strue. -D 2019-12-30T23:41:59.425 +C Back\sout\sthe\sNEVER()\sfrom\scheck-in\s[40d10e7aad5b8992]\sbecause\sit\sis\sreachable\nafter\sall.\sTicket\s[892575cdba4e1e36] +D 2019-12-30T23:50:19.979 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,7 +480,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c e3bfa38e343dd9181aca4b08f989738200ff6663fcb701c70e93b787ff1e0ddb +F src/expr.c 3584e19c222f94cd0bb9070318ad270c3ca0d4fe235a6f70a198f16d8faf976f F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1265,7 +1265,7 @@ F test/round1.test 768018b04522ca420b1aba8a24bd76091d269f3bce3902af3ec6ebcee41ab F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81 F test/rowid.test bfbd7b97d9267660be3c8f28507c4ed7f205196b8877c0db42df347c2e8845e3 -F test/rowvalue.test c39cc0be5e33f5294fc9224216198d6709d713ea948fdf8f42d89568e97912c9 +F test/rowvalue.test 8964f95b253d3b5cc8dc1cfd0cdb7529bce3ecc6b6259e23c5f829f80f4d51cd F test/rowvalue2.test 060d238b7e5639a7c5630cb5e63e311b44efef2b F test/rowvalue3.test 3068f508753af69884b12125995f023da0dbb256 F test/rowvalue4.test 02e35f7762371c2f57ebd856aa056eac56cb27ef7715a0bb31eac1895a745356 @@ -1853,7 +1853,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 40d10e7aad5b899206e45d1f8606470a90a07049e15d94c3811cfe695f3a402e -R aa5bb4045459c7f606ee53e4249654f3 +P ea44c607b8038999a6bda4d761d95056aa4058d6c2891b7eee0715a50e703490 +Q -40d10e7aad5b899206e45d1f8606470a90a07049e15d94c3811cfe695f3a402e +R fb8caaf3c1f7f4ac274fedc1a2aaaab0 U drh -Z 1a7ba8606ff1703aee99c8e566e0a179 +Z 49bc6be55a18b187cf6676db3f8cc0a3 diff --git a/manifest.uuid b/manifest.uuid index 8bc8e822b4..fe39121793 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ea44c607b8038999a6bda4d761d95056aa4058d6c2891b7eee0715a50e703490 \ No newline at end of file +f481636f1a0333c6e98906e5d4433bf1d046380bc29c760e8e7e2c2b3530b956 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index b7be52dc2f..e0a03d956f 100644 --- a/src/expr.c +++ b/src/expr.c @@ -594,7 +594,7 @@ static void codeVectorCompare( int addrDone = sqlite3VdbeMakeLabel(pParse); int isCommuted = ExprHasProperty(pExpr,EP_Commuted); - if( NEVER(pParse->nErr) ) return; + if( pParse->nErr ) return; if( nLeft!=sqlite3ExprVectorSize(pRight) ){ sqlite3ErrorMsg(pParse, "row value misused"); return; diff --git a/test/rowvalue.test b/test/rowvalue.test index f0a32b18c7..e3b66a1096 100644 --- a/test/rowvalue.test +++ b/test/rowvalue.test @@ -636,7 +636,12 @@ do_execsql_test 26.30 { SELECT 3 FROM t1 LEFT JOIN t0 WHERE (c0, x'') != (NULL, 0); } {3} - - +# 2019-12-30 ticket 892575cdba4e1e36 +# +reset_db +do_catchsql_test 27.10 { + CREATE TABLE t0(c0 CHECK(((0, 0) > (0, c0)))); + INSERT INTO t0(c0) VALUES(0) ON CONFLICT(c0) DO UPDATE SET c0 = 3; +} {1 {ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint}} finish_test From 02ff747bc0a6039cddf6108719426d247026fa18 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 31 Dec 2019 12:18:24 +0000 Subject: [PATCH 120/120] The OP_ResultRow opcode releases the SCopy dependences on all its registers, as the values in those registers will not be reused. FossilOrigin-Name: 1dc83c5d54ca2890112e735e336c209adb8d067d2f647e9f8ae5d58f84a52461 --- manifest | 15 +++++++-------- manifest.uuid | 2 +- src/vdbe.c | 9 +++++++++ test/whereG.test | 12 ++++++++++-- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 9dc48272fc..9a5ab15bd7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Back\sout\sthe\sNEVER()\sfrom\scheck-in\s[40d10e7aad5b8992]\sbecause\sit\sis\sreachable\nafter\sall.\sTicket\s[892575cdba4e1e36] -D 2019-12-30T23:50:19.979 +C The\sOP_ResultRow\sopcode\sreleases\sthe\sSCopy\sdependences\son\sall\sits\sregisters,\nas\sthe\svalues\sin\sthose\sregisters\swill\snot\sbe\sreused. +D 2019-12-31T12:18:24.111 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -600,7 +600,7 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 28132ce0a4f415a2533c5eea047aa671f8afb99bcf98b88f37d72150af6f3351 +F src/vdbe.c 119ddfe16b35fbaaf5460c9b58a8eeb0cc5d43058342af36925411dfc73f9862 F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -1700,7 +1700,7 @@ F test/whereC.test cae295158703cb3fc23bf1a108a9ab730efff0f6 F test/whereD.test 711d4df58d6d4fb9b3f5ce040b818564198be002 F test/whereE.test b3a055eef928c992b0a33198a7b8dc10eea5ad2f F test/whereF.test 3d9412b1199d3e2bed34fcb76b4c48d0bf4df95d27e3f8dd27b6f8b4716d0d89 -F test/whereG.test 4cda56de49f0c7d9a4f2590a3ddc5f79a7f2a03d2229d0f5bb5d3981ce57f293 +F test/whereG.test c9378b285828754377ef47fbece7264018c0a3743e7eb686e89917bb9df10885 F test/whereH.test e4b07f7a3c2f5d31195cd33710054c78667573b2 F test/whereI.test a2874062140ed4aba9ffae76e6190a3df6fc73d1373fdfa8fd632945082a5364 F test/whereJ.test 88287550f6ee604422403b053455b1ad894eeaa5c35d348532dfa1439286cb9a @@ -1853,8 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ea44c607b8038999a6bda4d761d95056aa4058d6c2891b7eee0715a50e703490 -Q -40d10e7aad5b899206e45d1f8606470a90a07049e15d94c3811cfe695f3a402e -R fb8caaf3c1f7f4ac274fedc1a2aaaab0 +P f481636f1a0333c6e98906e5d4433bf1d046380bc29c760e8e7e2c2b3530b956 +R 15ea7376c617491daf567615a28d64b4 U drh -Z 49bc6be55a18b187cf6676db3f8cc0a3 +Z 7a15f49ce421e16279acd3846b3f186d diff --git a/manifest.uuid b/manifest.uuid index fe39121793..a743f3e5e9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f481636f1a0333c6e98906e5d4433bf1d046380bc29c760e8e7e2c2b3530b956 \ No newline at end of file +1dc83c5d54ca2890112e735e336c209adb8d067d2f647e9f8ae5d58f84a52461 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 40e022d622..cc999a3ebb 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -1477,6 +1477,14 @@ case OP_ResultRow: { || (pMem[i].flags & (MEM_Str|MEM_Blob))==0 ); sqlite3VdbeMemNulTerminate(&pMem[i]); REGISTER_TRACE(pOp->p1+i, &pMem[i]); +#ifdef SQLITE_DEBUG + /* The registers in the result will not be used again when the + ** prepared statement restarts. This is because sqlite3_column() + ** APIs might have caused type conversions of made other changes to + ** the register values. Therefore, we can go ahead and break any + ** OP_SCopy dependencies. */ + pMem[i].pScopyFrom = 0; +#endif } if( db->mallocFailed ) goto no_mem; @@ -1484,6 +1492,7 @@ case OP_ResultRow: { db->xTrace(SQLITE_TRACE_ROW, db->pTraceArg, p, 0); } + /* Return SQLITE_ROW */ p->pc = (int)(pOp - aOp) + 1; diff --git a/test/whereG.test b/test/whereG.test index 595de116aa..9d4cde7b4d 100644 --- a/test/whereG.test +++ b/test/whereG.test @@ -306,7 +306,15 @@ do_execsql_test 8.10 { SELECT * FROM t0 WHERE likelihood(t0.rowid <= '0', 0.5); } {} - - +# 2019-12-31: assertion fault discovered by Yongheng's fuzzer. +# Harmless memIsValid() due to the code generators failure to +# release the registers used by OP_ResultRow. +# +do_execsql_test 9.10 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(a, b FLOAT); + INSERT INTO t1(a) VALUES(''),(NULL),('X'),(NULL); + SELECT coalesce(max(quote(a)),10) FROM t1 GROUP BY a; +} {NULL '' 'X'} finish_test