mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-27 08:39:28 +08:00
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
This commit is contained in:
parent
f8003e07f9
commit
9418d79a76
@ -308,6 +308,12 @@ ExecInsert(ModifyTableState *mtstate,
|
||||
/* FDW might have changed tuple */
|
||||
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;
|
||||
}
|
||||
else
|
||||
@ -561,6 +567,8 @@ ExecDelete(ItemPointer tupleid,
|
||||
}
|
||||
else if (resultRelInfo->ri_FdwRoutine)
|
||||
{
|
||||
HeapTuple tuple;
|
||||
|
||||
/*
|
||||
* delete from foreign table: let the FDW do it
|
||||
*
|
||||
@ -579,6 +587,15 @@ ExecDelete(ItemPointer tupleid,
|
||||
|
||||
if (slot == NULL) /* "do nothing" */
|
||||
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
|
||||
{
|
||||
@ -838,6 +855,12 @@ ExecUpdate(ItemPointer tupleid,
|
||||
|
||||
/* FDW might have changed tuple */
|
||||
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
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user