]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Do not apply the "AND false" optimization if either operand comes from the
authordrh <>
Mon, 1 May 2023 11:24:35 +0000 (11:24 +0000)
committerdrh <>
Mon, 1 May 2023 11:24:35 +0000 (11:24 +0000)
ON clause of a join.  Fix for the problem identified by
[forum:/forumpost/96cd4a7e9e|forum post 96cd4a7e9e].

FossilOrigin-Name: d095da0e7a24e3bcab6495d964f76a86d7a5910d2d6edddc6e8092bfa6084fe6

manifest
manifest.uuid
src/expr.c
test/join.test

index 5b05d8a9f2557faa52f56efc97944954cc1e6f53..8207804f11e45dfc987a567554af8b118f18b2c6 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\scrash\sthat\scould\soccur\sin\sfts5\s'secure-delete'\smode\swhen\soperating\son\scorrupt\srecords.
-D 2023-04-29T18:31:44.051
+C Do\snot\sapply\sthe\s"AND\sfalse"\soptimization\sif\seither\soperand\scomes\sfrom\sthe\nON\sclause\sof\sa\sjoin.\s\sFix\sfor\sthe\sproblem\sidentified\sby\n[forum:/forumpost/96cd4a7e9e|forum\spost\s96cd4a7e9e].
+D 2023-05-01T11:24:35.203
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -584,7 +584,7 @@ F src/date.c f21815ca7172ce073db3163ac54c8d9f2841077165c1a6123b4d1c376a0c7ec7
 F src/dbpage.c f3eea5f7ec47e09ee7da40f42b25092ecbe961fc59566b8e5f705f34335b2387
 F src/dbstat.c ec92074baa61d883de58c945162d9e666c13cd7cf3a23bc38b4d1c4d0b2c2bef
 F src/delete.c a9c6d3f51c0a31e9b831e0a0580a98d702904b42d216fee530940e40dec34873
-F src/expr.c 6353f4d92d9f67ec3466d8e6978cd31a45e34cb755c4d11e689077f03f7c0a15
+F src/expr.c 871cfd80c516ee39d90414b2d3da2b5bc9c9e21fe87b7eb787ea7ae4b6461758
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 03c134cc8bffe54835f742ddea0b72ebfc8f6b32773d175c71b8afeea6cb5c83
 F src/func.c d187be57a886ddf4e6b7ef584a494361899be3df5eee6d4a747b68ff4aff4122
@@ -1229,7 +1229,7 @@ F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c
 F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4
 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b
 F test/istrue.test e7f285bb70282625c258e866ce6337d4c762922f5a300e1b50f958aef6e7d9c9
-F test/join.test ed1daf99958fed1b9f017e56bae2bb6b49339a1ec0b70b9e8f7259960c6bf387
+F test/join.test aea7a4f55b2d9eb8ef3434ea78f55b15bd688ab6136a11105c9c52f77424f199
 F test/join2.test 8561fe82ce434ac96de91544072e578dc2cadddf2d9bc9cd802f866a9b92502e
 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0
 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916
@@ -2061,8 +2061,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 07383758d68e05021ccd393a69c1fa94836dfb02331326c082495a531a384363
-R f659959a34cd18cd5104e952e98d50d8
-U dan
-Z b8e56280f98e35721f913e42d252102b
+P 2e85b0e3dcae0915aa6472a3654c8ac72a6b2083c11747f3f657c79bbdaf530b
+R 13838bb1c49ef42cf7d6d72f16ec581a
+U drh
+Z e3cbaf1612201f89ba80e24327377d58
 # Remove this line to create a well-formed Fossil manifest.
index 8d196fa4ede8112984edd4e2113f2d6521394a8c..7b30323184bb39979fb4f64fea13681a71199c44 100644 (file)
@@ -1 +1 @@
-2e85b0e3dcae0915aa6472a3654c8ac72a6b2083c11747f3f657c79bbdaf530b
\ No newline at end of file
+d095da0e7a24e3bcab6495d964f76a86d7a5910d2d6edddc6e8092bfa6084fe6
\ No newline at end of file
index ebaf13af17e3e43a86aa1444efbfcf91f9857980..9ffc3baded5168f521332701d47bffc680c51609 100644 (file)
@@ -1113,9 +1113,9 @@ Select *sqlite3ExprListToValues(Parse *pParse, int nElem, ExprList *pEList){
 ** Join two expressions using an AND operator.  If either expression is
 ** NULL, then just return the other expression.
 **
-** If one side or the other of the AND is known to be false, then instead
-** of returning an AND expression, just return a constant expression with
-** a value of false.
+** If one side or the other of the AND is known to be false, and neither side
+** is part of an ON clause, then instead of returning an AND expression,
+** just return a constant expression with a value of false.
 */
 Expr *sqlite3ExprAnd(Parse *pParse, Expr *pLeft, Expr *pRight){
   sqlite3 *db = pParse->db;
@@ -1123,14 +1123,17 @@ Expr *sqlite3ExprAnd(Parse *pParse, Expr *pLeft, Expr *pRight){
     return pRight;
   }else if( pRight==0 ){
     return pLeft;
-  }else if( (ExprAlwaysFalse(pLeft) || ExprAlwaysFalse(pRight)) 
-         && !IN_RENAME_OBJECT
-  ){
-    sqlite3ExprDeferredDelete(pParse, pLeft);
-    sqlite3ExprDeferredDelete(pParse, pRight);
-    return sqlite3Expr(db, TK_INTEGER, "0");
   }else{
-    return sqlite3PExpr(pParse, TK_AND, pLeft, pRight);
+    u32 f = pLeft->flags | pRight->flags;
+    if( (f&(EP_OuterON|EP_InnerON|EP_IsFalse))==EP_IsFalse 
+     && !IN_RENAME_OBJECT
+    ){
+      sqlite3ExprDeferredDelete(pParse, pLeft);
+      sqlite3ExprDeferredDelete(pParse, pRight);
+      return sqlite3Expr(db, TK_INTEGER, "0");
+    }else{
+      return sqlite3PExpr(pParse, TK_AND, pLeft, pRight);
+    }
   }
 }
 
index d87982e718eb4f56073ead73ae408d536662598e..44bfb3bef2593fa1c916c7b6f1e0d7641782977e 100644 (file)
@@ -1245,4 +1245,22 @@ do_eqp_test join-28.2 {
 #   |--SCAN t4
 #   `--SEARCH t3 USING AUTOMATIC COVERING INDEX (a=?)
 
+
+# 2023-05-01 https://sqlite.org/forum/forumpost/96cd4a7e9e
+#
+reset_db
+db null NULL
+do_execsql_test join-29.1 {
+  CREATE TABLE t0(a INT); INSERT INTO t0(a) VALUES (1);
+  CREATE TABLE t1(b INT); INSERT INTO t1(b) VALUES (2);
+  CREATE VIEW v2(c) AS SELECT 3 FROM t1;
+  SELECT * FROM t1 JOIN v2 ON 0     FULL OUTER JOIN t0 ON true;
+} {NULL NULL 1}
+do_execsql_test join-29.2 {
+  SELECT * FROM t1 JOIN v2 ON 1=0   FULL OUTER JOIN t0 ON true;
+} {NULL NULL 1}
+do_execsql_test join-29.3 {
+  SELECT * FROM t1 JOIN v2 ON false FULL OUTER JOIN t0 ON true;
+} {NULL NULL 1}
+
 finish_test