aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2024-04-15 15:07:47 +0200
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2024-04-15 15:07:47 +0200
commitcee8db3f680b737b64d747530b48d30828cf4790 (patch)
treef45fbe7ffe98414d9e4e4b8348597f3bff73ca38 /src/backend/utils
parent9dfcac8e15acc3b4d4d5bc02383a56ccb07229fe (diff)
downloadpostgresql-cee8db3f680b737b64d747530b48d30828cf4790.tar.gz
postgresql-cee8db3f680b737b64d747530b48d30828cf4790.zip
ATTACH PARTITION: Don't match a PK with a UNIQUE constraint
When matching constraints in AttachPartitionEnsureIndexes() we weren't testing the constraint type, which could make a UNIQUE key lacking a not-null constraint incorrectly satisfy a primary key requirement. Fix this by testing that the constraint types match. (Other possible mismatches are verified by comparing index properties.) Discussion: https://postgr.es/m/202402051447.wimb4xmtiiyb@alvherre.pgsql
Diffstat (limited to 'src/backend/utils')
-rw-r--r--src/backend/utils/cache/lsyscache.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c
index 26368ffcc97..48a280d089b 100644
--- a/src/backend/utils/cache/lsyscache.c
+++ b/src/backend/utils/cache/lsyscache.c
@@ -1133,6 +1133,28 @@ 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;
+ char contype;
+
+ tp = SearchSysCache1(CONSTROID, ObjectIdGetDatum(conoid));
+ if (!HeapTupleIsValid(tp))
+ elog(ERROR, "cache lookup failed for constraint %u", conoid);
+
+ contype = ((Form_pg_constraint) GETSTRUCT(tp))->contype;
+ ReleaseSysCache(tp);
+
+ return contype;
+}
+
/* ---------- LANGUAGE CACHE ---------- */
char *