aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/executor/nodeModifyTable.c4
-rw-r--r--src/test/regress/expected/generated.out20
-rw-r--r--src/test/regress/sql/generated.sql15
3 files changed, 37 insertions, 2 deletions
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index f419c47065a..1ac65172e44 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -4141,12 +4141,12 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
}
/*
- * For INSERT and UPDATE, prepare to evaluate any generated columns.
+ * For INSERT/UPDATE/MERGE, prepare to evaluate any generated columns.
* We must do this now, even if we never insert or update any rows,
* because we have to fill resultRelInfo->ri_extraUpdatedCols for
* possible use by the trigger machinery.
*/
- if (operation == CMD_INSERT || operation == CMD_UPDATE)
+ if (operation == CMD_INSERT || operation == CMD_UPDATE || operation == CMD_MERGE)
ExecInitStoredGenerated(resultRelInfo, estate, operation);
}
diff --git a/src/test/regress/expected/generated.out b/src/test/regress/expected/generated.out
index 9867748c0f5..11940c851f2 100644
--- a/src/test/regress/expected/generated.out
+++ b/src/test/regress/expected/generated.out
@@ -192,6 +192,26 @@ SELECT * FROM gtest1 ORDER BY a;
3 | 6
(1 row)
+-- test MERGE
+CREATE TABLE gtestm (
+ id int PRIMARY KEY,
+ f1 int,
+ f2 int,
+ f3 int GENERATED ALWAYS AS (f1 * 2) STORED,
+ f4 int GENERATED ALWAYS AS (f2 * 2) STORED
+);
+INSERT INTO gtestm VALUES (1, 5, 100);
+MERGE INTO gtestm t USING (VALUES (1, 10), (2, 20)) v(id, f1) ON t.id = v.id
+ WHEN MATCHED THEN UPDATE SET f1 = v.f1
+ WHEN NOT MATCHED THEN INSERT VALUES (v.id, v.f1, 200);
+SELECT * FROM gtestm ORDER BY id;
+ id | f1 | f2 | f3 | f4
+----+----+-----+----+-----
+ 1 | 10 | 100 | 20 | 200
+ 2 | 20 | 200 | 40 | 400
+(2 rows)
+
+DROP TABLE gtestm;
-- views
CREATE VIEW gtest1v AS SELECT * FROM gtest1;
SELECT * FROM gtest1v;
diff --git a/src/test/regress/sql/generated.sql b/src/test/regress/sql/generated.sql
index 92d373b6384..87ec8421162 100644
--- a/src/test/regress/sql/generated.sql
+++ b/src/test/regress/sql/generated.sql
@@ -81,6 +81,21 @@ SELECT * FROM gtest1 ORDER BY a;
DELETE FROM gtest1 WHERE b = 2;
SELECT * FROM gtest1 ORDER BY a;
+-- test MERGE
+CREATE TABLE gtestm (
+ id int PRIMARY KEY,
+ f1 int,
+ f2 int,
+ f3 int GENERATED ALWAYS AS (f1 * 2) STORED,
+ f4 int GENERATED ALWAYS AS (f2 * 2) STORED
+);
+INSERT INTO gtestm VALUES (1, 5, 100);
+MERGE INTO gtestm t USING (VALUES (1, 10), (2, 20)) v(id, f1) ON t.id = v.id
+ WHEN MATCHED THEN UPDATE SET f1 = v.f1
+ WHEN NOT MATCHED THEN INSERT VALUES (v.id, v.f1, 200);
+SELECT * FROM gtestm ORDER BY id;
+DROP TABLE gtestm;
+
-- views
CREATE VIEW gtest1v AS SELECT * FROM gtest1;
SELECT * FROM gtest1v;