From c21130a0c1818cc70c2b5f82c6deec40bbd01534 Mon Sep 17 00:00:00 2001
From: Ajin Cherian <ajinc@fast.au.fujitsu.com>
Date: Fri, 15 Apr 2022 11:17:39 -0400
Subject: [PATCH 3/3] Add optional constraint name to field IndexStmt

And keep the original index name field intact when renaming.

This appears to be the only way to trace back the original index name
before it was renamed to match the constraint name.  We need this
information in the ddl_deparse module.
---
 src/backend/commands/tablecmds.c   |  4 ++--
 src/backend/nodes/copyfuncs.c      |  1 +
 src/backend/nodes/equalfuncs.c     |  1 +
 src/backend/nodes/outfuncs.c       |  1 +
 src/backend/parser/parse_utilcmd.c | 16 ++++++++++++++--
 src/include/nodes/parsenodes.h     |  1 +
 6 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 90edd0b..af2c963 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -8692,7 +8692,7 @@ ATExecAddIndexConstraint(AlteredTableInfo *tab, Relation rel,
 
 	indexRel = index_open(index_oid, AccessShareLock);
 
-	indexName = pstrdup(RelationGetRelationName(indexRel));
+	indexName = stmt->idxname;
 
 	indexInfo = BuildIndexInfo(indexRel);
 
@@ -8707,7 +8707,7 @@ ATExecAddIndexConstraint(AlteredTableInfo *tab, Relation rel,
 	 * explicitly gives some other name for the constraint, rename the index
 	 * to match.
 	 */
-	constraintName = stmt->idxname;
+	constraintName = stmt->conname;
 	if (constraintName == NULL)
 		constraintName = indexName;
 	else if (strcmp(constraintName, indexName) != 0)
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 836f427..88254a5 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -4182,6 +4182,7 @@ _copyIndexStmt(const IndexStmt *from)
 	IndexStmt  *newnode = makeNode(IndexStmt);
 
 	COPY_STRING_FIELD(idxname);
+	COPY_STRING_FIELD(conname);
 	COPY_NODE_FIELD(relation);
 	COPY_STRING_FIELD(accessMethod);
 	COPY_STRING_FIELD(tableSpace);
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index e013c1b..888ab32 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -1740,6 +1740,7 @@ static bool
 _equalIndexStmt(const IndexStmt *a, const IndexStmt *b)
 {
 	COMPARE_STRING_FIELD(idxname);
+	COMPARE_STRING_FIELD(conname);
 	COMPARE_NODE_FIELD(relation);
 	COMPARE_STRING_FIELD(accessMethod);
 	COMPARE_STRING_FIELD(tableSpace);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index d5f5e76..a8dedc4 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -2909,6 +2909,7 @@ _outIndexStmt(StringInfo str, const IndexStmt *node)
 	WRITE_NODE_TYPE("INDEXSTMT");
 
 	WRITE_STRING_FIELD(idxname);
+	WRITE_STRING_FIELD(conname);
 	WRITE_NODE_FIELD(relation);
 	WRITE_STRING_FIELD(accessMethod);
 	WRITE_STRING_FIELD(tableSpace);
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 2826559..9139643 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -2128,6 +2128,10 @@ transformIndexConstraints(CreateStmtContext *cxt)
 				 */
 				if (priorindex->idxname == NULL)
 					priorindex->idxname = index->idxname;
+
+				if (priorindex->conname == NULL)
+					priorindex->conname = index->conname;
+
 				keep = false;
 				break;
 			}
@@ -2186,10 +2190,17 @@ transformIndexConstraint(Constraint *constraint, CreateStmtContext *cxt)
 	index->deferrable = constraint->deferrable;
 	index->initdeferred = constraint->initdeferred;
 
+	index->idxname = NULL; /* by default, DefineIndex will choose name */
+
 	if (constraint->conname != NULL)
-		index->idxname = pstrdup(constraint->conname);
+	{
+		index->conname = pstrdup(constraint->conname);
+
+		if (constraint->indexname == NULL)
+			index->idxname = pstrdup(constraint->conname);
+	}
 	else
-		index->idxname = NULL;	/* DefineIndex will choose name */
+		index->conname = NULL;
 
 	index->relation = cxt->relation;
 	index->accessMethod = constraint->access_method ? constraint->access_method : DEFAULT_INDEX_TYPE;
@@ -2384,6 +2395,7 @@ transformIndexConstraint(Constraint *constraint, CreateStmtContext *cxt)
 		relation_close(index_rel, NoLock);
 
 		index->indexOid = index_oid;
+		index->idxname = pstrdup(index_name);
 	}
 
 	/*
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index da02658..dba0ab4 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -3240,6 +3240,7 @@ typedef struct IndexStmt
 {
 	NodeTag		type;
 	char	   *idxname;		/* name of new index, or NULL for default */
+	char	   *conname;		/* corresponding constraint name, or NULL */
 	RangeVar   *relation;		/* relation to build index on */
 	char	   *accessMethod;	/* name of access method (eg. btree) */
 	char	   *tableSpace;		/* tablespace, or NULL for default */
-- 
1.8.3.1

