Re: Foreign join pushdown vs EvalPlanQual - Mailing list pgsql-hackers

From Etsuro Fujita
Subject Re: Foreign join pushdown vs EvalPlanQual
Date
Msg-id 562706EB.3030901@lab.ntt.co.jp
Whole thread Raw
In response to Re: Foreign join pushdown vs EvalPlanQual  (Etsuro Fujita <fujita.etsuro@lab.ntt.co.jp>)
Responses Re: Foreign join pushdown vs EvalPlanQual
List pgsql-hackers
On 2015/10/20 13:11, Etsuro Fujita wrote:
> On 2015/10/20 5:34, Robert Haas wrote:
>> On Mon, Oct 19, 2015 at 3:45 AM, Etsuro Fujita
>> <fujita.etsuro@lab.ntt.co.jp> wrote:
>>> As Tom mentioned, just recomputing the original join tuple is not good
>>> enough.  We would need to rejoin the test tuples for the baserels
>>> even if
>>> ROW_MARK_COPY is in use.  Consider:
>>>
>>> A=# BEGIN;
>>> A=# UPDATE t SET a = a + 1 WHERE b = 1;
>>> B=# SELECT * from t, ft1, ft2
>>>       WHERE t.a = ft1.a AND t.b = ft2.b AND ft1.c = ft2.c FOR UPDATE;
>>> A=# COMMIT;
>>>
>>> where the plan for the SELECT FOR UPDATE is
>>>
>>> LockRows
>>> -> Nested Loop
>>>     -> Seq Scan on t
>>>     -> Foreign Scan on <ft1, ft2>
>>>          Remote SQL: SELECT * FROM ft1 JOIN ft2 WHERE ft1.c = ft2.c
>>> AND ft1.a
>>> = $1 AND ft2.b = $2
>>>
>>> If an EPQ recheck is invoked by the A's UPDATE, just recomputing the
>>> original join tuple from the whole-row image that you proposed would
>>> output
>>> an incorrect result in the EQP recheck since the value a in the updated
>>> version of a to-be-joined tuple in t would no longer match the value
>>> ft1.a
>>> extracted from the whole-row image if the A's UPDATE has committed
>>> successfully.  So I think we would need to rejoin the tuples
>>> populated from
>>> the whole-row images for the baserels ft1 and ft2, by executing the
>>> secondary plan with the new parameter values for a and b.

>> No.  You just need to populate fdw_recheck_quals correctly, same as
>> for the scan case.

> Yeah, I think we can probably do that for the case where a pushed-down
> join clause is an inner-join one, but I'm not sure that we can do that
> for the case where that clause is an outer-join one.  Maybe I'm missing
> something, though.

As I said yesterday, that opinion of me is completely wrong.  Sorry for 
the incorrectness.  Let me explain a little bit more.  I still think 
that even if ROW_MARK_COPY is in use, we would need to locally rejoin 
the tuples populated from the whole-row images for the foreign tables 
involved in a remote join, using a secondary plan.  Consider eg,

SELECT localtab.*, ft2 from localtab, ft1, ft2 WHERE ft1.x = ft2.x AND ft1.y = localtab.y FOR UPDATE

In this case, since the output of the foreign join would not include any 
ft1 columns, I don't think we could do the same thing as for the scan 
case, even if populating fdw_recheck_quals correctly.  And I think we 
would need to rejoin the tuples, using a local join execution plan, 
which would have the parameterization for the to-be-pushed-down clause 
ft1.y = localtab.y.  I'm still missing something, though.

Best regards,
Etsuro Fujita




pgsql-hackers by date:

Previous
From: Etsuro Fujita
Date:
Subject: Re: Typos in plannodes.h
Next
From: Haribabu Kommi
Date:
Subject: Re: Multi-tenancy with RLS