From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | pgsql-committers(at)postgresql(dot)org |
Subject: | pgsql: Don't throw serialization errors for self-conflicts in INSERT ON |
Date: | 2016-10-23 22:36:38 |
Message-ID: | E1byRNe-0007oX-Eg@gemulon.postgresql.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-committers |
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(at)mail(dot)gmail(dot)com>
Related-Discussion: <57EE93C8(dot)8080504(at)postgrespro(dot)ru>
Branch
------
REL9_6_STABLE
Details
-------
http://git.postgresql.org/pg/commitdiff/c4016fcb1fd2a20ef589a3a616b59381256a985a
Modified Files
--------------
src/backend/executor/nodeModifyTable.c | 13 ++-
.../expected/insert-conflict-do-nothing-2.out | 105 +++++++++++++++++++++
src/test/isolation/isolation_schedule | 1 +
.../specs/insert-conflict-do-nothing-2.spec | 34 +++++++
src/test/regress/expected/insert_conflict.out | 35 +++++++
src/test/regress/sql/insert_conflict.sql | 32 +++++++
6 files changed, 218 insertions(+), 2 deletions(-)
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2016-10-23 23:14:46 | pgsql: Avoid testing tuple visibility without buffer lock. |
Previous Message | Heikki Linnakangas | 2016-10-23 19:22:57 | Re: pgsql: Use OpenSSL EVP API for symmetric encryption in pgcrypto. |