From d68d5bca39a2a18e9c2cf5c5eb93889af872e086 Mon Sep 17 00:00:00 2001
From: "Zheng (Zane) Li" <zhelli@amazon.com>
Date: Fri, 2 Dec 2022 02:15:08 +0000
Subject: [PATCH v44 5/6] 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 74630a4518..0c6c7d90d9 100755
--- a/src/backend/commands/ddl_deparse.c
+++ b/src/backend/commands/ddl_deparse.c
@@ -3387,8 +3387,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 342a179133..ec54cb5bad 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 6a6d3293e4..87609a15e5 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -1974,6 +1974,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

