]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Show LEFT and RIGHT JOIN processing in the EXPLAIN QUERY PLAN output.
authordrh <>
Mon, 11 Apr 2022 14:26:37 +0000 (14:26 +0000)
committerdrh <>
Mon, 11 Apr 2022 14:26:37 +0000 (14:26 +0000)
FossilOrigin-Name: d91faeffea5cf0585fb71e5311fdcc6b8be85c7e9c732050b4448e617c970101

12 files changed:
ext/rtree/rtreeC.test
manifest
manifest.uuid
src/sqliteInt.h
src/where.c
src/wherecode.c
test/autoindex1.test
test/fts3join.test
test/index6.test
test/join2.test
test/join5.test
test/where9.test

index 75afcd7e2220a4934d0eb5eb94838d54a2e83bd7..bddc7d3030ebf4fece635924b4360f2c9aaa5340 100644 (file)
@@ -342,7 +342,7 @@ do_eqp_execsql_test 7.2 {
   QUERY PLAN
   |--SCAN xdir
   |--SCAN rt VIRTUAL TABLE INDEX 2:B0D1
-  `--SCAN ydir
+  `--SCAN ydir LEFT-JOIN
 } {
   5 1 2 7 12 14 {}
   5 2 2 7  8 12 10
index 86737b58ad56244e77922a8aaf6a3cb7949432dd..6a3bfffcd703e28a172e2fa281d47c9ea2ac8324 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C New\stest\scases.
-D 2022-04-11T13:13:57.688
+C Show\sLEFT\sand\sRIGHT\sJOIN\sprocessing\sin\sthe\sEXPLAIN\sQUERY\sPLAN\soutput.
+D 2022-04-11T14:26:37.296
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -409,7 +409,7 @@ F ext/rtree/rtree8.test 2d99006a1386663978c9e1df167554671e4f711c419175b39f332719
 F ext/rtree/rtree9.test fd3c9384ef8aabbc127b3878764070398f136eebc551cd20484b570f2cc1956a
 F ext/rtree/rtreeA.test a7fd235d8194115fa2e14d300337931eb2e960fe8a46cdfb66add2206412ea41
 F ext/rtree/rtreeB.test 4cec297f8e5c588654bbf3c6ed0903f10612be8a2878055dd25faf8c71758bc9
-F ext/rtree/rtreeC.test c4bfa9a61c6788c03e4a9ce40ab2cfc6100982559effd9842d1b658e1d47aa5f
+F ext/rtree/rtreeC.test 2978b194d09b13e106bdb0e1c5b408b9d42eb338c1082bf43c87ef43bd626147
 F ext/rtree/rtreeD.test fe46aa7f012e137bd58294409b16c0d43976c3bb92c8f710481e577c4a1100dc
 F ext/rtree/rtreeE.test e65d3fc625da1800b412fc8785817327d43ccfec5f5973912d8c9e471928caa9
 F ext/rtree/rtreeF.test 81ffa7ef51c4e4618d497a57328c265bf576990c7070633b623b23cd450ed331
@@ -557,7 +557,7 @@ F src/shell.c.in eb7f10d5e2c47bd014d92ec5db1def21fcc1ed56ffaaa4ee715b6c37c370b47
 F src/sqlite.h.in 2a35f62185eb5e7ecc64a2f68442b538ce9be74f80f28a00abc24837edcf1c17
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h f49e28c25bd941e79794db5415fdf7b202deb3bc072ed6f1ed273d578703684e
-F src/sqliteInt.h fa220cb1b04ae45fa34de634efec4c04ce668ddcb6316c8f3260a8cf1a31310b
+F src/sqliteInt.h cfdfe65eeb87d3fa8319481fb541586f49e93d5715e9f487ae83362844a9abc7
 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
 F src/status.c 4a3da6d77eeb3531cb0dbdf7047772a2a1b99f98c69e90ce009c75fe6328b2c0
 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -639,9 +639,9 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
 F src/wal.c b9df133a705093da8977da5eb202eaadb844839f1c7297c08d33471f5491843d
 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
 F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b
-F src/where.c 8d8e54e2e29ac503ac5824cac0d368a9a45b0a2a3f129b0f2d50a1e3a891c62f
+F src/where.c d5ad5f449c937f78b60a154c4ed9b6ccc6d4874ae14f7375e910f07addd143ab
 F src/whereInt.h ecf0d9fe3e35f2546e660c6389e56aedb6fd2434e31a0449b261ff55ebc6df2d
-F src/wherecode.c 808e94b66f1bf052cbb77665ba08625ba93fbb0c343fe0ecafdfdd264bf0c6c9
+F src/wherecode.c bdf7de22c7ac38ad92e78214231a6054019521bfab943c2bfd5ddfb9e8ad9255
 F src/whereexpr.c 174d4ad5be165c610c907abb779ef4a97974d22b84e1ce7898d2d9f6947249e5
 F src/window.c 42a71595263dbd8ef8248218e4fc7d4b5ddccece52146ad48e079342d93f6f8f
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
@@ -704,7 +704,7 @@ F test/auth2.test 9eb7fce9f34bf1f50d3f366fb3e606be5a2000a1
 F test/auth3.test 76d20a7fa136d63bcfcf8bcb65c0b1455ed71078d81f22bcd0550d3eb18594ab
 F test/autoanalyze1.test b9cc3f32a990fa56669b668d237c6d53e983554ae80c0604992e18869a0b2dec
 F test/autoinc.test 997d6f185f138229dc4251583a1d04816423dddc2fc034871a01aeb1d728cb39
-F test/autoindex1.test fe27af92eaf884bd9c38f94be3e8afa04ec494e5eefb189902026181a6175f5e
+F test/autoindex1.test 523b26034dc5e0c5ff0865055b4593f75863b82f17748dec9ca64bb8b267c502
 F test/autoindex2.test 12ef578928102baaa0dc23ad397601a2f4ecb0df
 F test/autoindex3.test 2d13958a5617e987624a428d7aed91bf51f322b49b476e3573fadec697ce6da5
 F test/autoindex4.test 75cb1191a552b8201351f5a50d160fcb9387a0fbbfb820c77798bfee7da3f8cf
@@ -1008,7 +1008,7 @@ F test/fts3fault.test 798e45af84be7978ca33d5bdc94246eb44724db24174b5d8e9b1ac46c5
 F test/fts3fault2.test 6a17a11d8034b1c4eca9f3091649273d56c49ff049e2173df8060f94341e9da0
 F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641
 F test/fts3fuzz001.test e3c7b0ce9b04cc02281dcc96812a277f02df03cd7dc082055d87e11eb18aaf56
-F test/fts3join.test b285c919559af5b093c51abb2c07ce7ec0156dbc9573f444b78dabd9f3040db2
+F test/fts3join.test ee25def5e763ea8879c19e74f862d5191410ccc7259338887a3685e97f512662
 F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6
 F test/fts3matchinfo.test aa66cc50615578b30f6df9984819ae5b702511cf8a94251ec7c594096a703a4a
 F test/fts3matchinfo2.test 00144e841704b8debfcdf6097969cd9f2a1cf759e2203cda42583648f2e6bf58
@@ -1110,7 +1110,7 @@ F test/index2.test f835d5e13ca163bd78c4459ca15fd2e4ed487407
 F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473ade0
 F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6
 F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7
-F test/index6.test 5a7ab531c692ff3b3d139ef8ea6709fab40f9c6862ed418b4976752a5481da3a
+F test/index6.test 6e5b6943f6a97a34898e48c4d0d4990caf55c12c00465a43a9c33d2fd9a3a820
 F test/index7.test b238344318e0b4e42126717f6554f0e7dfd0b39cecad4b736039b43e1e3b6eb3
 F test/index8.test caa097735c91dbc23d8a402f5e63a2a03c83840ba3928733ed7f9a03f8a912a3
 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721
@@ -1141,10 +1141,10 @@ F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4
 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b
 F test/istrue.test e7f285bb70282625c258e866ce6337d4c762922f5a300e1b50f958aef6e7d9c9
 F test/join.test a1832675aa30f2b422ff934b553e30294ca899484710242a2119ebf21f20a66a
-F test/join2.test 9bdc615841b91c97a16d68bad9508aea11fa0c6b34e5689847bcc4dac70e4990
+F test/join2.test bf5ce6bfcef40dd49cfa51dd338eee62551e1efd85cadc68456c9beb43a06914
 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0
 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916
-F test/join5.test 0d63c7e43b3160b9d4b93f196ef83b6efc7751b9edd0d18c53a46fbec7a49cfc
+F test/join5.test c4df54e2e204d7f1417bfbdd21ca324b4b07415c647595cc47798eacfddc96d3
 F test/join6.test f809c025fa253f9e150c0e9afd4cef8813257bceeb6f46e04041228c9403cc2c
 F test/join7.test 1046604adf0c14d511b9fdd32d0ae0dbd0b72bf5bdb743f8c2e2308ab2ece16d
 F test/journal1.test c7b768041b7f494471531e17abc2f4f5ebf9e5096984f43ed17c4eb80ba34497
@@ -1778,7 +1778,7 @@ F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2
 F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b
 F test/where7.test 1c1bf436bf31b913d4764a2b62ac6e98b9681e5c7ae2b562605592a56b7e946b
 F test/where8.test 461ca40265ed996a6305da99bb024b0e41602bb586acf544c08f95922358e49f
-F test/where9.test 1ffb75edc50a8faa6e7bd77f8221d783febb00b44b0bdb32fb48cec6e38eca95
+F test/where9.test 2db942671a002621eff4f713e347bb25243295f79d8990297cd160bebcfde3f7
 F test/whereA.test 9d1077b117f1b68d5f739d94f36956c36cf995eb87bb19b77b2e81af020edd20
 F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5
 F test/whereC.test cae295158703cb3fc23bf1a108a9ab730efff0f6
@@ -1946,8 +1946,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 0f6f61c3664cc87209c2a6f9b6df3a750d1510723fcde209c33db8feaf48bcf3
-R f9db99ab6a64191d51c5383e6585d61d
+P d5f6791b86f946b348f5ddc9cedc0df4a86b17854a97554140799caf74c602f3
+R e0e6850d0795cb014db7acec54c6d9c7
 U drh
-Z 5631bbf7326a120ea1b6b188ec3bde18
+Z 41018e27e5349147bcae79649d9ca497
 # Remove this line to create a well-formed Fossil manifest.
index 7b36e498afb27add099ee04c52f2a680e142a70e..2b59843c0c496bf4a182966d3a457d9ecb3be1a9 100644 (file)
@@ -1 +1 @@
-d5f6791b86f946b348f5ddc9cedc0df4a86b17854a97554140799caf74c602f3
\ No newline at end of file
+d91faeffea5cf0585fb71e5311fdcc6b8be85c7e9c732050b4448e617c970101
\ No newline at end of file
index b9eb970c7a8779bfa10507da554c3f540b0cc459..330d58fa48b51074a4325eed347220abbec0bcb5 100644 (file)
@@ -3163,7 +3163,7 @@ struct SrcList {
 #define WHERE_SORTBYGROUP      0x0200 /* Support sqlite3WhereIsSorted() */
 #define WHERE_AGG_DISTINCT     0x0400 /* Query is "SELECT agg(DISTINCT ...)" */
 #define WHERE_ORDERBY_LIMIT    0x0800 /* ORDERBY+LIMIT on the inner loop */
-                        /*     0x1000    not currently used */
+#define WHERE_RIGHT_JOIN       0x1000 /* Processing a RIGHT JOIN */
                         /*     0x2000    not currently used */
 #define WHERE_USE_LIMIT        0x4000 /* Use the LIMIT in cost estimates */
                         /*     0x8000    not currently used */
index 1cd8f4ded8806849a7a88cb8feec576145b25c89..3677759ce8e52ae5963b0b3999d6bfcbe4f6e812 100644 (file)
@@ -6191,8 +6191,9 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){
       sFrom.nAlloc = 1;
       memcpy(&sFrom.a[0], pTabItem, sizeof(SrcItem));
       sFrom.a[0].fg.jointype = 0;
+      ExplainQueryPlan((pParse, 1, "RIGHT-JOIN %s", pTab->zName));
       pSubWInfo = sqlite3WhereBegin(pParse, &sFrom, pSubWhere, 0, 0, 0,
-                                    WHERE_OR_SUBCLAUSE, 0);
+                                    WHERE_RIGHT_JOIN, 0);
       if( pSubWInfo ){
         int iCur = pLevel->iTabCur;
         int r = ++pParse->nMem;
@@ -6219,6 +6220,7 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){
         sqlite3WhereEnd(pSubWInfo);
       }
       sqlite3ExprDelete(pParse->db, pSubWhere);
+      ExplainQueryPlanPop(pParse);
       continue;
     }
 
