From 3e245bcef3e4e80daab55c15d8a2aba7e5fe9f38 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 16 Jun 2022 20:29:36 +0000 Subject: [PATCH 01/31] Minor fix to the query invariant testing logic of fuzzcheck. FossilOrigin-Name: 447e62a0946f5d77b7358adcabaeb23a7012cdfbfa1ef6082734cd9b45b2699d --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzinvariants.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 2257d3ea10..c2eeb441fd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\squery\sinvariants\sin\sfuzzcheck. -D 2022-06-15T20:18:44.107 +C Minor\sfix\sto\sthe\squery\sinvariant\stesting\slogic\sof\sfuzzcheck. +D 2022-06-16T20:29:36.245 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1097,7 +1097,7 @@ F test/fuzzdata8.db ca9a97f401b06b0d5376139ec7e1f9e773e13345a9a2d9ccc0032cdbfede F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc -F test/fuzzinvariants.c cd5a4c9b891a5c843e0f97a513c095490e974f1ea51392b13c0a7d77fff8e46d +F test/fuzzinvariants.c 0a8e98662b0ab765881c4094843c1cb4db07dced13006d8572dccf4004b2923f F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c F test/gencol1.test cc0dbb0ee116e5602e18ea7d47f2a0f76b26e09a823b7c36ef254370c2b0f3c1 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 @@ -1977,8 +1977,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 56c60a35ea457f06db58ec3f694a1ae16fd03e6625da1d7879d63d72bbcb1c62 -R 31cb1a38d873229e67ac58c6da93b5d2 +P 3a461f61b47e6ba6d5dcc2b7470ebde512b57bc68086f65050e07b06f42b7351 +R d0f84b140700e490433349a70f8e673c U drh -Z 1dfdc8c41c0d4bc708c84e77e53555ca +Z 3d24c9b621cf5763642f52e3d8949e70 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 5e298752d7..5a0c5b8a70 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3a461f61b47e6ba6d5dcc2b7470ebde512b57bc68086f65050e07b06f42b7351 \ No newline at end of file +447e62a0946f5d77b7358adcabaeb23a7012cdfbfa1ef6082734cd9b45b2699d \ No newline at end of file diff --git a/test/fuzzinvariants.c b/test/fuzzinvariants.c index f93722ced2..848d2a0124 100644 --- a/test/fuzzinvariants.c +++ b/test/fuzzinvariants.c @@ -184,7 +184,7 @@ static char *fuzz_invariant_sql(sqlite3_stmt *pStmt, int iCnt){ } for(i=0; i'3' || isdigit(zSuffix[2])) From 2a7aff93edd0fb208d93b08dae12fcb68dd8f061 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 17 Jun 2022 11:39:24 +0000 Subject: [PATCH 02/31] Avoid omitting the rhs of FULL JOINs in cases where it is only correct to omit the rhs of a LEFT JOIN. FossilOrigin-Name: f23a429d4153518d37387e121f22a30b22e2b31e126ad168e72049a96be86269 --- manifest | 15 +++++++------ manifest.uuid | 2 +- src/where.c | 2 +- test/joinH.test | 57 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 9 deletions(-) create mode 100644 test/joinH.test diff --git a/manifest b/manifest index c2eeb441fd..c8a84ac6d9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\sfix\sto\sthe\squery\sinvariant\stesting\slogic\sof\sfuzzcheck. -D 2022-06-16T20:29:36.245 +C Avoid\somitting\sthe\srhs\sof\sFULL\sJOINs\sin\scases\swhere\sit\sis\sonly\scorrect\sto\somit\sthe\srhs\sof\sa\sLEFT\sJOIN. +D 2022-06-17T11:39:24.504 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -657,7 +657,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 267caa227dd38ede46959468118ef4067316dae589d889c200911ff77df53ef1 +F src/where.c 2db3d41a1fd3b93d86680b4f33530d1f96ce9941771ebee80effba071d9d1e38 F src/whereInt.h b48ca529ffe293c18cbfa8326af18a09e39910de66fb3e96ef788c7cbf8ef3a7 F src/wherecode.c 0b09abfcb88c61c6a6984a3e065786631ff35495e9bdf865e6b74ab0a1299c5b F src/whereexpr.c 20255cf03e0b765b742301197d165511ff99e95da0d7ee9c8a2ebc1e888dd049 @@ -1176,6 +1176,7 @@ F test/joinC.test 1f1a602c2127f55f136e2cbd3bf2d26546614bf8cffe5902ec1ac9c07f87f2 F test/joinD.test 1a430af8dac5b68663f13df534ffe98775e582bac2305b80f1e8eb4ab778672a F test/joinE.test d5d182f3812771e2c0d97c9dcf5dbe4c41c8e21c82560e59358731c4a3981d6b F test/joinF.test 53dd66158806823ea680dd7543b5406af151b5aafa5cd06a7f3231cd94938127 +F test/joinH.test 743f5afbd5c275adb49a91fd8cfe9c494eca231c05777adb60b1cec19ac6511c F test/journal1.test c7b768041b7f494471531e17abc2f4f5ebf9e5096984f43ed17c4eb80ba34497 F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4 F test/journal3.test 7c3cf23ffc77db06601c1fcfc9743de8441cb77db9d1aa931863d94f5ffa140e @@ -1977,8 +1978,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 3a461f61b47e6ba6d5dcc2b7470ebde512b57bc68086f65050e07b06f42b7351 -R d0f84b140700e490433349a70f8e673c -U drh -Z 3d24c9b621cf5763642f52e3d8949e70 +P 447e62a0946f5d77b7358adcabaeb23a7012cdfbfa1ef6082734cd9b45b2699d +R 4a775b1d5ba6396498691341f48a10ac +U dan +Z 4f025e5a7e8dcede4b711630a37a27ba # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 5a0c5b8a70..d6f729e6e8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -447e62a0946f5d77b7358adcabaeb23a7012cdfbfa1ef6082734cd9b45b2699d \ No newline at end of file +f23a429d4153518d37387e121f22a30b22e2b31e126ad168e72049a96be86269 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 681cdf99a0..ed2a2d2218 100644 --- a/src/where.c +++ b/src/where.c @@ -5246,7 +5246,7 @@ static SQLITE_NOINLINE Bitmask whereOmitNoopJoin( WhereLoop *pLoop; pLoop = pWInfo->a[i].pWLoop; pItem = &pWInfo->pTabList->a[pLoop->iTab]; - if( (pItem->fg.jointype & JT_LEFT)==0 ) continue; + if( (pItem->fg.jointype & (JT_LEFT|JT_RIGHT))!=JT_LEFT ) continue; if( (pWInfo->wctrlFlags & WHERE_WANT_DISTINCT)==0 && (pLoop->wsFlags & WHERE_ONEROW)==0 ){ diff --git a/test/joinH.test b/test/joinH.test new file mode 100644 index 0000000000..6dde0c3834 --- /dev/null +++ b/test/joinH.test @@ -0,0 +1,57 @@ +# 2022 May 17 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix joinH + +do_execsql_test 1.0 { + CREATE TABLE t1(a INT); + CREATE TABLE t2(b INT); + INSERT INTO t2(b) VALUES(NULL); +} + +db nullvalue NULL + +do_execsql_test 1.1 { + SELECT DISTINCT a FROM t1 FULL JOIN t2 ON true WHERE (b ISNULL); +} {NULL} +do_execsql_test 1.2 { + SELECT a FROM t1 FULL JOIN t2 ON true; +} {NULL} +do_execsql_test 1.3 { + SELECT a FROM t1 FULL JOIN t2 ON true WHERE (b ISNULL); +} {NULL} +do_execsql_test 1.4 { + SELECT DISTINCT a FROM t1 FULL JOIN t2 ON true; +} {NULL} + +#----------------------------------------------------------- + +reset_db +do_execsql_test 2.0 { + CREATE TABLE r3(x); + CREATE TABLE r4(y INTEGER PRIMARY KEY); + INSERT INTO r4 VALUES(55); +} + +do_execsql_test 2.1 { + SELECT 'value!' FROM r3 FULL JOIN r4 ON (y=x); +} {value!} + +do_execsql_test 2.2 { + SELECT 'value!' FROM r3 FULL JOIN r4 ON (y=x) WHERE +y=55; +} {value!} + + +finish_test From 6efabd6cd326933735a010af32b251a22612f327 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 17 Jun 2022 12:25:33 +0000 Subject: [PATCH 03/31] Fix the new --query-invariants option on fuzzcheck so that it does not use an unprotected sqlite3_value object as an argument to sqlite3_value_int64(). FossilOrigin-Name: d9f820151d74a690b5fa560597a5b3ace20165a112e1b58cb4a7c47b42745643 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzinvariants.c | 27 +++++++++++++-------------- 3 files changed, 21 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index c8a84ac6d9..e03f7be9c0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\somitting\sthe\srhs\sof\sFULL\sJOINs\sin\scases\swhere\sit\sis\sonly\scorrect\sto\somit\sthe\srhs\sof\sa\sLEFT\sJOIN. -D 2022-06-17T11:39:24.504 +C Fix\sthe\snew\s--query-invariants\soption\son\sfuzzcheck\sso\sthat\sit\sdoes\snot\nuse\san\sunprotected\ssqlite3_value\sobject\sas\san\sargument\sto\ssqlite3_value_int64(). +D 2022-06-17T12:25:33.660 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1097,7 +1097,7 @@ F test/fuzzdata8.db ca9a97f401b06b0d5376139ec7e1f9e773e13345a9a2d9ccc0032cdbfede F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc -F test/fuzzinvariants.c 0a8e98662b0ab765881c4094843c1cb4db07dced13006d8572dccf4004b2923f +F test/fuzzinvariants.c e7b413a2526d9f702a2bfea5cbe5bdb7cb88c89b433e3e8ad931888bb5597bd0 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c F test/gencol1.test cc0dbb0ee116e5602e18ea7d47f2a0f76b26e09a823b7c36ef254370c2b0f3c1 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 @@ -1978,8 +1978,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 447e62a0946f5d77b7358adcabaeb23a7012cdfbfa1ef6082734cd9b45b2699d -R 4a775b1d5ba6396498691341f48a10ac -U dan -Z 4f025e5a7e8dcede4b711630a37a27ba +P f23a429d4153518d37387e121f22a30b22e2b31e126ad168e72049a96be86269 +R 10f66102aac19f279bc67099d1ccf16a +U drh +Z 8cec7a3e8591667bdea33d0479acc5f3 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d6f729e6e8..a071fa432c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f23a429d4153518d37387e121f22a30b22e2b31e126ad168e72049a96be86269 \ No newline at end of file +d9f820151d74a690b5fa560597a5b3ace20165a112e1b58cb4a7c47b42745643 \ No newline at end of file diff --git a/test/fuzzinvariants.c b/test/fuzzinvariants.c index 848d2a0124..86af776331 100644 --- a/test/fuzzinvariants.c +++ b/test/fuzzinvariants.c @@ -29,7 +29,7 @@ /* Forward references */ static char *fuzz_invariant_sql(sqlite3_stmt*, int); -static int sameValue(sqlite3_value*,sqlite3_value*); +static int sameValue(sqlite3_stmt*,int,sqlite3_stmt*,int); static void reportInvariantFailed(sqlite3_stmt*,sqlite3_stmt*,int); /* @@ -97,8 +97,7 @@ int fuzz_invariant( } while( (rc = sqlite3_step(pTestStmt))==SQLITE_ROW ){ for(i=0; i=nCol ) break; } @@ -211,29 +210,29 @@ static char *fuzz_invariant_sql(sqlite3_stmt *pStmt, int iCnt){ /* ** Return true if and only if v1 and is the same as v2. */ -static int sameValue(sqlite3_value *v1, sqlite3_value *v2){ +static int sameValue(sqlite3_stmt *pS1, int i1, sqlite3_stmt *pS2, int i2){ int x = 1; - if( sqlite3_value_type(v1)!=sqlite3_value_type(v2) ) return 0; - switch( sqlite3_value_type(v1) ){ + if( sqlite3_column_type(pS1,i1)!=sqlite3_column_type(pS2,i2) ) return 0; + switch( sqlite3_column_type(pS1,i1) ){ case SQLITE_INTEGER: { - x = sqlite3_value_int64(v1)==sqlite3_value_int64(v2); + x = sqlite3_column_int64(pS1,i1)==sqlite3_column_int64(pS2,i2); break; } case SQLITE_FLOAT: { - x = sqlite3_value_double(v1)==sqlite3_value_double(v2); + x = sqlite3_column_double(pS1,i1)==sqlite3_column_double(pS2,i2); break; } case SQLITE_TEXT: { - const char *z1 = (const char*)sqlite3_value_text(v1); - const char *z2 = (const char*)sqlite3_value_text(v2); + const char *z1 = (const char*)sqlite3_column_text(pS1,i1); + const char *z2 = (const char*)sqlite3_column_text(pS2,i2); x = ((z1==0 && z2==0) || (z1!=0 && z2!=0 && strcmp(z1,z1)==0)); break; } case SQLITE_BLOB: { - int len1 = sqlite3_value_bytes(v1); - const unsigned char *b1 = sqlite3_value_blob(v1); - int len2 = sqlite3_value_bytes(v2); - const unsigned char *b2 = sqlite3_value_blob(v2); + int len1 = sqlite3_column_bytes(pS1,i1); + const unsigned char *b1 = sqlite3_column_blob(pS1,i1); + int len2 = sqlite3_column_bytes(pS2,i2); + const unsigned char *b2 = sqlite3_column_blob(pS2,i2); if( len1!=len2 ){ x = 0; }else if( len1==0 ){ From 36f904f06574c637a9e28abd7b2be417c45abc83 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 17 Jun 2022 15:11:31 +0000 Subject: [PATCH 04/31] Fix the virtual table detection mechanism to avoid false-positives that were blocking all failures. Then fix a few of the additional problems that are revealed by that fix. More fixes are needed. FossilOrigin-Name: 42b2e6676fed1508ea0ba17c292e83134825469735700da97817c45d45c54e66 --- manifest | 17 ++++++++++------- manifest.uuid | 2 +- test/fuzzcheck.c | 10 +++++++++- test/fuzzinvariants.c | 18 +++++++++++++----- 4 files changed, 33 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index e03f7be9c0..ff0e27eca6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\snew\s--query-invariants\soption\son\sfuzzcheck\sso\sthat\sit\sdoes\snot\nuse\san\sunprotected\ssqlite3_value\sobject\sas\san\sargument\sto\ssqlite3_value_int64(). -D 2022-06-17T12:25:33.660 +C Fix\sthe\svirtual\stable\sdetection\smechanism\sto\savoid\sfalse-positives\sthat\swere\nblocking\sall\sfailures.\s\sThen\sfix\sa\sfew\sof\sthe\sadditional\sproblems\sthat\sare\nrevealed\sby\sthat\sfix.\s\sMore\sfixes\sare\sneeded. +D 2022-06-17T15:11:31.795 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1085,7 +1085,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 609152902fb51e718554719f44d13677f68c53d98d15fb359fbefdd134be153b +F test/fuzzcheck.c b18b6ae117937deac68793385d41ff6d73abcd1bf66f66b5b0cb4151d170c8db F test/fuzzdata1.db 3e86d9cf5aea68ddb8e27c02d7dfdaa226347426c7eb814918e4d95475bf8517 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1097,7 +1097,7 @@ F test/fuzzdata8.db ca9a97f401b06b0d5376139ec7e1f9e773e13345a9a2d9ccc0032cdbfede F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc -F test/fuzzinvariants.c e7b413a2526d9f702a2bfea5cbe5bdb7cb88c89b433e3e8ad931888bb5597bd0 +F test/fuzzinvariants.c 227ab751f1417bbc135389f2e394ab3f97b4940343aea006283b8888e8166d58 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c F test/gencol1.test cc0dbb0ee116e5602e18ea7d47f2a0f76b26e09a823b7c36ef254370c2b0f3c1 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 @@ -1978,8 +1978,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f23a429d4153518d37387e121f22a30b22e2b31e126ad168e72049a96be86269 -R 10f66102aac19f279bc67099d1ccf16a +P d9f820151d74a690b5fa560597a5b3ace20165a112e1b58cb4a7c47b42745643 +R 3bffc86c82ff136a0c0c4c0a76be66e5 +T *branch * query-invariants +T *sym-query-invariants * +T -sym-trunk * U drh -Z 8cec7a3e8591667bdea33d0479acc5f3 +Z 8dc954db016e69d2c5b338fff670ae32 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a071fa432c..82f853b1ff 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d9f820151d74a690b5fa560597a5b3ace20165a112e1b58cb4a7c47b42745643 \ No newline at end of file +42b2e6676fed1508ea0ba17c292e83134825469735700da97817c45d45c54e66 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index d09afe6a00..995137838c 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -896,9 +896,17 @@ static int block_troublesome_sql( } case SQLITE_FUNCTION: { static const char *azBadFuncs[] = { + "current_date", + "current_time", + "current_timestamp", + "date", + "datetime", + "julianday", "random", "randomblob", - "rtreedepth", + "strftime", + "time", + "unixepoch", }; int i; for(i=0; i100 ) return SQLITE_DONE; zTest = fuzz_invariant_sql(pStmt, iCnt); if( zTest==0 ) return SQLITE_DONE; rc = sqlite3_prepare_v2(db, zTest, -1, &pTestStmt, 0); @@ -88,7 +91,7 @@ int fuzz_invariant( sqlite3_free(zTest); nCol = sqlite3_column_count(pStmt); for(i=0; i=2 ){ char *zSql = sqlite3_expanded_sql(pTestStmt); @@ -101,7 +104,7 @@ int fuzz_invariant( } if( i>=nCol ) break; } - if( rc!=SQLITE_ROW ){ + if( rc!=SQLITE_ROW && rc!=SQLITE_NOMEM ){ /* No matching output row found */ sqlite3_stmt *pCk = 0; rc = sqlite3_prepare_v2(db, "PRAGMA integrity_check", -1, &pCk, 0); @@ -123,7 +126,10 @@ int fuzz_invariant( sqlite3_finalize(pCk); rc = sqlite3_prepare_v2(db, "SELECT 1 FROM bytecode(?1) WHERE opcode='VOpen'", -1, &pCk, 0); - if( rc==SQLITE_OK ) rc = sqlite3_step(pCk); + if( rc==SQLITE_OK ){ + sqlite3_bind_pointer(pCk, 1, pStmt, "stmt-pointer", 0); + rc = sqlite3_step(pCk); + } sqlite3_finalize(pCk); if( rc==SQLITE_DONE ){ reportInvariantFailed(pStmt, pTestStmt, iRow); @@ -155,6 +161,7 @@ static char *fuzz_invariant_sql(sqlite3_stmt *pStmt, int iCnt){ int mxCnt; int bDistinct = 0; int bOrderBy = 0; + int nParam = sqlite3_bind_parameter_count(pStmt); switch( iCnt % 4 ){ case 1: bDistinct = 1; break; @@ -196,7 +203,8 @@ static char *fuzz_invariant_sql(sqlite3_stmt *pStmt, int iCnt){ if( sqlite3_column_type(pStmt, i)==SQLITE_NULL ){ sqlite3_str_appendf(pTest, " %s \"%w\" ISNULL", zAnd, zColName); }else{ - sqlite3_str_appendf(pTest, " %s \"%w\"=?%d", zAnd, zColName, i+1); + sqlite3_str_appendf(pTest, " %s \"%w\"=?%d", zAnd, zColName, + i+1+nParam); } zAnd = "AND"; } @@ -253,7 +261,7 @@ static void printRow(sqlite3_stmt *pStmt, int iRow){ int i, nCol; nCol = sqlite3_column_count(pStmt); for(i=0; i Date: Fri, 17 Jun 2022 15:52:43 +0000 Subject: [PATCH 05/31] Only run query-invariant checks after the original query has run to completion, so that we know it does not error-out on a subsequent row. FossilOrigin-Name: d1fc857bb8dcd5914f5a9bbcc4efe5f4abe19a190e42e2c923b28327a95e4de6 --- manifest | 15 ++++++--------- manifest.uuid | 2 +- test/fuzzcheck.c | 43 ++++++++++++++++++++++++------------------- 3 files changed, 31 insertions(+), 29 deletions(-) diff --git a/manifest b/manifest index ff0e27eca6..39989145ee 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\svirtual\stable\sdetection\smechanism\sto\savoid\sfalse-positives\sthat\swere\nblocking\sall\sfailures.\s\sThen\sfix\sa\sfew\sof\sthe\sadditional\sproblems\sthat\sare\nrevealed\sby\sthat\sfix.\s\sMore\sfixes\sare\sneeded. -D 2022-06-17T15:11:31.795 +C Only\srun\squery-invariant\schecks\safter\sthe\soriginal\squery\shas\srun\sto\scompletion,\nso\sthat\swe\sknow\sit\sdoes\snot\serror-out\son\sa\ssubsequent\srow. +D 2022-06-17T15:52:43.687 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1085,7 +1085,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c b18b6ae117937deac68793385d41ff6d73abcd1bf66f66b5b0cb4151d170c8db +F test/fuzzcheck.c 873ea79afe6ffa015bb92bc2b6c8b3b0ae19939f05a2bb170c72554cee7efca6 F test/fuzzdata1.db 3e86d9cf5aea68ddb8e27c02d7dfdaa226347426c7eb814918e4d95475bf8517 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1978,11 +1978,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 d9f820151d74a690b5fa560597a5b3ace20165a112e1b58cb4a7c47b42745643 -R 3bffc86c82ff136a0c0c4c0a76be66e5 -T *branch * query-invariants -T *sym-query-invariants * -T -sym-trunk * +P 42b2e6676fed1508ea0ba17c292e83134825469735700da97817c45d45c54e66 +R 2ffa9998fa10a6490052b5721ce71198 U drh -Z 8dc954db016e69d2c5b338fff670ae32 +Z e096bb1569d84715c095fddd40356f9f # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 82f853b1ff..dd609bff2f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -42b2e6676fed1508ea0ba17c292e83134825469735700da97817c45d45c54e66 \ No newline at end of file +d1fc857bb8dcd5914f5a9bbcc4efe5f4abe19a190e42e2c923b28327a95e4de6 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 995137838c..dcce95e936 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -957,24 +957,6 @@ static int runDbSql(sqlite3 *db, const char *zSql, unsigned int *pBtsFlags){ int nRow = 0; while( (rc = sqlite3_step(pStmt))==SQLITE_ROW ){ nRow++; - if( (*pBtsFlags)==BTS_SELECT - && g.doInvariantChecks - && !sqlite3_stmt_isexplain(pStmt) - ){ - int iCnt = 0; - for(iCnt=0; iCnt<99999; iCnt++){ - rc = fuzz_invariant(db, pStmt, iCnt, nRow, &bCorrupt, eVerbosity); - if( rc==SQLITE_DONE ) break; - if( rc!=SQLITE_ERROR ) g.nInvariant++; - if( eVerbosity>0 ){ - if( rc==SQLITE_OK ){ - printf("invariant-check: ok\n"); - }else if( rc==SQLITE_CORRUPT ){ - printf("invariant-check: failed due to database corruption\n"); - } - } - } - } if( eVerbosity>=5 ){ int j; for(j=0; j=5 ) */ } /* End while( SQLITE_ROW */ - if( rc!=SQLITE_DONE && eVerbosity>=4 ){ + if( rc==SQLITE_DONE ){ + if( (*pBtsFlags)==BTS_SELECT + && g.doInvariantChecks + && !sqlite3_stmt_isexplain(pStmt) + && nRow>0 + ){ + sqlite3_reset(pStmt); + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + int iCnt = 0; + for(iCnt=0; iCnt<99999; iCnt++){ + rc = fuzz_invariant(db, pStmt, iCnt, nRow, &bCorrupt, eVerbosity); + if( rc==SQLITE_DONE ) break; + if( rc!=SQLITE_ERROR ) g.nInvariant++; + if( eVerbosity>0 ){ + if( rc==SQLITE_OK ){ + printf("invariant-check: ok\n"); + }else if( rc==SQLITE_CORRUPT ){ + printf("invariant-check: failed due to database corruption\n"); + } + } + } + } + } + }else if( eVerbosity>=4 ){ printf("SQL-ERROR: (%d) %s\n", rc, sqlite3_errmsg(db)); fflush(stdout); } From 63880362ed0cc7cf95371638b3f4baeb603df036 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 17 Jun 2022 16:09:47 +0000 Subject: [PATCH 06/31] Improve query-invariants to the point that it would have discovered the [f23a429d4153518d] bug if that bug had not already been fixed. FossilOrigin-Name: 2a7251ed9c4c959b6df75172159c6b4445e1c2212e357d2c49ab8fa19cb3ac11 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzcheck.c | 8 ++++++-- test/fuzzinvariants.c | 12 +++++------- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index 39989145ee..8b29566d82 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Only\srun\squery-invariant\schecks\safter\sthe\soriginal\squery\shas\srun\sto\scompletion,\nso\sthat\swe\sknow\sit\sdoes\snot\serror-out\son\sa\ssubsequent\srow. -D 2022-06-17T15:52:43.687 +C Improve\squery-invariants\sto\sthe\spoint\sthat\sit\swould\shave\sdiscovered\sthe\n[f23a429d4153518d]\sbug\sif\sthat\sbug\shad\snot\salready\sbeen\sfixed. +D 2022-06-17T16:09:47.744 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1085,7 +1085,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 873ea79afe6ffa015bb92bc2b6c8b3b0ae19939f05a2bb170c72554cee7efca6 +F test/fuzzcheck.c c50f105aaa5f5cc5ca5248ac8423ec316fbf6a9540236bcbf55999ff364bb49c F test/fuzzdata1.db 3e86d9cf5aea68ddb8e27c02d7dfdaa226347426c7eb814918e4d95475bf8517 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1097,7 +1097,7 @@ F test/fuzzdata8.db ca9a97f401b06b0d5376139ec7e1f9e773e13345a9a2d9ccc0032cdbfede F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc -F test/fuzzinvariants.c 227ab751f1417bbc135389f2e394ab3f97b4940343aea006283b8888e8166d58 +F test/fuzzinvariants.c df8e8e41e1b3d6a4b2d4af7971b6da546291935344b8b2ddd44a51f12dac773f F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c F test/gencol1.test cc0dbb0ee116e5602e18ea7d47f2a0f76b26e09a823b7c36ef254370c2b0f3c1 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 @@ -1978,8 +1978,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 42b2e6676fed1508ea0ba17c292e83134825469735700da97817c45d45c54e66 -R 2ffa9998fa10a6490052b5721ce71198 +P d1fc857bb8dcd5914f5a9bbcc4efe5f4abe19a190e42e2c923b28327a95e4de6 +R 55960cb339a18680e19e442b178a6dfb U drh -Z e096bb1569d84715c095fddd40356f9f +Z edf9c8ab3b73ba6da0e22cf8e8453a3c # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index dd609bff2f..56dec9bb2d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d1fc857bb8dcd5914f5a9bbcc4efe5f4abe19a190e42e2c923b28327a95e4de6 \ No newline at end of file +2a7251ed9c4c959b6df75172159c6b4445e1c2212e357d2c49ab8fa19cb3ac11 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index dcce95e936..063295ab20 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -934,6 +934,7 @@ int fuzz_invariant( sqlite3_stmt *pStmt, /* Test statement stopped on an SQLITE_ROW */ int iCnt, /* Invariant sequence number, starting at 0 */ int iRow, /* The row number for pStmt */ + int nRow, /* Total number of output rows */ int *pbCorrupt, /* IN/OUT: Flag indicating a corrupt database file */ int eVerbosity /* How much debugging output */ ); @@ -957,7 +958,7 @@ static int runDbSql(sqlite3 *db, const char *zSql, unsigned int *pBtsFlags){ int nRow = 0; while( (rc = sqlite3_step(pStmt))==SQLITE_ROW ){ nRow++; - if( eVerbosity>=5 ){ + if( eVerbosity>=4 ){ int j; for(j=0; j0 ){ + int iRow = 0; sqlite3_reset(pStmt); while( sqlite3_step(pStmt)==SQLITE_ROW ){ int iCnt = 0; + iRow++; for(iCnt=0; iCnt<99999; iCnt++){ - rc = fuzz_invariant(db, pStmt, iCnt, nRow, &bCorrupt, eVerbosity); + rc = fuzz_invariant(db, pStmt, iCnt, iRow, nRow, + &bCorrupt, eVerbosity); if( rc==SQLITE_DONE ) break; if( rc!=SQLITE_ERROR ) g.nInvariant++; if( eVerbosity>0 ){ diff --git a/test/fuzzinvariants.c b/test/fuzzinvariants.c index 05f8cf9b4e..807574ee3d 100644 --- a/test/fuzzinvariants.c +++ b/test/fuzzinvariants.c @@ -62,7 +62,8 @@ int fuzz_invariant( sqlite3 *db, /* The database connection */ sqlite3_stmt *pStmt, /* Test statement stopped on an SQLITE_ROW */ int iCnt, /* Invariant sequence number, starting at 0 */ - int iRow, /* The row number for pStmt */ + int iRow, /* Current row number */ + int nRow, /* Number of output rows from pStmt */ int *pbCorrupt, /* IN/OUT: Flag indicating a corrupt database file */ int eVerbosity /* How much debugging output */ ){ @@ -163,17 +164,14 @@ static char *fuzz_invariant_sql(sqlite3_stmt *pStmt, int iCnt){ int bOrderBy = 0; int nParam = sqlite3_bind_parameter_count(pStmt); + iCnt++; switch( iCnt % 4 ){ case 1: bDistinct = 1; break; case 2: bOrderBy = 1; break; case 3: bDistinct = bOrderBy = 1; break; } iCnt /= 4; - if( nCol==1 ){ - mxCnt = 0; - }else{ - mxCnt = nCol; - } + mxCnt = nCol; if( iCnt<0 || iCnt>mxCnt ) return 0; zIn = sqlite3_sql(pStmt); if( zIn==0 ) return 0; @@ -199,7 +197,7 @@ static char *fuzz_invariant_sql(sqlite3_stmt *pStmt, int iCnt){ ** WHERE clause. */ continue; } - if( iCnt>0 && i+1!=iCnt ) continue; + if( i+1!=iCnt ) continue; if( sqlite3_column_type(pStmt, i)==SQLITE_NULL ){ sqlite3_str_appendf(pTest, " %s \"%w\" ISNULL", zAnd, zColName); }else{ From ea64cb31a59451dfb6ed7010d96ec8db5b483487 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 17 Jun 2022 16:32:21 +0000 Subject: [PATCH 07/31] Allow integers and floating point numbers to compare equal. FossilOrigin-Name: 0fe2e465ba931d4bceaf171693d2ee7af45a5f96840e65e9d4ee4a2e60f155d8 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzinvariants.c | 12 +++++++++++- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 8b29566d82..f7f8ab1ec3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\squery-invariants\sto\sthe\spoint\sthat\sit\swould\shave\sdiscovered\sthe\n[f23a429d4153518d]\sbug\sif\sthat\sbug\shad\snot\salready\sbeen\sfixed. -D 2022-06-17T16:09:47.744 +C Allow\sintegers\sand\sfloating\spoint\snumbers\sto\scompare\sequal. +D 2022-06-17T16:32:21.419 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1097,7 +1097,7 @@ F test/fuzzdata8.db ca9a97f401b06b0d5376139ec7e1f9e773e13345a9a2d9ccc0032cdbfede F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc -F test/fuzzinvariants.c df8e8e41e1b3d6a4b2d4af7971b6da546291935344b8b2ddd44a51f12dac773f +F test/fuzzinvariants.c e1c844a9234329f8e6f84acc4c32c0657aacfde08d69d90cb9c24d332062994d F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c F test/gencol1.test cc0dbb0ee116e5602e18ea7d47f2a0f76b26e09a823b7c36ef254370c2b0f3c1 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 @@ -1978,8 +1978,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 d1fc857bb8dcd5914f5a9bbcc4efe5f4abe19a190e42e2c923b28327a95e4de6 -R 55960cb339a18680e19e442b178a6dfb +P 2a7251ed9c4c959b6df75172159c6b4445e1c2212e357d2c49ab8fa19cb3ac11 +R a7fd0f7a55560bceea65dad05280da0e U drh -Z edf9c8ab3b73ba6da0e22cf8e8453a3c +Z 41ab90bc026d0fa40109a7c68e53d405 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 56dec9bb2d..d2890c602d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2a7251ed9c4c959b6df75172159c6b4445e1c2212e357d2c49ab8fa19cb3ac11 \ No newline at end of file +0fe2e465ba931d4bceaf171693d2ee7af45a5f96840e65e9d4ee4a2e60f155d8 \ No newline at end of file diff --git a/test/fuzzinvariants.c b/test/fuzzinvariants.c index 807574ee3d..b40fa1fa55 100644 --- a/test/fuzzinvariants.c +++ b/test/fuzzinvariants.c @@ -218,7 +218,17 @@ static char *fuzz_invariant_sql(sqlite3_stmt *pStmt, int iCnt){ */ static int sameValue(sqlite3_stmt *pS1, int i1, sqlite3_stmt *pS2, int i2){ int x = 1; - if( sqlite3_column_type(pS1,i1)!=sqlite3_column_type(pS2,i2) ) return 0; + int t1 = sqlite3_column_type(pS1,i1); + int t2 = sqlite3_column_type(pS2,i2); + if( t1!=t2 ){ + if( (t1==SQLITE_INTEGER && t2==SQLITE_FLOAT) + || (t1==SQLITE_FLOAT && t2==SQLITE_INTEGER) + ){ + /* Comparison of numerics is ok */ + }else{ + return 0; + } + } switch( sqlite3_column_type(pS1,i1) ){ case SQLITE_INTEGER: { x = sqlite3_column_int64(pS1,i1)==sqlite3_column_int64(pS2,i2); From f26e45139e1f3e856b9a110af5e8850b85a8d7d1 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 17 Jun 2022 16:52:54 +0000 Subject: [PATCH 08/31] Do not run --query-invariants on statements that make use of sqlite_offset(). FossilOrigin-Name: c5ac4cbfb173c613d633b2c76484d735073692d001a336576174201b8f9af7b1 --- manifest | 13 ++++++------- manifest.uuid | 2 +- test/fuzzcheck.c | 1 + 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 8f0dcec53f..24d024ceb6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Various\sfixes\sand\simprovements\sto\sthe\s--query-invariants\soption\sof\nfuzzcheck. -D 2022-06-17T16:39:55.788 +C Do\snot\srun\s--query-invariants\son\sstatements\sthat\smake\suse\sof\nsqlite_offset(). +D 2022-06-17T16:52:54.486 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1085,7 +1085,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c c50f105aaa5f5cc5ca5248ac8423ec316fbf6a9540236bcbf55999ff364bb49c +F test/fuzzcheck.c 361ae999d46b03ee901b5bd3855478dd16eec5b247da55d35d7993922d93f7dc F test/fuzzdata1.db 3e86d9cf5aea68ddb8e27c02d7dfdaa226347426c7eb814918e4d95475bf8517 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1978,9 +1978,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 d9f820151d74a690b5fa560597a5b3ace20165a112e1b58cb4a7c47b42745643 0fe2e465ba931d4bceaf171693d2ee7af45a5f96840e65e9d4ee4a2e60f155d8 -R a7fd0f7a55560bceea65dad05280da0e -T +closed 0fe2e465ba931d4bceaf171693d2ee7af45a5f96840e65e9d4ee4a2e60f155d8 +P 09aca89b7c26c1eb7f9df1d1cfdada18848d7c188fa7fbbcf95442dabce476ea +R bd9dd9d7acb3556d329befe872070524 U drh -Z c4d513a0fe34cc5ee401eef54d4b01ee +Z a9947c172f3ac540c17b7632d43455db # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index aa97dde090..762ed8ffeb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -09aca89b7c26c1eb7f9df1d1cfdada18848d7c188fa7fbbcf95442dabce476ea \ No newline at end of file +c5ac4cbfb173c613d633b2c76484d735073692d001a336576174201b8f9af7b1 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 063295ab20..5682372578 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -904,6 +904,7 @@ static int block_troublesome_sql( "julianday", "random", "randomblob", + "sqlite_offset", "strftime", "time", "unixepoch", From c2beb0d8f60d60e2d9c3a6dc606499bccd88be62 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 17 Jun 2022 17:11:51 +0000 Subject: [PATCH 09/31] Omit the --query-invariants processing in fuzzcheck for queries that contain the implies_nonnull_row() test function. FossilOrigin-Name: 0602a0844893465ac2fe53c0fa648a5cbcbc6452fff6181c42fab517f047b583 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 17 +++++++++++++---- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 24d024ceb6..b87b2ca6d2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\srun\s--query-invariants\son\sstatements\sthat\smake\suse\sof\nsqlite_offset(). -D 2022-06-17T16:52:54.486 +C Omit\sthe\s--query-invariants\sprocessing\sin\sfuzzcheck\sfor\squeries\sthat\scontain\nthe\simplies_nonnull_row()\stest\sfunction. +D 2022-06-17T17:11:51.622 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1085,7 +1085,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 361ae999d46b03ee901b5bd3855478dd16eec5b247da55d35d7993922d93f7dc +F test/fuzzcheck.c 618511e19af06d8d7200a84fc5075837b3d46b000ce1f332f0639c7079761bf8 F test/fuzzdata1.db 3e86d9cf5aea68ddb8e27c02d7dfdaa226347426c7eb814918e4d95475bf8517 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1978,8 +1978,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 09aca89b7c26c1eb7f9df1d1cfdada18848d7c188fa7fbbcf95442dabce476ea -R bd9dd9d7acb3556d329befe872070524 +P c5ac4cbfb173c613d633b2c76484d735073692d001a336576174201b8f9af7b1 +R 124919f6bda8ad106a39594e4e49b06e U drh -Z a9947c172f3ac540c17b7632d43455db +Z 57c12800fd26ff66a6c4e43d9067826d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 762ed8ffeb..cb1b7d1d57 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c5ac4cbfb173c613d633b2c76484d735073692d001a336576174201b8f9af7b1 \ No newline at end of file +0602a0844893465ac2fe53c0fa648a5cbcbc6452fff6181c42fab517f047b583 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 5682372578..e95b2558d6 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -901,6 +901,7 @@ static int block_troublesome_sql( "current_timestamp", "date", "datetime", + "implies_nonnull_row", "julianday", "random", "randomblob", @@ -909,13 +910,21 @@ static int block_troublesome_sql( "time", "unixepoch", }; - int i; - for(i=0; i0 ){ + last = mid-1; + }else{ *pFlags |= BTS_BADFUNC; break; } - } + }while( first<=last ); break; } case SQLITE_READ: { From 01156ec1c9dd5fc2e3e5e7015a78d88b55ffff40 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 17 Jun 2022 21:31:30 +0000 Subject: [PATCH 10/31] Fix the OP_Concat operator such that when concatenating a BLOB with an odd number of bytes on a database that is UTF16, the size of the resulting string is reduced to a multiple of two. FossilOrigin-Name: 5eb2c23635320b76f5e1aea4d94375b847fe4b38cdb4e287fba188753f4773b1 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index b87b2ca6d2..41d17a7ad1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Omit\sthe\s--query-invariants\sprocessing\sin\sfuzzcheck\sfor\squeries\sthat\scontain\nthe\simplies_nonnull_row()\stest\sfunction. -D 2022-06-17T17:11:51.622 +C Fix\sthe\sOP_Concat\soperator\ssuch\sthat\swhen\sconcatenating\sa\sBLOB\swith\san\nodd\snumber\sof\sbytes\son\sa\sdatabase\sthat\sis\sUTF16,\sthe\ssize\sof\sthe\sresulting\nstring\sis\sreduced\sto\sa\smultiple\sof\stwo. +D 2022-06-17T21:31:30.484 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -642,7 +642,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 602fe229f32a96ceccae4f40824129669582096f7c355f53dbac156c9fecef23 F src/vacuum.c bb346170b0b54c6683bba4a5983aea40485597fdf605c87ec8bc2e199fe88cd8 -F src/vdbe.c 1c254d8ae4eeed388ed61e32a285571cfaf7d8c38c21f335eef20edc0c60c5e8 +F src/vdbe.c 555620fbbf4cb2e816e506afeae189e9f2c19a0bf18442f471f7a799300155b7 F src/vdbe.h 07641758ca8b4f4c6d81ea667ea167c541e6ece21f5574da11e3d21ec37e2662 F src/vdbeInt.h 2cad0aeeb106371ed0e0946bab89f60627087068847afc2451c05056961c18da F src/vdbeapi.c 354c893f1500cf524cc45c32879b9c68893a28b77e3442c24668d6afe4236217 @@ -1978,8 +1978,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 c5ac4cbfb173c613d633b2c76484d735073692d001a336576174201b8f9af7b1 -R 124919f6bda8ad106a39594e4e49b06e +P 0602a0844893465ac2fe53c0fa648a5cbcbc6452fff6181c42fab517f047b583 +R 677fb4cb73b59ff5567a29b0dcce5966 U drh -Z 57c12800fd26ff66a6c4e43d9067826d +Z f2da6ce1874ec91331ce02aadb2b4e60 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index cb1b7d1d57..de81e60315 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0602a0844893465ac2fe53c0fa648a5cbcbc6452fff6181c42fab517f047b583 \ No newline at end of file +5eb2c23635320b76f5e1aea4d94375b847fe4b38cdb4e287fba188753f4773b1 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 9df28fe1f4..64bb7d4328 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -1666,7 +1666,7 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ goto too_big; } - if( sqlite3VdbeMemGrow(pOut, (int)nByte+3, pOut==pIn2) ){ + if( sqlite3VdbeMemGrow(pOut, (int)nByte+2, pOut==pIn2) ){ goto no_mem; } MemSetTypeFlag(pOut, MEM_Str); @@ -1678,9 +1678,9 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ memcpy(&pOut->z[pIn2->n], pIn1->z, pIn1->n); assert( (pIn1->flags & MEM_Dyn) == (flags1 & MEM_Dyn) ); pIn1->flags = flags1; + if( encoding>SQLITE_UTF8 ) nByte &= ~1; pOut->z[nByte]=0; pOut->z[nByte+1] = 0; - pOut->z[nByte+2] = 0; pOut->flags |= MEM_Term; pOut->n = (int)nByte; pOut->enc = encoding; From 8fa6206bc4d9364951aeb6bf88e02303c0309b85 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 18 Jun 2022 10:26:12 +0000 Subject: [PATCH 11/31] In the --query-invariants option of fuzzcheck, correctly deal with OOMs causing the return value of sqlite3_column_name() to be NULL. FossilOrigin-Name: eabbee4a51bc1a865bddee890004ff3a1c9cc6b797b21f73e908642e154cef50 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzinvariants.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 41d17a7ad1..35b3074eb9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sOP_Concat\soperator\ssuch\sthat\swhen\sconcatenating\sa\sBLOB\swith\san\nodd\snumber\sof\sbytes\son\sa\sdatabase\sthat\sis\sUTF16,\sthe\ssize\sof\sthe\sresulting\nstring\sis\sreduced\sto\sa\smultiple\sof\stwo. -D 2022-06-17T21:31:30.484 +C In\sthe\s--query-invariants\soption\sof\sfuzzcheck,\scorrectly\sdeal\swith\sOOMs\ncausing\sthe\sreturn\svalue\sof\ssqlite3_column_name()\sto\sbe\sNULL. +D 2022-06-18T10:26:12.032 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1097,7 +1097,7 @@ F test/fuzzdata8.db ca9a97f401b06b0d5376139ec7e1f9e773e13345a9a2d9ccc0032cdbfede F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc -F test/fuzzinvariants.c e1c844a9234329f8e6f84acc4c32c0657aacfde08d69d90cb9c24d332062994d +F test/fuzzinvariants.c 7b30ce794452ed0c976a7e30cf098f8d8552ef485af6682abde9a293133d3cd9 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c F test/gencol1.test cc0dbb0ee116e5602e18ea7d47f2a0f76b26e09a823b7c36ef254370c2b0f3c1 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 @@ -1978,8 +1978,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 0602a0844893465ac2fe53c0fa648a5cbcbc6452fff6181c42fab517f047b583 -R 677fb4cb73b59ff5567a29b0dcce5966 +P 5eb2c23635320b76f5e1aea4d94375b847fe4b38cdb4e287fba188753f4773b1 +R 5a38f5bef33d12267a14f7a0d1c08cab U drh -Z f2da6ce1874ec91331ce02aadb2b4e60 +Z f2d1d961cabe20521b862d120682a7a7 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index de81e60315..81e42e2284 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5eb2c23635320b76f5e1aea4d94375b847fe4b38cdb4e287fba188753f4773b1 \ No newline at end of file +eabbee4a51bc1a865bddee890004ff3a1c9cc6b797b21f73e908642e154cef50 \ No newline at end of file diff --git a/test/fuzzinvariants.c b/test/fuzzinvariants.c index b40fa1fa55..3b7827a775 100644 --- a/test/fuzzinvariants.c +++ b/test/fuzzinvariants.c @@ -198,6 +198,7 @@ static char *fuzz_invariant_sql(sqlite3_stmt *pStmt, int iCnt){ continue; } if( i+1!=iCnt ) continue; + if( zColName==0 ) continue; if( sqlite3_column_type(pStmt, i)==SQLITE_NULL ){ sqlite3_str_appendf(pTest, " %s \"%w\" ISNULL", zAnd, zColName); }else{ From d0d21f556591656328d96f22af7d41e22191bf09 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 18 Jun 2022 14:50:43 +0000 Subject: [PATCH 12/31] Abandon a query-invariant check in fuzzcheck if the call to sqlite3_bind_value() returns anything other than SQLITE_OK or SQLITE_RANGE. FossilOrigin-Name: d31e1cd2ab44c7cce20b8990dff17719c286dd2fb46ba6d4f581a9553cf31891 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzinvariants.c | 6 +++++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 35b3074eb9..fbe59a3eb7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\s--query-invariants\soption\sof\sfuzzcheck,\scorrectly\sdeal\swith\sOOMs\ncausing\sthe\sreturn\svalue\sof\ssqlite3_column_name()\sto\sbe\sNULL. -D 2022-06-18T10:26:12.032 +C Abandon\sa\squery-invariant\scheck\sin\sfuzzcheck\sif\sthe\scall\sto\nsqlite3_bind_value()\sreturns\sanything\sother\sthan\sSQLITE_OK\sor\sSQLITE_RANGE. +D 2022-06-18T14:50:43.710 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1097,7 +1097,7 @@ F test/fuzzdata8.db ca9a97f401b06b0d5376139ec7e1f9e773e13345a9a2d9ccc0032cdbfede F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc -F test/fuzzinvariants.c 7b30ce794452ed0c976a7e30cf098f8d8552ef485af6682abde9a293133d3cd9 +F test/fuzzinvariants.c d02dbf42821ffee6edf0b202e015ae6c25442cb23a58dbf8abb5db227008b934 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c F test/gencol1.test cc0dbb0ee116e5602e18ea7d47f2a0f76b26e09a823b7c36ef254370c2b0f3c1 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 @@ -1978,8 +1978,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 5eb2c23635320b76f5e1aea4d94375b847fe4b38cdb4e287fba188753f4773b1 -R 5a38f5bef33d12267a14f7a0d1c08cab +P eabbee4a51bc1a865bddee890004ff3a1c9cc6b797b21f73e908642e154cef50 +R a250da4d7eb0fc648ee3fc57e9bf8333 U drh -Z f2d1d961cabe20521b862d120682a7a7 +Z c0f3947dc13c9e02ac56849fd48ded9e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 81e42e2284..182b881adb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eabbee4a51bc1a865bddee890004ff3a1c9cc6b797b21f73e908642e154cef50 \ No newline at end of file +d31e1cd2ab44c7cce20b8990dff17719c286dd2fb46ba6d4f581a9553cf31891 \ No newline at end of file diff --git a/test/fuzzinvariants.c b/test/fuzzinvariants.c index 3b7827a775..a59aab4894 100644 --- a/test/fuzzinvariants.c +++ b/test/fuzzinvariants.c @@ -92,7 +92,11 @@ int fuzz_invariant( sqlite3_free(zTest); nCol = sqlite3_column_count(pStmt); for(i=0; i=2 ){ char *zSql = sqlite3_expanded_sql(pTestStmt); From 13736999d9f405de3696dedbe4c658ca5116f66f Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 18 Jun 2022 20:20:30 +0000 Subject: [PATCH 13/31] Enable query invariant checking in fuzzcheck by default. There is no way to turn it off. Update the invariant checking logic to be consistant with dbsqlfuzz. FossilOrigin-Name: 66ca729bbbf37cb7ff8eb12f51429e0c0833bd5d3f0ef20a1eaeeb10820713c2 --- manifest | 14 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 53 +++++++++++++++++++++++++++++++------------ test/fuzzinvariants.c | 7 +++--- 4 files changed, 51 insertions(+), 25 deletions(-) diff --git a/manifest b/manifest index fbe59a3eb7..b16e4845e1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Abandon\sa\squery-invariant\scheck\sin\sfuzzcheck\sif\sthe\scall\sto\nsqlite3_bind_value()\sreturns\sanything\sother\sthan\sSQLITE_OK\sor\sSQLITE_RANGE. -D 2022-06-18T14:50:43.710 +C Enable\squery\sinvariant\schecking\sin\sfuzzcheck\sby\sdefault.\s\sThere\sis\sno\sway\nto\sturn\sit\soff.\s\sUpdate\sthe\sinvariant\schecking\slogic\sto\sbe\sconsistant\swith\ndbsqlfuzz. +D 2022-06-18T20:20:30.693 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1085,7 +1085,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 618511e19af06d8d7200a84fc5075837b3d46b000ce1f332f0639c7079761bf8 +F test/fuzzcheck.c 7b501d55631c2d759e0bed02ed329904a35690fc6563d7b6cc69b7788a024f26 F test/fuzzdata1.db 3e86d9cf5aea68ddb8e27c02d7dfdaa226347426c7eb814918e4d95475bf8517 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1097,7 +1097,7 @@ F test/fuzzdata8.db ca9a97f401b06b0d5376139ec7e1f9e773e13345a9a2d9ccc0032cdbfede F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc -F test/fuzzinvariants.c d02dbf42821ffee6edf0b202e015ae6c25442cb23a58dbf8abb5db227008b934 +F test/fuzzinvariants.c 2b939b78736f2cb340f43e7d2ecbdff48de56bfb2ba7fe0b7e28f5c03ee62daf F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c F test/gencol1.test cc0dbb0ee116e5602e18ea7d47f2a0f76b26e09a823b7c36ef254370c2b0f3c1 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 @@ -1978,8 +1978,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 eabbee4a51bc1a865bddee890004ff3a1c9cc6b797b21f73e908642e154cef50 -R a250da4d7eb0fc648ee3fc57e9bf8333 +P d31e1cd2ab44c7cce20b8990dff17719c286dd2fb46ba6d4f581a9553cf31891 +R 5b4a10214807c18490f78f54aeff8595 U drh -Z c0f3947dc13c9e02ac56849fd48ded9e +Z d6244a9a07066e08a48f8f82e9118858 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 182b881adb..1f4f0cd9e5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d31e1cd2ab44c7cce20b8990dff17719c286dd2fb46ba6d4f581a9553cf31891 \ No newline at end of file +66ca729bbbf37cb7ff8eb12f51429e0c0833bd5d3f0ef20a1eaeeb10820713c2 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index e95b2558d6..fe56262211 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -153,7 +153,6 @@ static struct GlobalVars { int nSql; /* Number of SQL scripts */ Blob *pFirstSql; /* First SQL script */ unsigned int uRandom; /* Seed for the SQLite PRNG */ - unsigned char doInvariantChecks; /* True to run query invariant checks */ unsigned int nInvariant; /* Number of invariant checks run */ char zTestName[100]; /* Name of current test */ } g; @@ -838,6 +837,7 @@ static int progress_handler(void *pClientData) { #define BTS_SELECT 0x000001 #define BTS_NONSELECT 0x000002 #define BTS_BADFUNC 0x000004 +#define BTS_BADPRAGMA 0x000008 /* Sticky for rest of the script */ /* ** Disallow debugging pragmas such as "PRAGMA vdbe_debug" and @@ -854,7 +854,8 @@ static int block_troublesome_sql( const char *zArg3, const char *zArg4 ){ - unsigned int *pFlags = (unsigned int*)pClientData; + unsigned int *pBtsFlags = (unsigned int*)pClientData; + (void)zArg3; (void)zArg4; switch( eCode ){ @@ -863,24 +864,31 @@ static int block_troublesome_sql( && (zArg2==0 || strtoll(zArg2,0,0)>100 || strtoll(zArg2,0,10)>100) ){ return SQLITE_DENY; + }else if( sqlite3_stricmp("hard_heap_limit", zArg1)==0 + || sqlite3_stricmp("reverse_unordered_selects", zArg1)==0 + ){ + /* BTS_BADPRAGMA is sticky. A hard_heap_limit or + ** revert_unordered_selects should inhibit all future attempts + ** at verifying query invariants */ + *pBtsFlags |= BTS_BADPRAGMA; }else if( eVerbosity==0 ){ if( sqlite3_strnicmp("vdbe_", zArg1, 5)==0 || sqlite3_stricmp("parser_trace", zArg1)==0 || sqlite3_stricmp("temp_store_directory", zArg1)==0 ){ return SQLITE_DENY; - } + } }else if( sqlite3_stricmp("oom",zArg1)==0 && zArg2!=0 && zArg2[0]!=0 ){ oomCounter = atoi(zArg2); } - *pFlags |= BTS_NONSELECT; + *pBtsFlags |= BTS_NONSELECT; break; } case SQLITE_ATTACH: { /* Deny the ATTACH if it is attaching anything other than an in-memory ** database. */ - *pFlags |= BTS_NONSELECT; + *pBtsFlags |= BTS_NONSELECT; if( zArg1==0 ) return SQLITE_DENY; if( strcmp(zArg1,":memory:")==0 ) return SQLITE_OK; if( sqlite3_strglob("file:*[?]vfs=memdb", zArg1)==0 @@ -891,23 +899,45 @@ static int block_troublesome_sql( return SQLITE_DENY; } case SQLITE_SELECT: { - *pFlags |= BTS_SELECT; + *pBtsFlags |= BTS_SELECT; break; } case SQLITE_FUNCTION: { static const char *azBadFuncs[] = { + "avg", + "count", + "cume_dist", "current_date", "current_time", "current_timestamp", "date", "datetime", + "decimal_sum", + "dense_rank", + "first_value", + "geopoly_group_bbox", + "group_concat", "implies_nonnull_row", + "json_group_array", + "json_group_object", "julianday", + "lag", + "last_value", + "lead", + "max", + "min", + "nth_value", + "ntile", + "percent_rank", "random", "randomblob", + "rank", + "row_number", "sqlite_offset", "strftime", + "sum", "time", + "total", "unixepoch", }; int first, last; @@ -921,7 +951,7 @@ static int block_troublesome_sql( }else if( c>0 ){ last = mid-1; }else{ - *pFlags |= BTS_BADFUNC; + *pBtsFlags |= BTS_BADFUNC; break; } }while( first<=last ); @@ -932,7 +962,7 @@ static int block_troublesome_sql( break; } default: { - *pFlags |= BTS_NONSELECT; + *pBtsFlags |= BTS_NONSELECT; } } return SQLITE_OK; @@ -962,7 +992,7 @@ static int runDbSql(sqlite3 *db, const char *zSql, unsigned int *pBtsFlags){ printf("RUNNING-SQL: [%s]\n", zSql); fflush(stdout); } - (*pBtsFlags) = 0; + (*pBtsFlags) &= ~BTS_BADPRAGMA; rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); if( rc==SQLITE_OK ){ int nRow = 0; @@ -1018,7 +1048,6 @@ static int runDbSql(sqlite3 *db, const char *zSql, unsigned int *pBtsFlags){ } /* End while( SQLITE_ROW */ if( rc==SQLITE_DONE ){ if( (*pBtsFlags)==BTS_SELECT - && g.doInvariantChecks && !sqlite3_stmt_isexplain(pStmt) && nRow>0 ){ @@ -1674,7 +1703,6 @@ static void showHelp(void){ " --oss-fuzz Enable OSS-FUZZ testing\n" " --prng-seed N Seed value for the PRGN inside of SQLite\n" " -q|--quiet Reduced output\n" -" --query-invariants Run query invariant checks\n" " --rebuild Rebuild and vacuum the database file\n" " --result-trace Show the results of each SQL command\n" " --script Output CLI script instead of running tests\n" @@ -1835,9 +1863,6 @@ int main(int argc, char **argv){ verboseFlag = 0; eVerbosity = 0; }else - if( strcmp(z,"query-invariants")==0 ){ - g.doInvariantChecks = 1; - }else if( strcmp(z,"rebuild")==0 ){ rebuildFlag = 1; openFlags4Data = SQLITE_OPEN_READWRITE; diff --git a/test/fuzzinvariants.c b/test/fuzzinvariants.c index a59aab4894..a2a5028d1b 100644 --- a/test/fuzzinvariants.c +++ b/test/fuzzinvariants.c @@ -109,7 +109,7 @@ int fuzz_invariant( } if( i>=nCol ) break; } - if( rc!=SQLITE_ROW && rc!=SQLITE_NOMEM ){ + if( rc==SQLITE_DONE ){ /* No matching output row found */ sqlite3_stmt *pCk = 0; rc = sqlite3_prepare_v2(db, "PRAGMA integrity_check", -1, &pCk, 0); @@ -183,8 +183,9 @@ static char *fuzz_invariant_sql(sqlite3_stmt *pStmt, int iCnt){ while( nIn>0 && (isspace(zIn[nIn-1]) || zIn[nIn-1]==';') ) nIn--; if( strchr(zIn, '?') ) return 0; pTest = sqlite3_str_new(0); - sqlite3_str_appendf(pTest, "SELECT %s* FROM (%.*s)", - bDistinct ? "DISTINCT " : "", (int)nIn, zIn); + sqlite3_str_appendf(pTest, "SELECT %s* FROM (%s", + bDistinct ? "DISTINCT " : "", zIn); + sqlite3_str_appendf(pTest, ")"); rc = sqlite3_prepare_v2(db, sqlite3_str_value(pTest), -1, &pBase, 0); if( rc ){ sqlite3_finalize(pBase); From 1d49768151a2cdbbfebe78cc2da11b717b164be8 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 19 Jun 2022 16:55:07 +0000 Subject: [PATCH 14/31] Follow-up to check-in [0057bbb508e7662b] - ensure that the database page has been initialized prior to continuing with the optimization. If the page is not initialized, that indicates that the database is corrupt. dbsqlfuzz 09ee46becd5e6d1b2a55c9f8ad767335a90aadb0. FossilOrigin-Name: 11162446f12ae3af6e4a63bb5c374129b2505f6006f91d4028c7165f05fe9651 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 3 +++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index b16e4845e1..8a7ccec81d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enable\squery\sinvariant\schecking\sin\sfuzzcheck\sby\sdefault.\s\sThere\sis\sno\sway\nto\sturn\sit\soff.\s\sUpdate\sthe\sinvariant\schecking\slogic\sto\sbe\sconsistant\swith\ndbsqlfuzz. -D 2022-06-18T20:20:30.693 +C Follow-up\sto\scheck-in\s[0057bbb508e7662b]\s-\sensure\sthat\sthe\sdatabase\spage\nhas\sbeen\sinitialized\sprior\sto\scontinuing\swith\sthe\soptimization.\s\sIf\sthe\spage\nis\snot\sinitialized,\sthat\sindicates\sthat\sthe\sdatabase\sis\scorrupt.\ndbsqlfuzz\s09ee46becd5e6d1b2a55c9f8ad767335a90aadb0. +D 2022-06-19T16:55:07.534 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -510,7 +510,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c a2891172438e385fdbe97c11c9745676bec54f518d4447090af97189fd8e52d7 F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c cc49f394c156f101ff12449a21ec1478f60e1bbd287fbf5fec8c2322dc55cccd +F src/btree.c b5a74c39d3123dadd190019c0afadd7f62b43dfe0712a39e9d0ff2fe26be5d93 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e F src/build.c 23f874642825d7eaaeeb7a3281b2b1a75e1d4c4dd9ae4dceddcd908266634214 @@ -1978,8 +1978,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 d31e1cd2ab44c7cce20b8990dff17719c286dd2fb46ba6d4f581a9553cf31891 -R 5b4a10214807c18490f78f54aeff8595 +P 66ca729bbbf37cb7ff8eb12f51429e0c0833bd5d3f0ef20a1eaeeb10820713c2 +R fa8846316014c6162dbcbfd1faaeecc9 U drh -Z d6244a9a07066e08a48f8f82e9118858 +Z fcfd6ea1142ee132e30beeda028c95e6 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 1f4f0cd9e5..e56b982368 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -66ca729bbbf37cb7ff8eb12f51429e0c0833bd5d3f0ef20a1eaeeb10820713c2 \ No newline at end of file +11162446f12ae3af6e4a63bb5c374129b2505f6006f91d4028c7165f05fe9651 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 8ed4d6cef4..facb951d3c 100644 --- a/src/btree.c +++ b/src/btree.c @@ -5847,6 +5847,9 @@ int sqlite3BtreeIndexMoveto( && pIdxKey->errCode==SQLITE_OK ){ pCur->curFlags &= ~BTCF_ValidOvfl; + if( !pCur->pPage->isInit ){ + return SQLITE_CORRUPT_BKPT; + } goto bypass_moveto_root; /* Start search on the current page */ } pIdxKey->errCode = SQLITE_OK; From ae8776e09227d77655a83138861c8aab0430ee71 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 20 Jun 2022 12:42:28 +0000 Subject: [PATCH 15/31] The fix at [cab9b4cccd13bf0a] was incomplete, as demonstrated by [forum:/forumpost/57bdf2217d|forum post 57bdf2217d]. This check-in should complete the fix. FossilOrigin-Name: fb0a23b6789da8e934562ce9ebd9d58ea13a10fd10dee5cbfc7ac8f394e1aeec --- ext/rtree/rtree1.test | 14 ++++++++++++++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/select.c | 18 ++++++++++++++++-- test/join8.test | 16 ++++++++++++++++ 5 files changed, 55 insertions(+), 11 deletions(-) diff --git a/ext/rtree/rtree1.test b/ext/rtree/rtree1.test index 0423bf557c..e5b55a28e4 100644 --- a/ext/rtree/rtree1.test +++ b/ext/rtree/rtree1.test @@ -733,4 +733,18 @@ do_execsql_test 19.1 { SELECT v0.x FROM v0, rt0 WHERE v0.x = rt0.b; } {0.0} +# 2022-06-20 https://sqlite.org/forum/forumpost/57bdf2217d +# +reset_db +do_execsql_test 20.0 { + CREATE VIRTUAL TABLE rt0 USING rtree(id, x0, x1); + CREATE TABLE t0(a INT); + CREATE TABLE t1(b INT); + INSERT INTO rt0 VALUES(0, 0, 0); + SELECT * FROM t1 JOIN t0 ON x0>a RIGHT JOIN rt0 ON true WHERE +x0 = 0; +} {} +do_execsql_test 20.1 { + SELECT * FROM t1 JOIN t0 ON x0>a RIGHT JOIN rt0 ON true WHERE x0 = 0; +} {} + finish_test diff --git a/manifest b/manifest index 8a7ccec81d..5496a6747d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Follow-up\sto\scheck-in\s[0057bbb508e7662b]\s-\sensure\sthat\sthe\sdatabase\spage\nhas\sbeen\sinitialized\sprior\sto\scontinuing\swith\sthe\soptimization.\s\sIf\sthe\spage\nis\snot\sinitialized,\sthat\sindicates\sthat\sthe\sdatabase\sis\scorrupt.\ndbsqlfuzz\s09ee46becd5e6d1b2a55c9f8ad767335a90aadb0. -D 2022-06-19T16:55:07.534 +C The\sfix\sat\s[cab9b4cccd13bf0a]\swas\sincomplete,\sas\sdemonstrated\sby\n[forum:/forumpost/57bdf2217d|forum\spost\s57bdf2217d].\s\sThis\scheck-in\nshould\scomplete\sthe\sfix. +D 2022-06-20T12:42:28.345 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -416,7 +416,7 @@ F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c cc3f89c11abcf114fa60d74709ae8b5bc1eae5a261b30bc1bb7085089c03bfab F ext/rtree/rtree.c d7b4b8b81d8d54376a7f81de5be85ec58b37c11604bcf42984a8418b34158d93 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 -F ext/rtree/rtree1.test 35c3bc0def71317b7601ee0d1149e7df2cd8fc4f13ec89a64761ac3f46ca123f +F ext/rtree/rtree1.test 70c092dcf34716b64edc9dbab171790322aa87b89a48f7437b8b4c7b466449c4 F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d F ext/rtree/rtree3.test 4ee5d7df86040efe3d8d84f141f2962a7745452200a7cba1db06f86d97050499 F ext/rtree/rtree4.test 304de65d484540111b896827e4261815e5dca4ce28eeecd58be648cd73452c4b @@ -570,7 +570,7 @@ F src/printf.c 6166a30417b05c5b2f82e1f183f75faa2926ad60531c0b688a57dbc951441a20 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c a4eb3c617027fd049b07432f3b942ea7151fa793a332a11a7d0f58c9539e104f F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c ee3113de67330163a35307eacb4188b6778fcae1e2d2f738a9dda2daa0346e24 +F src/select.c e3181898cc05e8a78195f1792f170760df49262d6267dcaa834160900aab7d37 F src/shell.c.in 08e59f1cb9d9b1180aba52861aaada0c95f6ddd210488719684e160a0724c806 F src/sqlite.h.in 172528c287399a34f188154017b7268bf82c6d5b780902e361958d2318c4e37c F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1168,7 +1168,7 @@ F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 F test/join5.test d22b6cba8fb59ab3f1c82701434c360705eb12d4ce200c449f37b018fc47681a F test/join6.test f809c025fa253f9e150c0e9afd4cef8813257bceeb6f46e04041228c9403cc2c F test/join7.test 2268dcbb54b724391dda3748ea95c60d960607ffeed67885675998e7117697f6 -F test/join8.test e3c8ca1419e3519596a7ef129246ed118d2508b1ebb69ea83b51ea0eda32037c +F test/join8.test c839d7cd4704b600468fd4d82d92bfe3eac67623c41dbfb99f804cdad7a3846e F test/join9.test 9056ddd3b0c0f4f9d658f4521038d9a37dc23ead8ca9a505d0b0db2b6a471e05 F test/joinA.test 7eab225dc1c1ab258a5e62513a4ed7cabbd3db971d59d5d92f4fb6fa14c12f6a F test/joinB.test 1b2ba3fc8568b49411787fccbf540570c148e9b6a53a30f80691cb6268098ded @@ -1978,8 +1978,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 66ca729bbbf37cb7ff8eb12f51429e0c0833bd5d3f0ef20a1eaeeb10820713c2 -R fa8846316014c6162dbcbfd1faaeecc9 +P 11162446f12ae3af6e4a63bb5c374129b2505f6006f91d4028c7165f05fe9651 +R e2f301053cf79999e11ddef561e846ed U drh -Z fcfd6ea1142ee132e30beeda028c95e6 +Z 238d98417a47860062f9a4d41505b756 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e56b982368..b75dd0fdc6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -11162446f12ae3af6e4a63bb5c374129b2505f6006f91d4028c7165f05fe9651 \ No newline at end of file +fb0a23b6789da8e934562ce9ebd9d58ea13a10fd10dee5cbfc7ac8f394e1aeec \ No newline at end of file diff --git a/src/select.c b/src/select.c index e4a32efb78..f062d2f4df 100644 --- a/src/select.c +++ b/src/select.c @@ -4666,6 +4666,8 @@ struct WhereConst { int nConst; /* Number for COLUMN=CONSTANT terms */ int nChng; /* Number of times a constant is propagated */ int bHasAffBlob; /* At least one column in apExpr[] as affinity BLOB */ + u32 mExcludeOn; /* Which ON expressions to exclude from considertion. + ** Either EP_OuterON or EP_InnerON|EP_OuterON */ Expr **apExpr; /* [i*2] is COLUMN and [i*2+1] is VALUE */ }; @@ -4728,7 +4730,7 @@ static void constInsert( static void findConstInWhere(WhereConst *pConst, Expr *pExpr){ Expr *pRight, *pLeft; if( NEVER(pExpr==0) ) return; - if( ExprHasProperty(pExpr, EP_OuterON|EP_InnerON) ){ + if( ExprHasProperty(pExpr, pConst->mExcludeOn) ){ testcase( ExprHasProperty(pExpr, EP_OuterON) ); testcase( ExprHasProperty(pExpr, EP_InnerON) ); return; @@ -4768,9 +4770,10 @@ static int propagateConstantExprRewriteOne( int i; if( pConst->pOomFault[0] ) return WRC_Prune; if( pExpr->op!=TK_COLUMN ) return WRC_Continue; - if( ExprHasProperty(pExpr, EP_FixedCol|EP_OuterON) ){ + if( ExprHasProperty(pExpr, EP_FixedCol|pConst->mExcludeOn) ){ testcase( ExprHasProperty(pExpr, EP_FixedCol) ); testcase( ExprHasProperty(pExpr, EP_OuterON) ); + testcase( ExprHasProperty(pExpr, EP_InnerON) ); return WRC_Continue; } for(i=0; inConst; i++){ @@ -4894,6 +4897,17 @@ static int propagateConstants( x.nChng = 0; x.apExpr = 0; x.bHasAffBlob = 0; + if( ALWAYS(p->pSrc!=0) + && p->pSrc->nSrc>0 + && (p->pSrc->a[0].fg.jointype & JT_LTORJ)!=0 + ){ + /* Do not propagate constants on any ON clause if there is a + ** RIGHT JOIN anywhere in the query */ + x.mExcludeOn = EP_InnerON | EP_OuterON; + }else{ + /* Do not propagate constants through the ON clause of a LEFT JOIN */ + x.mExcludeOn = EP_OuterON; + } findConstInWhere(&x, p->pWhere); if( x.nConst ){ memset(&w, 0, sizeof(w)); diff --git a/test/join8.test b/test/join8.test index e0211a8497..c39b773d18 100644 --- a/test/join8.test +++ b/test/join8.test @@ -661,6 +661,7 @@ do_execsql_test join8-20060 { # https://sqlite.org/forum/forumpost/8e4c352937e82929 # # Do not allow constant propagation between ON and WHERE clause terms. +# (Updated 2022-06-20) See also https://sqlite.org/forum/forumpost/57bdf2217d # reset_db do_execsql_test join8-21000 { @@ -674,6 +675,21 @@ do_execsql_test join8-21010 { do_execsql_test join8-22020 { SELECT * FROM t1 JOIN t3 ON (b=TRUE) RIGHT JOIN t2 ON TRUE WHERE (b IS TRUE); } {} +do_execsql_test join8-22030 { + DROP TABLE t1; + DROP TABLE t2; + DROP TABLE t3; + CREATE TABLE t1(a INT); + CREATE TABLE t2(b INT); + CREATE TABLE t3(c INTEGER PRIMARY KEY, d INT); + CREATE INDEX t3d ON t3(d); + INSERT INTO t3 VALUES(0, 0); + SELECT * FROM t1 JOIN t2 ON d>b RIGHT JOIN t3 ON true WHERE +d = 0; +} {} +do_execsql_test join8-22040 { + SELECT * FROM t1 JOIN t2 ON d>b RIGHT JOIN t3 ON true WHERE d = 0; +} {} + # 2022-06-10 # https://sqlite.org/forum/forumpost/51e6959f61 From d7480403bc6b9d50130465596a7fb4b7a9fe9b30 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 20 Jun 2022 17:04:44 +0000 Subject: [PATCH 16/31] Do not allow an ON clause to references tables to its right if there is a RIGHT or LEFT join anywhere in the query. Other RDBMSes prohibit this always, but SQLite must allow ON clauses to reference tables to their right for legacy compatibility, unless there is a RIGHT or LEFT join someplace in the query, in which case there is no legacy to support. FossilOrigin-Name: e615dbe02ca949252d1526ed5c48f8ce08159773ea2008ce666484379d0d9854 --- ext/rtree/rtree1.test | 15 ++++++++++++--- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/select.c | 18 ++++++++++-------- src/whereexpr.c | 12 +++++++++--- test/join8.test | 8 +++++--- 6 files changed, 46 insertions(+), 27 deletions(-) diff --git a/ext/rtree/rtree1.test b/ext/rtree/rtree1.test index e5b55a28e4..034155341b 100644 --- a/ext/rtree/rtree1.test +++ b/ext/rtree/rtree1.test @@ -741,10 +741,19 @@ do_execsql_test 20.0 { CREATE TABLE t0(a INT); CREATE TABLE t1(b INT); INSERT INTO rt0 VALUES(0, 0, 0); +} +do_catchsql_test 20.1 { SELECT * FROM t1 JOIN t0 ON x0>a RIGHT JOIN rt0 ON true WHERE +x0 = 0; -} {} -do_execsql_test 20.1 { +} {1 {ON clause references tables to its right}} +do_catchsql_test 20.2 { SELECT * FROM t1 JOIN t0 ON x0>a RIGHT JOIN rt0 ON true WHERE x0 = 0; -} {} +} {1 {ON clause references tables to its right}} +db null - +do_execsql_test 20.3 { + SELECT * FROM t1 JOIN t0 ON true RIGHT JOIN rt0 ON x0>a WHERE +x0 = 0; +} {- - 0 0.0 0.0} +do_execsql_test 20.4 { + SELECT * FROM t1 JOIN t0 ON true RIGHT JOIN rt0 ON x0>a WHERE x0 = 0; +} {- - 0 0.0 0.0} finish_test diff --git a/manifest b/manifest index 5496a6747d..a9812cacf6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sfix\sat\s[cab9b4cccd13bf0a]\swas\sincomplete,\sas\sdemonstrated\sby\n[forum:/forumpost/57bdf2217d|forum\spost\s57bdf2217d].\s\sThis\scheck-in\nshould\scomplete\sthe\sfix. -D 2022-06-20T12:42:28.345 +C Do\snot\sallow\san\sON\sclause\sto\sreferences\stables\sto\sits\sright\sif\sthere\sis\sa\nRIGHT\sor\sLEFT\sjoin\sanywhere\sin\sthe\squery.\s\sOther\sRDBMSes\sprohibit\sthis\salways,\nbut\sSQLite\smust\sallow\sON\sclauses\sto\sreference\stables\sto\stheir\sright\sfor\slegacy\ncompatibility,\sunless\sthere\sis\sa\sRIGHT\sor\sLEFT\sjoin\ssomeplace\sin\sthe\squery,\nin\swhich\scase\sthere\sis\sno\slegacy\sto\ssupport. +D 2022-06-20T17:04:44.141 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -416,7 +416,7 @@ F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c cc3f89c11abcf114fa60d74709ae8b5bc1eae5a261b30bc1bb7085089c03bfab F ext/rtree/rtree.c d7b4b8b81d8d54376a7f81de5be85ec58b37c11604bcf42984a8418b34158d93 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 -F ext/rtree/rtree1.test 70c092dcf34716b64edc9dbab171790322aa87b89a48f7437b8b4c7b466449c4 +F ext/rtree/rtree1.test d47f58832145fcfed9067bc457ca8664962196c4566c17a1ebd679367db55d11 F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d F ext/rtree/rtree3.test 4ee5d7df86040efe3d8d84f141f2962a7745452200a7cba1db06f86d97050499 F ext/rtree/rtree4.test 304de65d484540111b896827e4261815e5dca4ce28eeecd58be648cd73452c4b @@ -570,7 +570,7 @@ F src/printf.c 6166a30417b05c5b2f82e1f183f75faa2926ad60531c0b688a57dbc951441a20 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c a4eb3c617027fd049b07432f3b942ea7151fa793a332a11a7d0f58c9539e104f F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c e3181898cc05e8a78195f1792f170760df49262d6267dcaa834160900aab7d37 +F src/select.c baadb1b3fd0e87f82f0c416b68a5b8d90d8f4ffb3568c9a86f84a2be7d40261f F src/shell.c.in 08e59f1cb9d9b1180aba52861aaada0c95f6ddd210488719684e160a0724c806 F src/sqlite.h.in 172528c287399a34f188154017b7268bf82c6d5b780902e361958d2318c4e37c F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -660,7 +660,7 @@ F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c 2db3d41a1fd3b93d86680b4f33530d1f96ce9941771ebee80effba071d9d1e38 F src/whereInt.h b48ca529ffe293c18cbfa8326af18a09e39910de66fb3e96ef788c7cbf8ef3a7 F src/wherecode.c 0b09abfcb88c61c6a6984a3e065786631ff35495e9bdf865e6b74ab0a1299c5b -F src/whereexpr.c 20255cf03e0b765b742301197d165511ff99e95da0d7ee9c8a2ebc1e888dd049 +F src/whereexpr.c 3b5f9f6f9fc07039b242ecf7a66e87392e9c49d62923b3c593c904090bd9345c F src/window.c fff1b51757438c664e471d5184634e48dcdf8ea34b640f3b1b0810b1e06de18c F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1168,7 +1168,7 @@ F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 F test/join5.test d22b6cba8fb59ab3f1c82701434c360705eb12d4ce200c449f37b018fc47681a F test/join6.test f809c025fa253f9e150c0e9afd4cef8813257bceeb6f46e04041228c9403cc2c F test/join7.test 2268dcbb54b724391dda3748ea95c60d960607ffeed67885675998e7117697f6 -F test/join8.test c839d7cd4704b600468fd4d82d92bfe3eac67623c41dbfb99f804cdad7a3846e +F test/join8.test 6d063ef3fa580ff9e50015107b0e6caf51e7055731749ba6391b8f11c1e00e3f F test/join9.test 9056ddd3b0c0f4f9d658f4521038d9a37dc23ead8ca9a505d0b0db2b6a471e05 F test/joinA.test 7eab225dc1c1ab258a5e62513a4ed7cabbd3db971d59d5d92f4fb6fa14c12f6a F test/joinB.test 1b2ba3fc8568b49411787fccbf540570c148e9b6a53a30f80691cb6268098ded @@ -1978,8 +1978,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 11162446f12ae3af6e4a63bb5c374129b2505f6006f91d4028c7165f05fe9651 -R e2f301053cf79999e11ddef561e846ed +P fb0a23b6789da8e934562ce9ebd9d58ea13a10fd10dee5cbfc7ac8f394e1aeec +R 9a31acf363f55129767709f03c1bfdcf U drh -Z 238d98417a47860062f9a4d41505b756 +Z ae2f170f0ee7cf50c320a853890db816 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index b75dd0fdc6..bd8414421c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fb0a23b6789da8e934562ce9ebd9d58ea13a10fd10dee5cbfc7ac8f394e1aeec \ No newline at end of file +e615dbe02ca949252d1526ed5c48f8ce08159773ea2008ce666484379d0d9854 \ No newline at end of file diff --git a/src/select.c b/src/select.c index f062d2f4df..5c73c6bf63 100644 --- a/src/select.c +++ b/src/select.c @@ -424,11 +424,13 @@ void sqlite3SetJoinExpr(Expr *p, int iTable, u32 joinFlag){ } } -/* Undo the work of sqlite3SetJoinExpr(). In the expression p, convert every -** term that is marked with EP_OuterON and w.iJoin==iTable into -** an ordinary term that omits the EP_OuterON mark. +/* Undo the work of sqlite3SetJoinExpr(). This is used when a LEFT JOIN +** is simplified into an ordinary JOIN, and when an ON expression is +** "pushed down" into the WHERE clause of a subquery. ** -** This happens when a LEFT JOIN is simplified into an ordinary JOIN. +** Convert every term that is marked with EP_OuterON and w.iJoin==iTable into +** an ordinary term that omits the EP_OuterON mark. Or if iTable<0, then +** just clear every EP_OuterON and EP_InnerON mark from the expression tree. ** ** If nullable is true, that means that Expr p might evaluate to NULL even ** if it is a reference to a NOT NULL column. This can happen, for example, @@ -438,10 +440,9 @@ void sqlite3SetJoinExpr(Expr *p, int iTable, u32 joinFlag){ */ static void unsetJoinExpr(Expr *p, int iTable, int nullable){ while( p ){ - if( ExprHasProperty(p, EP_OuterON) - && (iTable<0 || p->w.iJoin==iTable) ){ - ExprClearProperty(p, EP_OuterON); - ExprSetProperty(p, EP_InnerON); + if( iTable<0 || (ExprHasProperty(p, EP_OuterON) && p->w.iJoin==iTable) ){ + ExprClearProperty(p, EP_OuterON|EP_InnerON); + if( iTable>=0 ) ExprSetProperty(p, EP_InnerON); } if( p->op==TK_COLUMN && p->iTable==iTable && !nullable ){ ExprClearProperty(p, EP_CanBeNull); @@ -6771,6 +6772,7 @@ int sqlite3Select( SELECTTRACE(0x100,pParse,p, ("LEFT-JOIN simplifies to JOIN on term %d\n",i)); pItem->fg.jointype &= ~(JT_LEFT|JT_OUTER); + assert( pItem->iCursor>=0 ); unsetJoinExpr(p->pWhere, pItem->iCursor, pTabList->a[0].fg.jointype & JT_LTORJ); } diff --git a/src/whereexpr.c b/src/whereexpr.c index 878e69f633..52da05ddde 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -1121,9 +1121,15 @@ static void exprAnalyze( } }else if( (prereqAll>>1)>=x ){ /* The ON clause of an INNER JOIN references a table to its right. - ** Most other SQL database engines raise an error. But all versions - ** of SQLite going back to 3.0.0 have just put the ON clause constraint - ** into the WHERE clause and carried on. */ + ** Most other SQL database engines raise an error. But SQLite versions + ** 3.0 through 3.38 just put the ON clause constraint into the WHERE + ** clause and carried on. Beginning with 3.39, raise an error only + ** if there is a RIGHT or LEFT JOIN in the query. This makes SQLite + ** more like other systems, and also preserves legacy. */ + if( pSrc->nSrc>0 && (pSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ + sqlite3ErrorMsg(pParse, "ON clause references tables to its right"); + return; + } ExprClearProperty(pExpr, EP_InnerON); } } diff --git a/test/join8.test b/test/join8.test index c39b773d18..46bf38aa6d 100644 --- a/test/join8.test +++ b/test/join8.test @@ -684,11 +684,13 @@ do_execsql_test join8-22030 { CREATE TABLE t3(c INTEGER PRIMARY KEY, d INT); CREATE INDEX t3d ON t3(d); INSERT INTO t3 VALUES(0, 0); +} +do_catchsql_test join8-22031 { SELECT * FROM t1 JOIN t2 ON d>b RIGHT JOIN t3 ON true WHERE +d = 0; -} {} -do_execsql_test join8-22040 { +} {1 {ON clause references tables to its right}} +do_catchsql_test join8-22040 { SELECT * FROM t1 JOIN t2 ON d>b RIGHT JOIN t3 ON true WHERE d = 0; -} {} +} {1 {ON clause references tables to its right}} # 2022-06-10 From 436c28a265044008ae18ba55b040358b52b2c531 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 20 Jun 2022 18:26:14 +0000 Subject: [PATCH 17/31] Do not allow FROM-clause terms on the left side of a RIGHT or FULL JOIN to be reordered. [forum:/forumpost/6650cd40b5634f35|forum post 6650cd40b5634f35]. This is probably more strict that necessary to get correct behavior, but for the first release that supports RIGHT/FULL JOIN it is perhaps better to be correct than fast. A less strict constraint might be to prohibit FROM-clause terms that originate on the left side of a RIGHT JOIN from crossing from the right side to the left side of a LEFT JOIN. Revisit this later. FossilOrigin-Name: 238453ffab0ba1bdddb529be35da82d5e8fb312a9574003a5441f455e601a909 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 14 ++++++++++++-- test/join8.test | 21 +++++++++++++++++++++ 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index a9812cacf6..a63676b224 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sallow\san\sON\sclause\sto\sreferences\stables\sto\sits\sright\sif\sthere\sis\sa\nRIGHT\sor\sLEFT\sjoin\sanywhere\sin\sthe\squery.\s\sOther\sRDBMSes\sprohibit\sthis\salways,\nbut\sSQLite\smust\sallow\sON\sclauses\sto\sreference\stables\sto\stheir\sright\sfor\slegacy\ncompatibility,\sunless\sthere\sis\sa\sRIGHT\sor\sLEFT\sjoin\ssomeplace\sin\sthe\squery,\nin\swhich\scase\sthere\sis\sno\slegacy\sto\ssupport. -D 2022-06-20T17:04:44.141 +C Do\snot\sallow\sFROM-clause\sterms\son\sthe\sleft\sside\sof\sa\sRIGHT\sor\sFULL\sJOIN\sto\nbe\sreordered.\s[forum:/forumpost/6650cd40b5634f35|forum\spost\s6650cd40b5634f35].\nThis\sis\sprobably\smore\sstrict\sthat\snecessary\sto\sget\scorrect\sbehavior,\nbut\sfor\sthe\sfirst\srelease\sthat\ssupports\sRIGHT/FULL\sJOIN\sit\sis\sperhaps\sbetter\nto\sbe\scorrect\sthan\sfast.\s\sA\sless\sstrict\sconstraint\smight\sbe\sto\sprohibit\nFROM-clause\sterms\sthat\soriginate\son\sthe\sleft\sside\sof\sa\sRIGHT\sJOIN\sfrom\ncrossing\sfrom\sthe\sright\sside\sto\sthe\sleft\sside\sof\sa\sLEFT\sJOIN.\s\sRevisit\sthis\nlater. +D 2022-06-20T18:26:14.716 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -657,7 +657,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 2db3d41a1fd3b93d86680b4f33530d1f96ce9941771ebee80effba071d9d1e38 +F src/where.c ce4cb0246b6a21bbc728405ade013e1ea2d8d7662e720bf3601cdf57877738fd F src/whereInt.h b48ca529ffe293c18cbfa8326af18a09e39910de66fb3e96ef788c7cbf8ef3a7 F src/wherecode.c 0b09abfcb88c61c6a6984a3e065786631ff35495e9bdf865e6b74ab0a1299c5b F src/whereexpr.c 3b5f9f6f9fc07039b242ecf7a66e87392e9c49d62923b3c593c904090bd9345c @@ -1168,7 +1168,7 @@ F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 F test/join5.test d22b6cba8fb59ab3f1c82701434c360705eb12d4ce200c449f37b018fc47681a F test/join6.test f809c025fa253f9e150c0e9afd4cef8813257bceeb6f46e04041228c9403cc2c F test/join7.test 2268dcbb54b724391dda3748ea95c60d960607ffeed67885675998e7117697f6 -F test/join8.test 6d063ef3fa580ff9e50015107b0e6caf51e7055731749ba6391b8f11c1e00e3f +F test/join8.test d0e75bf880a1b1ee8fda57d8187170c5b2ff0c0cd0e1d6d474faa99fe1283d8d F test/join9.test 9056ddd3b0c0f4f9d658f4521038d9a37dc23ead8ca9a505d0b0db2b6a471e05 F test/joinA.test 7eab225dc1c1ab258a5e62513a4ed7cabbd3db971d59d5d92f4fb6fa14c12f6a F test/joinB.test 1b2ba3fc8568b49411787fccbf540570c148e9b6a53a30f80691cb6268098ded @@ -1978,8 +1978,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 fb0a23b6789da8e934562ce9ebd9d58ea13a10fd10dee5cbfc7ac8f394e1aeec -R 9a31acf363f55129767709f03c1bfdcf +P e615dbe02ca949252d1526ed5c48f8ce08159773ea2008ce666484379d0d9854 +R 48589c176c5ab1c40074a760cfbc3f01 U drh -Z ae2f170f0ee7cf50c320a853890db816 +Z 3000f0f04f5b94504d5251d15c1dcd1e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index bd8414421c..7f5c636bac 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e615dbe02ca949252d1526ed5c48f8ce08159773ea2008ce666484379d0d9854 \ No newline at end of file +238453ffab0ba1bdddb529be35da82d5e8fb312a9574003a5441f455e601a909 \ No newline at end of file diff --git a/src/where.c b/src/where.c index ed2a2d2218..196c508b0d 100644 --- a/src/where.c +++ b/src/where.c @@ -4180,11 +4180,21 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ pNew->iTab = iTab; pBuilder->iPlanLimit += SQLITE_QUERY_PLANNER_LIMIT_INCR; pNew->maskSelf = sqlite3WhereGetMask(&pWInfo->sMaskSet, pItem->iCursor); - if( bFirstPastRJ || (pItem->fg.jointype & (JT_OUTER|JT_CROSS))!=0 ){ + if( bFirstPastRJ + || (pItem->fg.jointype & (JT_OUTER|JT_CROSS|JT_LTORJ))!=0 + ){ /* Add prerequisites to prevent reordering of FROM clause terms ** across CROSS joins and outer joins. The bFirstPastRJ boolean ** prevents the right operand of a RIGHT JOIN from being swapped with - ** other elements even further to the right. */ + ** other elements even further to the right. + ** + ** The JT_LTORJ term prevents any FROM-clause term reordering for terms + ** to the left of a RIGHT JOIN. This is conservative. Relaxing this + ** constraint somewhat to prevent terms from crossing from the right + ** side of a LEFT JOIN over to the left side when they are on the + ** left side of a RIGHT JOIN would be sufficient for all known failure + ** cases. FIX ME: Implement this optimization. + */ mPrereq |= mPrior; bFirstPastRJ = (pItem->fg.jointype & JT_RIGHT)!=0; } diff --git a/test/join8.test b/test/join8.test index 46bf38aa6d..97b0fe13df 100644 --- a/test/join8.test +++ b/test/join8.test @@ -764,5 +764,26 @@ do_execsql_test join8-24000 { SELECT * FROM t4 JOIN t7 ON true RIGHT JOIN (SELECT y AS z FROM t7) AS t6 ON (x=z); } {- - - - 200} +# 2022-06-20 +# forum/forumpost/6650cd40b5634f35 +# +reset_db +do_execsql_test join8-25000 { + CREATE TABLE t1(a1 INT); + CREATE TABLE t2(b2 INT); + CREATE TABLE t3(c3 INT, d3 INT UNIQUE); + CREATE TABLE t4(e4 INT, f4 TEXT); + INSERT INTO t3(c3, d3) VALUES (2, 1); + INSERT INTO t4(f4) VALUES ('x'); + CREATE INDEX i0 ON t3(c3) WHERE d3 ISNULL; + ANALYZE main; +} +db null - +do_execsql_test join8-25010 { + SELECT * FROM t1 LEFT JOIN t2 ON true JOIN t3 ON (b2 IN (a1)) FULL JOIN t4 ON true; +} {- - - - - x} +do_execsql_test join8-25020 { + SELECT 1 FROM t1 LEFT JOIN t2 ON true JOIN t3 ON (b2 IN (a1)) FULL JOIN t4 ON true; +} {1} finish_test From 4af6462fb811ebb1abb572a549249d0663da6c1a Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 20 Jun 2022 19:12:57 +0000 Subject: [PATCH 18/31] Add an ALWAYS() macro to an always-true branch. FossilOrigin-Name: 364645d8fe22491cd566e868027e739464205e892753356016b1988ead207af4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/whereexpr.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index a63676b224..c2372bfc32 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sallow\sFROM-clause\sterms\son\sthe\sleft\sside\sof\sa\sRIGHT\sor\sFULL\sJOIN\sto\nbe\sreordered.\s[forum:/forumpost/6650cd40b5634f35|forum\spost\s6650cd40b5634f35].\nThis\sis\sprobably\smore\sstrict\sthat\snecessary\sto\sget\scorrect\sbehavior,\nbut\sfor\sthe\sfirst\srelease\sthat\ssupports\sRIGHT/FULL\sJOIN\sit\sis\sperhaps\sbetter\nto\sbe\scorrect\sthan\sfast.\s\sA\sless\sstrict\sconstraint\smight\sbe\sto\sprohibit\nFROM-clause\sterms\sthat\soriginate\son\sthe\sleft\sside\sof\sa\sRIGHT\sJOIN\sfrom\ncrossing\sfrom\sthe\sright\sside\sto\sthe\sleft\sside\sof\sa\sLEFT\sJOIN.\s\sRevisit\sthis\nlater. -D 2022-06-20T18:26:14.716 +C Add\san\sALWAYS()\smacro\sto\san\salways-true\sbranch. +D 2022-06-20T19:12:57.509 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -660,7 +660,7 @@ F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c ce4cb0246b6a21bbc728405ade013e1ea2d8d7662e720bf3601cdf57877738fd F src/whereInt.h b48ca529ffe293c18cbfa8326af18a09e39910de66fb3e96ef788c7cbf8ef3a7 F src/wherecode.c 0b09abfcb88c61c6a6984a3e065786631ff35495e9bdf865e6b74ab0a1299c5b -F src/whereexpr.c 3b5f9f6f9fc07039b242ecf7a66e87392e9c49d62923b3c593c904090bd9345c +F src/whereexpr.c 4dae5e39a813224bec5bc404ebc328ad369766c39652692ae145e0870ca4cc5b F src/window.c fff1b51757438c664e471d5184634e48dcdf8ea34b640f3b1b0810b1e06de18c F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1978,8 +1978,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 e615dbe02ca949252d1526ed5c48f8ce08159773ea2008ce666484379d0d9854 -R 48589c176c5ab1c40074a760cfbc3f01 +P 238453ffab0ba1bdddb529be35da82d5e8fb312a9574003a5441f455e601a909 +R 57576f51c387fe18a54479f6dd78ac04 U drh -Z 3000f0f04f5b94504d5251d15c1dcd1e +Z b2444781b1807ed8d4ed33c84208ef21 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 7f5c636bac..c8d0b08c74 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -238453ffab0ba1bdddb529be35da82d5e8fb312a9574003a5441f455e601a909 \ No newline at end of file +364645d8fe22491cd566e868027e739464205e892753356016b1988ead207af4 \ No newline at end of file diff --git a/src/whereexpr.c b/src/whereexpr.c index 52da05ddde..9c7fcd351a 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -1126,7 +1126,7 @@ static void exprAnalyze( ** clause and carried on. Beginning with 3.39, raise an error only ** if there is a RIGHT or LEFT JOIN in the query. This makes SQLite ** more like other systems, and also preserves legacy. */ - if( pSrc->nSrc>0 && (pSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ + if( ALWAYS(pSrc->nSrc>0) && (pSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ sqlite3ErrorMsg(pParse, "ON clause references tables to its right"); return; } From b9294de1e6e4ff73b3f1d045d0325d5a54fb90f8 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 21 Jun 2022 13:41:24 +0000 Subject: [PATCH 19/31] Allow a HAVING clause on any aggregate query, even if there is no GROUP BY clause. This brings SQLite into closer agreement with PostgreSQL and fixes the concern raised by [forum:/forumpost/1a7fea4651|forum post 1a7fea4651]. FossilOrigin-Name: 9322a7c21f1c22ba00e9b889223e89bc1591db6e561ce05091e905e98c1bf2b3 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/resolve.c | 4 ++-- test/count.test | 9 ++++++--- test/select3.test | 7 +++---- test/window1.test | 5 +++++ 6 files changed, 26 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index c2372bfc32..da777bfc04 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\san\sALWAYS()\smacro\sto\san\salways-true\sbranch. -D 2022-06-20T19:12:57.509 +C Allow\sa\sHAVING\sclause\son\sany\saggregate\squery,\seven\sif\sthere\sis\sno\sGROUP\sBY\nclause.\s\sThis\sbrings\sSQLite\sinto\scloser\sagreement\swith\sPostgreSQL\sand\sfixes\nthe\sconcern\sraised\sby\s\n[forum:/forumpost/1a7fea4651|forum\spost\s1a7fea4651]. +D 2022-06-21T13:41:24.351 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -568,7 +568,7 @@ F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7 F src/prepare.c c62820c15dcb63013519c8e41d9f928d7478672cc902cfd0581c733c271dbf45 F src/printf.c 6166a30417b05c5b2f82e1f183f75faa2926ad60531c0b688a57dbc951441a20 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c -F src/resolve.c a4eb3c617027fd049b07432f3b942ea7151fa793a332a11a7d0f58c9539e104f +F src/resolve.c 1655e44c77c51ebbe82924287528a78bd4a4aaaf34189dbae28d19ccf2ca615c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c baadb1b3fd0e87f82f0c416b68a5b8d90d8f4ffb3568c9a86f84a2be7d40261f F src/shell.c.in 08e59f1cb9d9b1180aba52861aaada0c95f6ddd210488719684e160a0724c806 @@ -838,7 +838,7 @@ F test/corruptL.test ecce40d7b9b909a670a42a45d86e30d927735d7e7f09041af438b19529d F test/corruptM.test 7d574320e08c1b36caa3e47262061f186367d593a7e305d35f15289cc2c3e067 F test/corruptN.test 60b5a62944b4f0029ba07edaa5fd8e670539d6b0a8d99db26c068d435675cbfe F test/cost.test b11cdbf9f11ffe8ef99c9881bf390e61fe92baf2182bad1dbe6de59a7295c576 -F test/count.test 013d64569c15563c59472d17ec4ddc681034aaee65e8b01880bc88315fd4c673 +F test/count.test cd4bd531066e8d77ef8fe1e3fc8253d042072e117ccab214b290cf83f1602249 F test/countofview.test e17d6e6688cf74f22783c9ec6e788c0790ee4fbbaee713affd00b1ac0bb39b86 F test/coveridxscan.test f35c7208dedc4f98e471c569df64c0f95a49f6e072d8dc7c8f99bdee2697de1b F test/crash.test fb9dc4a02dcba30d4aa5c2c226f98b220b2b959f @@ -1390,7 +1390,7 @@ F test/securedel.test 2f70b2449186a1921bd01ec9da407fbfa98c3a7a5521854c300c194b2f F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5 F test/select1.test 692e84cfa29c405854c69e8a4027183d64c22952866a123fabbce741a379e889 F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56 -F test/select3.test c49fbb758903f3718e2de5aa4655eda4838131cbea24a86db908f8b6889aa68c +F test/select3.test 399a0b23f8618bfe07ea24fb67f2952f620d6eba662bccabf6f4f71c2d89e6c9 F test/select4.test f0684d3da3bccacbe2a1ebadf6fb49d9df6f53acb4c6ebc228a88d0d6054cc7b F test/select5.test 8afc5e5dcdebc2be54472e73ebd9cd1adef1225fd15d37a1c62f969159f390ae F test/select6.test 9b2fb4ffedf52e1b5703cfcae1212e7a4a063f014c0458d78d29aca3db766d1f @@ -1831,7 +1831,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 4baffc3acb2e5188a5e3a895b2b543ed09e62f7c72d713c1feebf76222fe9976 F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 18aadea36d7a9fab1474b1d80002d82304a342e0471793841c66afde14a381b8 +F test/window1.test ae87c4ea4e689725c7e1c826ab2b10704d5b6d31f9b9e5abadded996ba53a1d4 F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1978,8 +1978,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 238453ffab0ba1bdddb529be35da82d5e8fb312a9574003a5441f455e601a909 -R 57576f51c387fe18a54479f6dd78ac04 +P 364645d8fe22491cd566e868027e739464205e892753356016b1988ead207af4 +R b811a955eaf3f4f24a3997e7a988ecb5 U drh -Z b2444781b1807ed8d4ed33c84208ef21 +Z 1ff0c2c17df919cd17badf81d6bc1850 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index c8d0b08c74..00c7a12629 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -364645d8fe22491cd566e868027e739464205e892753356016b1988ead207af4 \ No newline at end of file +9322a7c21f1c22ba00e9b889223e89bc1591db6e561ce05091e905e98c1bf2b3 \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 175f81a10e..6a36c8cf47 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1824,8 +1824,8 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ sNC.uNC.pEList = p->pEList; sNC.ncFlags |= NC_UEList; if( p->pHaving ){ - if( !pGroupBy ){ - sqlite3ErrorMsg(pParse, "a GROUP BY clause is required before HAVING"); + if( (p->selFlags & SF_Aggregate)==0 ){ + sqlite3ErrorMsg(pParse, "HAVING clause on a non-aggregate query"); return WRC_Abort; } if( sqlite3ResolveExprNames(&sNC, p->pHaving) ) return WRC_Abort; diff --git a/test/count.test b/test/count.test index fdcb21e81d..6f02074cdc 100644 --- a/test/count.test +++ b/test/count.test @@ -126,9 +126,12 @@ do_test count-2.7 { do_test count-2.8 { uses_op_count {SELECT count(*) FROM t2 WHERE a IS NOT NULL} } {0} -do_test count-2.9 { - catchsql {SELECT count(*) FROM t2 HAVING count(*)>1} -} {1 {a GROUP BY clause is required before HAVING}} +do_execsql_test count-2.9a { + SELECT count(*) FROM t2 HAVING count(*)>1; +} {} +do_execsql_test count-2.9b { + SELECT count(*) FROM t2 HAVING count(*)<10; +} {0} do_test count-2.10 { uses_op_count {SELECT count(*) FROM (SELECT 1)} } {0} diff --git a/test/select3.test b/test/select3.test index fec8ba4a51..690514b496 100644 --- a/test/select3.test +++ b/test/select3.test @@ -119,10 +119,9 @@ do_test select3-2.14 { # Cannot have a HAVING without a GROUP BY # -do_test select3-3.1 { - set v [catch {execsql {SELECT log, count(*) FROM t1 HAVING log>=4}} msg] - lappend v $msg -} {1 {a GROUP BY clause is required before HAVING}} +do_execsql_test select3-3.1 { + SELECT log, count(*) FROM t1 HAVING log>=4 +} {} # Toss in some HAVING clauses # diff --git a/test/window1.test b/test/window1.test index 84331d1152..fd71ed6bb9 100644 --- a/test/window1.test +++ b/test/window1.test @@ -2203,5 +2203,10 @@ do_catchsql_test 71.0 { ORDER BY b; } {/1 {.*}/} +do_execsql_test 72.1 { + CREATE TABLE dual(dummy); INSERT INTO dual VALUES('X'); + CREATE VIEW v1(x,y) AS SELECT RANK() OVER (PARTITION BY 0), SUM(0) FROM dual; + SELECT * FROM v1 WHERE true; +} {1 0} finish_test From 8c44962aaffa59d579db49b44c085dbdb108af34 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 21 Jun 2022 18:38:18 +0000 Subject: [PATCH 20/31] Disable the short-cut query planner if the NOT INDEXED modifier is used. [forum:/forumpost/454d706296|Forum post 454d706296]. FossilOrigin-Name: bd87d107fe474ceeac8bacb01c80bc479edbc2ae4e30697bf54ab91a5a8d2a98 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 6 +++++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index da777bfc04..3287f064ba 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\sa\sHAVING\sclause\son\sany\saggregate\squery,\seven\sif\sthere\sis\sno\sGROUP\sBY\nclause.\s\sThis\sbrings\sSQLite\sinto\scloser\sagreement\swith\sPostgreSQL\sand\sfixes\nthe\sconcern\sraised\sby\s\n[forum:/forumpost/1a7fea4651|forum\spost\s1a7fea4651]. -D 2022-06-21T13:41:24.351 +C Disable\sthe\sshort-cut\squery\splanner\sif\sthe\sNOT\sINDEXED\smodifier\sis\sused.\n[forum:/forumpost/454d706296|Forum\spost\s454d706296]. +D 2022-06-21T18:38:18.478 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -657,7 +657,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 ce4cb0246b6a21bbc728405ade013e1ea2d8d7662e720bf3601cdf57877738fd +F src/where.c 518fd39eb7d0fa7bea59d990fb41dc369206d58f42257718ed01fdc814ce55c9 F src/whereInt.h b48ca529ffe293c18cbfa8326af18a09e39910de66fb3e96ef788c7cbf8ef3a7 F src/wherecode.c 0b09abfcb88c61c6a6984a3e065786631ff35495e9bdf865e6b74ab0a1299c5b F src/whereexpr.c 4dae5e39a813224bec5bc404ebc328ad369766c39652692ae145e0870ca4cc5b @@ -1978,8 +1978,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 364645d8fe22491cd566e868027e739464205e892753356016b1988ead207af4 -R b811a955eaf3f4f24a3997e7a988ecb5 +P 9322a7c21f1c22ba00e9b889223e89bc1591db6e561ce05091e905e98c1bf2b3 +R dc1b0ba1ee85a7e377a271938e5a33d9 U drh -Z 1ff0c2c17df919cd17badf81d6bc1850 +Z 22b60deef4a05bbb68a5eab2c13bab74 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 00c7a12629..332c085d34 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9322a7c21f1c22ba00e9b889223e89bc1591db6e561ce05091e905e98c1bf2b3 \ No newline at end of file +bd87d107fe474ceeac8bacb01c80bc479edbc2ae4e30697bf54ab91a5a8d2a98 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 196c508b0d..4095a52137 100644 --- a/src/where.c +++ b/src/where.c @@ -5083,7 +5083,11 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ pItem = pWInfo->pTabList->a; pTab = pItem->pTab; if( IsVirtual(pTab) ) return 0; - if( pItem->fg.isIndexedBy ) return 0; + if( pItem->fg.isIndexedBy || pItem->fg.notIndexed ){ + testcase( pItem->fg.isIndexedBy ); + testcase( pItem->fg.notIndexed ); + return 0; + } iCur = pItem->iCursor; pWC = &pWInfo->sWC; pLoop = pBuilder->pNew; From 861ac67a9d42f52684c7df7104d2eb608fd33de5 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 22 Jun 2022 12:54:25 +0000 Subject: [PATCH 21/31] Fix a typo in a comment. No changes to code. FossilOrigin-Name: ef9de201b33678a80bb27c5be8f9dc973c8a4f14af9bfdd3ace36887c8a591ea --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeaux.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 3287f064ba..eed1e4b2af 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disable\sthe\sshort-cut\squery\splanner\sif\sthe\sNOT\sINDEXED\smodifier\sis\sused.\n[forum:/forumpost/454d706296|Forum\spost\s454d706296]. -D 2022-06-21T18:38:18.478 +C Fix\sa\stypo\sin\sa\scomment.\s\sNo\schanges\sto\scode. +D 2022-06-22T12:54:25.584 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -646,7 +646,7 @@ F src/vdbe.c 555620fbbf4cb2e816e506afeae189e9f2c19a0bf18442f471f7a799300155b7 F src/vdbe.h 07641758ca8b4f4c6d81ea667ea167c541e6ece21f5574da11e3d21ec37e2662 F src/vdbeInt.h 2cad0aeeb106371ed0e0946bab89f60627087068847afc2451c05056961c18da F src/vdbeapi.c 354c893f1500cf524cc45c32879b9c68893a28b77e3442c24668d6afe4236217 -F src/vdbeaux.c 75c4f75ed7e1d12eb3d80093a160ec998c839f3008a1c3c967fc5acf522d0e3c +F src/vdbeaux.c 328b866880e67526300aa2361c5e50beb3d97dd8746db37dd4aa0135aea60e4d F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd F src/vdbemem.c 3db315458f8dc158aff58719795441437dd6c0fd302e9d9379a8f2a61e185ad6 F src/vdbesort.c 43756031ca7430f7aec3ef904824a7883c4ede783e51f280d99b9b65c0796e35 @@ -1978,8 +1978,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 9322a7c21f1c22ba00e9b889223e89bc1591db6e561ce05091e905e98c1bf2b3 -R dc1b0ba1ee85a7e377a271938e5a33d9 +P bd87d107fe474ceeac8bacb01c80bc479edbc2ae4e30697bf54ab91a5a8d2a98 +R 7711111e395c840c3bc6751d9962c287 U drh -Z 22b60deef4a05bbb68a5eab2c13bab74 +Z 85a2fed5268d7d7a54feb858103fed23 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 332c085d34..d9152c5063 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bd87d107fe474ceeac8bacb01c80bc479edbc2ae4e30697bf54ab91a5a8d2a98 \ No newline at end of file +ef9de201b33678a80bb27c5be8f9dc973c8a4f14af9bfdd3ace36887c8a591ea \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index b2e471e0c9..7c3be404ef 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -592,7 +592,7 @@ void sqlite3VdbeRunOnlyOnce(Vdbe *p){ } /* -** Mark the VDBE as one that can only be run multiple times. +** Mark the VDBE as one that can be run multiple times. */ void sqlite3VdbeReusable(Vdbe *p){ int i; From b88574470922b7aef80c6c587efa89dcef43e9b1 Mon Sep 17 00:00:00 2001 From: larrybr Date: Wed, 22 Jun 2022 14:00:24 +0000 Subject: [PATCH 22/31] Give dbtotxt an option to prepend .open --hexdb FossilOrigin-Name: afeee6125d141ae281658a5f7b73e9b77bc252fa387678b2b5837488180bf108 --- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/dbtotxt.c | 13 ++++++++++++- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index eed1e4b2af..7ee71c0987 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stypo\sin\sa\scomment.\s\sNo\schanges\sto\scode. -D 2022-06-22T12:54:25.584 +C Give\sdbtotxt\san\soption\sto\sprepend\s.open\s--hexdb +D 2022-06-22T14:00:24.150 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1883,7 +1883,7 @@ F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367 F tool/cg_anno.tcl c1f875f5a4c9caca3d59937b16aff716f8b1883935f1b4c9ae23124705bc8099 x F tool/checkSpacing.c 810e51703529a204fc4e1eb060e9ab663e3c06d2 F tool/dbhash.c 5da0c61032d23d74f2ab84ffc5740f0e8abec94f2c45c0b4306be7eb3ae96df0 -F tool/dbtotxt.c b2221864a20fb391c46bd31bc1fbdc4a96f5c8a89bef58f421eb9b9c36b1702c +F tool/dbtotxt.c 2620a354d109b70d71bf758d2a64e042d74e0aaa5bd6e447900ed3542410d7f9 F tool/dbtotxt.md c9a57af8739957ef36d2cfad5c4b1443ff3688ed33e4901ee200c8b651f43f3c F tool/enlargedb.c 3e8b2612b985cfa7e3e8800031ee191b43ae80de96abb5abbd5eada62651ee21 F tool/extract-sqlite3h.tcl 069ceab0cee26cba99952bfa08c0b23e35941c837acabe143f0c355d96c9e2eb x @@ -1978,8 +1978,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 bd87d107fe474ceeac8bacb01c80bc479edbc2ae4e30697bf54ab91a5a8d2a98 -R 7711111e395c840c3bc6751d9962c287 -U drh -Z 85a2fed5268d7d7a54feb858103fed23 +P ef9de201b33678a80bb27c5be8f9dc973c8a4f14af9bfdd3ace36887c8a591ea +R 67da5a3eed2217c3a0aabb673b1aeeeb +U larrybr +Z 3ac9b1cd50f131bc537beb881646b592 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d9152c5063..b754e9a5a0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ef9de201b33678a80bb27c5be8f9dc973c8a4f14af9bfdd3ace36887c8a591ea \ No newline at end of file +afeee6125d141ae281658a5f7b73e9b77bc252fa387678b2b5837488180bf108 \ No newline at end of file diff --git a/tool/dbtotxt.c b/tool/dbtotxt.c index 8b0600fa51..a56416dcc4 100644 --- a/tool/dbtotxt.c +++ b/tool/dbtotxt.c @@ -10,7 +10,11 @@ ** ** Usage: ** -** dbtotxt [--pagesize N] FILENAME +** dbtotxt [OPTIONS] FILENAME +** +** where OPTIONS are zero or more of: +** --pagesize N => setting the database page size for later readin +** --for-cli => prepending '.open --hexdb' to the output ** ** The translation of the database appears on standard output. If the ** --pagesize command-line option is omitted, then the page size is taken @@ -38,6 +42,7 @@ static int allZero(unsigned char *aLine){ int main(int argc, char **argv){ int pgsz = 0; /* page size */ + int forCli = 0; /* whether to prepend with .open */ long szFile; /* Size of the input file in bytes */ FILE *in; /* Input file */ int i, j; /* Loop counters */ @@ -67,6 +72,9 @@ int main(int argc, char **argv){ nErr++; } continue; + }else if( strcmp(z,"for-cli")==0 ){ + forCli = 1; + continue; } fprintf(stderr, "Unknown option: %s\n", argv[i]); nErr++; @@ -114,6 +122,9 @@ int main(int argc, char **argv){ for(i=0; zInputFile[i]; i++){ if( zInputFile[i]=='/' && zInputFile[i+1]!=0 ) zBaseName = zInputFile+i+1; } + if( forCli ){ + printf(".open --hexdb\n"); + } printf("| size %d pagesize %d filename %s\n",(int)szFile,pgsz,zBaseName); for(i=0; i Date: Wed, 22 Jun 2022 14:25:12 +0000 Subject: [PATCH 23/31] Additional enhancements to comments. No changes to code. FossilOrigin-Name: d9a320448f5693d906adf437800675cd4773701db065f3ed238b933fb80f6681 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/vdbe.c | 2 +- src/vdbeapi.c | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 7ee71c0987..ea0ce73d98 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Give\sdbtotxt\san\soption\sto\sprepend\s.open\s--hexdb -D 2022-06-22T14:00:24.150 +C Additional\senhancements\sto\scomments.\s\sNo\schanges\sto\scode. +D 2022-06-22T14:25:12.248 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -642,10 +642,10 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 602fe229f32a96ceccae4f40824129669582096f7c355f53dbac156c9fecef23 F src/vacuum.c bb346170b0b54c6683bba4a5983aea40485597fdf605c87ec8bc2e199fe88cd8 -F src/vdbe.c 555620fbbf4cb2e816e506afeae189e9f2c19a0bf18442f471f7a799300155b7 +F src/vdbe.c d7a10fd2afa527886e930ea39eb4a946206e0e439e6cca7424d7373232183010 F src/vdbe.h 07641758ca8b4f4c6d81ea667ea167c541e6ece21f5574da11e3d21ec37e2662 F src/vdbeInt.h 2cad0aeeb106371ed0e0946bab89f60627087068847afc2451c05056961c18da -F src/vdbeapi.c 354c893f1500cf524cc45c32879b9c68893a28b77e3442c24668d6afe4236217 +F src/vdbeapi.c 602610f1252d59cd69742f78a1e2f6fbae40a4b407f5506a6a7b869b0df08ff2 F src/vdbeaux.c 328b866880e67526300aa2361c5e50beb3d97dd8746db37dd4aa0135aea60e4d F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd F src/vdbemem.c 3db315458f8dc158aff58719795441437dd6c0fd302e9d9379a8f2a61e185ad6 @@ -1978,8 +1978,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 ef9de201b33678a80bb27c5be8f9dc973c8a4f14af9bfdd3ace36887c8a591ea -R 67da5a3eed2217c3a0aabb673b1aeeeb -U larrybr -Z 3ac9b1cd50f131bc537beb881646b592 +P afeee6125d141ae281658a5f7b73e9b77bc252fa387678b2b5837488180bf108 +R 69eeb3295eb4274ceb6c39df1e8e1372 +U drh +Z 91cf5bff56e9a2477802f426b46d491e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index b754e9a5a0..993099b892 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -afeee6125d141ae281658a5f7b73e9b77bc252fa387678b2b5837488180bf108 \ No newline at end of file +d9a320448f5693d906adf437800675cd4773701db065f3ed238b933fb80f6681 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 64bb7d4328..7857924a80 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -1004,7 +1004,7 @@ case OP_Gosub: { /* jump */ ** and also less than the current address, then the "EXPLAIN" output ** formatter in the CLI will indent all opcodes from the P2 opcode up ** to be not including the current Return. P2 should be the first opcode -** in the subroutine from which this opcode is returnning. Thus the P2 +** in the subroutine from which this opcode is returning. Thus the P2 ** value is a byte-code indentation hint. See tag-20220407a in ** wherecode.c and shell.c. */ diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 39d73288ce..4e719ede36 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -818,9 +818,9 @@ int sqlite3_step(sqlite3_stmt *pStmt){ sqlite3_reset(pStmt); if( savedPc>=0 ){ /* Setting minWriteFileFormat to 254 is a signal to the OP_Init and - ** OP_Trace opcodes to *not* perform SQLITE_TRACE_STMT because one - ** should output has already occurred due to SQLITE_SCHEMA. - ** tag-20220401a */ + ** OP_Trace opcodes to *not* perform SQLITE_TRACE_STMT because it has + ** already been done once on a prior invocation that failed due to + ** SQLITE_SCHEMA. tag-20220401a */ v->minWriteFileFormat = 254; } assert( v->expired==0 ); From 0751fc3b8544529c565cc1c107096111224ca3a6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 22 Jun 2022 14:43:52 +0000 Subject: [PATCH 24/31] Allow more line with on the debugging output for SrcItem elements in the parse tree. This affects debugging builds only and is a no-op for production builds. FossilOrigin-Name: edbe24e7fc81ab6c26ab05f2231cb46d157d71a677ce8a2983e0c6e48122a2bd --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/treeview.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index ea0ce73d98..2f5eda81f7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Additional\senhancements\sto\scomments.\s\sNo\schanges\sto\scode. -D 2022-06-22T14:25:12.248 +C Allow\smore\sline\swith\son\sthe\sdebugging\soutput\sfor\sSrcItem\selements\sin\sthe\nparse\stree.\s\sThis\saffects\sdebugging\sbuilds\sonly\sand\sis\sa\sno-op\sfor\sproduction\nbuilds. +D 2022-06-22T14:43:52.362 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -635,7 +635,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c a38f52058b517929e264094abd0b5fd1e8e145a1aa43bc6f6a72ae5218f96c98 -F src/treeview.c c48bbb4b04a951dcecf95b464d0fe94930339af56688a77f18ee50a526bc1706 +F src/treeview.c 0bd550f5974565eba541db339906be7a3f9e91beafb879cb40705382887f08e1 F src/trigger.c 61bea163b1fa3039bc572ed8312461b978e5c527e5301f302b078f4c1ccdec6a F src/update.c c52a7991bece0453d22c77c08469512ee2f1391c12503fd347d1c939220c5877 F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 @@ -1978,8 +1978,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 afeee6125d141ae281658a5f7b73e9b77bc252fa387678b2b5837488180bf108 -R 69eeb3295eb4274ceb6c39df1e8e1372 +P d9a320448f5693d906adf437800675cd4773701db065f3ed238b933fb80f6681 +R 27ed9fcb382af87d5a08bc34ff2d6974 U drh -Z 91cf5bff56e9a2477802f426b46d491e +Z a2538d4ae7c9b67cd89e3d643eaf4fd0 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 993099b892..72e56fa01b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d9a320448f5693d906adf437800675cd4773701db065f3ed238b933fb80f6681 \ No newline at end of file +edbe24e7fc81ab6c26ab05f2231cb46d157d71a677ce8a2983e0c6e48122a2bd \ No newline at end of file diff --git a/src/treeview.c b/src/treeview.c index cca0ee92aa..366c4afd18 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -58,7 +58,7 @@ void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){ va_list ap; int i; StrAccum acc; - char zBuf[500]; + char zBuf[1000]; sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); if( p ){ for(i=0; iiLevel && i<(int)sizeof(p->bLine)-1; i++){ @@ -189,7 +189,7 @@ void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){ const SrcItem *pItem = &pSrc->a[i]; StrAccum x; int n = 0; - char zLine[100]; + char zLine[1000]; sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); x.printfFlags |= SQLITE_PRINTF_INTERNAL; sqlite3_str_appendf(&x, "{%d:*} %!S", pItem->iCursor, pItem); From cf5cab01cf9199dc331228022c1bb07f5cf39236 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 22 Jun 2022 15:55:28 +0000 Subject: [PATCH 25/31] More comment fixes. No changes to code. FossilOrigin-Name: 5c9133ef431a031249760267ca851239d0857ffba633cac27d3865cf179c3274 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 2 +- src/whereexpr.c | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 2f5eda81f7..53f2a4d347 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\smore\sline\swith\son\sthe\sdebugging\soutput\sfor\sSrcItem\selements\sin\sthe\nparse\stree.\s\sThis\saffects\sdebugging\sbuilds\sonly\sand\sis\sa\sno-op\sfor\sproduction\nbuilds. -D 2022-06-22T14:43:52.362 +C More\scomment\sfixes.\s\sNo\schanges\sto\scode. +D 2022-06-22T15:55:28.710 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -570,7 +570,7 @@ F src/printf.c 6166a30417b05c5b2f82e1f183f75faa2926ad60531c0b688a57dbc951441a20 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 1655e44c77c51ebbe82924287528a78bd4a4aaaf34189dbae28d19ccf2ca615c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c baadb1b3fd0e87f82f0c416b68a5b8d90d8f4ffb3568c9a86f84a2be7d40261f +F src/select.c ede9acfd0b792ad1fc8f07c847e566f2dc2056ab81332ae0f4c82ee993d2bd1b F src/shell.c.in 08e59f1cb9d9b1180aba52861aaada0c95f6ddd210488719684e160a0724c806 F src/sqlite.h.in 172528c287399a34f188154017b7268bf82c6d5b780902e361958d2318c4e37c F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -660,7 +660,7 @@ F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c 518fd39eb7d0fa7bea59d990fb41dc369206d58f42257718ed01fdc814ce55c9 F src/whereInt.h b48ca529ffe293c18cbfa8326af18a09e39910de66fb3e96ef788c7cbf8ef3a7 F src/wherecode.c 0b09abfcb88c61c6a6984a3e065786631ff35495e9bdf865e6b74ab0a1299c5b -F src/whereexpr.c 4dae5e39a813224bec5bc404ebc328ad369766c39652692ae145e0870ca4cc5b +F src/whereexpr.c 55a39f42aaf982574fbf52906371a84cceed98a994422198dfd03db4fce4cc46 F src/window.c fff1b51757438c664e471d5184634e48dcdf8ea34b640f3b1b0810b1e06de18c F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1978,8 +1978,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 d9a320448f5693d906adf437800675cd4773701db065f3ed238b933fb80f6681 -R 27ed9fcb382af87d5a08bc34ff2d6974 +P edbe24e7fc81ab6c26ab05f2231cb46d157d71a677ce8a2983e0c6e48122a2bd +R eed41148dbd1edc9cf961b34c5434b7b U drh -Z a2538d4ae7c9b67cd89e3d643eaf4fd0 +Z 26bd716937413acf498443519370ce68 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 72e56fa01b..b55c3e7d16 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -edbe24e7fc81ab6c26ab05f2231cb46d157d71a677ce8a2983e0c6e48122a2bd \ No newline at end of file +5c9133ef431a031249760267ca851239d0857ffba633cac27d3865cf179c3274 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 5c73c6bf63..148c36c7fa 100644 --- a/src/select.c +++ b/src/select.c @@ -6994,7 +6994,7 @@ int sqlite3Select( /* Generate code to implement the subquery ** - ** The subquery is implemented as a co-routine all if the following are + ** The subquery is implemented as a co-routine if all of the following are ** true: ** ** (1) the subquery is guaranteed to be the outer loop (so that diff --git a/src/whereexpr.c b/src/whereexpr.c index 9c7fcd351a..8c9233ebd3 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -1124,7 +1124,7 @@ static void exprAnalyze( ** Most other SQL database engines raise an error. But SQLite versions ** 3.0 through 3.38 just put the ON clause constraint into the WHERE ** clause and carried on. Beginning with 3.39, raise an error only - ** if there is a RIGHT or LEFT JOIN in the query. This makes SQLite + ** if there is a RIGHT or FULL JOIN in the query. This makes SQLite ** more like other systems, and also preserves legacy. */ if( ALWAYS(pSrc->nSrc>0) && (pSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ sqlite3ErrorMsg(pParse, "ON clause references tables to its right"); From f221e4b5d606144eb5a0e265c7129490f03576fe Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 22 Jun 2022 18:33:21 +0000 Subject: [PATCH 26/31] Fix requirements marks that changed due to typo fixes in the documentation. FossilOrigin-Name: 5247df05991df979024df5a30bb3473401add92d4c12b01c040a16dda6da39f5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/e_vacuum.test | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 53f2a4d347..56a95c79b6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C More\scomment\sfixes.\s\sNo\schanges\sto\scode. -D 2022-06-22T15:55:28.710 +C Fix\srequirements\smarks\sthat\schanged\sdue\sto\stypo\sfixes\sin\sthe\sdocumentation. +D 2022-06-22T18:33:21.684 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -903,7 +903,7 @@ F test/e_select2.test aceb80ab927d46fba5ce7586ebabf23e2bb0604f F test/e_totalchanges.test c927f7499dc3aa28b9b556b7d6d115a2f0fe41f012b128d16bf1f3b30e9b41e4 F test/e_update.test f46c2554d915c9197548681e8d8c33a267e84528 F test/e_uri.test a3d30c7d6d7700150055b6660ee42da7f05dee2c150ce08bf6a9ededc26468cc -F test/e_vacuum.test 0d8832a2ce92350db0d0cff47b419465fd9772562e1f77ff7d9478c07a4980d2 +F test/e_vacuum.test 89fc48e8beee2f9dfd6de1fbb2edea6542dae9121dc0fbe6313764169e742104 F test/e_wal.test ae9a593207a77d711443ee69ffe081fda9243625 F test/e_walauto.test 248af31e73c98df23476a22bdb815524c9dc3ba8 F test/e_walckpt.test 28c371a6bb5e5fe7f31679c1df1763a19d19e8a0 @@ -1978,8 +1978,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 edbe24e7fc81ab6c26ab05f2231cb46d157d71a677ce8a2983e0c6e48122a2bd -R eed41148dbd1edc9cf961b34c5434b7b +P 5c9133ef431a031249760267ca851239d0857ffba633cac27d3865cf179c3274 +R 05fb481e132d02ee2b4ecd44d8b7de24 U drh -Z 26bd716937413acf498443519370ce68 +Z a7b592876a55718c3da48b4ab5a2abbd # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index b55c3e7d16..115c93d720 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5c9133ef431a031249760267ca851239d0857ffba633cac27d3865cf179c3274 \ No newline at end of file +5247df05991df979024df5a30bb3473401add92d4c12b01c040a16dda6da39f5 \ No newline at end of file diff --git a/test/e_vacuum.test b/test/e_vacuum.test index cfe7f8464f..63bf7c125f 100644 --- a/test/e_vacuum.test +++ b/test/e_vacuum.test @@ -190,8 +190,8 @@ if {![nonzero_reserved_bytes]} { } } -# EVIDENCE-OF: R-55119-57913 By default, VACUUM only works only on the -# main database. +# EVIDENCE-OF: R-40347-36128 By default, VACUUM operates on the main +# database. forcedelete test.db2 create_db { PRAGMA auto_vacuum = NONE } do_execsql_test e_vacuum-2.1.1 { From 2b0ea0204f40dacd997085378ab8a331b65b7be8 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 22 Jun 2022 18:51:47 +0000 Subject: [PATCH 27/31] Enhance the TCL scrip that generates sqlite3-all.c so that it outputs all text in its original order. FossilOrigin-Name: 83ff1a28e3e7a99fa90d5079897d76529c4256eed859bf7cb98b860fbedfdc5b --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/split-sqlite3c.tcl | 5 +++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 56a95c79b6..8806838d86 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\srequirements\smarks\sthat\schanged\sdue\sto\stypo\sfixes\sin\sthe\sdocumentation. -D 2022-06-22T18:33:21.684 +C Enhance\sthe\sTCL\sscrip\sthat\sgenerates\ssqlite3-all.c\sso\sthat\sit\soutputs\sall\ntext\sin\sits\soriginal\sorder. +D 2022-06-22T18:51:47.144 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1942,7 +1942,7 @@ F tool/speedtest16.c ecb6542862151c3e6509bbc00509b234562ae81e F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 7ce07da76b5e745783e703a834417d725b7d45fd -F tool/split-sqlite3c.tcl 3efcd4240b738f6bb2b5af0aea7e1e0ef9bc1c61654f645076cec883030b710c +F tool/split-sqlite3c.tcl 6b02bb5444cabc477c0d6eb3ecedcc827063e9ac41954831e90c72c481aa9d30 F tool/sqldiff.c 4f967c199c5f93eec64978e3a625d6c07fb1162212b1d48f65740d9eb4607eee F tool/sqlite3_analyzer.c.in f88615bf33098945e0a42f17733f472083d150b58bdaaa5555a7129d0a51621c F tool/sqltclsh.c.in 1bcc2e9da58fadf17b0bf6a50e68c1159e602ce057210b655d50bad5aaaef898 @@ -1978,8 +1978,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 5c9133ef431a031249760267ca851239d0857ffba633cac27d3865cf179c3274 -R 05fb481e132d02ee2b4ecd44d8b7de24 +P 5247df05991df979024df5a30bb3473401add92d4c12b01c040a16dda6da39f5 +R a8c13c127511ed3f8d625bea05c612fa U drh -Z a7b592876a55718c3da48b4ab5a2abbd +Z 534627147f20b9113ed0f141bfe27606 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 115c93d720..ef08fe0df4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5247df05991df979024df5a30bb3473401add92d4c12b01c040a16dda6da39f5 \ No newline at end of file +83ff1a28e3e7a99fa90d5079897d76529c4256eed859bf7cb98b860fbedfdc5b \ No newline at end of file diff --git a/tool/split-sqlite3c.tcl b/tool/split-sqlite3c.tcl index 230e3f2549..9751e7de9c 100644 --- a/tool/split-sqlite3c.tcl +++ b/tool/split-sqlite3c.tcl @@ -74,6 +74,11 @@ while {[regexp $BEGIN $line]} { incr N $n while {[gets $in line]>=0} { if {[regexp $BEGIN $line]} break + if {$N>0} { + write_one_file $all + set N 0 + set all {} + } puts $out1 $line } } From 9efc61860782843df4808572011584642aa9e5b2 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 23 Jun 2022 12:36:56 +0000 Subject: [PATCH 28/31] Minor correction to a comment. No code changes. FossilOrigin-Name: 5fa00959ebc3a46fe400564d5a30e8c44857cd4f0473fb25e84154019eff3f39 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 8806838d86..8882a0bee8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\sTCL\sscrip\sthat\sgenerates\ssqlite3-all.c\sso\sthat\sit\soutputs\sall\ntext\sin\sits\soriginal\sorder. -D 2022-06-22T18:51:47.144 +C Minor\scorrection\sto\sa\scomment.\s\sNo\scode\schanges. +D 2022-06-23T12:36:56.505 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -570,7 +570,7 @@ F src/printf.c 6166a30417b05c5b2f82e1f183f75faa2926ad60531c0b688a57dbc951441a20 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 1655e44c77c51ebbe82924287528a78bd4a4aaaf34189dbae28d19ccf2ca615c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c ede9acfd0b792ad1fc8f07c847e566f2dc2056ab81332ae0f4c82ee993d2bd1b +F src/select.c 2db8bbf13f57cc9872f9b927546e98f5ea583e9e364182426492a434a994421b F src/shell.c.in 08e59f1cb9d9b1180aba52861aaada0c95f6ddd210488719684e160a0724c806 F src/sqlite.h.in 172528c287399a34f188154017b7268bf82c6d5b780902e361958d2318c4e37c F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1978,8 +1978,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 5247df05991df979024df5a30bb3473401add92d4c12b01c040a16dda6da39f5 -R a8c13c127511ed3f8d625bea05c612fa +P 83ff1a28e3e7a99fa90d5079897d76529c4256eed859bf7cb98b860fbedfdc5b +R 84b3e295df7fc9b4a1509f0d6ebc58aa U drh -Z 534627147f20b9113ed0f141bfe27606 +Z 71ed77c77f9d7bcfc9156cb5b9ba5369 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index ef08fe0df4..b65bad0e2e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -83ff1a28e3e7a99fa90d5079897d76529c4256eed859bf7cb98b860fbedfdc5b \ No newline at end of file +5fa00959ebc3a46fe400564d5a30e8c44857cd4f0473fb25e84154019eff3f39 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 148c36c7fa..6f5e8c82ab 100644 --- a/src/select.c +++ b/src/select.c @@ -4282,8 +4282,8 @@ static int flattenSubquery( */ if( (pSubitem->fg.jointype & (JT_OUTER|JT_LTORJ))!=0 ){ if( pSubSrc->nSrc>1 /* (3a) */ - || isAgg /* (3b) */ - || IsVirtual(pSubSrc->a[0].pTab) /* (3c) */ + || isAgg /* (3c) */ + || IsVirtual(pSubSrc->a[0].pTab) /* (3b) */ || (p->selFlags & SF_Distinct)!=0 /* (3d) */ || (pSubitem->fg.jointype & JT_RIGHT)!=0 /* (26) */ ){ From 2a40a882f2a1b7d0c318abd789928d6213bc8f11 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 24 Jun 2022 11:02:42 +0000 Subject: [PATCH 29/31] A minor fix to test/fuzzinvariants.c so that it works even with column names that originally contain a ':' and that are disambiguated. FossilOrigin-Name: 8d9b1fff9d87522c4464aaf3ff0a7b93db244c59b4010562e35a8f161da4859b --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzinvariants.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 8882a0bee8..6fd6698c4f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\scorrection\sto\sa\scomment.\s\sNo\scode\schanges. -D 2022-06-23T12:36:56.505 +C A\sminor\sfix\sto\stest/fuzzinvariants.c\sso\sthat\sit\sworks\seven\swith\scolumn\snames\nthat\soriginally\scontain\sa\s':'\sand\sthat\sare\sdisambiguated. +D 2022-06-24T11:02:42.330 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1097,7 +1097,7 @@ F test/fuzzdata8.db ca9a97f401b06b0d5376139ec7e1f9e773e13345a9a2d9ccc0032cdbfede F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc -F test/fuzzinvariants.c 2b939b78736f2cb340f43e7d2ecbdff48de56bfb2ba7fe0b7e28f5c03ee62daf +F test/fuzzinvariants.c c1c7ae6be4c5fe4e5b845ce2b166c17a3d0f8ef545ab0248c9990505010070da F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c F test/gencol1.test cc0dbb0ee116e5602e18ea7d47f2a0f76b26e09a823b7c36ef254370c2b0f3c1 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 @@ -1978,8 +1978,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 83ff1a28e3e7a99fa90d5079897d76529c4256eed859bf7cb98b860fbedfdc5b -R 84b3e295df7fc9b4a1509f0d6ebc58aa +P 5fa00959ebc3a46fe400564d5a30e8c44857cd4f0473fb25e84154019eff3f39 +R 59892a8e29e6cb98527f02ecb312f872 U drh -Z 71ed77c77f9d7bcfc9156cb5b9ba5369 +Z 828e6f2fc90ba3fe90c806c6a54af59a # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index b65bad0e2e..f2918e5780 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5fa00959ebc3a46fe400564d5a30e8c44857cd4f0473fb25e84154019eff3f39 \ No newline at end of file +8d9b1fff9d87522c4464aaf3ff0a7b93db244c59b4010562e35a8f161da4859b \ No newline at end of file diff --git a/test/fuzzinvariants.c b/test/fuzzinvariants.c index a2a5028d1b..a601e7aa45 100644 --- a/test/fuzzinvariants.c +++ b/test/fuzzinvariants.c @@ -193,7 +193,7 @@ static char *fuzz_invariant_sql(sqlite3_stmt *pStmt, int iCnt){ } for(i=0; i'3' || isdigit(zSuffix[2])) From a5ec23a705bb51363647e2105af45f3ad30ca64a Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 24 Jun 2022 11:05:36 +0000 Subject: [PATCH 30/31] In sqlite3WhereBegin, do not proceed with coding the loop if an error is detected as part of WHERE expression analysis. FossilOrigin-Name: db5266dec601a9513bc8dd09a9f8bb4aef55b780d22610946099e8edd4836587 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/where.c | 2 +- test/joinH.test | 15 +++++++++++++++ 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 6fd6698c4f..a1b859e037 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C A\sminor\sfix\sto\stest/fuzzinvariants.c\sso\sthat\sit\sworks\seven\swith\scolumn\snames\nthat\soriginally\scontain\sa\s':'\sand\sthat\sare\sdisambiguated. -D 2022-06-24T11:02:42.330 +C In\ssqlite3WhereBegin,\sdo\snot\sproceed\swith\scoding\sthe\sloop\sif\san\serror\sis\sdetected\sas\spart\sof\sWHERE\sexpression\sanalysis. +D 2022-06-24T11:05:36.223 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -657,7 +657,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 518fd39eb7d0fa7bea59d990fb41dc369206d58f42257718ed01fdc814ce55c9 +F src/where.c 9a44063e60d8f42dd9dc8147b8e8dcfc315bbd13e25c395211292c36d828c869 F src/whereInt.h b48ca529ffe293c18cbfa8326af18a09e39910de66fb3e96ef788c7cbf8ef3a7 F src/wherecode.c 0b09abfcb88c61c6a6984a3e065786631ff35495e9bdf865e6b74ab0a1299c5b F src/whereexpr.c 55a39f42aaf982574fbf52906371a84cceed98a994422198dfd03db4fce4cc46 @@ -1176,7 +1176,7 @@ F test/joinC.test 1f1a602c2127f55f136e2cbd3bf2d26546614bf8cffe5902ec1ac9c07f87f2 F test/joinD.test 1a430af8dac5b68663f13df534ffe98775e582bac2305b80f1e8eb4ab778672a F test/joinE.test d5d182f3812771e2c0d97c9dcf5dbe4c41c8e21c82560e59358731c4a3981d6b F test/joinF.test 53dd66158806823ea680dd7543b5406af151b5aafa5cd06a7f3231cd94938127 -F test/joinH.test 743f5afbd5c275adb49a91fd8cfe9c494eca231c05777adb60b1cec19ac6511c +F test/joinH.test e67d1d6a8c7141caf981a07386caa7fda0362baa09e03669f9a4fbee812806d0 F test/journal1.test c7b768041b7f494471531e17abc2f4f5ebf9e5096984f43ed17c4eb80ba34497 F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4 F test/journal3.test 7c3cf23ffc77db06601c1fcfc9743de8441cb77db9d1aa931863d94f5ffa140e @@ -1978,8 +1978,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 5fa00959ebc3a46fe400564d5a30e8c44857cd4f0473fb25e84154019eff3f39 -R 59892a8e29e6cb98527f02ecb312f872 -U drh -Z 828e6f2fc90ba3fe90c806c6a54af59a +P 8d9b1fff9d87522c4464aaf3ff0a7b93db244c59b4010562e35a8f161da4859b +R d54dcfae1667c78e0c8fe9c8b4346dc8 +U dan +Z b23261e637d1f835efae62f75c2ff1cb # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f2918e5780..a405481d5a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8d9b1fff9d87522c4464aaf3ff0a7b93db244c59b4010562e35a8f161da4859b \ No newline at end of file +db5266dec601a9513bc8dd09a9f8bb4aef55b780d22610946099e8edd4836587 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 4095a52137..de6ea91e3d 100644 --- a/src/where.c +++ b/src/where.c @@ -5592,7 +5592,7 @@ WhereInfo *sqlite3WhereBegin( /* Analyze all of the subexpressions. */ sqlite3WhereExprAnalyze(pTabList, &pWInfo->sWC); sqlite3WhereAddLimit(&pWInfo->sWC, pLimit); - if( db->mallocFailed ) goto whereBeginError; + if( pParse->nErr ) goto whereBeginError; /* Special case: WHERE terms that do not refer to any tables in the join ** (constant expressions). Evaluate each such term, and jump over all the diff --git a/test/joinH.test b/test/joinH.test index 6dde0c3834..9832861208 100644 --- a/test/joinH.test +++ b/test/joinH.test @@ -53,5 +53,20 @@ do_execsql_test 2.2 { SELECT 'value!' FROM r3 FULL JOIN r4 ON (y=x) WHERE +y=55; } {value!} +#----------------------------------------------------------- +reset_db +do_execsql_test 3.1 { + CREATE TABLE t0 (c0); + CREATE TABLE t1 (c0); + CREATE TABLE t2 (c0 , c1 , c2 , UNIQUE (c0), UNIQUE (c2 DESC)); + INSERT INTO t2 VALUES ('x', 'y', 'z'); + ANALYZE; + CREATE VIEW v0(c0) AS SELECT FALSE; +} + +do_catchsql_test 3.2 { + SELECT * FROM t0 LEFT OUTER JOIN t1 ON v0.c0 INNER JOIN v0 INNER JOIN t2 ON (t2.c2 NOT NULL); +} {1 {ON clause references tables to its right}} + finish_test From 86bc5e41bbe5247b74c41b629257e83618d4a0dc Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 24 Jun 2022 12:56:48 +0000 Subject: [PATCH 31/31] Fix a harmless UBSAN warning associated with PRAGMA schema_version found by OSSFuzz. FossilOrigin-Name: e93fd170ce4ae91d572c46d03f68f55d00091d0188030517455017d90d212587 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index a1b859e037..621dd03662 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\ssqlite3WhereBegin,\sdo\snot\sproceed\swith\scoding\sthe\sloop\sif\san\serror\sis\sdetected\sas\spart\sof\sWHERE\sexpression\sanalysis. -D 2022-06-24T11:05:36.223 +C Fix\sa\sharmless\sUBSAN\swarning\sassociated\swith\sPRAGMA\sschema_version\nfound\sby\sOSSFuzz. +D 2022-06-24T12:56:48.588 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -642,7 +642,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 602fe229f32a96ceccae4f40824129669582096f7c355f53dbac156c9fecef23 F src/vacuum.c bb346170b0b54c6683bba4a5983aea40485597fdf605c87ec8bc2e199fe88cd8 -F src/vdbe.c d7a10fd2afa527886e930ea39eb4a946206e0e439e6cca7424d7373232183010 +F src/vdbe.c 3df15f0f2cd9d8faeeea18398a62f16c07fda2bfd8d726186f07508ad69b40e2 F src/vdbe.h 07641758ca8b4f4c6d81ea667ea167c541e6ece21f5574da11e3d21ec37e2662 F src/vdbeInt.h 2cad0aeeb106371ed0e0946bab89f60627087068847afc2451c05056961c18da F src/vdbeapi.c 602610f1252d59cd69742f78a1e2f6fbae40a4b407f5506a6a7b869b0df08ff2 @@ -1978,8 +1978,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 8d9b1fff9d87522c4464aaf3ff0a7b93db244c59b4010562e35a8f161da4859b -R d54dcfae1667c78e0c8fe9c8b4346dc8 -U dan -Z b23261e637d1f835efae62f75c2ff1cb +P db5266dec601a9513bc8dd09a9f8bb4aef55b780d22610946099e8edd4836587 +R 09efcead2b1be4144ef279312bf3e194 +U drh +Z 1fc91f4cca35906afdee86eebc313610 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a405481d5a..1a1f800066 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -db5266dec601a9513bc8dd09a9f8bb4aef55b780d22610946099e8edd4836587 \ No newline at end of file +e93fd170ce4ae91d572c46d03f68f55d00091d0188030517455017d90d212587 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 7857924a80..ef9a23f64e 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3959,7 +3959,7 @@ case OP_SetCookie: { rc = sqlite3BtreeUpdateMeta(pDb->pBt, pOp->p2, pOp->p3); if( pOp->p2==BTREE_SCHEMA_VERSION ){ /* When the schema cookie changes, record the new cookie internally */ - pDb->pSchema->schema_cookie = pOp->p3 - pOp->p5; + *(u32*)&pDb->pSchema->schema_cookie = *(u32*)&pOp->p3 - pOp->p5; db->mDbFlags |= DBFLAG_SchemaChange; sqlite3FkClearTriggerCache(db, pOp->p1); }else if( pOp->p2==BTREE_FILE_FORMAT ){