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-00049P-2L@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
------
master
Details
-------
http://git.postgresql.org/pg/commitdiff/9c810a2edccaffe0ff48b50d31c47a155e4f9815
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(-)
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. |