index 0c810486781896df57de03c477d0fd138dc268f0..410d6f206e0a617a1a1c136583785cff5d4e8038 100644 (file)
@@ -204,6 +204,9 @@ int sqlite3WhereExplainOneScan(
                   pLoop->u.vtab.idxNum, pLoop->u.vtab.idxStr);
     }
 #endif
+    if( pItem->fg.jointype & JT_LEFT ){
+      sqlite3_str_appendf(&str, " LEFT-JOIN");
+    }
 #ifdef SQLITE_EXPLAIN_ESTIMATED_ROWS
     if( pLoop->nOut>=10 ){
       sqlite3_str_appendf(&str, " (~%llu rows)",
@@ -1150,7 +1153,7 @@ static void codeDeferredSeek(
   
   pWInfo->bDeferredSeek = 1;
   sqlite3VdbeAddOp3(v, OP_DeferredSeek, iIdxCur, 0, iCur);
-  if( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)
+  if( (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN))
    && DbMaskAllZero(sqlite3ParseToplevel(pParse)->writeMask)
   ){
     int i;
@@ -1502,7 +1505,7 @@ Bitmask sqlite3WhereCodeOneLoopStart(
   ** initialize a memory cell that records if this table matches any
   ** row of the left table of the join.
   */
-  assert( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)
+  assert( (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN))
        || pLevel->iFrom>0 || (pTabItem[0].fg.jointype & JT_LEFT)==0
   );
   if( pLevel->iFrom>0 && (pTabItem[0].fg.jointype & JT_LEFT)!=0 ){
@@ -2140,7 +2143,7 @@ Bitmask sqlite3WhereCodeOneLoopStart(
 
     /* Seek the table cursor, if required */
     omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 
-           && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0;
+           && (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN))==0;
     if( omitTable ){
       /* pIdx is a covering index.  No need to access the main table. */
     }else if( HasRowid(pIdx->pTable) ){
@@ -2174,7 +2177,7 @@ Bitmask sqlite3WhereCodeOneLoopStart(
       ** move forward to the next index.
       ** https://sqlite.org/src/info/4e8e4857d32d401f
       */
-      if( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){
+      if( (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN))==0 ){
         whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo);
       }
   
@@ -2193,7 +2196,7 @@ Bitmask sqlite3WhereCodeOneLoopStart(
       /* The following assert() is not a requirement, merely an observation:
       ** The OR-optimization doesn't work for the right hand table of
       ** a LEFT JOIN: */
-      assert( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 );
+      assert( (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN))==0 );
     }
   
     /* Record the instruction used to terminate the loop. */
index 6b437f186703395ecbc2291d95dd01e160b688b2..2cd49004002ab67ed137dae1b238e974a32df44a 100644 (file)
@@ -283,7 +283,7 @@ do_eqp_test autoindex1-600a {
   |  `--CORRELATED SCALAR SUBQUERY xxxxxx
   |     `--SEARCH later USING COVERING INDEX sqlite_autoindex_flock_owner_1 (flock_no=? AND owner_change_date>? AND owner_change_date<?)
   |--SCAN x USING INDEX sheep_reg_flock_index
-  `--SEARCH y USING AUTOMATIC COVERING INDEX (sheep_no=?)
+  `--SEARCH y USING AUTOMATIC COVERING INDEX (sheep_no=?) LEFT-JOIN
 }
 
 
index 9a7994193f166dc68dd88bf3ce8610f81a7e71a5..3333b1ab42ff1784baee92587b4f8d43898088bd 100644 (file)
@@ -100,7 +100,7 @@ do_eqp_test 4.2 {
   |--MATERIALIZE rr
   |  `--SCAN ft4 VIRTUAL TABLE INDEX 3:
   |--SCAN t4
-  `--SEARCH rr USING AUTOMATIC COVERING INDEX (docid=?)
+  `--SEARCH rr USING AUTOMATIC COVERING INDEX (docid=?) LEFT-JOIN
 }
 
 finish_test
index 7eed6a47e7acb23f8c4c3474c8795b0f75096736..1ae2ee8753f5859c758bbbc5f2a9d2cfa3d7b9c2 100644 (file)
@@ -320,7 +320,7 @@ do_eqp_test index6-8.1 {
 } {
   QUERY PLAN
   |--SCAN t8a
-  `--SEARCH t8b USING INDEX i8c (y=?)
+  `--SEARCH t8b USING INDEX i8c (y=?) LEFT-JOIN
 }
 
 do_execsql_test index6-8.2 {
index 170000ca27402cad942d8df4a0eac926a0b345ea..8af242b1ad13bf0fe1975f4fbe7c77fb4dbed371 100644 (file)
@@ -114,7 +114,7 @@ do_eqp_test 3.1 {
 } {
   QUERY PLAN
   |--SCAN t1
-  `--SEARCH t2 USING INTEGER PRIMARY KEY (rowid=?)
+  `--SEARCH t2 USING INTEGER PRIMARY KEY (rowid=?) LEFT-JOIN
 }
 
 do_eqp_test 3.2 {
@@ -122,7 +122,7 @@ do_eqp_test 3.2 {
 } {
   QUERY PLAN
   |--SCAN t1
-  `--SEARCH t2 USING INTEGER PRIMARY KEY (rowid=?)
+  `--SEARCH t2 USING INTEGER PRIMARY KEY (rowid=?) LEFT-JOIN
 }
 
 #-------------------------------------------------------------------------
@@ -162,15 +162,15 @@ do_eqp_test 4.1.5 {
 } {
   QUERY PLAN
   |--SCAN c1
-  |--SEARCH c2 USING INTEGER PRIMARY KEY (rowid=?)
-  `--SEARCH c3 USING INTEGER PRIMARY KEY (rowid=?)
+  |--SEARCH c2 USING INTEGER PRIMARY KEY (rowid=?) LEFT-JOIN
+  `--SEARCH c3 USING INTEGER PRIMARY KEY (rowid=?) LEFT-JOIN
 }
 do_eqp_test 4.1.6 {
   SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v1+1);
 } {
   QUERY PLAN
   |--SCAN c1
-  `--SEARCH c3 USING INTEGER PRIMARY KEY (rowid=?)
+  `--SEARCH c3 USING INTEGER PRIMARY KEY (rowid=?) LEFT-JOIN
 }
 
 do_execsql_test 4.2.0 {
@@ -209,15 +209,15 @@ do_eqp_test 4.2.5 {
 } {
   QUERY PLAN
   |--SCAN c1
-  |--SEARCH c2 USING INDEX sqlite_autoindex_c2_1 (k=?)
-  `--SEARCH c3 USING INDEX sqlite_autoindex_c3_1 (k=?)
+  |--SEARCH c2 USING INDEX sqlite_autoindex_c2_1 (k=?) LEFT-JOIN
+  `--SEARCH c3 USING INDEX sqlite_autoindex_c3_1 (k=?) LEFT-JOIN
 }
 do_eqp_test 4.2.6 {
   SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v1+1);
 } {
   QUERY PLAN
   |--SCAN c1
-  `--SEARCH c3 USING INDEX sqlite_autoindex_c3_1 (k=?)
+  `--SEARCH c3 USING INDEX sqlite_autoindex_c3_1 (k=?) LEFT-JOIN
 }
 
 # 2017-11-23 (Thanksgiving day)
index a5cedd8cb28d09cd1562fb0ce097a659ab218890..e4fd9cd871b8d5780ce83bebf45fd4e571b588d1 100644 (file)
@@ -280,9 +280,9 @@ do_eqp_test 7.2 {
   |--SCAN t1
   `--MULTI-INDEX OR
      |--INDEX 1
-     |  `--SEARCH t2 USING INDEX t2xy (x=? AND y=?)
+     |  `--SEARCH t2 USING INDEX t2xy (x=? AND y=?) LEFT-JOIN
      `--INDEX 2
-        `--SEARCH t2 USING INDEX t2xy (x=? AND y=?)
+        `--SEARCH t2 USING INDEX t2xy (x=? AND y=?) LEFT-JOIN
 }
 
 do_execsql_test 7.3 {
@@ -303,7 +303,7 @@ do_eqp_test 7.4 {
 } {
   QUERY PLAN
   |--SCAN t3
-  `--SEARCH t4 USING INDEX t4xz (x=?)
+  `--SEARCH t4 USING INDEX t4xz (x=?) LEFT-JOIN
 } 
 do_eqp_test 7.4b {
   SELECT * FROM t3 CROSS JOIN t4 ON (t4.x = t3.x) WHERE (+t4.y = ? OR t4.z = ?);
index 429708f1fe8350080ef02f0da3da43065825ff09..475788153247495df176ab3c0fb3c232518e2e3d 100644 (file)
@@ -378,9 +378,9 @@ ifcapable explain {
     |--SEARCH t1 USING INTEGER PRIMARY KEY (rowid=?)
     `--MULTI-INDEX OR
        |--INDEX 1
-       |  `--SEARCH t2 USING INDEX t2d (d=?)
+       |  `--SEARCH t2 USING INDEX t2d (d=?) LEFT-JOIN
        `--INDEX 2
-          `--SEARCH t2 USING COVERING INDEX t2f (f=?)
+          `--SEARCH t2 USING COVERING INDEX t2f (f=?) LEFT-JOIN
   }]
 }