summaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
authorAmit Kapila <akapila@postgresql.org>2025-10-09 03:48:54 +0000
committerAmit Kapila <akapila@postgresql.org>2025-10-09 03:48:54 +0000
commit96b37849734673e7c82fb86c4f0a46a28f500ac8 (patch)
treebd12627fe6ff240f26d7ff2db36e29a9c3e751e4 /src/backend/parser
parentef5e60a9d352a97791af632e0d26a572bc88e921 (diff)
Add "ALL SEQUENCES" support to publications.
This patch adds support for the ALL SEQUENCES clause in publications, enabling synchronization/replication of all sequences that is useful for upgrades. Publications can now include all sequences via FOR ALL SEQUENCES. psql enhancements: \d shows publications for a given sequence. \dRp indicates if a publication includes all sequences. ALL SEQUENCES can be combined with ALL TABLES, but not with other options like TABLE or TABLES IN SCHEMA. We can extend support for more granular clauses in future. The view pg_publication_sequences provides information about the mapping between publications and sequences. This patch enables publishing of sequences; subscriber-side support will be added in upcoming patches. Author: vignesh C <vignesh21@gmail.com> Author: Tomas Vondra <tomas@vondra.me> Reviewed-by: shveta malik <shveta.malik@gmail.com> Reviewed-by: Dilip Kumar <dilipbalaut@gmail.com> Reviewed-by: Peter Smith <smithpb2250@gmail.com> Reviewed-by: Hayato Kuroda <kuroda.hayato@fujitsu.com> Reviewed-by: Masahiko Sawada <sawada.mshk@gmail.com> Reviewed-by: Nisha Moond <nisha.moond412@gmail.com> Reviewed-by: Shlok Kyal <shlok.kyal.oss@gmail.com> Reviewed-by: Amit Kapila <amit.kapila16@gmail.com> Discussion: https://postgr.es/m/CAA4eK1LC+KJiAkSrpE_NwvNdidw9F2os7GERUeSxSKv71gXysQ@mail.gmail.com
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/gram.y87
1 files changed, 82 insertions, 5 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 57bf7a7c7f2..21caf2d43bf 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -202,6 +202,10 @@ static void processCASbits(int cas_bits, int location, const char *constrType,
bool *not_valid, bool *no_inherit, core_yyscan_t yyscanner);
static PartitionStrategy parsePartitionStrategy(char *strategy, int location,
core_yyscan_t yyscanner);
+static void preprocess_pub_all_objtype_list(List *all_objects_list,
+ bool *all_tables,
+ bool *all_sequences,
+ core_yyscan_t yyscanner);
static void preprocess_pubobj_list(List *pubobjspec_list,
core_yyscan_t yyscanner);
static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
@@ -260,6 +264,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
PartitionBoundSpec *partboundspec;
RoleSpec *rolespec;
PublicationObjSpec *publicationobjectspec;
+ PublicationAllObjSpec *publicationallobjectspec;
struct SelectLimit *selectlimit;
SetQuantifier setquantifier;
struct GroupClause *groupclause;
@@ -447,7 +452,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
+ drop_option_list pub_obj_list pub_obj_type_list
%type <retclause> returning_clause
%type <node> returning_option
@@ -585,6 +590,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
%type <node> var_value zone_value
%type <rolespec> auth_ident RoleSpec opt_granted_by
%type <publicationobjectspec> PublicationObjSpec
+%type <publicationallobjectspec> PublicationAllObjSpec
%type <keyword> unreserved_keyword type_func_name_keyword
%type <keyword> col_name_keyword reserved_keyword
@@ -10704,7 +10710,12 @@ AlterOwnerStmt: ALTER AGGREGATE aggregate_with_argtypes OWNER TO RoleSpec
*
* CREATE PUBLICATION name [WITH options]
*
- * CREATE PUBLICATION FOR ALL TABLES [WITH options]
+ * CREATE PUBLICATION FOR ALL pub_obj_type [, ...] [WITH options]
+ *
+ * pub_obj_type is one of:
+ *
+ * TABLES
+ * SEQUENCES
*
* CREATE PUBLICATION FOR pub_obj [, ...] [WITH options]
*
@@ -10724,13 +10735,16 @@ CreatePublicationStmt:
n->options = $4;
$$ = (Node *) n;
}
- | CREATE PUBLICATION name FOR ALL TABLES opt_definition
+ | CREATE PUBLICATION name FOR pub_obj_type_list opt_definition
{
CreatePublicationStmt *n = makeNode(CreatePublicationStmt);
n->pubname = $3;
- n->options = $7;
- n->for_all_tables = true;
+ n->pubobjects = (List *) $5;
+ preprocess_pub_all_objtype_list($5, &n->for_all_tables,
+ &n->for_all_sequences,
+ yyscanner);
+ n->options = $6;
$$ = (Node *) n;
}
| CREATE PUBLICATION name FOR pub_obj_list opt_definition
@@ -10842,6 +10856,28 @@ pub_obj_list: PublicationObjSpec
{ $$ = lappend($1, $3); }
;
+PublicationAllObjSpec:
+ ALL TABLES
+ {
+ $$ = makeNode(PublicationAllObjSpec);
+ $$->pubobjtype = PUBLICATION_ALL_TABLES;
+ $$->location = @1;
+ }
+ | ALL SEQUENCES
+ {
+ $$ = makeNode(PublicationAllObjSpec);
+ $$->pubobjtype = PUBLICATION_ALL_SEQUENCES;
+ $$->location = @1;
+ }
+ ;
+
+pub_obj_type_list: PublicationAllObjSpec
+ { $$ = list_make1($1); }
+ | pub_obj_type_list ',' PublicationAllObjSpec
+ { $$ = lappend($1, $3); }
+ ;
+
+
/*****************************************************************************
*
* ALTER PUBLICATION name SET ( options )
@@ -19640,6 +19676,47 @@ parsePartitionStrategy(char *strategy, int location, core_yyscan_t yyscanner)
}
/*
+ * Process all_objects_list to set all_tables and/or all_sequences.
+ * Also, checks if the pub_object_type has been specified more than once.
+ */
+static void
+preprocess_pub_all_objtype_list(List *all_objects_list, bool *all_tables,
+ bool *all_sequences, core_yyscan_t yyscanner)
+{
+ if (!all_objects_list)
+ return;
+
+ *all_tables = false;
+ *all_sequences = false;
+
+ foreach_ptr(PublicationAllObjSpec, obj, all_objects_list)
+ {
+ if (obj->pubobjtype == PUBLICATION_ALL_TABLES)
+ {
+ if (*all_tables)
+ ereport(ERROR,
+ errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("invalid publication object list"),
+ errdetail("ALL TABLES can be specified only once."),
+ parser_errposition(obj->location));
+
+ *all_tables = true;
+ }
+ else if (obj->pubobjtype == PUBLICATION_ALL_SEQUENCES)
+ {
+ if (*all_sequences)
+ ereport(ERROR,
+ errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("invalid publication object list"),
+ errdetail("ALL SEQUENCES can be specified only once."),
+ parser_errposition(obj->location));
+
+ *all_sequences = true;
+ }
+ }
+}
+
+/*
* Process pubobjspec_list to check for errors in any of the objects and
* convert PUBLICATIONOBJ_CONTINUATION into appropriate PublicationObjSpecType.
*/