Check equality semantics for unique indexes on partitioned tables.
authorTom Lane
Wed, 1 Apr 2020 18:49:49 +0000 (14:49 -0400)
committerTom Lane
Wed, 1 Apr 2020 18:49:49 +0000 (14:49 -0400)
commit76ddc88f4dde93154e3553546c7cffe97060a26c
tree6832f9f70cca0c2f13b9938ea57a7ea1dc404bd9
parent7054e12e0fb64d7c1573a0b55c01b23b6d5e15eb
Check equality semantics for unique indexes on partitioned tables.

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
src/backend/commands/indexcmds.c