From ce92b29829742dd8a8e094cb9f680d62659f20da Mon Sep 17 00:00:00 2001 From: Tender Wang Date: Fri, 18 Sep 2026 10:00:25 +0800 Subject: [PATCH] Fix merge issue --- src/backend/executor/nodeModifyTable.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index 2632431ea05..fc993069d0e 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -3561,10 +3561,20 @@ lmerge_matched: errmsg("could not serialize access due to concurrent delete"))); /* - * If the tuple was already deleted, set matched to false to - * let caller handle it under NOT MATCHED [BY TARGET] clauses. + * If this was a MATCHED case, the source row still exists, so + * let the caller handle it under NOT MATCHED [BY TARGET] + * clauses. + * + * If this was originally a NOT MATCHED BY SOURCE case, leave + * matched true. Since neither a source row nor a target row + * now exists, there is no further action to execute. + * + * If this was originally MATCHED but a concurrent update had + * already changed it to NOT MATCHED BY SOURCE, matched is + * already false and should remain so. */ - *matched = false; + if (relaction->mas_action->matchKind == MERGE_WHEN_MATCHED) + *matched = false; goto out; case TM_Updated: -- 2.43.0