mirror of
https://github.com/postgres/postgres.git
synced 2025-06-11 20:28:21 +03:00
Fix tuple routing to initialize batching only for inserts
A cross-partition update on a partitioned table is implemented as a delete followed by an insert. With foreign partitions, this was however causing issues, because the FDW and core may disagree on when to enable batching. postgres_fdw was only allowing batching for plain inserts (CMD_INSERT) while core was trying to batch the insert component of the cross-partition update. Fix by restricting core to apply batching only to plain CMD_INSERT queries. It's possible to allow batching for cross-partition updates, but that will require more extensive changes, so better to leave that for a separate patch. Author: Amit Langote Reviewed-by: Tomas Vondra, Takayuki Tsunakawa Discussion: https://postgr.es/m/20200628151002.7x5laxwpgvkyiu3q@development
This commit is contained in:
@ -1934,17 +1934,26 @@ static int
|
||||
postgresGetForeignModifyBatchSize(ResultRelInfo *resultRelInfo)
|
||||
{
|
||||
int batch_size;
|
||||
PgFdwModifyState *fmstate = resultRelInfo->ri_FdwState ?
|
||||
(PgFdwModifyState *) resultRelInfo->ri_FdwState :
|
||||
NULL;
|
||||
|
||||
/* 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.
|
||||
*/
|
||||
Assert(fmstate == NULL || fmstate->aux_fmstate == NULL);
|
||||
|
||||
/*
|
||||
* In EXPLAIN without ANALYZE, ri_fdwstate is NULL, so we have to lookup
|
||||
* the option directly in server/table options. Otherwise just use the
|
||||
* value we determined earlier.
|
||||
*/
|
||||
if (resultRelInfo->ri_FdwState)
|
||||
batch_size = ((PgFdwModifyState *) resultRelInfo->ri_FdwState)->batch_size;
|
||||
if (fmstate)
|
||||
batch_size = fmstate->batch_size;
|
||||
else
|
||||
batch_size = get_batch_size_option(resultRelInfo->ri_RelationDesc);
|
||||
|
||||
|
Reference in New Issue
Block a user