Fix create_lateral_join_info to handle dead relations properly.
authorRobert Haas <rhaas@postgresql.org>
Wed, 20 Sep 2017 14:20:10 +0000 (10:20 -0400)
committerRobert Haas <rhaas@postgresql.org>
Wed, 20 Sep 2017 14:20:10 +0000 (10:20 -0400)
Commit 0a480502b092195a9b25a2f0f199a21d592a9c57 broke it.

Report by Andreas Seltenreich.  Fix by Ashutosh Bapat.

Discussion: http://postgr.es/m/874ls2vrnx.fsf@ansel.ydns.eu

src/backend/optimizer/plan/initsplan.c
src/test/regress/expected/join.out
src/test/regress/sql/join.sql

index ad81f0f82ff5707a2665d827ae3c8549b0b56f55..9931dddba43a6675d39ad5a621335166cd8a779e 100644 (file)
@@ -632,7 +632,11 @@ create_lateral_join_info(PlannerInfo *root)
        RelOptInfo *brel = root->simple_rel_array[rti];
        RangeTblEntry *brte = root->simple_rte_array[rti];
 
-       if (brel == NULL)
+       /*
+        * Skip empty slots. Also skip non-simple relations i.e. dead
+        * relations.
+        */
+       if (brel == NULL || !IS_SIMPLE_REL(brel))
            continue;
 
        /*
@@ -644,7 +648,6 @@ create_lateral_join_info(PlannerInfo *root)
         * therefore be marked with the appropriate lateral info so that those
         * children eventually get marked also.
         */
-       Assert(IS_SIMPLE_REL(brel));
        Assert(brte);
        if (brel->reloptkind == RELOPT_OTHER_MEMBER_REL &&
            (brte->rtekind != RTE_RELATION ||
index 06a84e8e1c76c2e23932f51543d3b6ccb15a71f8..f47449b1c44989cdc7d0958e5c551d53dd917714 100644 (file)
@@ -4060,6 +4060,18 @@ select i8.* from int8_tbl i8 left join (select f1 from int4_tbl group by f1) i4
  Seq Scan on int8_tbl i8
 (1 row)
 
+-- check join removal with lateral references
+explain (costs off)
+select 1 from (select a.id FROM a left join b on a.b_id = b.id) q,
+             lateral generate_series(1, q.id) gs(i) where q.id = gs.i;
+                QUERY PLAN                 
+-------------------------------------------
+ Nested Loop
+   ->  Seq Scan on a
+   ->  Function Scan on generate_series gs
+         Filter: (a.id = i)
+(4 rows)
+
 rollback;
 create temp table parent (k int primary key, pd int);
 create temp table child (k int unique, cd int);
index 8b21838e92759b2ecd309023db17d4238c688a32..d847d536533db4d8966661f69a0c4185c90bcd84 100644 (file)
@@ -1336,6 +1336,11 @@ explain (costs off)
 select i8.* from int8_tbl i8 left join (select f1 from int4_tbl group by f1) i4
   on i8.q1 = i4.f1;
 
+-- check join removal with lateral references
+explain (costs off)
+select 1 from (select a.id FROM a left join b on a.b_id = b.id) q,
+             lateral generate_series(1, q.id) gs(i) where q.id = gs.i;
+
 rollback;
 
 create temp table parent (k int primary key, pd int);