-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
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
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
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.
-2e85b0e3dcae0915aa6472a3654c8ac72a6b2083c11747f3f657c79bbdaf530b
\ No newline at end of file
+d095da0e7a24e3bcab6495d964f76a86d7a5910d2d6edddc6e8092bfa6084fe6
\ No newline at end of file
** 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;
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);
+ }
}
}
# |--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