Re: [POC] Fast COPY FROM command for the table with foreign partitions - Mailing list pgsql-hackers

From Andrey V. Lepikhov
Subject Re: [POC] Fast COPY FROM command for the table with foreign partitions
Date
Msg-id 27e119ab-70a4-a08a-deb2-d882e2ce9435@postgrespro.ru
Whole thread Raw
In response to Re: [POC] Fast COPY FROM command for the table with foreign partitions  (Alexey Kondratov <a.kondratov@postgrespro.ru>)
Responses Re: [POC] Fast COPY FROM command for the table with foreign partitions  (Alexey Kondratov <a.kondratov@postgrespro.ru>)
List pgsql-hackers
On 9/8/20 8:34 PM, Alexey Kondratov wrote:
> On 2020-09-08 17:00, Amit Langote wrote:
>> <a.kondratov@postgrespro.ru> wrote:
>>> On 2020-09-08 10:34, Amit Langote wrote:
>>> Another ambiguous part of the refactoring was in changing
>>> InitResultRelInfo() arguments:
>>>
>>> @@ -1278,6 +1280,7 @@ InitResultRelInfo(ResultRelInfo *resultRelInfo,
>>>                                   Relation resultRelationDesc,
>>>                                   Index resultRelationIndex,
>>>                                   Relation partition_root,
>>> +                                 bool use_multi_insert,
>>>                                   int instrument_options)
>>>
>>> Why do we need to pass this use_multi_insert flag here? Would it be
>>> better to set resultRelInfo->ri_usesMultiInsert in the
>>> InitResultRelInfo() unconditionally like it is done for
>>> ri_usesFdwDirectModify? And after that it will be up to the caller
>>> whether to use multi-insert or not based on their own circumstances.
>>> Otherwise now we have a flag to indicate that we want to check for
>>> another flag, while this check doesn't look costly.
>>
>> Hmm, I think having two flags seems confusing and bug prone,
>> especially if you consider partitions.  For example, if a partition's
>> ri_usesMultiInsert is true, but CopyFrom()'s local flag is false, then
>> execPartition.c: ExecInitPartitionInfo() would wrongly perform
>> BeginForeignCopy() based on only ri_usesMultiInsert, because it
>> wouldn't know CopyFrom()'s local flag.  Am I missing something?
> 
> No, you're right. If someone want to share a state and use ResultRelInfo 
> (RRI) for that purpose, then it's fine, but CopyFrom() may simply 
> override RRI->ri_usesMultiInsert if needed and pass this RRI further.
> 
> This is how it's done for RRI->ri_usesFdwDirectModify. 
> InitResultRelInfo() initializes it to false and then 
> ExecInitModifyTable() changes the flag if needed.
> 
> Probably this is just a matter of personal choice, but for me the 
> current implementation with additional argument in InitResultRelInfo() 
> doesn't look completely right. Maybe because a caller now should pass an 
> additional argument (as false) even if it doesn't care about 
> ri_usesMultiInsert at all. It also adds additional complexity and feels 
> like abstractions leaking.
I didn't feel what the problem was and prepared a patch version 
according to Alexey's suggestion (see Alternate.patch).
This does not seem very convenient and will lead to errors in the 
future. So, I agree with Amit.

-- 
regards,
Andrey Lepikhov
Postgres Professional

Attachment

pgsql-hackers by date:

Previous
From: Tomas Vondra
Date:
Subject: Re: PATCH: logical_work_mem and logical streaming of large in-progress transactions
Next
From: Dilip Kumar
Date:
Subject: Re: PATCH: logical_work_mem and logical streaming of large in-progress transactions