aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/indexcmds.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/commands/indexcmds.c')
-rw-r--r--src/backend/commands/indexcmds.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index d54c78c3527..ab3d9a0a489 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -1995,6 +1995,12 @@ makeObjectName(const char *name1, const char *name2, const char *label)
* except that the label can't be NULL; digits will be appended to the label
* if needed to create a name that is unique within the specified namespace.
*
+ * If isconstraint is true, we also avoid choosing a name matching any
+ * existing constraint in the same namespace. (This is stricter than what
+ * Postgres itself requires, but the SQL standard says that constraint names
+ * should be unique within schemas, so we follow that for autogenerated
+ * constraint names.)
+ *
* Note: it is theoretically possible to get a collision anyway, if someone
* else chooses the same name concurrently. This is fairly unlikely to be
* a problem in practice, especially if one is holding an exclusive lock on
@@ -2006,7 +2012,8 @@ makeObjectName(const char *name1, const char *name2, const char *label)
*/
char *
ChooseRelationName(const char *name1, const char *name2,
- const char *label, Oid namespaceid)
+ const char *label, Oid namespaceid,
+ bool isconstraint)
{
int pass = 0;
char *relname = NULL;
@@ -2020,7 +2027,11 @@ ChooseRelationName(const char *name1, const char *name2,
relname = makeObjectName(name1, name2, modlabel);
if (!OidIsValid(get_relname_relid(relname, namespaceid)))
- break;
+ {
+ if (!isconstraint ||
+ !ConstraintNameExists(relname, namespaceid))
+ break;
+ }
/* found a conflict, so try a new name component */
pfree(relname);
@@ -2048,28 +2059,32 @@ ChooseIndexName(const char *tabname, Oid namespaceId,
indexname = ChooseRelationName(tabname,
NULL,
"pkey",
- namespaceId);
+ namespaceId,
+ true);
}
else if (exclusionOpNames != NIL)
{
indexname = ChooseRelationName(tabname,
ChooseIndexNameAddition(colnames),
"excl",
- namespaceId);
+ namespaceId,
+ true);
}
else if (isconstraint)
{
indexname = ChooseRelationName(tabname,
ChooseIndexNameAddition(colnames),
"key",
- namespaceId);
+ namespaceId,
+ true);
}
else
{
indexname = ChooseRelationName(tabname,
ChooseIndexNameAddition(colnames),
"idx",
- namespaceId);
+ namespaceId,
+ false);
}
return indexname;