WRITE_NODE_FIELD(indpred);
WRITE_BOOL_FIELD(predOK);
WRITE_BOOL_FIELD(unique);
+ WRITE_BOOL_FIELD(immediate);
WRITE_BOOL_FIELD(hypothetical);
}
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;
/*
ChangeVarNodes((Node *) info->indpred, 1, varno, 0);
info->predOK = false; /* set later in indxpath.c */
info->unique = index->indisunique;
+ info->immediate = index->indimmediate;
info->hypothetical = false;
/*
* 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)
* commonly the same as the exposed type of the variable argument,
* but can be different in binary-compatible-type cases.
* isunique: TRUE if we were able to match the var to a unique index,
- * implying its values are unique for this query.
+ * implying its values are unique for this query. (Caution: this
+ * should be trusted for statistical purposes only, since we do not
+ * check indimmediate.)
*
* Caller is responsible for doing ReleaseVariableStats() before exiting.
*/
bool amhasgetbitmap; /* does AM have amgetbitmap interface? */
/* added in 9.0.4: */
bool hypothetical; /* true if index doesn't really exist */
+ /* added in 9.0.6: */
+ bool immediate; /* is uniqueness enforced immediately? */
} IndexOptInfo;