WRITE_NODE_FIELD(indextlist);
    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;
 
        /*
 
 
            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        predOK;         /* true if predicate matches query */
    bool        unique;         /* true if a unique index */
+   bool        immediate;      /* is uniqueness enforced immediately? */
    bool        hypothetical;   /* true if index doesn't really exist */
    bool        amcanorderbyop; /* does AM support order by operator result? */
    bool        amcanreturn;    /* can AM return IndexTuples? */