Currently, the check for exclusion constraints performs a sanity check
that's slightly too strict -- it assumes that a tuple will conflict with
itself. That is not always the case: the operator might be "<>", in
which case it's perfectly valid for the search for conflicts to not find
itself.

This patch simply removes that sanity check, and leaves a comment in
place.

Regards,
        Jeff Davis
*** a/src/backend/executor/execUtils.c
--- b/src/backend/executor/execUtils.c
***************
*** 1309,1323 **** retry:
  	index_endscan(index_scan);
  
  	/*
! 	 * We should have found our tuple in the index, unless we exited the loop
! 	 * early because of conflict.  Complain if not.
  	 */
- 	if (!found_self && !conflict)
- 		ereport(ERROR,
- 				(errcode(ERRCODE_INTERNAL_ERROR),
- 				 errmsg("failed to re-find tuple within index \"%s\"",
- 						RelationGetRelationName(index)),
- 		errhint("This may be because of a non-immutable index expression.")));
  
  	econtext->ecxt_scantuple = save_scantuple;
  
--- 1309,1320 ----
  	index_endscan(index_scan);
  
  	/*
! 	 * Ordinarily, at this point the search should have found the
! 	 * inserted tuple if there was no conflict. However, there are
! 	 * some cases where a tuple may not conflict with itself, and
! 	 * therefore would _not_ have found itself in this search -- for
! 	 * instance, if the operator is <>.
  	 */
  
  	econtext->ecxt_scantuple = save_scantuple;
  
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to