From a7b1569820252f8d5a51910550a1eedaa8632ab3 Mon Sep 17 00:00:00 2001 From: "tender.wang" Date: Fri, 27 Oct 2023 13:48:48 +0800 Subject: [PATCH v3 1/2] Fix partition detach issue. --- src/backend/commands/tablecmds.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 721d24783b..d5c6da04fb 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -19185,7 +19185,9 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, { ForeignKeyCacheInfo *fk = lfirst(cell); HeapTuple contup; + HeapTuple parentConTup; Form_pg_constraint conform; + Form_pg_constraint parentConForm; Constraint *fkconstraint; Oid insertTriggerOid, updateTriggerOid; @@ -19203,6 +19205,24 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, continue; } + /* For referenced-side, if it is partitioned table, each partition + * has one row in pg_constraint. But it doesn't have INSERT CHECK trigger + */ + Assert(OidIsValid(conform->conparentid)); + parentConTup = SearchSysCache1(CONSTROID, + ObjectIdGetDatum(conform->conparentid)); + if (!HeapTupleIsValid(parentConTup)) + elog(ERROR, "cache lookup failed for constraint %u", + conform->conparentid); + parentConForm = (Form_pg_constraint)GETSTRUCT(parentConTup); + if (parentConForm->confrelid != conform->confrelid && + parentConForm->conrelid == conform->conrelid) + { + ReleaseSysCache(contup); + ReleaseSysCache(parentConTup); + continue; + } + /* unset conparentid and adjust conislocal, coninhcount, etc. */ ConstraintSetParentConstraint(fk->conoid, InvalidOid, InvalidOid); @@ -19250,6 +19270,7 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, NULL, NULL); ReleaseSysCache(contup); + ReleaseSysCache(parentConTup); } list_free_deep(fks); if (trigrel) -- 2.34.1