v3-0001-Fix-partition-detach-issue.patch
application/octet-stream
Filename: v3-0001-Fix-partition-detach-issue.patch
Type: application/octet-stream
Part: 0
Patch
Format: format-patch
Series: patch v3-0001
Subject: Fix partition detach issue.
| File | + | − |
|---|---|---|
| src/backend/commands/tablecmds.c | 21 | 0 |
From a7b1569820252f8d5a51910550a1eedaa8632ab3 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 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