aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/nodeModifyTable.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2021-05-21 15:02:07 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2021-05-21 15:02:07 -0400
commit77e3204ecbf15ab5dfd295bbc66eeeec4d9ade19 (patch)
treed05a40262c896f41b3cc33712a002e54835b5c96 /src/backend/executor/nodeModifyTable.c
parentd18ee6f92d9a22b4fae57f515797b2196bf385c7 (diff)
downloadpostgresql-77e3204ecbf15ab5dfd295bbc66eeeec4d9ade19.tar.gz
postgresql-77e3204ecbf15ab5dfd295bbc66eeeec4d9ade19.zip
Fix usage of "tableoid" in GENERATED expressions.
We consider this supported (though I've got my doubts that it's a good idea, because tableoid is not immutable). However, several code paths failed to fill the field in soon enough, causing such a GENERATED expression to see zero or the wrong value. This occurred when ALTER TABLE adds a new GENERATED column to a table with existing rows, and during regular INSERT or UPDATE on a foreign table with GENERATED columns. Noted during investigation of a report from Vitaly Ustinov. Back-patch to v12 where GENERATED came in. Discussion: https://postgr.es/m/CAM_DEiWR2DPT6U4xb-Ehigozzd3n3G37ZB1+867zbsEVtYoJww@mail.gmail.com
Diffstat (limited to 'src/backend/executor/nodeModifyTable.c')
-rw-r--r--src/backend/executor/nodeModifyTable.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 2a01449f25a..c5d1c924322 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -438,6 +438,12 @@ ExecInsert(ModifyTableState *mtstate,
else if (resultRelInfo->ri_FdwRoutine)
{
/*
+ * GENERATED expressions might reference the tableoid column, so
+ * (re-)initialize tts_tableOid before evaluating them.
+ */
+ slot->tts_tableOid = RelationGetRelid(resultRelInfo->ri_RelationDesc);
+
+ /*
* Compute stored generated columns
*/
if (resultRelationDesc->rd_att->constr &&
@@ -458,7 +464,7 @@ ExecInsert(ModifyTableState *mtstate,
/*
* AFTER ROW Triggers or RETURNING expressions might reference the
* tableoid column, so (re-)initialize tts_tableOid before evaluating
- * them.
+ * them. (This covers the case where the FDW replaced the slot.)
*/
slot->tts_tableOid = RelationGetRelid(resultRelInfo->ri_RelationDesc);
}
@@ -467,8 +473,8 @@ ExecInsert(ModifyTableState *mtstate,
WCOKind wco_kind;
/*
- * Constraints might reference the tableoid column, so (re-)initialize
- * tts_tableOid before evaluating them.
+ * Constraints and GENERATED expressions might reference the tableoid
+ * column, so (re-)initialize tts_tableOid before evaluating them.
*/
slot->tts_tableOid = RelationGetRelid(resultRelationDesc);
@@ -1173,6 +1179,12 @@ ExecUpdate(ModifyTableState *mtstate,
else if (resultRelInfo->ri_FdwRoutine)
{
/*
+ * GENERATED expressions might reference the tableoid column, so
+ * (re-)initialize tts_tableOid before evaluating them.
+ */
+ slot->tts_tableOid = RelationGetRelid(resultRelInfo->ri_RelationDesc);
+
+ /*
* Compute stored generated columns
*/
if (resultRelationDesc->rd_att->constr &&
@@ -1193,7 +1205,7 @@ ExecUpdate(ModifyTableState *mtstate,
/*
* AFTER ROW Triggers or RETURNING expressions might reference the
* tableoid column, so (re-)initialize tts_tableOid before evaluating
- * them.
+ * them. (This covers the case where the FDW replaced the slot.)
*/
slot->tts_tableOid = RelationGetRelid(resultRelationDesc);
}
@@ -1204,8 +1216,8 @@ ExecUpdate(ModifyTableState *mtstate,
bool update_indexes;
/*
- * Constraints might reference the tableoid column, so (re-)initialize
- * tts_tableOid before evaluating them.
+ * Constraints and GENERATED expressions might reference the tableoid
+ * column, so (re-)initialize tts_tableOid before evaluating them.
*/
slot->tts_tableOid = RelationGetRelid(resultRelationDesc);