Check equality semantics for unique indexes on partitioned tables.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 1 Apr 2020 18:49:49 +0000 (14:49 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 1 Apr 2020 18:49:49 +0000 (14:49 -0400)
commit501b0187998c24d4a950459d9bf5e67f9f3e4a25
tree93ddff3ca7d2c9cdfabbe0f3500d1938b31aedf1
parenta80818605e5447b9b846590c3d3fab99060cb53e
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