From e871a4a991762ec5312239aa1a1e0ff918d6ce90 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Mon, 5 Feb 2024 19:05:34 +0100 Subject: [PATCH v2 2/2] ATTACH PARTITION: Don't let a UNIQUE constraint match a PRIMARY KEY --- src/backend/commands/tablecmds.c | 5 +++++ src/backend/utils/cache/lsyscache.c | 25 +++++++++++++++++++++++++ src/include/utils/lsyscache.h | 2 ++ 3 files changed, 32 insertions(+) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 02724d5f04..cd4687fb7f 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -19269,6 +19269,11 @@ AttachPartitionEnsureIndexes(List **wqueue, Relation rel, Relation attachrel) /* no dice */ if (!OidIsValid(cldConstrOid)) continue; + + /* Ensure they're both the same type of constraint */ + if (get_constraint_type(constraintOid) != + get_constraint_type(cldConstrOid)) + continue; } /* bingo. */ diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c index f730aa26c4..da737786ad 100644 --- a/src/backend/utils/cache/lsyscache.c +++ b/src/backend/utils/cache/lsyscache.c @@ -1132,6 +1132,31 @@ get_constraint_index(Oid conoid) return InvalidOid; } +/* + * get_constraint_type + * Return the pg_constraint.contype value for the given constraint. + * + * No frills. + */ +char +get_constraint_type(Oid conoid) +{ + HeapTuple tp; + + tp = SearchSysCache1(CONSTROID, ObjectIdGetDatum(conoid)); + if (HeapTupleIsValid(tp)) + { + Form_pg_constraint contup = (Form_pg_constraint) GETSTRUCT(tp); + char result; + + result = contup->contype; + ReleaseSysCache(tp); + return result; + } + + return '\0'; +} + /* ---------- LANGUAGE CACHE ---------- */ char * diff --git a/src/include/utils/lsyscache.h b/src/include/utils/lsyscache.h index e4a200b00e..fe694f5c4a 100644 --- a/src/include/utils/lsyscache.h +++ b/src/include/utils/lsyscache.h @@ -100,6 +100,8 @@ extern char *get_collation_name(Oid colloid); extern bool get_collation_isdeterministic(Oid colloid); extern char *get_constraint_name(Oid conoid); extern Oid get_constraint_index(Oid conoid); +extern char get_constraint_type(Oid conoid); + extern char *get_language_name(Oid langoid, bool missing_ok); extern Oid get_opclass_family(Oid opclass); extern Oid get_opclass_input_type(Oid opclass); -- 2.39.2