From 6359f65af7b7c294acf3ac4798d877670722d880 Mon Sep 17 00:00:00 2001 From: Zhijie Hou 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