From 5e767c579344d6b980ec84940bbd9d72009a21bc Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 25 Feb 2010 04:15:47 +0000 Subject: [PATCH] Make sure the ON clause of a LEFT JOIN does not cause an index to be used to speed access to a table to the left of the join. Ticket [ebdbadade5] FossilOrigin-Name: f0ae251abb9e8a8793f46a30b79b2ce541cf14d5 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/where.c | 5 +++-- test/where6.test | 24 ++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index c7103b9a91..94a98d047e 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,8 @@ -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 -C Add\stestcase()\smacros\sbeside\seach\ssqlite3_log()\scall\sto\smake\ssure\sit\sis\ntested\swith\sboth\slogging\senable\sand\sdisabled. -D 2010-02-24T21:44:07 +C Make\ssure\sthe\sON\sclause\sof\sa\sLEFT\sJOIN\sdoes\snot\scause\san\sindex\sto\sbe\nused\sto\sspeed\saccess\sto\sa\stable\sto\sthe\sleft\sof\sthe\sjoin.\nTicket\s[ebdbadade5] +D 2010-02-25T04:15:48 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in 4f2f967b7e58a35bb74fb7ec8ae90e0f4ca7868b F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -224,7 +224,7 @@ F src/vdbemem.c aeba77b59f3553d3cc5b72c18a8267c6fba546b9 F src/vdbetrace.c 864cef96919323482ebd9986f2132435115e9cc2 F src/vtab.c 606adf51cd6d4ba51a8c6dccede06a6f7b0dd72d F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f -F src/where.c 9269ec75e1e36e69748fd918ac5a636020c85e7e +F src/where.c 399ea4c090284c9d16f76d685b9b44e8b9b4442b F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 F test/all.test 14165b3e32715b700b5f0cbf8f6e3833dda0be45 @@ -757,7 +757,7 @@ F test/where2.test 45eacc126aabb37959a387aa83e59ce1f1f03820 F test/where3.test 97d3936e6a443b968f1a61cdcc0f673252000e94 F test/where4.test e9b9e2f2f98f00379e6031db6a6fca29bae782a2 F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2 -F test/where6.test 42c4373595f4409d9c6a9987b4a60000ad664faf +F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b F test/where7.test fdd58ab9dec9f97679e65d4414bf5e07d725d79f F test/where8.test 2bb8ea44b745fcc93db150fac9ce33d12e499760 F test/where8m.test da346596e19d54f0aba35ebade032a7c47d79739 @@ -795,14 +795,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P dd480f62afa56ff85c2dd57ee7a16eee427e823f -R c9523526f48a8860988dae54cadcdbf1 +P 1168763d2cd96acfa0488198e8bc82f0c4fa35a3 +R 1756ec34ec14812b999545b49c238389 U drh -Z 1dbd84d12743933d537cbe784ede4bca +Z cef349c135ac8fde894db77ffb6c3cd3 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) -iD8DBQFLhZ2qoxKgR168RlERAtqjAJ9ekluC7QTqJi+Q6cIzjOZVf34HNACfUmiQ -TteOSExg+iy0J6i1CF0ncys= -=oaDc +iD8DBQFLhfl5oxKgR168RlERAuYtAJ9UCQXaWqORFlTB8prfqFcd5VDUngCcDDwZ +5GuaCQJQEFY+u7p5eZA7abU= +=4lWh -----END PGP SIGNATURE----- diff --git a/manifest.uuid b/manifest.uuid index d00c919731..e4b48db311 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1168763d2cd96acfa0488198e8bc82f0c4fa35a3 \ No newline at end of file +f0ae251abb9e8a8793f46a30b79b2ce541cf14d5 \ No newline at end of file diff --git a/src/where.c b/src/where.c index f27ce66928..5f81ce0768 100644 --- a/src/where.c +++ b/src/where.c @@ -1096,7 +1096,7 @@ static void exprAnalyze( Expr *pExpr; /* The expression to be analyzed */ Bitmask prereqLeft; /* Prerequesites of the pExpr->pLeft */ Bitmask prereqAll; /* Prerequesites of pExpr */ - Bitmask extraRight = 0; /* */ + Bitmask extraRight = 0; /* Extra dependencies on LEFT JOIN */ Expr *pStr1 = 0; /* RHS of LIKE/GLOB operator */ int isComplete = 0; /* RHS of LIKE/GLOB ends with wildcard */ int noCase = 0; /* LIKE/GLOB distinguishes case */ @@ -1168,7 +1168,8 @@ static void exprAnalyze( pLeft = pDup->pLeft; pNew->leftCursor = pLeft->iTable; pNew->u.leftColumn = pLeft->iColumn; - pNew->prereqRight = prereqLeft; + testcase( (prereqLeft | extraRight) != prereqLeft ); + pNew->prereqRight = prereqLeft | extraRight; pNew->prereqAll = prereqAll; pNew->eOperator = operatorMask(pDup->op); } diff --git a/test/where6.test b/test/where6.test index bcea6540a5..83e975b7dd 100644 --- a/test/where6.test +++ b/test/where6.test @@ -127,4 +127,28 @@ do_test where6-2.14 { } } {1 3 1 3} +# Ticket [ebdbadade5b]: +# If the ON close on a LEFT JOIN is of the form x=y where both x and y +# are indexed columns on tables to left of the join, then do not use that +# term with indices to either table. +# +do_test where6-3.1 { + db eval { + CREATE TABLE t4(x UNIQUE); + INSERT INTO t4 VALUES('abc'); + INSERT INTO t4 VALUES('def'); + INSERT INTO t4 VALUES('ghi'); + CREATE TABLE t5(a, b, c, PRIMARY KEY(a,b)); + INSERT INTO t5 VALUES('abc','def',123); + INSERT INTO t5 VALUES('def','ghi',456); + + SELECT t4a.x, t4b.x, t5.c, t6.v + FROM t4 AS t4a + INNER JOIN t4 AS t4b + LEFT JOIN t5 ON t5.a=t4a.x AND t5.b=t4b.x + LEFT JOIN (SELECT 1 AS v) AS t6 ON t4a.x=t4b.x + ORDER BY 1, 2, 3; + } +} {abc abc {} 1 abc def 123 {} abc ghi {} {} def abc {} {} def def {} 1 def ghi 456 {} ghi abc {} {} ghi def {} {} ghi ghi {} 1} + finish_test