• Tom Lane's avatar
    Check equality semantics for unique indexes on partitioned tables. · 501b0187
    Tom Lane authored
    We require the partition key to be a subset of the set of columns
    being made unique, so that physically-separate indexes on the different
    partitions are sufficient to enforce the uniqueness constraint.
    
    The existing code checked that the listed columns appear, but did not
    inquire into the index semantics, which is a serious oversight given
    that different index opclasses might enforce completely different
    notions of uniqueness.
    
    Ideally, perhaps, we'd just match the partition key opfamily to the
    index opfamily.  But hash partitioning uses hash opfamilies which we
    can't directly match to btree opfamilies.  Hence, look up the equality
    operator in each family, and accept if it's the same operator.  This
    should be okay in a fairly general sense, since the equality operator
    ought to precisely represent the opfamily's notion of uniqueness.
    
    A remaining weak spot is that we don't have a cross-index-AM notion of
    which opfamily member is "equality".  But we know which one to use for
    hash and btree AMs, and those are the only two that are relevant here
    at present.  (Any non-core AMs that know how to enforce equality are
    out of luck, for now.)
    
    Back-patch to v11 where this feature was introduced.
    
    Guancheng Luo, revised a bit by me
    
    Discussion: https://postgr.es/m/D9C3CEF7-04E8-47A1-8300-CA1DCD5ED40D@gmail.com
    501b0187
indexcmds.c 110 KB