Re: postgres_fdw: Oddity in pushing down inherited UPDATE/DELETE joins to remote servers

From: Amit Langote <Langote_Amit_f8(at)lab(dot)ntt(dot)co(dot)jp>
To: Etsuro Fujita <fujita(dot)etsuro(at)lab(dot)ntt(dot)co(dot)jp>, Robert Haas <robertmhaas(at)gmail(dot)com>
Cc: Pg Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: postgres_fdw: Oddity in pushing down inherited UPDATE/DELETE joins to remote servers
Date: 2018-05-17 05:19:44
Message-ID: 5f8521d1-26e1-207d-7580-0f5a24b0592e@lab.ntt.co.jp
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 2018/05/17 12:30, Etsuro Fujita wrote:
> (2018/05/17 1:16), Robert Haas wrote:
>> Was it just good luck that this ever worked at all?  I mean:
>>
>> -        if (rti<  root->simple_rel_array_size&&
>> -            root->simple_rel_array[rti] != NULL)
>> +        if (rti<  subroot->simple_rel_array_size&&
>> +            subroot->simple_rel_array[rti] != NULL)
>>           {
>> -            RelOptInfo *resultRel = root->simple_rel_array[rti];
>> +            RelOptInfo *resultRel = subroot->simple_rel_array[rti];
>>
>>               fdwroutine = resultRel->fdwroutine;
>>           }
>>           else
>>           {
>> -            RangeTblEntry *rte = planner_rt_fetch(rti, root);
>> +            RangeTblEntry *rte = planner_rt_fetch(rti, subroot);
>>
>> ...an RTI is only meaningful relative to a particular PlannerInfo's
>> range table.  It can't be right to just take an RTI for one
>> PlannerInfo and look it up in some other PlannerInfo's range table.
>
> I think that can be right; because inheritance_planner generates the
> simple_rel_array and simple_rte_array for the parent PlannerInfo so that
> it allows us to do that.  This is the logic that that function creates the
> simple_rel_array for the parent PlannerInfo:
>
>         /*
>          * We need to collect all the RelOptInfos from all child plans into
>          * the main PlannerInfo, since setrefs.c will need them.  We use the
>          * last child's simple_rel_array (previous ones are too short), so we
>          * have to propagate forward the RelOptInfos that were already built
>          * in previous children.
>          */
>         Assert(subroot->simple_rel_array_size >= save_rel_array_size);
>         for (rti = 1; rti < save_rel_array_size; rti++)
>         {
>             RelOptInfo *brel = save_rel_array[rti];
>
>             if (brel)
>                 subroot->simple_rel_array[rti] = brel;
>         }

Looking at this for a bit, I wondered if this crash wouldn't have occurred
if the "propagation" had also considered join relations in addition to
simple relations. For example, if I changed inheritance_planner like the
attached (not proposing that we consider committing it), reported crash
doesn't occur. The fact that it's not currently that way means that
somebody thought that there is no point in keeping all of those joinrels
around until plan creation time. If that is so, is it a bit worrying that
a FDW function invoked from createplan.c may try to look for one?

Thanks,
Amit

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Amit Langote 2018-05-17 05:23:04 Re: Needless additional partition check in INSERT?
Previous Message David Rowley 2018-05-17 05:15:48 Re: Needless additional partition check in INSERT?