v2-0001-Fix-partition-detach-issue.patch

application/x-patch

Filename: v2-0001-Fix-partition-detach-issue.patch
Type: application/x-patch
Part: 0
Message: Re: [BUG] Fix DETACH with FK pointing to a partitioned table fails

Patch

Format: format-patch
Series: patch v2-0001
Subject: Fix partition detach issue.
File+
src/backend/commands/tablecmds.c 21 0
From 24491419ad65871e54207d3ef481d8abe529e1e1 Mon Sep 17 00:00:00 2001
From: "tender.wang" <tender.wang@openpie.com>
Date: Fri, 27 Oct 2023 13:48:48 +0800
Subject: [PATCH v2] 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 416a98e7ce..3b897b620a 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -19356,7 +19356,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;
@@ -19374,6 +19376,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);
 
@@ -19421,6 +19441,7 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent,
 									   NULL, NULL);
 
 		ReleaseSysCache(contup);
+		ReleaseSysCache(parentConTup);
 	}
 	list_free_deep(fks);
 	if (trigrel)
-- 
2.25.1