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
Message: Re: Added schema level support for publication.

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