v1-0001-simplify-gram.y-atop-of-your-patch_patch

application/octet-stream

Filename: v1-0001-simplify-gram.y-atop-of-your-patch_patch
Type: application/octet-stream
Part: 0
Message: RE: Skipping schema changes in publication
From 6359f65af7b7c294acf3ac4798d877670722d880 Mon Sep 17 00:00:00 2001
From: Zhijie Hou <houzj.fnst@fujitsu.com>
Date: Mon, 30 Mar 2026 12:55:55 +0800
Subject: [PATCH v1] simplify gram.y

---
 src/backend/parser/gram.y | 55 +++------------------------------------
 1 file changed, 4 insertions(+), 51 deletions(-)

diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 8ee83d62334..173702a7fd4 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -209,8 +209,6 @@ static void preprocess_pub_all_objtype_list(List *all_objects_list,
 											core_yyscan_t yyscanner);
 static void preprocess_pubobj_list(List *pubobjspec_list,
 								   core_yyscan_t yyscanner);
-static void preprocess_except_pubobj_list(List *pubexceptobjspec_list,
-										 core_yyscan_t yyscanner);
 static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 
 %}
@@ -11401,7 +11399,7 @@ pub_obj_list:	PublicationObjSpec
 	;
 
 opt_pub_except_clause:
-			EXCEPT '(' pub_except_obj_list ')'			{ $$ = $3; }
+			EXCEPT '(' TABLE pub_except_obj_list ')'			{ $$ = $4; }
 			| /*EMPTY*/									{ $$ = NIL; }
 		;
 
@@ -11410,7 +11408,6 @@ PublicationAllObjSpec:
 					{
 						$$ = makeNode(PublicationAllObjSpec);
 						$$->pubobjtype = PUBLICATION_ALL_TABLES;
-						preprocess_except_pubobj_list($3, yyscanner);
 						$$->except_tables = $3;
 						$$->location = @1;
 					}
@@ -11429,21 +11426,12 @@ pub_all_obj_type_list:	PublicationAllObjSpec
 	;
 
 PublicationExceptObjSpec:
-			 TABLE relation_expr
+			 relation_expr
 				{
 					$$ = makeNode(PublicationObjSpec);
 					$$->pubobjtype = PUBLICATIONOBJ_EXCEPT_TABLE;
 					$$->pubtable = makeNode(PublicationTable);
 					$$->pubtable->except = true;
-					$$->pubtable->relation = $2;
-					$$->location = @2;
-				}
-			 | relation_expr
-				{
-					$$ = makeNode(PublicationObjSpec);
-					$$->pubobjtype = PUBLICATIONOBJ_CONTINUATION;
-					$$->pubtable = makeNode(PublicationTable);
-					$$->pubtable->except = true;
 					$$->pubtable->relation = $1;
 					$$->location = @1;
 				}
@@ -11451,6 +11439,8 @@ PublicationExceptObjSpec:
 
 pub_except_obj_list: PublicationExceptObjSpec
 					{ $$ = list_make1($1); }
+			| pub_except_obj_list ',' TABLE PublicationExceptObjSpec
+					{ $$ = lappend($1, $4); }
 			| pub_except_obj_list ',' PublicationExceptObjSpec
 					{ $$ = lappend($1, $3); }
 	;
@@ -20776,43 +20766,6 @@ preprocess_pubobj_list(List *pubobjspec_list, core_yyscan_t yyscanner)
 	}
 }
 
-/*
- * Similar to preprocess_pubobj_list(), but used for the EXCEPT clause.
- */
-static void
-preprocess_except_pubobj_list(List *pubexceptobjspec_list,
-							  core_yyscan_t yyscanner)
-{
-	ListCell   *cell;
-	PublicationObjSpec *pubobj;
-	PublicationObjSpecType prevobjtype = PUBLICATIONOBJ_CONTINUATION;
-
-	if (!pubexceptobjspec_list)
-		return;
-
-	pubobj = (PublicationObjSpec *) linitial(pubexceptobjspec_list);
-
-	Assert(pubobj->pubobjtype == PUBLICATIONOBJ_EXCEPT_TABLE ||
-		   pubobj->pubobjtype == PUBLICATIONOBJ_CONTINUATION);
-
-	if (pubobj->pubobjtype == PUBLICATIONOBJ_CONTINUATION)
-		ereport(ERROR,
-				errcode(ERRCODE_SYNTAX_ERROR),
-				errmsg("invalid publication object list"),
-				errdetail("TABLE must be specified before a standalone table."),
-				parser_errposition(pubobj->location));
-
-	foreach(cell, pubexceptobjspec_list)
-	{
-		pubobj = (PublicationObjSpec *) lfirst(cell);
-
-		if (pubobj->pubobjtype == PUBLICATIONOBJ_CONTINUATION)
-			pubobj->pubobjtype = prevobjtype;
-
-		prevobjtype = pubobj->pubobjtype;
-	}
-}
-
 /*----------
  * Recursive view transformation
  *
-- 
2.53.0.windows.2