pgsql: Fix failure to handle conflicts in non-arbiter exclusion constra

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)postgresql(dot)org
Subject: pgsql: Fix failure to handle conflicts in non-arbiter exclusion constra
Date: 2016-07-04 20:09:29
Message-ID: E1bKABN-00049Q-2O@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Fix failure to handle conflicts in non-arbiter exclusion constraints.

ExecInsertIndexTuples treated an exclusion constraint as subject to
noDupErr processing even when it was not listed in arbiterIndexes, and
would therefore not error out for a conflict in such a constraint, instead
returning it as an arbiter-index failure. That led to an infinite loop in
ExecInsert, since ExecCheckIndexConstraints ignored the index as-intended
and therefore didn't throw the expected error. To fix, make the exclusion
constraint code path use the same condition as the index_insert call does
to decide whether no-error-for-duplicates behavior is appropriate. While
at it, refactor a little bit to avoid unnecessary list_member_oid calls.
(That surely wouldn't save anything worth noticing, but I find the code
a bit clearer this way.)

Per bug report from Heikki Rauhala. Back-patch to 9.5 where ON CONFLICT
was introduced.

Report: <4C976D6B-76B4-434C-8052-D009F7B7AEDA(at)reaktor(dot)fi>

Branch
------
REL9_5_STABLE

Details
-------
http://git.postgresql.org/pg/commitdiff/31ce32ade428dd3ea11ea468f8bdd6492b991ed1

Modified Files
--------------
src/backend/executor/execIndexing.c | 19 ++++++++++++-------
src/test/regress/expected/insert_conflict.out | 23 +++++++++++++++++++++++
src/test/regress/sql/insert_conflict.sql | 14 ++++++++++++++
3 files changed, 49 insertions(+), 7 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Fujii Masao 2016-07-06 10:00:23 pgsql: Fix typo in comment.
Previous Message Tom Lane 2016-07-03 22:43:52 pgsql: Typo fix.