]> granicus.if.org Git - postgresql/commit
Fix failure to handle conflicts in non-arbiter exclusion constraints.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 4 Jul 2016 20:09:11 +0000 (16:09 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 4 Jul 2016 20:09:11 +0000 (16:09 -0400)
commit9c810a2edccaffe0ff48b50d31c47a155e4f9815
tree62b834fa1bba35c137e555c757559fce72aa70d3
parent29a2195de645759d66ee7e77c4c05b2c4aeb6729
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@reaktor.fi>
src/backend/executor/execIndexing.c
src/test/regress/expected/insert_conflict.out
src/test/regress/sql/insert_conflict.sql