pgsql: Don't throw serialization errors for self-conflicts in INSERT ON - Mailing list pgsql-committers

From Tom Lane
Subject pgsql: Don't throw serialization errors for self-conflicts in INSERT ON
Date
Msg-id E1byRNe-0007oY-Eo@gemulon.postgresql.org
Whole thread Raw
List 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@mail.gmail.com>
Related-Discussion: <57EE93C8.8080504@postgrespro.ru>

Branch
------
REL9_5_STABLE

Details
-------
http://git.postgresql.org/pg/commitdiff/65d85b8f9dc3768b3b5bf59187620e9c7cafcb47

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(-)


pgsql-committers by date:

Previous
From: Tom Lane
Date:
Subject: pgsql: Don't throw serialization errors for self-conflicts in INSERT ON
Next
From: Tom Lane
Date:
Subject: pgsql: Avoid testing tuple visibility without buffer lock.