]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
The fix at [cab9b4cccd13bf0a] was incomplete, as demonstrated by
authordrh <>
Mon, 20 Jun 2022 12:42:28 +0000 (12:42 +0000)
committerdrh <>
Mon, 20 Jun 2022 12:42:28 +0000 (12:42 +0000)
[forum:/forumpost/57bdf2217d|forum post 57bdf2217d].  This check-in
should complete the fix.

FossilOrigin-Name: fb0a23b6789da8e934562ce9ebd9d58ea13a10fd10dee5cbfc7ac8f394e1aeec

ext/rtree/rtree1.test
manifest
manifest.uuid
src/select.c
test/join8.test

index 0423bf557cc31d5e58e57bfe6f2c26074e4b6c7e..e5b55a28e4732434db78a423e3774aff2eef02e7 100644 (file)
@@ -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
index 8a7ccec81d2ef1d587cdf3dc921a4fec3381816b..5496a6747dc3814ce064bfed38c42942af0f9c50 100644 (file)
--- 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.
index e56b982368c8ca1586af9924af6fec878c9be81a..b75dd0fdc6e006a3ba119e4e17f2a4cabcabf2ec 100644 (file)
@@ -1 +1 @@
-11162446f12ae3af6e4a63bb5c374129b2505f6006f91d4028c7165f05fe9651
\ No newline at end of file
+fb0a23b6789da8e934562ce9ebd9d58ea13a10fd10dee5cbfc7ac8f394e1aeec
\ No newline at end of file
index e4a32efb780ff490a2554cad9c2fe4fcad43641d..f062d2f4df53f5be64ae45b24a74e1e22e0561e9 100644 (file)
@@ -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; i<pConst->nConst; 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));
index e0211a849701fc35f20f9816d28b459ae41229f9..c39b773d185361b4866410df7b57f994f812cb9b 100644 (file)
@@ -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