]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Ensure that the query flattener does not change an ON clause term to a WHERE clause...
authordan <Dan Kennedy>
Mon, 2 Dec 2024 17:21:52 +0000 (17:21 +0000)
committerdan <Dan Kennedy>
Mon, 2 Dec 2024 17:21:52 +0000 (17:21 +0000)
FossilOrigin-Name: bdd408a2557ff05c9ea962a94b442f7c078d8e1ec27035aa95bc23d4d2bd5606

manifest
manifest.uuid
src/select.c
test/pushdown.test

index 8855823756a8da1f8c1224c9bf97df55b92ef049..6acd483d7609cce29c397b9186db52d060fe308c 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\scomment\stypo\son\sthe\ssqlite3ExprIsSingleTableConstraint()\sroutine.
-D 2024-12-02T16:24:47.122
+C Ensure\sthat\sthe\squery\sflattener\sdoes\snot\schange\san\sON\sclause\sterm\sto\sa\sWHERE\sclause\sterm.
+D 2024-12-02T17:21:52.631
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d
@@ -777,7 +777,7 @@ F src/printf.c 96f7f8baeedc7639da94e4e7a4a2c200e2537c4eec9e5e1c2ffc821f40eb3105
 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
-F src/select.c c8165a8dff9c7b0f038b566f02a1ea983f4e0fdf8a3308e357727f4c9d8b07a5
+F src/select.c 1334b0606dbdc753c8333f41bff441c97f77ef8ad9e33f3701e8adfe3b587c28
 F src/shell.c.in 7aa68b305246391984c48f10725416079394a64bf0349fa4087d835c41ef733d
 F src/sqlite.h.in 4d93768709c53b7c653a63817a82d5a8625264ca0d8cdf99967ba147bdcf2aa6
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@@ -1541,7 +1541,7 @@ F test/printf.test 685fec5a0c5af2490ab0632775a301554361d674211d690f5bee0a97b0533
 F test/printf2.test 3f55c1871a5a65507416076f6eb97e738d5210aeda7595a74ee895f2224cce60
 F test/progress.test ebab27f670bd0d4eb9d20d49cef96e68141d92fb
 F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc
-F test/pushdown.test 84b525767442b3695d671f9df59dd91cf0ed8fb24cbbcdc55959f0dadeee8b39
+F test/pushdown.test 46a626ef1c0ca79b85296ff2e078b9da20a50e9b804b38f441590c3987580ddd
 F test/queryonly.test 5f653159e0f552f0552d43259890c1089391dcca
 F test/quick.test 1681febc928d686362d50057c642f77a02c62e57
 F test/quickcheck.test a4b7e878cd97e46108291c409b0bf8214f29e18fddd68a42bc5c1375ad1fb80a
@@ -2202,8 +2202,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 578f76cfb2e298fe6bfd278b545091fe682d01feb0be56ef57b6c9f2c179ac61
-R 4f8aa96fb5dc4e807fa23513f1b51f86
-U drh
-Z d928f2574431a0b1dc02438a266e7594
+P 346a845bf1cd1c7e542f7bf763d86c197d9a3b4f3ea38ade416790a1cf80e6f2
+R 3d9ca48b4ce75be7e80d82495e9e7ffe
+U dan
+Z f342386cec8099c31eae45b11308d89c
 # Remove this line to create a well-formed Fossil manifest.
