From 8cb464110747b43a323ce8b819882ed0265233de Mon Sep 17 00:00:00 2001
From: amit <amitlangote09@gmail.com>
Date: Wed, 30 Mar 2016 16:59:35 +0900
Subject: [PATCH] Perform constraint name uniqueness check for index constraints.

---
 src/backend/commands/indexcmds.c |   14 ++++++++++++++
 src/backend/commands/tablecmds.c |   13 +++++++++++++
 2 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index 13b04e6..4528378 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -23,6 +23,7 @@
 #include "catalog/index.h"
 #include "catalog/indexing.h"
 #include "catalog/pg_am.h"
+#include "catalog/pg_constraint_fn.h"
 #include "catalog/pg_opclass.h"
 #include "catalog/pg_opfamily.h"
 #include "catalog/pg_tablespace.h"
@@ -467,6 +468,19 @@ DefineIndex(Oid relationId,
 											stmt->excludeOpNames,
 											stmt->primary,
 											stmt->isconstraint);
+	/*
+	 * Prevent creation of the constraint entry with duplicate name further
+	 * down by index_create().
+	 */
+	else if (ConstraintNameIsUsed(CONSTRAINT_RELATION,
+							 RelationGetRelid(rel),
+							 RelationGetNamespace(rel),
+							 indexRelationName))
+		ereport(ERROR,
+				(errcode(ERRCODE_DUPLICATE_OBJECT),
+				 errmsg("constraint \"%s\" for relation \"%s\" already exists",
+						indexRelationName,
+						RelationGetRelationName(rel))));
 
 	/*
 	 * look up the access method, verify it can handle the requested features
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 96dc923..b519349 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -5983,6 +5983,19 @@ ATExecAddIndexConstraint(AlteredTableInfo *tab, Relation rel,
 	constraintName = stmt->idxname;
 	if (constraintName == NULL)
 		constraintName = indexName;
+	/*
+	 * Prevent creation of the constraint entry with duplicate name below
+	 * by index_constraint_create().
+	 */
+	else if (ConstraintNameIsUsed(CONSTRAINT_RELATION,
+							 RelationGetRelid(rel),
+							 RelationGetNamespace(rel),
+							 constraintName))
+		ereport(ERROR,
+				(errcode(ERRCODE_DUPLICATE_OBJECT),
+				 errmsg("constraint \"%s\" for relation \"%s\" already exists",
+						constraintName,
+						RelationGetRelationName(rel))));
 	else if (strcmp(constraintName, indexName) != 0)
 	{
 		ereport(NOTICE,
-- 
1.7.1

