From: drh <> Date: Mon, 20 Jun 2022 12:42:28 +0000 (+0000) Subject: The fix at [cab9b4cccd13bf0a] was incomplete, as demonstrated by X-Git-Tag: version-3.39.0~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ae8776e09227d77655a83138861c8aab0430ee71;p=thirdparty%2Fsqlite.git 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 --- 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