v33-0006-Alternate-grammar-for-ALL-TABLES-IN-SCHEMA.patch
text/x-patch
Filename: v33-0006-Alternate-grammar-for-ALL-TABLES-IN-SCHEMA.patch
Type: text/x-patch
Part: 5
Patch
Format: format-patch
Series: patch v33-0006
Subject: Alternate grammar for "ALL TABLES IN SCHEMA"
| File | + | − |
|---|---|---|
| src/backend/commands/publicationcmds.c | 3 | 5 |
| src/backend/nodes/copyfuncs.c | 2 | 1 |
| src/backend/nodes/equalfuncs.c | 2 | 1 |
| src/backend/parser/gram.y | 43 | 47 |
| src/include/nodes/parsenodes.h | 2 | 3 |
From 2e968f7a483fa8f535ffaa6ada37735aefad363f Mon Sep 17 00:00:00 2001
From: Vignesh C <vignesh21@gmail.com>
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 <rolespec> auth_ident RoleSpec opt_granted_by
%type <publicationobjectspec> PublicationObjSpec
-%type <publicationobjectspec> pubobj_expr
-%type <node> pubobj_name
%type <keyword> unreserved_keyword type_func_name_keyword
%type <keyword> col_name_keyword reserved_keyword
%type <keyword> 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