On Sun, Feb 15, 2026 at 3:20 AM Alexander Korotkov <aekorotkov@gmail.com> wrote:
Hi hackers,
I found it strange that ExecMergeMatched() checks for IsolationUsesXactSnapshot() in the TM_Deleted case, but not in the TM_Updated case. Indeed, EPQ works on the repeatable read isolation level!
s1# create table test (id int primary key, val int); s1# insert into test values (1,0);
s2# begin; s2# update test set val = val + 100;
s1# MERGE INTO test t USING (VALUES (1, 100)) AS s (id, inc) ON t.id = s.id WHEN MATCHED THEN UPDATE SET val = t.val + s.inc WHEN NOT MATCHED THEN INSERT (id, val) VALUES (s.id, s.inc); (waiting ...)
s2# commit;
s1# MERGE 1 s1# select * from test;
id | val ----+----- 1 | 200 (1 row)
Oh, sorry I missed the begin statement for s1. The complete case should look like this.
s1# create table test (id int primary key, val int);
s1# insert into test values (1,0);
s2# begin; s2# update test set val = val + 100;
s1# begin isolation level repeatable read; s1# MERGE INTO test t USING (VALUES (1, 100)) AS s (id, inc) ON t.id = s.id WHEN MATCHED THEN UPDATE SET val = t.val + s.inc WHEN NOT MATCHED THEN INSERT (id, val) VALUES (s.id, s.inc); (waiting ...)