From: dan Date: Mon, 16 Feb 2026 16:56:25 +0000 (+0000) Subject: Fix another case where SQLite might fail to identify an ON clause on a RIGHT or FULL... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1105c33900f93c0a74f233b7d62e94146df506eb;p=thirdparty%2Fsqlite.git Fix another case where SQLite might fail to identify an ON clause on a RIGHT or FULL join that refers to FROM-clause elements to its right. FossilOrigin-Name: e956b36063e77b5ad0d8b8afb5dc942665f570d762929ff277e320c06ded8ce6 --- diff --git a/manifest b/manifest index a3134bc2e0..01047c2b72 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sidentifying\sON\sclauses\sattached\sto\sRIGHT\sor\sFULL\sJOINs\s(which\sis\san\serror)\sif\sthe\sjoin\sappeared\sin\sa\sflattened\ssub-query. -D 2026-02-16T11:59:14.701 +C Fix\sanother\scase\swhere\sSQLite\smight\sfail\sto\sidentify\san\sON\sclause\son\sa\sRIGHT\sor\sFULL\sjoin\sthat\srefers\sto\sFROM-clause\selements\sto\sits\sright. +D 2026-02-16T16:56:25.515 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -736,7 +736,7 @@ F src/pragma.c ecec75795c1821520266e4f93fa8840cce48979af532db06f085e36a7813860f F src/prepare.c f6a6e28a281bd1d1da12f47d370a81af46159b40f73bf7fa0b276b664f9c8b7d F src/printf.c b1b29b5e58e1530d5daeee5963d3c318d8ab2d7e38437580e28755753e0c1ded F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c -F src/resolve.c c1dcb80bea2c37e6d01fea793e4f5f6f6254569f3a3aecf18d88b6fc3702a84b +F src/resolve.c f7af61e80e1ae1e0fc5aae9e430f6195a4063d670deae504905d1ef13324cd76 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 615d62112f5c14fb24facf9391492b42403875bfd4288db6ba10d7e6fbc22c4c F src/shell.c.in b944a21d98cc4c6107bfd1ec702440579cb4bf86435125b67ff661180e9453b5 @@ -1342,7 +1342,7 @@ F test/joinD.test 2ce62e7353a0702ca5e70008faf319c1d4686aa19fba34275c6d1da0e960be F test/joinE.test d5d182f3812771e2c0d97c9dcf5dbe4c41c8e21c82560e59358731c4a3981d6b F test/joinF.test 53dd66158806823ea680dd7543b5406af151b5aafa5cd06a7f3231cd94938127 F test/joinH.test 1d2fc3190be68525fd9ce749b9468c40ba2930181e52fb5ee6f836051b38effb -F test/joinI.test f48cfbec4fd68a0d7a4498593164a4d76d622774afe896b46c223cbe15e02f55 +F test/joinI.test 249802b168ce96d8d57943ef9abafc1e36e28d91829f68bc2b6e87f2b4d33241 F test/journal1.test bc61a4228db11bffca118bd358ba4b868524bf080f3532749de6c539656e20fa F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4 F test/journal3.test e5aeff93a7776cf644dbc48dec277655cff80a1cd24689036abc87869b120ea6 @@ -2194,8 +2194,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P b5ebbd004183f81902fa79a143222204b33dbe1cacb918194556b8dac67bd567 -R 962f4ef1dbd316a124811ac609d56f62 +P cf2dc6dfad275dad8fef763a57baaaf6301b0d3bf1916be90f22200cbe0115d0 +R 2e7ff14b5ef634dc725bfd72473b0ff4 U dan -Z 5af30b1d418ec7aa73d461b781393237 +Z d0c166fbac26f66972b26fd6effe2f97 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 6b98f673bf..0a85212cf4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cf2dc6dfad275dad8fef763a57baaaf6301b0d3bf1916be90f22200cbe0115d0 +e956b36063e77b5ad0d8b8afb5dc942665f570d762929ff277e320c06ded8ce6 diff --git a/src/resolve.c b/src/resolve.c index d806092359..0f4572f3a5 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -2073,6 +2073,14 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ return WRC_Abort; } + /* If the SELECT statement contains ON clauses that were moved into + ** the WHERE clause, go through and verify that none of the terms + ** in the ON clauses reference tables to the right of the ON clause. */ + if( (p->selFlags & SF_OnToWhere) ){ + sqlite3SelectCheckOnClauses(pParse, p); + if( pParse->nErr ) return WRC_Abort; + } + /* Advance to the next term of the compound */ p = p->pPrior; @@ -2250,14 +2258,6 @@ void sqlite3ResolveSelectNames( w.pParse = pParse; w.u.pNC = pOuterNC; sqlite3WalkSelect(&w, p); - - /* If the SELECT statement contains ON clauses that were moved into - ** the WHERE clause, go through and verify that none of the terms - ** in the ON clauses reference tables to the right of the ON clause. - ** Do this now, immediately after name resolution. */ - if( pParse->nErr==0 && (p->selFlags & SF_OnToWhere) ){ - sqlite3SelectCheckOnClauses(pParse, p); - } } /* diff --git a/test/joinI.test b/test/joinI.test index c9cd316f74..3390afc6e4 100644 --- a/test/joinI.test +++ b/test/joinI.test @@ -146,5 +146,27 @@ do_catchsql_test 6.5 { (SELECT * FROM t7 RIGHT JOIN t8 ON (t6.a) CROSS JOIN t6); } {1 {ON clause references tables to its right}} +do_catchsql_test 6.6 { + SELECT *, NOT EXISTS ( + SELECT * FROM t7 RIGHT JOIN t8 ON (t6.a) CROSS JOIN t6 + ) FROM t5; +} {1 {ON clause references tables to its right}} + +do_catchsql_test 6.7 { + SELECT *, NOT EXISTS ( + SELECT 1 + EXCEPT + SELECT 11 FROM t7 RIGHT JOIN t8 ON (t6.a) CROSS JOIN t6 + ) FROM t5; +} {1 {ON clause references tables to its right}} + +do_catchsql_test 6.8 { + SELECT *, NOT EXISTS ( + SELECT 11 FROM t7 RIGHT JOIN t8 ON (t6.a) CROSS JOIN t6 + EXCEPT + SELECT 1 + ) FROM t5; +} {1 {ON clause references tables to its right}} + finish_test