From 9826381494f21a0155fe7ab76c4cb5fd7f7ebadc Mon Sep 17 00:00:00 2001
From: Amit Kapila <akapila@postgresql.org>
Date: Mon, 13 Sep 2021 15:57:39 +0530
Subject: [PATCH v28 3/5] Include catalog name and schema name in rangevar.

---
 src/backend/parser/gram.y | 49 ++++++++++++++++++++++++++++++++-------
 1 file changed, 40 insertions(+), 9 deletions(-)

diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 9e91f1abde..adebc632a3 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -426,7 +426,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				transform_element_list transform_type_list
 				TriggerTransitions TriggerReferencing
 				vacuum_relation_list opt_vacuum_relation_list
-				drop_option_list pub_obj_list pubobj_name
+				drop_option_list pub_obj_list
 
 %type <node>	opt_routine_body
 %type <groupclause> group_clause
@@ -611,6 +611,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <partboundspec> PartitionBoundSpec
 %type <list>		hash_partbound
 %type <defelt>		hash_partbound_elem
+%type <node>	pubobj_name
 
 
 /*
@@ -9629,6 +9630,10 @@ CreatePublicationStmt:
 				}
 		;
 
+/*
+ * This expression can either have relation or schema name, so we can't
+ * directly use relation_expr here.
+ */
 pubobj_expr:
 			pubobj_name
 				{
@@ -9648,14 +9653,40 @@ pubobj_expr:
 				}
 		;
 
-/*
- * We cannot use any_name in pubobj_expr, because the dot('.') in rule attr
- * would have a shift/reduce conflict with the dot('.') in rule indirection_el
- * which also used in pubobj_expr. To resolve the conflicts, declare a new rule
- * pubobj_name which directly use indirection_el.
- */
-pubobj_name:	ColId						{ $$ = list_make1(makeString($1)); }
-			| ColId indirection				{ $$ = lcons(makeString($1), $2); }
+/* This can be either a schema or relation name. */
+pubobj_name:
+			ColId
+				{
+					$$ = (Node *) list_make1(makeString($1));
+				}
+			| ColId indirection
+				{
+					RangeVar *range_var;
+					check_qualified_name($2, yyscanner);
+					range_var = makeRangeVar(NULL, NULL, @1);
+					switch (list_length($2))
+					{
+						case 1:
+							range_var->catalogname = NULL;
+							range_var->schemaname = $1;
+							range_var->relname = strVal(linitial($2));
+							break;
+						case 2:
+							range_var->catalogname = $1;
+							range_var->schemaname = strVal(linitial($2));
+							range_var->relname = strVal(lsecond($2));
+							break;
+						default:
+							ereport(ERROR,
+									(errcode(ERRCODE_SYNTAX_ERROR),
+									 errmsg("improper qualified name (too many dotted names): %s",
+											NameListToString(lcons(makeString($1), $2))),
+									 parser_errposition(@1)));
+							break;
+					}
+
+					$$ = (Node *) range_var;
+				}
 		;
 
 /* FOR TABLE and FOR ALL TABLES IN SCHEMA specifications */
-- 
2.28.0.windows.1

