Skip to content
Snippets Groups Projects
Commit 9418d79a authored by Robert Haas's avatar Robert Haas
Browse files

When modifying a foreign table, initialize tableoid field properly.

Failure to do this can cause AFTER ROW triggers or RETURNING expressions
that reference this field to misbehave.

Etsuro Fujita, reviewed by Thom Brown
parent f8003e07
No related branches found
No related tags found
No related merge requests found
...@@ -308,6 +308,12 @@ ExecInsert(ModifyTableState *mtstate, ...@@ -308,6 +308,12 @@ ExecInsert(ModifyTableState *mtstate,
/* FDW might have changed tuple */ /* FDW might have changed tuple */
tuple = ExecMaterializeSlot(slot); tuple = ExecMaterializeSlot(slot);
/*
* AFTER ROW Triggers or RETURNING expressions might reference the
* tableoid column, so initialize t_tableOid before evaluating them.
*/
tuple->t_tableOid = RelationGetRelid(resultRelationDesc);
newId = InvalidOid; newId = InvalidOid;
} }
else else
...@@ -561,6 +567,8 @@ ExecDelete(ItemPointer tupleid, ...@@ -561,6 +567,8 @@ ExecDelete(ItemPointer tupleid,
} }
else if (resultRelInfo->ri_FdwRoutine) else if (resultRelInfo->ri_FdwRoutine)
{ {
HeapTuple tuple;
/* /*
* delete from foreign table: let the FDW do it * delete from foreign table: let the FDW do it
* *
...@@ -579,6 +587,15 @@ ExecDelete(ItemPointer tupleid, ...@@ -579,6 +587,15 @@ ExecDelete(ItemPointer tupleid,
if (slot == NULL) /* "do nothing" */ if (slot == NULL) /* "do nothing" */
return NULL; return NULL;
/*
* RETURNING expressions might reference the tableoid column, so
* initialize t_tableOid before evaluating them.
*/
if (slot->tts_isempty)
ExecStoreAllNullTuple(slot);
tuple = ExecMaterializeSlot(slot);
tuple->t_tableOid = RelationGetRelid(resultRelationDesc);
} }
else else
{ {
...@@ -838,6 +855,12 @@ ExecUpdate(ItemPointer tupleid, ...@@ -838,6 +855,12 @@ ExecUpdate(ItemPointer tupleid,
/* FDW might have changed tuple */ /* FDW might have changed tuple */
tuple = ExecMaterializeSlot(slot); tuple = ExecMaterializeSlot(slot);
/*
* AFTER ROW Triggers or RETURNING expressions might reference the
* tableoid column, so initialize t_tableOid before evaluating them.
*/
tuple->t_tableOid = RelationGetRelid(resultRelationDesc);
} }
else else
{ {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment