From 1a6bac0d2f9f5730410a72c0f7639873fc7ff452 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 25 Apr 2022 10:43:19 +0000 Subject: [PATCH 01/10] Remove NEVER() on branches formerly thought to unreachable (see check-in [71272caff5874137]) in order to fix the first bug reported by [forum:/forumpost/28821db852|forum post 28821db852]. FossilOrigin-Name: bd6811d8110d5f00596e2eff6d4b02af8b6d8557d41990e6f50518ead0fa01fb --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 8 ++------ 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 1ca4bb0e33..8fd0c5d678 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Prevent\sthe\sORDER\sBY\sLIMIT\soptimization\sfrom\srunning\sif\sthe\sinnermost\sloop\nis\sa\sright-join,\sas\sdoing\sso\swill\sget\san\sincorrect\sanswer. -D 2022-04-23T19:21:47.563 +C Remove\sNEVER()\son\sbranches\sformerly\sthought\sto\sunreachable\n(see\scheck-in\s[71272caff5874137])\sin\sorder\sto\sfix\sthe\sfirst\sbug\sreported\nby\s[forum:/forumpost/28821db852|forum\spost\s28821db852]. +D 2022-04-25T10:43:19.387 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -496,7 +496,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c df695e953c2ce78ce4878ee5016751df9bc9a921dc0500a0f53ab3bb3196e505 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e -F src/build.c 470be339e458a48456cb317ad207ab3cb68ace8b2d76625d2a7eace660fc9674 +F src/build.c 97d466af241420c09ef173a3ffdce01c586b74f61e9442b8c4a2a4fe9bb9110d F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 026dbdcdbd8c3cde98a88483ee88310ff43150ab164ad768f12cc700a11495ad @@ -1951,8 +1951,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 45fe919266ba1843f3eeeb511ab43126069d4976c9fc64e57e0390c21f110b6e -R 0a0603ff6c95cefd37960887000d010b +P 3aefc874d31885c64a5e02868edb2aa56a2b4429252d494e67e4088a9298ce5b +R 6dba55261ae795532633c33f57ad1712 U drh -Z d51b97788760f2ddfc9cd009c0f034c0 +Z 6c6a697026f7f5ef57340e9f97a907a3 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 5f63056501..52cb76b4ed 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3aefc874d31885c64a5e02868edb2aa56a2b4429252d494e67e4088a9298ce5b \ No newline at end of file +bd6811d8110d5f00596e2eff6d4b02af8b6d8557d41990e6f50518ead0fa01fb \ No newline at end of file diff --git a/src/build.c b/src/build.c index 8ae263fc3e..9468944ae1 100644 --- a/src/build.c +++ b/src/build.c @@ -172,9 +172,7 @@ void sqlite3FinishCoding(Parse *pParse){ int i; int reg; - if( NEVER(pReturning->nRetCol==0) ){ - assert( CORRUPT_DB ); - }else{ + if( pReturning->nRetCol ){ sqlite3VdbeAddOp0(v, OP_FkCheck); addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, pReturning->iRetCur); @@ -270,9 +268,7 @@ void sqlite3FinishCoding(Parse *pParse){ if( pParse->bReturning ){ Returning *pRet = pParse->u1.pReturning; - if( NEVER(pRet->nRetCol==0) ){ - assert( CORRUPT_DB ); - }else{ + if( pRet->nRetCol ){ sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRet->iRetCur, pRet->nRetCol); } } From 7f417569f7e8762d62993a14402ae1d14f248e8f Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 25 Apr 2022 14:49:48 +0000 Subject: [PATCH 02/10] Avoid unintended side-effects on Parse.nSelect in the sqlite3ViewGetColumnNames() routine. FossilOrigin-Name: 59789fe1e745bb6f81898176e7e9c6064ac9f4bbefb4dc3c8f3e4c1379568f69 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 7 ++++--- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 8fd0c5d678..7a9ad1dd31 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sNEVER()\son\sbranches\sformerly\sthought\sto\sunreachable\n(see\scheck-in\s[71272caff5874137])\sin\sorder\sto\sfix\sthe\sfirst\sbug\sreported\nby\s[forum:/forumpost/28821db852|forum\spost\s28821db852]. -D 2022-04-25T10:43:19.387 +C Avoid\sunintended\sside-effects\son\sParse.nSelect\sin\sthe\nsqlite3ViewGetColumnNames()\sroutine. +D 2022-04-25T14:49:48.098 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -496,7 +496,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c df695e953c2ce78ce4878ee5016751df9bc9a921dc0500a0f53ab3bb3196e505 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e -F src/build.c 97d466af241420c09ef173a3ffdce01c586b74f61e9442b8c4a2a4fe9bb9110d +F src/build.c e8e776b52bc145cbf4e9fb88b99830083880fc2b174c2f96518fff15cbc72396 F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 026dbdcdbd8c3cde98a88483ee88310ff43150ab164ad768f12cc700a11495ad @@ -1951,8 +1951,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 3aefc874d31885c64a5e02868edb2aa56a2b4429252d494e67e4088a9298ce5b -R 6dba55261ae795532633c33f57ad1712 +P bd6811d8110d5f00596e2eff6d4b02af8b6d8557d41990e6f50518ead0fa01fb +R 1736d98e99a4d046468766a1a31c6936 U drh -Z 6c6a697026f7f5ef57340e9f97a907a3 +Z b9e8c09744bf10f890ccfa1fbf1f1b9a # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 52cb76b4ed..7e90177ba2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bd6811d8110d5f00596e2eff6d4b02af8b6d8557d41990e6f50518ead0fa01fb \ No newline at end of file +59789fe1e745bb6f81898176e7e9c6064ac9f4bbefb4dc3c8f3e4c1379568f69 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 9468944ae1..fbd633209f 100644 --- a/src/build.c +++ b/src/build.c @@ -3055,7 +3055,6 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ Table *pSelTab; /* A fake table from which we get the result set */ Select *pSel; /* Copy of the SELECT that implements the view */ int nErr = 0; /* Number of errors encountered */ - int n; /* Temporarily holds the number of cursors assigned */ sqlite3 *db = pParse->db; /* Database connection for malloc errors */ #ifndef SQLITE_OMIT_VIRTUALTABLE int rc; @@ -3113,8 +3112,9 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ pSel = sqlite3SelectDup(db, pTable->u.view.pSelect, 0); if( pSel ){ u8 eParseMode = pParse->eParseMode; + int nTab = pParse->nTab; + int nSelect = pParse->nSelect; pParse->eParseMode = PARSE_MODE_NORMAL; - n = pParse->nTab; sqlite3SrcListAssignCursors(pParse, pSel->pSrc); pTable->nCol = -1; DisableLookaside; @@ -3126,7 +3126,8 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ #else pSelTab = sqlite3ResultSetOfSelect(pParse, pSel, SQLITE_AFF_NONE); #endif - pParse->nTab = n; + pParse->nTab = nTab; + pParse->nSelect = nSelect; if( pSelTab==0 ){ pTable->nCol = 0; nErr++; From 95fe38f2fc7468be6165552f8ef6bc85bcf1f358 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 25 Apr 2022 14:59:59 +0000 Subject: [PATCH 03/10] Add a new optimizer disabling bit to disable just the UNION ALL branch of the query flattener. FossilOrigin-Name: c0f9ebab5455d8541a562122d3270b95ce571c3fd870b0048dda2b036c2b66c0 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 1 + src/sqliteInt.h | 1 + 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 7a9ad1dd31..b24cf29d3b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sunintended\sside-effects\son\sParse.nSelect\sin\sthe\nsqlite3ViewGetColumnNames()\sroutine. -D 2022-04-25T14:49:48.098 +C Add\sa\snew\soptimizer\sdisabling\sbit\sto\sdisable\sjust\sthe\sUNION\sALL\sbranch\sof\sthe\nquery\sflattener. +D 2022-04-25T14:59:59.150 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -553,12 +553,12 @@ F src/printf.c 512574910a45341c8ad244bd3d4939968ebdfde215645b676fff01cc46e90757 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c f72bb13359dd5a74d440df25f320dc2c1baff5cde4fc9f0d1bc3feba90b8932a F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 92b3b250434de59fb87462dcdad79b456ae8ec82ae3194d4081ecb5af41ff0ec +F src/select.c ea203cd4f5d07443d7d25ae30fc0fb11b04ab9bd46a047ff5ebcb0abef63b4e9 F src/shell.c.in ae0a6fae983caac6f8c824733f0599dfdf7b3a7e8efdef3cb5e3ab2e457ffc35 F src/sqlite.h.in 2a35f62185eb5e7ecc64a2f68442b538ce9be74f80f28a00abc24837edcf1c17 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h f49e28c25bd941e79794db5415fdf7b202deb3bc072ed6f1ed273d578703684e -F src/sqliteInt.h 36b5d1cce15971fa71b53a950de3158197d85dbaf9b8b2f0bc6279347b09606a +F src/sqliteInt.h 2ed6fde4c3cd0438816f2b4597634067b11e430028b0e27b4be27736930d1739 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4a3da6d77eeb3531cb0dbdf7047772a2a1b99f98c69e90ce009c75fe6328b2c0 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1951,8 +1951,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 bd6811d8110d5f00596e2eff6d4b02af8b6d8557d41990e6f50518ead0fa01fb -R 1736d98e99a4d046468766a1a31c6936 +P 59789fe1e745bb6f81898176e7e9c6064ac9f4bbefb4dc3c8f3e4c1379568f69 +R 5dab58ddb6f58a52bd1b258cb5165dfd U drh -Z b9e8c09744bf10f890ccfa1fbf1f1b9a +Z 6423624c0497dbe7560341f194996237 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 7e90177ba2..6154315b41 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -59789fe1e745bb6f81898176e7e9c6064ac9f4bbefb4dc3c8f3e4c1379568f69 \ No newline at end of file +c0f9ebab5455d8541a562122d3270b95ce571c3fd870b0048dda2b036c2b66c0 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 5e90781eff..111e995cf1 100644 --- a/src/select.c +++ b/src/select.c @@ -4325,6 +4325,7 @@ static int flattenSubquery( if( pSrc->nSrc>1 ){ if( pParse->nSelect>500 ) return 0; + if( OptimizationDisabled(db, SQLITE_FlttnUnionAll) ) return 0; aCsrMap = sqlite3DbMallocZero(db, ((i64)pParse->nTab+1)*sizeof(int)); if( aCsrMap ) aCsrMap[0] = pParse->nTab; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index ec465cdb33..d396f24650 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1780,6 +1780,7 @@ struct sqlite3 { #define SQLITE_BloomPulldown 0x00100000 /* Run Bloom filters early */ #define SQLITE_BalancedMerge 0x00200000 /* Balance multi-way merges */ #define SQLITE_ReleaseReg 0x00400000 /* Use OP_ReleaseReg for testing */ +#define SQLITE_FlttnUnionAll 0x00800000 /* Disable the UNION ALL flattener */ #define SQLITE_AllOpts 0xffffffff /* All optimizations */ /* From a9cdb90421423503bdfb6c7b8a85754dd495ea7f Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 25 Apr 2022 19:40:33 +0000 Subject: [PATCH 04/10] Fix a problem with automatic indexes introduced by check-in [664b461bb5063d980] and reported by [forum:/forumpost/0d3200f4f3bcd3a3|forum post 0d3200f4f3bcd3a3]. FossilOrigin-Name: 7ca3456c00998a429418ff29cf251b381586b330b88344c94a40c5df0b71da85 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/expr.c | 36 ++++++++++++++++++++++++++++++++++++ src/select.c | 20 ++++++++++---------- src/sqliteInt.h | 1 + src/where.c | 6 ++---- test/autoindex1.test | 20 ++++++++++++++++++-- 7 files changed, 78 insertions(+), 27 deletions(-) diff --git a/manifest b/manifest index b24cf29d3b..d9200cb4ad 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\snew\soptimizer\sdisabling\sbit\sto\sdisable\sjust\sthe\sUNION\sALL\sbranch\sof\sthe\nquery\sflattener. -D 2022-04-25T14:59:59.150 +C Fix\sa\sproblem\swith\sautomatic\sindexes\sintroduced\sby\ncheck-in\s[664b461bb5063d980]\sand\sreported\sby\n[forum:/forumpost/0d3200f4f3bcd3a3|forum\spost\s0d3200f4f3bcd3a3]. +D 2022-04-25T19:40:33.982 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -504,7 +504,7 @@ F src/date.c 15082566229d4b1e5f24fdb490bf9bcc68824b911d70e3573ef075a1b9e2d26f F src/dbpage.c 90661a87e1db8bfbc8d2ebbdcd3749651ddb287c555c07a28fb17c7c591ffb68 F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c a8e844af211a48b13b5b358be77a12c860c6a557c21990ad51a548e2536500ce -F src/expr.c 06dfbfb7f469c00eba3c8a7e282765969fe7c772f235a365f51bfffcaa69fe7f +F src/expr.c 5d4178f8462ca55a38cefcfcdf9635030607e3532649c96de471afafeca732c4 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e F src/func.c a3407a6fbb0d4088d8d502e46f0ace63e0aeae7467ae23a9ca9815bbf9239761 @@ -553,12 +553,12 @@ F src/printf.c 512574910a45341c8ad244bd3d4939968ebdfde215645b676fff01cc46e90757 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c f72bb13359dd5a74d440df25f320dc2c1baff5cde4fc9f0d1bc3feba90b8932a F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c ea203cd4f5d07443d7d25ae30fc0fb11b04ab9bd46a047ff5ebcb0abef63b4e9 +F src/select.c e5772fb9c1b56a3e9ca688ea27303fc115d1cf336d68561ceee4145dfa2f36d9 F src/shell.c.in ae0a6fae983caac6f8c824733f0599dfdf7b3a7e8efdef3cb5e3ab2e457ffc35 F src/sqlite.h.in 2a35f62185eb5e7ecc64a2f68442b538ce9be74f80f28a00abc24837edcf1c17 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h f49e28c25bd941e79794db5415fdf7b202deb3bc072ed6f1ed273d578703684e -F src/sqliteInt.h 2ed6fde4c3cd0438816f2b4597634067b11e430028b0e27b4be27736930d1739 +F src/sqliteInt.h 11cd60560cd14bb6eecd04d244faf4c1895417b97d89e2f50833f83c4611588d F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4a3da6d77eeb3531cb0dbdf7047772a2a1b99f98c69e90ce009c75fe6328b2c0 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -640,7 +640,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c b9df133a705093da8977da5eb202eaadb844839f1c7297c08d33471f5491843d F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b -F src/where.c bd4895fbb6ac9cc5b772d191b93dd5a240a505e3113be9aee0dc8c957568dd41 +F src/where.c 43085b3a4ce2e56315fabb0b240a56e76667d9e03c79f287695bcae7b76152d5 F src/whereInt.h 4db5a877a9d1f38b5c928c1c84297c07f30b9a3bc1f5f66214cf1a8ef90a0556 F src/wherecode.c 55a33d9db1759970c30220904bcc628ba66a1ccb63b5437ef4642f7ea6267b03 F src/whereexpr.c 174d4ad5be165c610c907abb779ef4a97974d22b84e1ce7898d2d9f6947249e5 @@ -705,7 +705,7 @@ F test/auth2.test 9eb7fce9f34bf1f50d3f366fb3e606be5a2000a1 F test/auth3.test 76d20a7fa136d63bcfcf8bcb65c0b1455ed71078d81f22bcd0550d3eb18594ab F test/autoanalyze1.test b9cc3f32a990fa56669b668d237c6d53e983554ae80c0604992e18869a0b2dec F test/autoinc.test 997d6f185f138229dc4251583a1d04816423dddc2fc034871a01aeb1d728cb39 -F test/autoindex1.test 523b26034dc5e0c5ff0865055b4593f75863b82f17748dec9ca64bb8b267c502 +F test/autoindex1.test cdc336e80cfd586c0e09426d58bec412db7527ca22dfabe88eab690e3acbb406 F test/autoindex2.test 12ef578928102baaa0dc23ad397601a2f4ecb0df F test/autoindex3.test 2d13958a5617e987624a428d7aed91bf51f322b49b476e3573fadec697ce6da5 F test/autoindex4.test 5df39313526b6f22a26bd119bbd97ca69f28386ab3c671fc10568d921c41eb08 @@ -1951,8 +1951,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 59789fe1e745bb6f81898176e7e9c6064ac9f4bbefb4dc3c8f3e4c1379568f69 -R 5dab58ddb6f58a52bd1b258cb5165dfd +P c0f9ebab5455d8541a562122d3270b95ce571c3fd870b0048dda2b036c2b66c0 +R cb2c389ae944c4d6eaa6314dd1b0dc57 U drh -Z 6423624c0497dbe7560341f194996237 +Z 42d259eeea1f414b7f57e1057b3c3aee # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 6154315b41..a5c9464c8d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c0f9ebab5455d8541a562122d3270b95ce571c3fd870b0048dda2b036c2b66c0 \ No newline at end of file +7ca3456c00998a429418ff29cf251b381586b330b88344c94a40c5df0b71da85 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 1709876219..addd5794db 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2296,6 +2296,42 @@ int sqlite3ExprIsTableConstant(Expr *p, int iCur){ return exprIsConst(p, 3, iCur); } +/* +** Check pExpr to see if it is an invariant constraint on data source pSrc. +** This is an optimization. False negatives will perhaps cause slower +** queries, but false positives will yield incorrect answers. So when in +** double, return 0. +** +** To be an invariant constraint, the following must be true: +** +** (1) pExpr cannot refer to any table other than pSrc->iCursor. +** +** (2) pExpr cannot use subqueries or non-deterministic functions. +** +** (3) pSrc cannot be part of the left operand for a RIGHT JOIN. +** (Is there some way to relax this constraint?) +** +** (4) If pSrc is the right operand of a LEFT JOIN, then... +** (4a) pExpr must come from an ON clause.. + (4b) and specifically the ON clause associated with the LEFT JOIN. +** +** (5) If pSrc is not the right operand of a LEFT JOIN or the left +** operand of a RIGHT JOIN, then pExpr must be from the WHERE +** clause, not an ON clause. +*/ +int sqlite3ExprIsTableConstraint(Expr *pExpr, const SrcItem *pSrc){ + if( pSrc->fg.jointype & JT_LTORJ ){ + return 0; /* rule (3) */ + } + if( pSrc->fg.jointype & JT_LEFT ){ + if( !ExprHasProperty(pExpr, EP_FromJoin) ) return 0; /* rule (4a) */ + if( pExpr->w.iJoin!=pSrc->iCursor ) return 0; /* rule (4b) */ + }else{ + if( ExprHasProperty(pExpr, EP_FromJoin) ) return 0; /* rule (5) */ + } + return sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor); /* rules (1), (2) */ +} + /* ** sqlite3WalkExpr() callback used by sqlite3ExprIsConstantOrGroupBy(). diff --git a/src/select.c b/src/select.c index 111e995cf1..5249c1f728 100644 --- a/src/select.c +++ b/src/select.c @@ -4954,8 +4954,7 @@ static int pushDownWhereTerms( Parse *pParse, /* Parse context (for malloc() and error reporting) */ Select *pSubq, /* The subquery whose WHERE clause is to be augmented */ Expr *pWhere, /* The WHERE clause of the outer query */ - int iCursor, /* Cursor number of the subquery */ - int isLeftJoin /* True if pSubq is the right term of a LEFT JOIN */ + SrcItem *pSrc /* The subquery term of the outer FROM clause */ ){ Expr *pNew; int nChng = 0; @@ -4990,10 +4989,11 @@ static int pushDownWhereTerms( return 0; /* restriction (3) */ } while( pWhere->op==TK_AND ){ - nChng += pushDownWhereTerms(pParse, pSubq, pWhere->pRight, - iCursor, isLeftJoin); + nChng += pushDownWhereTerms(pParse, pSubq, pWhere->pRight, pSrc); pWhere = pWhere->pLeft; } + +#if 0 /* Legacy code. Checks now done by sqlite3ExprIsTableConstraint() */ if( isLeftJoin && (ExprHasProperty(pWhere,EP_FromJoin)==0 || pWhere->w.iJoin!=iCursor) @@ -5005,7 +5005,9 @@ static int pushDownWhereTerms( ){ return 0; /* restriction (5) */ } - if( sqlite3ExprIsTableConstant(pWhere, iCursor) ){ +#endif + + if( sqlite3ExprIsTableConstant(pWhere, pSrc->iCursor) ){ nChng++; pSubq->selFlags |= SF_PushDown; while( pSubq ){ @@ -5013,8 +5015,8 @@ static int pushDownWhereTerms( pNew = sqlite3ExprDup(pParse->db, pWhere, 0); unsetJoinExpr(pNew, -1); x.pParse = pParse; - x.iTable = iCursor; - x.iNewTable = iCursor; + x.iTable = pSrc->iCursor; + x.iNewTable = pSrc->iCursor; x.isOuterJoin = 0; x.pEList = pSubq->pEList; pNew = substExpr(&x, pNew); @@ -6840,9 +6842,7 @@ int sqlite3Select( if( OptimizationEnabled(db, SQLITE_PushDown) && (pItem->fg.isCte==0 || (pItem->u2.pCteUse->eM10d!=M10d_Yes && pItem->u2.pCteUse->nUse<2)) - && (pItem->fg.jointype & JT_RIGHT)==0 - && pushDownWhereTerms(pParse, pSub, p->pWhere, pItem->iCursor, - (pItem->fg.jointype & JT_OUTER)!=0) + && pushDownWhereTerms(pParse, pSub, p->pWhere, pItem) ){ #if TREETRACE_ENABLED if( sqlite3TreeTrace & 0x100 ){ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d396f24650..d799510fc0 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4752,6 +4752,7 @@ int sqlite3ExprIsConstantNotJoin(Expr*); int sqlite3ExprIsConstantOrFunction(Expr*, u8); int sqlite3ExprIsConstantOrGroupBy(Parse*, Expr*, ExprList*); int sqlite3ExprIsTableConstant(Expr*,int); +int sqlite3ExprIsTableConstraint(Expr*,const SrcItem*); #ifdef SQLITE_ENABLE_CURSOR_HINTS int sqlite3ExprContainsSubquery(Expr*); #endif diff --git a/src/where.c b/src/where.c index d6c023941c..2750d93584 100644 --- a/src/where.c +++ b/src/where.c @@ -832,9 +832,7 @@ static SQLITE_NOINLINE void constructAutomaticIndex( ** WHERE clause (or the ON clause of a LEFT join) that constrain which ** rows of the target table (pSrc) that can be used. */ if( (pTerm->wtFlags & TERM_VIRTUAL)==0 - && ((pSrc->fg.jointype&(JT_LEFT|JT_LTORJ))==0 - || ExprHasProperty(pExpr,EP_FromJoin)) - && sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor) + && sqlite3ExprIsTableConstraint(pExpr, pSrc) ){ pPartial = sqlite3ExprAnd(pParse, pPartial, sqlite3ExprDup(pParse->db, pExpr, 0)); @@ -1073,7 +1071,7 @@ static SQLITE_NOINLINE void sqlite3ConstructBloomFilter( for(pTerm=pWInfo->sWC.a; pTermpExpr; if( (pTerm->wtFlags & TERM_VIRTUAL)==0 - && sqlite3ExprIsTableConstant(pExpr, iCur) + && sqlite3ExprIsTableConstraint(pExpr, pItem) ){ sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL); } diff --git a/test/autoindex1.test b/test/autoindex1.test index 2cd4900400..4b290c7961 100644 --- a/test/autoindex1.test +++ b/test/autoindex1.test @@ -542,7 +542,23 @@ do_execsql_test autoindex1-1020 { SELECT count(*) FROM t11 LEFT JOIN t12 WHERE t12.y IS t11.w; } 0 - - +# 2022-04-25 +# https://sqlite.org/forum/forumpost/0d3200f4f3bcd3a3 +# +reset_db +do_execsql_test autoindex-1100 { + CREATE TABLE t1(a INT, b INT); + CREATE TABLE t2(c INT, d INT); + CREATE TABLE t3(e TEXT, f TEXT); + INSERT INTO t1 VALUES(1, 1); + INSERT INTO t2 VALUES(1, 2); + INSERT INTO t3 VALUES('abc', 'def'); +} {} +do_execsql_test autoindex-1110 { + SELECT * FROM t1, t2 LEFT JOIN t3 ON (t2.d=1) WHERE t2.c = +t1.a; +} {1 1 1 2 {} {}} +do_execsql_test autoindex-1120 { + SELECT * FROM t1 LEFT JOIN t2 ON (t2.c=+t1.a) LEFT JOIN t3 ON (t2.d IS NULL); +} {1 1 1 2 {} {}} finish_test From 5eb6e09795507d7a435228229bee0aa90791aa18 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 25 Apr 2022 20:38:42 +0000 Subject: [PATCH 05/10] The pushDownWhereTerms() routine should be using sqlite3ExprIsTableConstraint(), not sqlite3ExprIsTableConstant(). This fixes many problems, but still an error persists in join7.test. FossilOrigin-Name: 10bf0e613809f71cc1a47ad40b517e2a66671212a6464e179c9d377e8b70d499 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index d9200cb4ad..83dab85af9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sautomatic\sindexes\sintroduced\sby\ncheck-in\s[664b461bb5063d980]\sand\sreported\sby\n[forum:/forumpost/0d3200f4f3bcd3a3|forum\spost\s0d3200f4f3bcd3a3]. -D 2022-04-25T19:40:33.982 +C The\spushDownWhereTerms()\sroutine\sshould\sbe\susing\nsqlite3ExprIsTableConstraint(),\snot\ssqlite3ExprIsTableConstant().\s\sThis\sfixes\nmany\sproblems,\sbut\sstill\san\serror\spersists\sin\sjoin7.test. +D 2022-04-25T20:38:42.383 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -553,7 +553,7 @@ F src/printf.c 512574910a45341c8ad244bd3d4939968ebdfde215645b676fff01cc46e90757 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c f72bb13359dd5a74d440df25f320dc2c1baff5cde4fc9f0d1bc3feba90b8932a F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c e5772fb9c1b56a3e9ca688ea27303fc115d1cf336d68561ceee4145dfa2f36d9 +F src/select.c 0ee60363b0bc5e4c0cc9fc2e0a6d76e5d0d2eb756d691e302800bebf16439ec4 F src/shell.c.in ae0a6fae983caac6f8c824733f0599dfdf7b3a7e8efdef3cb5e3ab2e457ffc35 F src/sqlite.h.in 2a35f62185eb5e7ecc64a2f68442b538ce9be74f80f28a00abc24837edcf1c17 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1951,8 +1951,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 c0f9ebab5455d8541a562122d3270b95ce571c3fd870b0048dda2b036c2b66c0 -R cb2c389ae944c4d6eaa6314dd1b0dc57 +P 7ca3456c00998a429418ff29cf251b381586b330b88344c94a40c5df0b71da85 +R e383c06c18e315aa0b232a51b37bdb01 U drh -Z 42d259eeea1f414b7f57e1057b3c3aee +Z b20e944a61d9ac254d588d9faa898773 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a5c9464c8d..66d3596648 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7ca3456c00998a429418ff29cf251b381586b330b88344c94a40c5df0b71da85 \ No newline at end of file +10bf0e613809f71cc1a47ad40b517e2a66671212a6464e179c9d377e8b70d499 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 5249c1f728..356f6477b4 100644 --- a/src/select.c +++ b/src/select.c @@ -5007,7 +5007,7 @@ static int pushDownWhereTerms( } #endif - if( sqlite3ExprIsTableConstant(pWhere, pSrc->iCursor) ){ + if( sqlite3ExprIsTableConstraint(pWhere, pSrc) ){ nChng++; pSubq->selFlags |= SF_PushDown; while( pSubq ){ From 0e464b5f513bef5b08da17988a47c8baa8b34b90 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 25 Apr 2022 20:47:58 +0000 Subject: [PATCH 06/10] Do not allow the push-down optimization on the right table of a RIGHT JOIN. FossilOrigin-Name: 05917bfa02a7b6678c147d10fb53f55532ab15fd5d82d925ae921ae3759f0115 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 83dab85af9..18fad4225b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\spushDownWhereTerms()\sroutine\sshould\sbe\susing\nsqlite3ExprIsTableConstraint(),\snot\ssqlite3ExprIsTableConstant().\s\sThis\sfixes\nmany\sproblems,\sbut\sstill\san\serror\spersists\sin\sjoin7.test. -D 2022-04-25T20:38:42.383 +C Do\snot\sallow\sthe\spush-down\soptimization\son\sthe\sright\stable\sof\sa\sRIGHT\sJOIN. +D 2022-04-25T20:47:58.298 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -553,7 +553,7 @@ F src/printf.c 512574910a45341c8ad244bd3d4939968ebdfde215645b676fff01cc46e90757 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c f72bb13359dd5a74d440df25f320dc2c1baff5cde4fc9f0d1bc3feba90b8932a F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 0ee60363b0bc5e4c0cc9fc2e0a6d76e5d0d2eb756d691e302800bebf16439ec4 +F src/select.c cc1a7581403fc074eee85283ba8d81de50a831ae175cb65a5751be00f621c0d5 F src/shell.c.in ae0a6fae983caac6f8c824733f0599dfdf7b3a7e8efdef3cb5e3ab2e457ffc35 F src/sqlite.h.in 2a35f62185eb5e7ecc64a2f68442b538ce9be74f80f28a00abc24837edcf1c17 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1951,8 +1951,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 7ca3456c00998a429418ff29cf251b381586b330b88344c94a40c5df0b71da85 -R e383c06c18e315aa0b232a51b37bdb01 +P 10bf0e613809f71cc1a47ad40b517e2a66671212a6464e179c9d377e8b70d499 +R 8764866988e0da227134244ae6ff31d7 U drh -Z b20e944a61d9ac254d588d9faa898773 +Z bf16933ceb0da28b71dd4050f0adc6a6 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 66d3596648..361d84d949 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -10bf0e613809f71cc1a47ad40b517e2a66671212a6464e179c9d377e8b70d499 \ No newline at end of file +05917bfa02a7b6678c147d10fb53f55532ab15fd5d82d925ae921ae3759f0115 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 356f6477b4..e0f93a1012 100644 --- a/src/select.c +++ b/src/select.c @@ -4960,6 +4960,7 @@ static int pushDownWhereTerms( int nChng = 0; if( pWhere==0 ) return 0; if( pSubq->selFlags & (SF_Recursive|SF_MultiPart) ) return 0; + if( pSrc->fg.jointype & (JT_LTORJ|JT_RIGHT) ) return 0; #ifndef SQLITE_OMIT_WINDOWFUNC if( pSubq->pPrior ){ From 5487cdcc0a74b811c5ea50625943d83d0b4c052b Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 26 Apr 2022 19:16:11 +0000 Subject: [PATCH 07/10] Update corruptL.test so that it works with SQLITE_ENABLE_OVERSIZE_CELL_CHECK builds. FossilOrigin-Name: b1bec72043f798f4d4d30e6b60a45ed4dc521115c8a9f97bb8228e3f089deefb --- manifest | 15 +++++++-------- manifest.uuid | 2 +- test/corruptL.test | 6 +++++- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 53d80cd62f..9c6009d8db 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sautomatic\sindexes\sintroduced\sby\ncheck-in\s[664b461bb5063d980]\sand\sreported\sby\n[forum:/forumpost/0d3200f4f3bcd3a3|forum\spost\s0d3200f4f3bcd3a3]. -D 2022-04-25T20:56:55.290 +C Update\scorruptL.test\sso\sthat\sit\sworks\swith\sSQLITE_ENABLE_OVERSIZE_CELL_CHECK\sbuilds. +D 2022-04-26T19:16:11.042 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -815,7 +815,7 @@ F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 F test/corruptK.test 5b4212fe346699831c5ad559a62c54e11c0611bdde1ea8423a091f9c01aa32af -F test/corruptL.test 21a951d1eb09120f3c1561af5bac30ed49be2d9dfcad039f71759c5d9e28a349 +F test/corruptL.test ecce40d7b9b909a670a42a45d86e30d927735d7e7f09041af438b19529d35532 F test/corruptM.test 7d574320e08c1b36caa3e47262061f186367d593a7e305d35f15289cc2c3e067 F test/corruptN.test 60b5a62944b4f0029ba07edaa5fd8e670539d6b0a8d99db26c068d435675cbfe F test/cost.test b11cdbf9f11ffe8ef99c9881bf390e61fe92baf2182bad1dbe6de59a7295c576 @@ -1951,9 +1951,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 c0f9ebab5455d8541a562122d3270b95ce571c3fd870b0048dda2b036c2b66c0 05917bfa02a7b6678c147d10fb53f55532ab15fd5d82d925ae921ae3759f0115 -R 8764866988e0da227134244ae6ff31d7 -T +closed 05917bfa02a7b6678c147d10fb53f55532ab15fd5d82d925ae921ae3759f0115 -U drh -Z 79f75ad88ffd5089cb0059313ed9c927 +P 134cfb18ff930e4bccc1a7412a02be353bf67c6d5080bc0673afaac81afa889c +R befb1f523df3bca906a42f846ff7dead +U dan +Z e8552be406f4e283f43139c97e8f16c9 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 75514fbf2b..8d5d3327b9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -134cfb18ff930e4bccc1a7412a02be353bf67c6d5080bc0673afaac81afa889c \ No newline at end of file +b1bec72043f798f4d4d30e6b60a45ed4dc521115c8a9f97bb8228e3f089deefb \ No newline at end of file diff --git a/test/corruptL.test b/test/corruptL.test index eef91b7747..7361a0b35e 100644 --- a/test/corruptL.test +++ b/test/corruptL.test @@ -1480,8 +1480,12 @@ do_execsql_test 19.1 { PRAGMA writable_schema=ON; } +set err "UNIQUE constraint failed: index 'a'" +ifcapable oversize_cell_check { + set err "database disk image is malformed" +} do_catchsql_test 19.2 { UPDATE t1 SET a=1; -} {1 {UNIQUE constraint failed: index 'a'}} +} [list 1 $err] finish_test From 9684d71081fd07cd79f2738f7bfd83cde3aa49a0 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 27 Apr 2022 13:33:48 +0000 Subject: [PATCH 08/10] Fix a test problem in rbubusy.test causing a crash under some circumstances. FossilOrigin-Name: bc5bbd9fa636cc9ef0cbbc0600b8fc1404b9732670ac4e7a8b5a230fbce758d5 --- ext/rbu/rbubusy.test | 5 +++++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/ext/rbu/rbubusy.test b/ext/rbu/rbubusy.test index a16b85ff96..8cc47db8f9 100644 --- a/ext/rbu/rbubusy.test +++ b/ext/rbu/rbubusy.test @@ -79,4 +79,9 @@ do_test 1.7 { rbu close +db close +sqlite3_shutdown +test_sqlite3_log +sqlite3_initialize finish_test + diff --git a/manifest b/manifest index 9c6009d8db..5d25cfd023 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\scorruptL.test\sso\sthat\sit\sworks\swith\sSQLITE_ENABLE_OVERSIZE_CELL_CHECK\sbuilds. -D 2022-04-26T19:16:11.042 +C Fix\sa\stest\sproblem\sin\srbubusy.test\scausing\sa\scrash\sunder\ssome\scircumstances. +D 2022-04-27T13:33:48.684 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -358,7 +358,7 @@ F ext/rbu/rbuA.test b34a90cb495682c25b5fc03a9d5e7a4fc99541c29256f25e2e2a4f6542b4 F ext/rbu/rbuB.test 52b07158824c6927b7e25554ace92a695cdebfc296ae3d308ac386984aded9bc F ext/rbu/rbuC.test 80f1cc2fb74f44b1128fd0ed8eedab3a76fefeb72a947860e2869ef76fc8dc6b F ext/rbu/rbu_common.tcl 60d904133ff843fe72cc0514e9dd2486707181e6e0fbab20979da28c48d21de9 -F ext/rbu/rbubusy.test 35a6ad081b374281f728b26264ef4f0b0e7888ccb5ace1843aed30ed99c2e1ca +F ext/rbu/rbubusy.test f38ef557358564491b8a2ee70e4cad31e40fcea57a16f27bc56ba40a59bbde50 F ext/rbu/rbucollate.test cac528a9a46318cba42e61258bb42660bbbf4fdb9a8c863de5a54ad0c658d197 F ext/rbu/rbucrash.test 000981a1fe8a6e4d9a684232f6a129e66a3ef595f5ed74655e2f9c68ffa613b4 F ext/rbu/rbucrash2.test efa143cc94228eb0266d3f1abfbee60a5838a84cef7cc3fcb8c145b74d96fd41 @@ -1951,8 +1951,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 134cfb18ff930e4bccc1a7412a02be353bf67c6d5080bc0673afaac81afa889c -R befb1f523df3bca906a42f846ff7dead +P b1bec72043f798f4d4d30e6b60a45ed4dc521115c8a9f97bb8228e3f089deefb +R f8e9d661e065b7babfd72a5655e4ad71 U dan -Z e8552be406f4e283f43139c97e8f16c9 +Z 3cd41b751eccac6d73d356239c542a95 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8d5d3327b9..9b2e970b93 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b1bec72043f798f4d4d30e6b60a45ed4dc521115c8a9f97bb8228e3f089deefb \ No newline at end of file +bc5bbd9fa636cc9ef0cbbc0600b8fc1404b9732670ac4e7a8b5a230fbce758d5 \ No newline at end of file From 609959285bc035aa18da0d89bea484e1b5432105 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 27 Apr 2022 16:41:56 +0000 Subject: [PATCH 09/10] When computing STAT1 values using ANALYZE, if a ratio comes out to be between 1.0 and 1.1, then round it down to 1 rather than the using the default rounding rule of changing it to 2. The reduces the estimation error for the case where a column value is very nearly, but not quite unique. FossilOrigin-Name: eb59c46a5aed69bc6fd096997bf24c082e533c1085439f6ec1fbe5ff78e8b374 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/analyze.c | 8 +++++++- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 5d25cfd023..dcee977a82 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stest\sproblem\sin\srbubusy.test\scausing\sa\scrash\sunder\ssome\scircumstances. -D 2022-04-27T13:33:48.684 +C When\scomputing\sSTAT1\svalues\susing\sANALYZE,\sif\sa\sratio\scomes\sout\sto\sbe\sbetween\n1.0\sand\s1.1,\sthen\sround\sit\sdown\sto\s1\srather\sthan\sthe\susing\sthe\sdefault\srounding\nrule\sof\schanging\sit\sto\s2.\s\sThe\sreduces\sthe\sestimation\serror\sfor\sthe\ncase\swhere\sa\scolumn\svalue\sis\svery\snearly,\sbut\snot\squite\sunique. +D 2022-04-27T16:41:56.099 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -487,7 +487,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c 9395ece9850ad57c6fbb453aeb5185be4bae3b159c4b37611425c565124ee849 -F src/analyze.c 3a119baeb03053c154029877454d41bb8fd79d4d1eb583392f2289b3554a75bc +F src/analyze.c aabdf3769c7fd9954a8ec508eb7041ae174b66f88d12c47199fabbea9a646467 F src/attach.c 4431f82f0247bf3aaf91589acafdff77d1882235c95407b36da1585c765fbbc8 F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c a2891172438e385fdbe97c11c9745676bec54f518d4447090af97189fd8e52d7 @@ -1951,8 +1951,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 b1bec72043f798f4d4d30e6b60a45ed4dc521115c8a9f97bb8228e3f089deefb -R f8e9d661e065b7babfd72a5655e4ad71 -U dan -Z 3cd41b751eccac6d73d356239c542a95 +P bc5bbd9fa636cc9ef0cbbc0600b8fc1404b9732670ac4e7a8b5a230fbce758d5 +R 5515b70c241c679d58c02a7cda432aa8 +U drh +Z e146713923a218edc001415f7d000194 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 9b2e970b93..0444092686 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bc5bbd9fa636cc9ef0cbbc0600b8fc1404b9732670ac4e7a8b5a230fbce758d5 \ No newline at end of file +eb59c46a5aed69bc6fd096997bf24c082e533c1085439f6ec1fbe5ff78e8b374 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index e8699653f7..39009899ab 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -847,9 +847,14 @@ static void statGet( ** * "WHERE a=? AND b=?" matches 2 rows. ** ** If D is the count of distinct values and K is the total number of - ** rows, then each estimate is computed as: + ** rows, then each estimate is usually computed as: ** ** I = (K+D-1)/D + ** + ** In other words, I is K/D rounded up to the next whole integer. + ** However, if I is between 1.0 and 1.1 (in other words if I is + ** close to 1.0 but just a little larger) then do not round up but + ** instead keep the I value at 1.0. */ sqlite3_str sStat; /* Text of the constructed "stat" line */ int i; /* Loop counter */ @@ -860,6 +865,7 @@ static void statGet( for(i=0; inKeyCol; i++){ u64 nDistinct = p->current.anDLt[i] + 1; u64 iVal = (p->nRow + nDistinct - 1) / nDistinct; + if( iVal==2 && p->nRow*10 <= nDistinct*11 ) iVal = 1; sqlite3_str_appendf(&sStat, " %llu", iVal); assert( p->current.anEq[i] ); } From 22b541b55a12a137b533132396cbdf2e71e2f7d3 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 27 Apr 2022 18:38:46 +0000 Subject: [PATCH 10/10] Fix a harmless typo in a comment. FossilOrigin-Name: e1f4a115df34e45cf1bcf98961c699b582f564a58a979e95853b219bda06212c --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index dcee977a82..4b561cb6fc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\scomputing\sSTAT1\svalues\susing\sANALYZE,\sif\sa\sratio\scomes\sout\sto\sbe\sbetween\n1.0\sand\s1.1,\sthen\sround\sit\sdown\sto\s1\srather\sthan\sthe\susing\sthe\sdefault\srounding\nrule\sof\schanging\sit\sto\s2.\s\sThe\sreduces\sthe\sestimation\serror\sfor\sthe\ncase\swhere\sa\scolumn\svalue\sis\svery\snearly,\sbut\snot\squite\sunique. -D 2022-04-27T16:41:56.099 +C Fix\sa\sharmless\stypo\sin\sa\scomment. +D 2022-04-27T18:38:46.859 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -504,7 +504,7 @@ F src/date.c 15082566229d4b1e5f24fdb490bf9bcc68824b911d70e3573ef075a1b9e2d26f F src/dbpage.c 90661a87e1db8bfbc8d2ebbdcd3749651ddb287c555c07a28fb17c7c591ffb68 F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c a8e844af211a48b13b5b358be77a12c860c6a557c21990ad51a548e2536500ce -F src/expr.c 5d4178f8462ca55a38cefcfcdf9635030607e3532649c96de471afafeca732c4 +F src/expr.c d8c520edd0edf0b9c0ca467aa44c864ff17f265fd1cebbd224b6d5c625b638c3 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e F src/func.c a3407a6fbb0d4088d8d502e46f0ace63e0aeae7467ae23a9ca9815bbf9239761 @@ -1951,8 +1951,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 bc5bbd9fa636cc9ef0cbbc0600b8fc1404b9732670ac4e7a8b5a230fbce758d5 -R 5515b70c241c679d58c02a7cda432aa8 +P eb59c46a5aed69bc6fd096997bf24c082e533c1085439f6ec1fbe5ff78e8b374 +R f499c3fddca86db7a0183d3ecdb0953b U drh -Z e146713923a218edc001415f7d000194 +Z 7426364b9684e9a6fe822d40fffa4b25 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0444092686..1daa831936 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eb59c46a5aed69bc6fd096997bf24c082e533c1085439f6ec1fbe5ff78e8b374 \ No newline at end of file +e1f4a115df34e45cf1bcf98961c699b582f564a58a979e95853b219bda06212c \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index addd5794db..13bacb90ca 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2300,7 +2300,7 @@ int sqlite3ExprIsTableConstant(Expr *p, int iCur){ ** Check pExpr to see if it is an invariant constraint on data source pSrc. ** This is an optimization. False negatives will perhaps cause slower ** queries, but false positives will yield incorrect answers. So when in -** double, return 0. +** doubt, return 0. ** ** To be an invariant constraint, the following must be true: **