From f3cad6887230cc20f2b4e74ed9c9f25c2b47eda1 Mon Sep 17 00:00:00 2001 From: Sami Imseih Date: Fri, 17 Jan 2025 14:25:52 -0600 Subject: [PATCH v1 1/1] Fix DETACH PARTITION with foreign key referencing a parent partition --- src/backend/commands/tablecmds.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index d2420a9558..f2a14f0785 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -20009,18 +20009,32 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, { ForeignKeyCacheInfo *fk = lfirst(cell); HeapTuple contup; + HeapTuple contup_parent; Form_pg_constraint conform; + Form_pg_constraint conform_parent; Oid insertTriggerOid, updateTriggerOid; + Oid parentConRelid = InvalidOid; contup = SearchSysCache1(CONSTROID, ObjectIdGetDatum(fk->conoid)); if (!HeapTupleIsValid(contup)) elog(ERROR, "cache lookup failed for constraint %u", fk->conoid); conform = (Form_pg_constraint) GETSTRUCT(contup); + if (OidIsValid(conform->conparentid)) + { + contup_parent = SearchSysCache1(CONSTROID, ObjectIdGetDatum(conform->conparentid)); + if (!HeapTupleIsValid(contup_parent)) + elog(ERROR, "cache lookup failed for constraint %u", conform->conparentid); + conform_parent = (Form_pg_constraint) GETSTRUCT(contup_parent); + parentConRelid = conform_parent->conrelid; + ReleaseSysCache(contup_parent); + } + /* consider only the inherited foreign keys */ if (conform->contype != CONSTRAINT_FOREIGN || - !OidIsValid(conform->conparentid)) + !OidIsValid(conform->conparentid) || + (conform->conrelid == parentConRelid)) { ReleaseSysCache(contup); continue; -- 2.39.5 (Apple Git-154)