Incorrect command tag row count for MERGE with a cross-partition update
Dean Rasheed <dean.a.rasheed@gmail.com>
From: Dean Rasheed <dean.a.rasheed@gmail.com>
To: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2023-02-20T15:56:27Z
Lists: pgsql-hackers
Attachments
- merge-cp-update-command-tag-fix.patch (text/x-patch) patch
Playing around with MERGE some more, I noticed that the command tag row count is wrong if it does a cross-partition update: CREATE TABLE target (a int, b int) PARTITION BY LIST (b); CREATE TABLE target_p1 PARTITION OF target FOR VALUES IN (1); CREATE TABLE target_p2 PARTITION OF target FOR VALUES IN (2); INSERT INTO target VALUES (1,1); MERGE INTO target t USING (VALUES (1)) v(a) ON t.a = v.a WHEN MATCHED THEN UPDATE SET b = 2; which returns "MERGE 2" when only 1 row was updated, because ExecUpdateAct() will update estate->es_processed for a cross-partition update (but not for a normal update), and then ExecMergeMatched() will update it again. I think the best fix is to have ExecMergeMatched() pass canSetTag = false to ExecUpdateAct(), so that ExecMergeMatched() takes responsibility for updating estate->es_processed in all cases. Regards, Dean
Commits
-
Fix MERGE command tag for cross-partition updates.
- 018af1cc1c80 15.3 landed
- 80a48e0f21c5 16.0 landed