pgsql: Fix self-referencing foreign keys with partitioned tables

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Fix self-referencing foreign keys with partitioned tables
Date: 2022-10-07 17:39:07
Message-ID: E1ogrJT-001LTb-0m@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Fix self-referencing foreign keys with partitioned tables

There are a number of bugs in this area. Two of them are fixed here,
namely:
1. get_relation_idx_constraint_oid does not restrict the type of
constraint that's returned, so with sufficient bad luck it can
return the OID of a foreign key constraint. This has the effect that
a primary key in a partition can end up as a child of a foreign key,
which makes no sense (it needs to be the child of the equivalent
primary key.)
Change the API contract so that only index-backed constraints are
returned, mimicking get_constraint_index().

2. Both CloneFkReferenced and CloneFkReferencing clone a
self-referencing foreign key, so the partition ends up with
a duplicate foreign key. Change the former function to ignore such
constraints.

Add some tests to verify that things are better now. (However, these
new tests show some additional misbehavior that will be fixed later --
namely that there's a constraint marked NOT VALID.)

Backpatch to 12, where these constraints are possible at all.

Author: Jehan-Guillaume de Rorthais <jgdr(at)dalibo(dot)com>
Discussion: https://postgr.es/m/20220603154232.1715b14c@karst

Branch
------
REL_13_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/7d520e68ea1e38a9f7ad1d04bd5f95d53eef6cd4

Modified Files
--------------
src/backend/catalog/pg_constraint.c | 13 ++++-
src/backend/commands/tablecmds.c | 13 +++++
src/test/regress/expected/foreign_key.out | 81 +++++++++++++++++++++++++++++++
src/test/regress/sql/foreign_key.sql | 55 +++++++++++++++++++++
4 files changed, 161 insertions(+), 1 deletion(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Peter Eisentraut 2022-10-07 17:55:17 Re: pgsql: Remove unnecessary uses of Abs()
Previous Message Tom Lane 2022-10-07 14:38:16 Re: pgsql: Remove unnecessary uses of Abs()