diff options
Diffstat (limited to 'src/backend/optimizer')
-rw-r--r-- | src/backend/optimizer/path/indxpath.c | 7 | ||||
-rw-r--r-- | src/backend/optimizer/util/plancat.c | 6 |
2 files changed, 10 insertions, 3 deletions
diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c index 940efb38b66..77df5a24ea2 100644 --- a/src/backend/optimizer/path/indxpath.c +++ b/src/backend/optimizer/path/indxpath.c @@ -2277,10 +2277,11 @@ relation_has_unique_index_for(PlannerInfo *root, RelOptInfo *rel, int c; /* - * If the index is not unique or if it's a partial index that doesn't - * match the query, it's useless here. + * If the index is not unique, or not immediately enforced, or if it's + * a partial index that doesn't match the query, it's useless here. */ - if (!ind->unique || (ind->indpred != NIL && !ind->predOK)) + if (!ind->unique || !ind->immediate || + (ind->indpred != NIL && !ind->predOK)) continue; /* diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index bb809522424..de629e93c9a 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -324,6 +324,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, info->predOK = false; /* set later in indxpath.c */ info->unique = index->indisunique; + info->immediate = index->indimmediate; info->hypothetical = false; /* @@ -1076,6 +1077,11 @@ join_selectivity(PlannerInfo *root, * Detect whether there is a unique index on the specified attribute * of the specified relation, thus allowing us to conclude that all * the (non-null) values of the attribute are distinct. + * + * This function does not check the index's indimmediate property, which + * means that uniqueness may transiently fail to hold intra-transaction. + * That's appropriate when we are making statistical estimates, but beware + * of using this for any correctness proofs. */ bool has_unique_index(RelOptInfo *rel, AttrNumber attno) |