mirror of
https://github.com/postgres/postgres.git
synced 2025-10-18 04:29:09 +03:00
Don't throw serialization errors for self-conflicts in INSERT ON CONFLICT.
A transaction that conflicts against itself, for example INSERT INTO t(pk) VALUES (1),(1) ON CONFLICT DO NOTHING; should behave the same regardless of isolation level. It certainly shouldn't throw a serialization error, as retrying will not help. We got this wrong due to the ON CONFLICT logic not considering the case, as reported by Jason Dusek. Core of this patch is by Peter Geoghegan (based on an earlier patch by Thomas Munro), though I didn't take his proposed code refactoring for fear that it might have unexpected side-effects. Test cases by Thomas Munro and myself. Report: <CAO3NbwOycQjt2Oqy2VW-eLTq2M5uGMyHnGm=RNga4mjqcYD7gQ@mail.gmail.com> Related-Discussion: <57EE93C8.8080504@postgrespro.ru>
This commit is contained in:
34
src/test/isolation/specs/insert-conflict-do-nothing-2.spec
Normal file
34
src/test/isolation/specs/insert-conflict-do-nothing-2.spec
Normal file
@@ -0,0 +1,34 @@
|
||||
# INSERT...ON CONFLICT DO NOTHING test with multiple rows
|
||||
# in higher isolation levels
|
||||
|
||||
setup
|
||||
{
|
||||
CREATE TABLE ints (key int primary key, val text);
|
||||
}
|
||||
|
||||
teardown
|
||||
{
|
||||
DROP TABLE ints;
|
||||
}
|
||||
|
||||
session "s1"
|
||||
step "beginrr1" { BEGIN ISOLATION LEVEL REPEATABLE READ; }
|
||||
step "begins1" { BEGIN ISOLATION LEVEL SERIALIZABLE; }
|
||||
step "donothing1" { INSERT INTO ints(key, val) VALUES(1, 'donothing1') ON CONFLICT DO NOTHING; }
|
||||
step "c1" { COMMIT; }
|
||||
step "show" { SELECT * FROM ints; }
|
||||
|
||||
session "s2"
|
||||
step "beginrr2" { BEGIN ISOLATION LEVEL REPEATABLE READ; }
|
||||
step "begins2" { BEGIN ISOLATION LEVEL SERIALIZABLE; }
|
||||
step "donothing2" { INSERT INTO ints(key, val) VALUES(1, 'donothing2'), (1, 'donothing3') ON CONFLICT DO NOTHING; }
|
||||
step "c2" { COMMIT; }
|
||||
|
||||
permutation "beginrr1" "beginrr2" "donothing1" "c1" "donothing2" "c2" "show"
|
||||
permutation "beginrr1" "beginrr2" "donothing2" "c2" "donothing1" "c1" "show"
|
||||
permutation "beginrr1" "beginrr2" "donothing1" "donothing2" "c1" "c2" "show"
|
||||
permutation "beginrr1" "beginrr2" "donothing2" "donothing1" "c2" "c1" "show"
|
||||
permutation "begins1" "begins2" "donothing1" "c1" "donothing2" "c2" "show"
|
||||
permutation "begins1" "begins2" "donothing2" "c2" "donothing1" "c1" "show"
|
||||
permutation "begins1" "begins2" "donothing1" "donothing2" "c1" "c2" "show"
|
||||
permutation "begins1" "begins2" "donothing2" "donothing1" "c2" "c1" "show"
|
Reference in New Issue
Block a user