aboutsummaryrefslogtreecommitdiff
path: root/contrib/postgres_fdw/postgres_fdw.c
diff options
context:
space:
mode:
authorTomas Vondra <tomas.vondra@postgresql.org>2021-02-18 00:02:00 +0100
committerTomas Vondra <tomas.vondra@postgresql.org>2021-02-18 00:03:45 +0100
commit927f453a941061e3d5884bab206581c34784e45b (patch)
treed959c78ac87ff1274b292e3f8a26f7a1eb7c1986 /contrib/postgres_fdw/postgres_fdw.c
parentc15283ff429bf318f161bf84768795843b22696d (diff)
downloadpostgresql-927f453a941061e3d5884bab206581c34784e45b.tar.gz
postgresql-927f453a941061e3d5884bab206581c34784e45b.zip
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
Diffstat (limited to 'contrib/postgres_fdw/postgres_fdw.c')
-rw-r--r--contrib/postgres_fdw/postgres_fdw.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c
index 368997d9d1f..35b48575c59 100644
--- a/contrib/postgres_fdw/postgres_fdw.c
+++ b/contrib/postgres_fdw/postgres_fdw.c
@@ -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);