From 2e968f7a483fa8f535ffaa6ada37735aefad363f Mon Sep 17 00:00:00 2001 From: Vignesh C Date: Mon, 27 Sep 2021 09:50:29 +0530 Subject: [PATCH v33 6/6] Alternate grammar for "ALL TABLES IN SCHEMA" Alternate grammar for "ALL TABLES IN SCHEMA" --- src/backend/commands/publicationcmds.c | 8 +-- src/backend/nodes/copyfuncs.c | 3 +- src/backend/nodes/equalfuncs.c | 3 +- src/backend/parser/gram.y | 90 ++++++++++++-------------- src/include/nodes/parsenodes.h | 5 +- 5 files changed, 52 insertions(+), 57 deletions(-) diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c index c59cd5ad49..5094b4b607 100644 --- a/src/backend/commands/publicationcmds.c +++ b/src/backend/commands/publicationcmds.c @@ -161,14 +161,12 @@ ObjectsInPublicationToOids(List *pubobjspec_list, ParseState *pstate, { pubobj = (PublicationObjSpec *) lfirst(cell); if (pubobj->pubobjtype == PUBLICATIONOBJ_TABLE) - *rels = lappend(*rels, pubobj->object); + *rels = lappend(*rels, pubobj->rangevar); else if (pubobj->pubobjtype == PUBLICATIONOBJ_REL_IN_SCHEMA) { Oid schemaid; - char *schemaname; - schemaname = strVal(pubobj->object); - if (strcmp(schemaname, "CURRENT_SCHEMA") == 0) + if (strcmp(pubobj->name, "CURRENT_SCHEMA") == 0) { List *search_path; @@ -182,7 +180,7 @@ ObjectsInPublicationToOids(List *pubobjspec_list, ParseState *pstate, list_free(search_path); } else - schemaid = get_namespace_oid(schemaname, false); + schemaid = get_namespace_oid(pubobj->name, false); /* Filter out duplicates if user specifies "sch1, sch1" */ *schemas = list_append_unique_oid(*schemas, schemaid); diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index ade93023b8..553cd834e6 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -4964,7 +4964,8 @@ _copyPublicationObject(const PublicationObjSpec *from) PublicationObjSpec *newnode = makeNode(PublicationObjSpec); COPY_SCALAR_FIELD(pubobjtype); - COPY_NODE_FIELD(object); + COPY_STRING_FIELD(name); + COPY_NODE_FIELD(rangevar); COPY_LOCATION_FIELD(location); return newnode; diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 1dcd63d64f..054b2d94e5 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -3137,7 +3137,8 @@ static bool _equalPublicationObject(const PublicationObjSpec *a, const PublicationObjSpec *b) { - COMPARE_NODE_FIELD(object); + COMPARE_STRING_FIELD(name); + COMPARE_NODE_FIELD(rangevar); return true; } diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index ed6a4ffd9b..55eb74eaf3 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -561,8 +561,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type auth_ident RoleSpec opt_granted_by %type PublicationObjSpec -%type pubobj_expr -%type pubobj_name %type unreserved_keyword type_func_name_keyword %type col_name_keyword reserved_keyword %type bare_label_keyword @@ -9640,59 +9638,57 @@ CreatePublicationStmt: } ; -pubobj_expr: - pubobj_name +/* FOR TABLE and FOR ALL TABLES IN SCHEMA specifications */ +PublicationObjSpec: + TABLE relation_expr { $$ = makeNode(PublicationObjSpec); - $$->object = $1; - $$->location = @1; + $$->pubobjtype = PUBLICATIONOBJ_TABLE; + $$->rangevar = $2; } - | extended_relation_expr + | ALL TABLES IN_P SCHEMA ColId + { + $$ = makeNode(PublicationObjSpec); + $$->pubobjtype = PUBLICATIONOBJ_REL_IN_SCHEMA; + $$->name = $5; + $$->location = @5; + } + | ALL TABLES IN_P SCHEMA CURRENT_SCHEMA + { + $$ = makeNode(PublicationObjSpec); + $$->pubobjtype = PUBLICATIONOBJ_REL_IN_SCHEMA; + $$->name = "CURRENT_SCHEMA"; + $$->location = @5; + } + | ColId { $$ = makeNode(PublicationObjSpec); - $$->object = (Node *)$1; + $$->name = $1; + $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION; $$->location = @1; } - | CURRENT_SCHEMA + | ColId indirection { $$ = makeNode(PublicationObjSpec); - $$->object = (Node *)makeString("CURRENT_SCHEMA"); + $$->rangevar = makeRangeVarFromQualifiedName($1, $2, @1, yyscanner); + $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION; $$->location = @1; } - ; - -/* - * This can be either a schema or relation name. For relations, the inheritance - * will be implicit. - */ -pubobj_name: - ColId + | CURRENT_SCHEMA { - $$ = (Node *)makeString($1); + $$ = makeNode(PublicationObjSpec); + $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION; + $$->name = "CURRENT_SCHEMA"; + $$->location = @1; } - | ColId indirection + /* grammar like tablename * , ONLY tablename, ONLY ( tablename ) */ + | extended_relation_expr { - $$ = (Node *)makeRangeVarFromQualifiedName($1, $2, @1, yyscanner); + $$ = makeNode(PublicationObjSpec); + $$->rangevar = $1; + $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION; } - ; - -/* FOR TABLE and FOR ALL TABLES IN SCHEMA specifications */ -PublicationObjSpec: TABLE pubobj_expr - { - $$ = $2; - $$->pubobjtype = PUBLICATIONOBJ_TABLE; - } - | ALL TABLES IN_P SCHEMA pubobj_expr - { - $$ = $5; - $$->pubobjtype = PUBLICATIONOBJ_REL_IN_SCHEMA; - } - | pubobj_expr - { - $$ = $1; - $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION; - } - ; + ; pub_obj_list: PublicationObjSpec { $$ = list_make1($1); } @@ -17303,19 +17299,19 @@ preprocess_pubobj_list (List *pubobjspec_list, core_yyscan_t yyscanner) foreach(cell, pubobjspec_list) { - Node *node; - pubobj = (PublicationObjSpec *) lfirst(cell); - node = (Node *) pubobj->object; if (pubobj->pubobjtype == PUBLICATIONOBJ_CONTINUATION) pubobj->pubobjtype = prevobjtype; - if (pubobj->pubobjtype == PUBLICATIONOBJ_TABLE && IsA(node, String)) - pubobj->object = (Node *)makeRangeVar(NULL, strVal(node), - pubobj->location); + if (pubobj->pubobjtype == PUBLICATIONOBJ_TABLE && pubobj->name) + { + pubobj->rangevar = makeRangeVar(NULL, pubobj->name, + pubobj->location); + pubobj->name = NULL; + } else if (pubobj->pubobjtype == PUBLICATIONOBJ_REL_IN_SCHEMA && - !IsA(node, String)) + !pubobj->name) ereport(ERROR, errcode(ERRCODE_SYNTAX_ERROR), errmsg("invalid schema name at or near"), diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 15aacf7165..37702a4e7a 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -367,9 +367,8 @@ typedef struct PublicationObjSpec { NodeTag type; PublicationObjSpecType pubobjtype; /* type of this publication object */ - Node *object; /* publication object could be: - * RangeVar - table object - * String - tablename or schemaname */ + char *name; + RangeVar *rangevar; int location; /* token location, or -1 if unknown */ } PublicationObjSpec; -- 2.30.2