On Tue, Aug 8, 2023 at 7:34 PM Ashutosh Bapat <ashutosh.bapat....@gmail.com>
wrote:

> On Tue, Aug 8, 2023 at 12:44 PM Richard Guo <guofengli...@gmail.com>
> wrote:
> > This is not an existing bug.  Our current code (without this patch)
> > would always call create_nestloop_path() after the reparameterization
> > work has been done for the inner path.  So we can safely check against
> > outer rel (not its topmost parent) in create_nestloop_path().  But now
> > with this patch, the reparameterization is postponed until createplan.c,
> > so we have to check against the topmost parent of outer rel in
> > create_nestloop_path(), otherwise we'd have duplicate clauses in the
> > final plan.
>
> Hmm. I am worried about the impact this will have when the nestloop
> path is created for two child relations. Your code will still pick the
> top_parent_relids which seems odd. Have you tested that case?


Well, the way it's working is that for child rels all parameterized
paths arriving at try_nestloop_path (or try_partial_nestloop_path) are
parameterized by top parents at first.  Then our current code (without
this patch) applies reparameterize_path_by_child to the inner path
before calling create_nestloop_path().  So in create_nestloop_path() the
inner path is parameterized by child rel.  That's why we check against
outer rel itself not its top parent there.

With this patch, the reparameterize_path_by_child work is postponed
until createplan time, so in create_nestloop_path() the inner path is
still parameterized by top parent.  So we have to check against the top
parent of outer rel.

I think the query shown upthread is sufficient to verify this theory.

regression=# explain (costs off)
select * from prt1 t1 left join lateral
    (select t1.a as t1a, t2.* from prt1 t2) s on t1.a = s.a;
                       QUERY PLAN
---------------------------------------------------------
 Append
   ->  Nested Loop Left Join
         ->  Seq Scan on prt1_p1 t1_1
         ->  Index Scan using iprt1_p1_a on prt1_p1 t2_1
               Index Cond: (a = t1_1.a)
   ->  Nested Loop Left Join
         ->  Seq Scan on prt1_p2 t1_2
         ->  Index Scan using iprt1_p2_a on prt1_p2 t2_2
               Index Cond: (a = t1_2.a)
   ->  Nested Loop Left Join
         ->  Seq Scan on prt1_p3 t1_3
         ->  Index Scan using iprt1_p3_a on prt1_p3 t2_3
               Index Cond: (a = t1_3.a)
(13 rows)


> Please add this to the next commitfest.


Done here https://commitfest.postgresql.org/44/4477/

Thanks
Richard

Reply via email to