From 0cb64c56692269470c9a165b2de90c8cc86907af Mon Sep 17 00:00:00 2001
From: Ajin Cherian <ajinc@fast.au.fujitsu.com>
Date: Mon, 12 Dec 2022 04:29:37 -0500
Subject: [PATCH v52 5/7] Skip ALTER TABLE subcommands generated for
 TableLikeClause in the DDL deparser to avoid duplicated subcommands.

---
 src/backend/commands/ddl_deparse.c | 10 ++++++++++
 src/backend/parser/parse_utilcmd.c |  1 +
 src/include/nodes/parsenodes.h     |  1 +
 3 files changed, 12 insertions(+)

diff --git a/src/backend/commands/ddl_deparse.c b/src/backend/commands/ddl_deparse.c
index 03b5875df2..aa04cce019 100755
--- a/src/backend/commands/ddl_deparse.c
+++ b/src/backend/commands/ddl_deparse.c
@@ -3281,8 +3281,18 @@ deparse_AlterRelation(CollectedCommand *cmd)
 	bool		istable = false;
 	List	   *exprs = NIL;
 	Oid			relId = cmd->d.alterTable.objectId;
+	AlterTableStmt *stmt = NULL;
 
 	Assert(cmd->type == SCT_AlterTable);
+	stmt = (AlterTableStmt *) cmd->parsetree;
+	Assert(IsA(stmt, AlterTableStmt));
+
+	/*
+	 * ALTER TABLE subcommands generated for TableLikeClause is processed in
+	 * the top level CREATE TABLE command; return empty here.
+	 */
+	if (stmt->table_like)
+		return NULL;
 
 	rel = relation_open(relId, AccessShareLock);
 	dpcontext = deparse_context_for(RelationGetRelationName(rel),
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index f743cd548c..16967468b8 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -1397,6 +1397,7 @@ expandTableLikeClause(RangeVar *heapRel, TableLikeClause *table_like_clause)
 		atcmd->cmds = atsubcmds;
 		atcmd->objtype = OBJECT_TABLE;
 		atcmd->missing_ok = false;
+		atcmd->table_like = true;
 		result = lcons(atcmd, result);
 	}
 
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 34bc640ff2..263c0e27c2 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -1973,6 +1973,7 @@ typedef struct AlterTableStmt
 	List	   *cmds;			/* list of subcommands */
 	ObjectType	objtype;		/* type of object */
 	bool		missing_ok;		/* skip error if table missing */
+	bool        table_like;		/* internally generated for TableLikeClause */
 } AlterTableStmt;
 
 typedef enum AlterTableType
-- 
2.34.1

