summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Freund2015-05-08 20:22:05 +0000
committerAndres Freund2015-05-08 20:28:23 +0000
commitbab64ef9e8bc56fa5db9bd41cefb54c3d8051dbe (patch)
treed7286cb2add3c11f3854a846746f8a0474ba9f9a
parentde7688442f5aaa03da60416a6aa3474738718803 (diff)
Fix two problems in infer_arbiter_indexes().
The first is a pretty simple bug where a relcache entry is used after the relation is closed. In this particular situation it does not appear to have bad consequences unless compiled with RELCACHE_FORCE_RELEASE. The second is that infer_arbiter_indexes() skipped indexes that aren't yet valid according to indcheckxmin. That's not required here, because uniqueness checks don't care about visibility according to an older snapshot. While thats not really a bug, it makes things undesirably non-deterministic. There is some hope that this explains a test failure on buildfarm member jaguarundi. Discussion: [email protected]
-rw-r--r--src/backend/optimizer/util/plancat.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c
index 8bcc5064a37..894e0db802d 100644
--- a/src/backend/optimizer/util/plancat.c
+++ b/src/backend/optimizer/util/plancat.c
@@ -547,13 +547,11 @@ infer_arbiter_indexes(PlannerInfo *root)
goto next;
/*
- * If the index is valid, but cannot yet be used, ignore it. See
- * src/backend/access/heap/README.HOT for discussion.
+ * Note that we do not perform a check against indcheckxmin (like
+ * e.g. get_relation_info()) here to eliminate candidates, because
+ * uniqueness checking only cares about the most recently committed
+ * tuple versions.
*/
- if (idxForm->indcheckxmin &&
- !TransactionIdPrecedes(HeapTupleHeaderGetXmin(idxRel->rd_indextuple->t_data),
- TransactionXmin))
- goto next;
/*
* Look for match on "ON constraint_name" variant, which may not be
@@ -566,10 +564,10 @@ infer_arbiter_indexes(PlannerInfo *root)
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
errmsg("ON CONFLICT DO UPDATE not supported with exclusion constraints")));
+ candidates = lappend_oid(candidates, idxForm->indexrelid);
list_free(indexList);
index_close(idxRel, NoLock);
heap_close(relation, NoLock);
- candidates = lappend_oid(candidates, idxForm->indexrelid);
return candidates;
}
else if (indexOidFromConstraint != InvalidOid)