index f585aba1573ddb32beeb766eafa5230ff7aad71b..8518415b4d3233acd3975e27f44fab5e3db1369a 100644 (file)
@@ -1 +1 @@
-346a845bf1cd1c7e542f7bf763d86c197d9a3b4f3ea38ade416790a1cf80e6f2
+bdd408a2557ff05c9ea962a94b442f7c078d8e1ec27035aa95bc23d4d2bd5606
index 916bd831e5edd3d0d3bc50265f9fd02dccf94302..285e9133e78750483df7aec7d3a2a856e82f1af9 100644 (file)
@@ -3911,32 +3911,32 @@ static Expr *substExpr(
         if( pSubst->isOuterJoin ){
           ExprSetProperty(pNew, EP_CanBeNull);
         }
-        if( ExprHasProperty(pExpr,EP_OuterON|EP_InnerON) ){
-          sqlite3SetJoinExpr(pNew, pExpr->w.iJoin,
-                             pExpr->flags & (EP_OuterON|EP_InnerON));
-        }
-        sqlite3ExprDelete(db, pExpr);
-        pExpr = pNew;
-        if( pExpr->op==TK_TRUEFALSE ){
-          pExpr->u.iValue = sqlite3ExprTruthValue(pExpr);
-          pExpr->op = TK_INTEGER;
-          ExprSetProperty(pExpr, EP_IntValue);
+        if( pNew->op==TK_TRUEFALSE ){
+          pNew->u.iValue = sqlite3ExprTruthValue(pNew);
+          pNew->op = TK_INTEGER;
+          ExprSetProperty(pNew, EP_IntValue);
         }
 
         /* Ensure that the expression now has an implicit collation sequence,
         ** just as it did when it was a column of a view or sub-query. */
         {
-          CollSeq *pNat = sqlite3ExprCollSeq(pSubst->pParse, pExpr);
+          CollSeq *pNat = sqlite3ExprCollSeq(pSubst->pParse, pNew);
           CollSeq *pColl = sqlite3ExprCollSeq(pSubst->pParse,
                 pSubst->pCList->a[iColumn].pExpr
           );
-          if( pNat!=pColl || (pExpr->op!=TK_COLUMN && pExpr->op!=TK_COLLATE) ){
-            pExpr = sqlite3ExprAddCollateString(pSubst->pParse, pExpr,
+          if( pNat!=pColl || (pNew->op!=TK_COLUMN && pNew->op!=TK_COLLATE) ){
+            pNew = sqlite3ExprAddCollateString(pSubst->pParse, pNew,
                 (pColl ? pColl->zName : "BINARY")
             );
           }
         }
-        ExprClearProperty(pExpr, EP_Collate);
+        ExprClearProperty(pNew, EP_Collate);
+        if( ExprHasProperty(pExpr,EP_OuterON|EP_InnerON) ){
+          sqlite3SetJoinExpr(pNew, pExpr->w.iJoin,
+                             pExpr->flags & (EP_OuterON|EP_InnerON));
+        }
+        sqlite3ExprDelete(db, pExpr);
+        pExpr = pNew;
       }
     }
   }else{
index 271d412e7e9bfb4b6dfcc7e2abcbee17ec921261..cb9042d258ffde8f56e6c9015b46ed4672736098 100644 (file)
@@ -325,4 +325,35 @@ do_eqp_test 6.3 {
   `--REUSE LIST SUBQUERY xxxxxx
 }
 
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 7.0 {
+  CREATE  TABLE  t0_1(a INT , b INT, c INT);
+  CREATE  TABLE  t0_2(a INT , b INT, c INT);
+
+  INSERT INTO t0_1 (a, b, c) VALUES (1, 0, 1);
+  INSERT INTO t0_2 (a, b, c) VALUES (1, 0, 1);
+
+  CREATE  TABLE  empty1(x);
+  CREATE  TABLE  empty2(y);
+}
+
+do_execsql_test 7.1 {
+  SELECT t0_2.c
+    FROM (SELECT '0000' AS c0 FROM empty2 RIGHT JOIN t0_1 ON 1) AS v0 
+    LEFT JOIN empty1 ON v0.c0, t0_2 
+    RIGHT JOIN (
+           SELECT 5678 AS col0 FROM (SELECT 0)
+    ) AS sub1 ON 1;
+} {1}
+
+do_execsql_test 7.2 {
+  SELECT t0_2.c
+    FROM (SELECT '0000' AS c0 FROM empty2 RIGHT JOIN t0_1 ON 1) AS v0 
+    LEFT JOIN empty1 ON v0.c0, t0_2 
+    RIGHT JOIN (
+           SELECT 5678 AS col0 FROM (SELECT 0)
+    ) AS sub1 ON 1 WHERE +t0_2.c;
+} {1}
+
 finish_test