mirror of
https://github.com/postgres/postgres.git
synced 2025-11-18 02:02:55 +03:00
Fix replica identity check for MERGE.
When executing a MERGE, check that the target relation supports all actions mentioned in the MERGE command. Specifically, check that it has a REPLICA IDENTITY if it publishes updates or deletes and the MERGE command contains update or delete actions. Failing to do this can silently break replication. Author: Zhijie Hou <houzj.fnst@fujitsu.com> Reviewed-by: Ashutosh Bapat <ashutosh.bapat.oss@gmail.com> Reviewed-by: Dean Rasheed <dean.a.rasheed@gmail.com> Tested-by: Chao Li <li.evan.chao@gmail.com> Discussion: https://postgr.es/m/OS3PR01MB57180C87E43A679A730482DF94B62@OS3PR01MB5718.jpnprd01.prod.outlook.com Backpatch-through: 15
This commit is contained in:
@@ -1061,7 +1061,16 @@ CheckValidResultRel(ResultRelInfo *resultRelInfo, CmdType operation,
|
||||
{
|
||||
case RELKIND_RELATION:
|
||||
case RELKIND_PARTITIONED_TABLE:
|
||||
CheckCmdReplicaIdentity(resultRel, operation);
|
||||
|
||||
/*
|
||||
* For MERGE, check that the target relation supports each action.
|
||||
* For other operations, just check the operation itself.
|
||||
*/
|
||||
if (operation == CMD_MERGE)
|
||||
foreach_node(MergeAction, action, mergeActions)
|
||||
CheckCmdReplicaIdentity(resultRel, action->commandType);
|
||||
else
|
||||
CheckCmdReplicaIdentity(resultRel, operation);
|
||||
|
||||
/*
|
||||
* For INSERT ON CONFLICT DO UPDATE, additionally check that the
|
||||
|
||||
Reference in New Issue
Block a user