mirror of
https://github.com/postgres/postgres.git
synced 2025-10-25 13:17:41 +03:00
Allow batching of inserts during cross-partition updates.
Commit927f453a9disallowed batching added by commitb663a4136to be used for the inserts performed as part of cross-partition updates of partitioned tables, mainly because the previous code in nodeModifyTable.c couldn't handle pending inserts into foreign-table partitions that are also UPDATE target partitions. But we don't have such a limitation anymore (cf. commitffbb7e65a), so let's allow for this by removing from execPartition.c the restriction added by commit927f453a9that batching is only allowed if the query command type is CMD_INSERT. In postgres_fdw, since commit86dc90056changed it to effectively disable cross-partition updates in the case where a foreign-table partition chosen to insert rows into is also an UPDATE target partition, allow batching in the case where a foreign-table partition chosen to do so is *not* also an UPDATE target partition. This is enabled by the "batch_size" option added by commitb663a4136, which is disabled by default. This patch also adjusts the test case added by commit927f453a9to confirm that the inserts performed as part of a cross-partition update of a partitioned table indeed uses batching. Amit Langote, reviewed and/or tested by Georgios Kokolatos, Zhihong Yu, Bharath Rupireddy, Hou Zhijie, Vignesh C, and me. Discussion: http://postgr.es/m/CA%2BHiwqH1Lz1yJmPs%3DaD-pzd_HLLynLHvq5iYeT9mB0bBV7oJ6w%40mail.gmail.com
This commit is contained in:
@@ -2017,16 +2017,16 @@ static int
|
||||
postgresGetForeignModifyBatchSize(ResultRelInfo *resultRelInfo)
|
||||
{
|
||||
int batch_size;
|
||||
PgFdwModifyState *fmstate = resultRelInfo->ri_FdwState ?
|
||||
(PgFdwModifyState *) resultRelInfo->ri_FdwState :
|
||||
NULL;
|
||||
PgFdwModifyState *fmstate = (PgFdwModifyState *) resultRelInfo->ri_FdwState;
|
||||
|
||||
/* should be called only once */
|
||||
Assert(resultRelInfo->ri_BatchSize == 0);
|
||||
|
||||
/*
|
||||
* Should never get called when the insert is being performed as part of a
|
||||
* row movement operation.
|
||||
* Should never get called when the insert is being performed on a table
|
||||
* that is also among the target relations of an UPDATE operation,
|
||||
* because postgresBeginForeignInsert() currently rejects such insert
|
||||
* attempts.
|
||||
*/
|
||||
Assert(fmstate == NULL || fmstate->aux_fmstate == NULL);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user