aboutsummaryrefslogtreecommitdiff
path: root/contrib/postgres_fdw/postgres_fdw.c
diff options
context:
space:
mode:
authorEtsuro Fujita <efujita@postgresql.org>2022-04-21 15:30:00 +0900
committerEtsuro Fujita <efujita@postgresql.org>2022-04-21 15:30:00 +0900
commit4eea2202beadbba67638bb129149abe5650aaaf6 (patch)
tree734aff3b848b6f83d6da7d75276f96464d2ee630 /contrib/postgres_fdw/postgres_fdw.c
parentba6af6aa0b764d76cfca79d9dfbddc7134a16bfc (diff)
downloadpostgresql-4eea2202beadbba67638bb129149abe5650aaaf6.tar.gz
postgresql-4eea2202beadbba67638bb129149abe5650aaaf6.zip
postgres_fdw: Disable batch insert when BEFORE ROW INSERT triggers exist.
Previously, we allowed this, but such triggers might query the table to insert into and act differently if the tuples that have already been processed and prepared for insertion are not there, so disable it in such cases. Back-patch to v14 where batch insert was added. Discussion: https://postgr.es/m/CAPmGK16_uPqsmgK0-LpLSUk54_BoK13bPrhxhfjSoSTVz414hA%40mail.gmail.com
Diffstat (limited to 'contrib/postgres_fdw/postgres_fdw.c')
-rw-r--r--contrib/postgres_fdw/postgres_fdw.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c
index c51dd687229..0e5771c89d8 100644
--- a/contrib/postgres_fdw/postgres_fdw.c
+++ b/contrib/postgres_fdw/postgres_fdw.c
@@ -2012,8 +2012,8 @@ postgresExecForeignBatchInsert(EState *estate,
* Determine the maximum number of tuples that can be inserted in bulk
*
* Returns the batch size specified for server or table. When batching is not
- * allowed (e.g. for tables with AFTER ROW triggers or with RETURNING clause),
- * returns 1.
+ * allowed (e.g. for tables with BEFORE/AFTER ROW triggers or with RETURNING
+ * clause), returns 1.
*/
static int
postgresGetForeignModifyBatchSize(ResultRelInfo *resultRelInfo)
@@ -2042,10 +2042,19 @@ postgresGetForeignModifyBatchSize(ResultRelInfo *resultRelInfo)
else
batch_size = get_batch_size_option(resultRelInfo->ri_RelationDesc);
- /* Disable batching when we have to use RETURNING. */
+ /*
+ * Disable batching when we have to use RETURNING or there are any
+ * BEFORE/AFTER ROW INSERT triggers on the foreign table.
+ *
+ * When there are any BEFORE ROW INSERT triggers on the table, we can't
+ * support it, because such triggers might query the table we're inserting
+ * into and act differently if the tuples that have already been processed
+ * and prepared for insertion are not there.
+ */
if (resultRelInfo->ri_projectReturning != NULL ||
(resultRelInfo->ri_TrigDesc &&
- resultRelInfo->ri_TrigDesc->trig_insert_after_row))
+ (resultRelInfo->ri_TrigDesc->trig_insert_before_row ||
+ resultRelInfo->ri_TrigDesc->trig_insert_after_row)))
return 1;
/*