diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2024-04-15 15:07:47 +0200 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2024-04-15 15:07:47 +0200 |
commit | cee8db3f680b737b64d747530b48d30828cf4790 (patch) | |
tree | f45fbe7ffe98414d9e4e4b8348597f3bff73ca38 /src/backend/utils | |
parent | 9dfcac8e15acc3b4d4d5bc02383a56ccb07229fe (diff) | |
download | postgresql-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.c | 22 |
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 * |