-C fiddle:\sminor\sstyle\stweaks,\sincluding\susing\sswapped\scolors\sfor\sthe\sinput/output\sfields\sto\shelp\s(hopefully)\sreduce\sthe\s"which\sfield\sis\swhich?"\sdissonance.
-D 2022-06-10T15:43:03.260
+C The\ssame\srestrictions\son\sthe\suse\sof\sWHERE\sclause\sterms\sto\sdrive\sindexes\nin\sthe\spresence\sof\sRIGHT\sJOINs\salso\sapply\sto\sthe\suse\sof\sWHERE\sclause\sterms\nto\smanufacture\sautomatic\sindexes.\s\sThis\sfixes\sa\sproblem\sidentified\sby\n[forum:/forumpost/51e6959f61|forum\spost\s51e6959f61].
+D 2022-06-10T16:41:54.319
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
F src/wal.c b9df133a705093da8977da5eb202eaadb844839f1c7297c08d33471f5491843d
F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b
-F src/where.c 7a5c084800eab6ed9006bccd5d3116a7a6a998c56c525b22f62f131b3b133189
+F src/where.c 267caa227dd38ede46959468118ef4067316dae589d889c200911ff77df53ef1
F src/whereInt.h b48ca529ffe293c18cbfa8326af18a09e39910de66fb3e96ef788c7cbf8ef3a7
F src/wherecode.c 0b09abfcb88c61c6a6984a3e065786631ff35495e9bdf865e6b74ab0a1299c5b
F src/whereexpr.c 20255cf03e0b765b742301197d165511ff99e95da0d7ee9c8a2ebc1e888dd049
F test/join5.test d22b6cba8fb59ab3f1c82701434c360705eb12d4ce200c449f37b018fc47681a
F test/join6.test f809c025fa253f9e150c0e9afd4cef8813257bceeb6f46e04041228c9403cc2c
F test/join7.test 2268dcbb54b724391dda3748ea95c60d960607ffeed67885675998e7117697f6
-F test/join8.test ca277bf3c03a2fdcc4bccfadb178828350c9bae1354a3410b2c3d46f61e62a10
+F test/join8.test 135277faf0cab04efe42bfea9aadde034bd36dc2ce3a3de49e97c8c7f745f103
F test/join9.test 9056ddd3b0c0f4f9d658f4521038d9a37dc23ead8ca9a505d0b0db2b6a471e05
F test/joinA.test 7eab225dc1c1ab258a5e62513a4ed7cabbd3db971d59d5d92f4fb6fa14c12f6a
F test/joinB.test 1b2ba3fc8568b49411787fccbf540570c148e9b6a53a30f80691cb6268098ded
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P cab9b4cccd13bf0ab2bc38dc9a9c04ddd34e29c65ab6aef07b6bb3c31a43bece
-R 29ea6fa57e08e2764252fc42ded3b3ec
-U stephan
-Z 4b738143df3568b63c5639bf0ffc2bc2
+P e25dad868f9ef2c7847319c9f6f106999ba8b0a3e09ed9edfbd25e8fc6f3c10e
+R 71f93056490b18abe7ae590f710ffb97
+U drh
+Z c3464bb306b9115d0a59088775264fcc
# Remove this line to create a well-formed Fossil manifest.
-e25dad868f9ef2c7847319c9f6f106999ba8b0a3e09ed9edfbd25e8fc6f3c10e
\ No newline at end of file
+342c501f532523347e6c339351e02043dd6ee9e11a291224b65ea72bd6c2ba40
\ No newline at end of file
char aff;
if( pTerm->leftCursor!=pSrc->iCursor ) return 0;
if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) return 0;
- if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ))!=0
- && !ExprHasProperty(pTerm->pExpr, EP_OuterON)
- && (pTerm->eOperator & WO_IS)
- ){
- /* Cannot use an IS term from the WHERE clause as an index driver for
- ** the RHS of a LEFT JOIN or for the LHS of a RIGHT JOIN. Such a term
- ** can only be used if it is from the ON clause. */
- return 0;
+ assert( (pSrc->fg.jointype & JT_RIGHT)==0 );
+ if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 ){
+ testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LEFT );
+ testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LTORJ );
+ testcase( ExprHasProperty(pTerm->pExpr, EP_OuterON) )
+ testcase( ExprHasProperty(pTerm->pExpr, EP_InnerON) );
+ if( !ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON)
+ || pTerm->pExpr->w.iJoin != pSrc->iCursor
+ ){
+ return 0; /* See tag-20191211-001 */
+ }
}
if( (pTerm->prereqRight & notReady)!=0 ) return 0;
assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 );
** for an example of a WHERE clause constraints that may not be used on
** the right table of a RIGHT JOIN because the constraint implies a
** not-NULL condition on the left table of the RIGHT JOIN.
+ **
+ ** 2022-06-10: The same condition applies to termCanDriveIndex() above.
+ ** https://sqlite.org/forum/forumpost/51e6959f61
*/
if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 ){
testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LEFT );
do_execsql_test join8-22020 {
SELECT * FROM t1 JOIN t3 ON (b=TRUE) RIGHT JOIN t2 ON TRUE WHERE (b IS TRUE);
} {}
+
+# 2022-06-10
+# https://sqlite.org/forum/forumpost/51e6959f61
+#
+# Restrictions on the usage of WHERE clause constraints by joins that are
+# involved with a RIGHT JOIN must also be applied to automatic indexes.
+#
+reset_db
+do_execsql_test join8-22000 {
+ CREATE TABLE t1(a INT);
+ CREATE TABLE t2(b INT);
+ CREATE TABLE t3(c TEXT); INSERT INTO t3 VALUES('x');
+ CREATE TABLE t4(d TEXT); INSERT INTO t4 VALUES('y');
+ SELECT 99
+ FROM t1
+ LEFT JOIN t2 ON true
+ RIGHT JOIN t3 ON true
+ RIGHT JOIN t4 ON true
+ WHERE a=b;
+} {}
finish_test