File tree Expand file tree Collapse file tree 3 files changed +53
-4
lines changed Expand file tree Collapse file tree 3 files changed +53
-4
lines changed Original file line number Diff line number Diff line change @@ -9868,6 +9868,34 @@ SELECT COUNT(*) FROM ftable;
9868
9868
2
9869
9869
(1 row)
9870
9870
9871
+ -- Disable batch inserting into foreign tables with BEFORE ROW INSERT triggers
9872
+ -- even if the batch_size option is enabled.
9873
+ ALTER FOREIGN TABLE ftable OPTIONS ( SET batch_size '10' );
9874
+ CREATE TRIGGER trig_row_before BEFORE INSERT ON ftable
9875
+ FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
9876
+ EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO ftable VALUES (3), (4);
9877
+ QUERY PLAN
9878
+ -------------------------------------------------------------
9879
+ Insert on public.ftable
9880
+ Remote SQL: INSERT INTO public.batch_table(x) VALUES ($1)
9881
+ Batch Size: 1
9882
+ -> Values Scan on "*VALUES*"
9883
+ Output: "*VALUES*".column1
9884
+ (5 rows)
9885
+
9886
+ INSERT INTO ftable VALUES (3), (4);
9887
+ NOTICE: trig_row_before(23, skidoo) BEFORE ROW INSERT ON ftable
9888
+ NOTICE: NEW: (3)
9889
+ NOTICE: trig_row_before(23, skidoo) BEFORE ROW INSERT ON ftable
9890
+ NOTICE: NEW: (4)
9891
+ SELECT COUNT(*) FROM ftable;
9892
+ count
9893
+ -------
9894
+ 4
9895
+ (1 row)
9896
+
9897
+ -- Clean up
9898
+ DROP TRIGGER trig_row_before ON ftable;
9871
9899
DROP FOREIGN TABLE ftable;
9872
9900
DROP TABLE batch_table;
9873
9901
-- Use partitioning
Original file line number Diff line number Diff line change @@ -2012,8 +2012,8 @@ postgresExecForeignBatchInsert(EState *estate,
2012
2012
* Determine the maximum number of tuples that can be inserted in bulk
2013
2013
*
2014
2014
* Returns the batch size specified for server or table. When batching is not
2015
- * allowed (e.g. for tables with AFTER ROW triggers or with RETURNING clause),
2016
- * returns 1.
2015
+ * allowed (e.g. for tables with BEFORE/ AFTER ROW triggers or with RETURNING
2016
+ * clause), returns 1.
2017
2017
*/
2018
2018
static int
2019
2019
postgresGetForeignModifyBatchSize (ResultRelInfo * resultRelInfo )
@@ -2042,10 +2042,19 @@ postgresGetForeignModifyBatchSize(ResultRelInfo *resultRelInfo)
2042
2042
else
2043
2043
batch_size = get_batch_size_option (resultRelInfo -> ri_RelationDesc );
2044
2044
2045
- /* Disable batching when we have to use RETURNING. */
2045
+ /*
2046
+ * Disable batching when we have to use RETURNING or there are any
2047
+ * BEFORE/AFTER ROW INSERT triggers on the foreign table.
2048
+ *
2049
+ * When there are any BEFORE ROW INSERT triggers on the table, we can't
2050
+ * support it, because such triggers might query the table we're inserting
2051
+ * into and act differently if the tuples that have already been processed
2052
+ * and prepared for insertion are not there.
2053
+ */
2046
2054
if (resultRelInfo -> ri_projectReturning != NULL ||
2047
2055
(resultRelInfo -> ri_TrigDesc &&
2048
- resultRelInfo -> ri_TrigDesc -> trig_insert_after_row ))
2056
+ (resultRelInfo -> ri_TrigDesc -> trig_insert_before_row ||
2057
+ resultRelInfo -> ri_TrigDesc -> trig_insert_after_row )))
2049
2058
return 1 ;
2050
2059
2051
2060
/*
Original file line number Diff line number Diff line change @@ -3083,6 +3083,18 @@ CREATE FOREIGN TABLE ftable ( x int ) SERVER loopback OPTIONS ( table_name 'batc
3083
3083
EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO ftable VALUES (1 ), (2 );
3084
3084
INSERT INTO ftable VALUES (1 ), (2 );
3085
3085
SELECT COUNT (* ) FROM ftable;
3086
+
3087
+ -- Disable batch inserting into foreign tables with BEFORE ROW INSERT triggers
3088
+ -- even if the batch_size option is enabled.
3089
+ ALTER FOREIGN TABLE ftable OPTIONS ( SET batch_size ' 10' );
3090
+ CREATE TRIGGER trig_row_before BEFORE INSERT ON ftable
3091
+ FOR EACH ROW EXECUTE PROCEDURE trigger_data(23 ,' skidoo' );
3092
+ EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO ftable VALUES (3 ), (4 );
3093
+ INSERT INTO ftable VALUES (3 ), (4 );
3094
+ SELECT COUNT (* ) FROM ftable;
3095
+
3096
+ -- Clean up
3097
+ DROP TRIGGER trig_row_before ON ftable;
3086
3098
DROP FOREIGN TABLE ftable;
3087
3099
DROP TABLE batch_table;
3088
3100
You can’t perform that action at this time.
0 commit comments