diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index dc5872f988..19c924b7df 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -189,8 +189,8 @@ typedef struct AlteredTableInfo
 	List	   *changedConstraintDefs;	/* string definitions of same */
 	List	   *changedIndexOids;	/* OIDs of indexes to rebuild */
 	List	   *changedIndexDefs;	/* string definitions of same */
-	char	   *replicaIdentityIndex;	/* index to reset as REPLICA IDENTITY */
-	char	   *clusterOnIndex; /* index to use for CLUSTER */
+	Oid			replicaIdentityIndex;	/* index to reset as REPLICA IDENTITY */
+	Oid			clusterOnIndex; /* index to use for CLUSTER */
 	List	   *changedStatisticsOids;	/* OIDs of statistics to rebuild */
 	List	   *changedStatisticsDefs;	/* string definitions of same */
 } AlteredTableInfo;
@@ -12856,10 +12856,12 @@ RememberReplicaIdentityForRebuilding(Oid indoid, AlteredTableInfo *tab)
 	if (!get_index_isreplident(indoid))
 		return;
 
-	if (tab->replicaIdentityIndex)
+	/* We must de-duplicate multiple requests */
+	if (OidIsValid(tab->replicaIdentityIndex) &&
+		tab->replicaIdentityIndex != indoid)
 		elog(ERROR, "relation %u has multiple indexes marked as replica identity", tab->relid);
 
-	tab->replicaIdentityIndex = get_rel_name(indoid);
+	tab->replicaIdentityIndex = indoid;
 }
 
 /*
@@ -12871,10 +12873,12 @@ RememberClusterOnForRebuilding(Oid indoid, AlteredTableInfo *tab)
 	if (!get_index_isclustered(indoid))
 		return;
 
-	if (tab->clusterOnIndex)
+	/* We must de-duplicate multiple requests */
+	if (OidIsValid(tab->clusterOnIndex) &&
+		tab->clusterOnIndex != indoid)
 		elog(ERROR, "relation %u has multiple clustered indexes", tab->relid);
 
-	tab->clusterOnIndex = get_rel_name(indoid);
+	tab->clusterOnIndex = indoid;
 }
 
 /*
@@ -13117,13 +13121,15 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode)
 	/*
 	 * Queue up command to restore replica identity index marking
 	 */
-	if (tab->replicaIdentityIndex)
+	if (OidIsValid(tab->replicaIdentityIndex))
 	{
 		AlterTableCmd *cmd = makeNode(AlterTableCmd);
 		ReplicaIdentityStmt *subcmd = makeNode(ReplicaIdentityStmt);
 
 		subcmd->identity_type = REPLICA_IDENTITY_INDEX;
-		subcmd->name = tab->replicaIdentityIndex;
+		subcmd->name = get_rel_name(tab->replicaIdentityIndex);
+		Assert(subcmd->name);
+
 		cmd->subtype = AT_ReplicaIdentity;
 		cmd->def = (Node *) subcmd;
 
@@ -13135,12 +13141,13 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode)
 	/*
 	 * Queue up command to restore marking of index used for cluster.
 	 */
-	if (tab->clusterOnIndex)
+	if (OidIsValid(tab->clusterOnIndex))
 	{
 		AlterTableCmd *cmd = makeNode(AlterTableCmd);
 
 		cmd->subtype = AT_ClusterOn;
-		cmd->name = tab->clusterOnIndex;
+		cmd->name = get_rel_name(tab->clusterOnIndex);
+		Assert(cmd->name);
 
 		/* do it after indexes and constraints */
 		tab->subcmds[AT_PASS_OLD_CONSTR] =
diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out
index 16e0475663..bde3f14dfa 100644
--- a/src/test/regress/expected/alter_table.out
+++ b/src/test/regress/expected/alter_table.out
@@ -4584,3 +4584,16 @@ drop publication pub1;
 drop schema alter1 cascade;
 NOTICE:  drop cascades to table alter1.t1
 drop schema alter2 cascade;
+/* Test case for bug #17409 */
+create table atref (p1 int constraint pk_atref primary key);
+create table attbl (c1 int, constraint fk_atref foreign key (c1) references atref(p1));
+cluster atref using pk_atref;
+alter table atref alter column p1 set data type bigint;
+drop table attbl;
+drop table atref;
+create table atref (p1 int constraint pk_atref primary key);
+alter table atref replica identity using index pk_atref;
+create table attbl (c1 int, constraint fk_attbl foreign key (c1) references atref(p1));
+alter table atref alter column p1 set data type bigint;
+drop table attbl;
+drop table atref;
diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql
index ac894c0602..1cbcce490c 100644
--- a/src/test/regress/sql/alter_table.sql
+++ b/src/test/regress/sql/alter_table.sql
@@ -3013,3 +3013,19 @@ alter table alter1.t1 set schema alter2; -- should fail
 drop publication pub1;
 drop schema alter1 cascade;
 drop schema alter2 cascade;
+
+/* Test case for bug #17409 */
+
+create table atref (p1 int constraint pk_atref primary key);
+create table attbl (c1 int, constraint fk_atref foreign key (c1) references atref(p1));
+cluster atref using pk_atref;
+alter table atref alter column p1 set data type bigint;
+drop table attbl;
+drop table atref;
+
+create table atref (p1 int constraint pk_atref primary key);
+alter table atref replica identity using index pk_atref;
+create table attbl (c1 int, constraint fk_attbl foreign key (c1) references atref(p1));
+alter table atref alter column p1 set data type bigint;
+drop table attbl;
+drop table atref;
