mirror of
https://github.com/postgres/postgres.git
synced 2025-07-07 00:36:50 +03:00
Logical replication support for TRUNCATE
Update the built-in logical replication system to make use of the previously added logical decoding for TRUNCATE support. Add the required truncate callback to pgoutput and a new logical replication protocol message. Publications get a new attribute to determine whether to replicate truncate actions. When updating a publication via pg_dump from an older version, this is not set, thus preserving the previous behavior. Author: Simon Riggs <simon@2ndquadrant.com> Author: Marco Nenciarini <marco.nenciarini@2ndquadrant.it> Author: Peter Eisentraut <peter.eisentraut@2ndquadrant.com> Reviewed-by: Petr Jelinek <petr.jelinek@2ndquadrant.com> Reviewed-by: Andres Freund <andres@anarazel.de> Reviewed-by: Alvaro Herrera <alvherre@alvh.no-ip.org>
This commit is contained in:
@ -62,7 +62,8 @@ parse_publication_options(List *options,
|
||||
bool *publish_given,
|
||||
bool *publish_insert,
|
||||
bool *publish_update,
|
||||
bool *publish_delete)
|
||||
bool *publish_delete,
|
||||
bool *publish_truncate)
|
||||
{
|
||||
ListCell *lc;
|
||||
|
||||
@ -72,6 +73,7 @@ parse_publication_options(List *options,
|
||||
*publish_insert = true;
|
||||
*publish_update = true;
|
||||
*publish_delete = true;
|
||||
*publish_truncate = true;
|
||||
|
||||
/* Parse options */
|
||||
foreach(lc, options)
|
||||
@ -96,6 +98,7 @@ parse_publication_options(List *options,
|
||||
*publish_insert = false;
|
||||
*publish_update = false;
|
||||
*publish_delete = false;
|
||||
*publish_truncate = false;
|
||||
|
||||
*publish_given = true;
|
||||
publish = defGetString(defel);
|
||||
@ -116,6 +119,8 @@ parse_publication_options(List *options,
|
||||
*publish_update = true;
|
||||
else if (strcmp(publish_opt, "delete") == 0)
|
||||
*publish_delete = true;
|
||||
else if (strcmp(publish_opt, "truncate") == 0)
|
||||
*publish_truncate = true;
|
||||
else
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
@ -145,6 +150,7 @@ CreatePublication(CreatePublicationStmt *stmt)
|
||||
bool publish_insert;
|
||||
bool publish_update;
|
||||
bool publish_delete;
|
||||
bool publish_truncate;
|
||||
AclResult aclresult;
|
||||
|
||||
/* must have CREATE privilege on database */
|
||||
@ -181,7 +187,8 @@ CreatePublication(CreatePublicationStmt *stmt)
|
||||
|
||||
parse_publication_options(stmt->options,
|
||||
&publish_given, &publish_insert,
|
||||
&publish_update, &publish_delete);
|
||||
&publish_update, &publish_delete,
|
||||
&publish_truncate);
|
||||
|
||||
values[Anum_pg_publication_puballtables - 1] =
|
||||
BoolGetDatum(stmt->for_all_tables);
|
||||
@ -191,6 +198,8 @@ CreatePublication(CreatePublicationStmt *stmt)
|
||||
BoolGetDatum(publish_update);
|
||||
values[Anum_pg_publication_pubdelete - 1] =
|
||||
BoolGetDatum(publish_delete);
|
||||
values[Anum_pg_publication_pubtruncate - 1] =
|
||||
BoolGetDatum(publish_truncate);
|
||||
|
||||
tup = heap_form_tuple(RelationGetDescr(rel), values, nulls);
|
||||
|
||||
@ -237,11 +246,13 @@ AlterPublicationOptions(AlterPublicationStmt *stmt, Relation rel,
|
||||
bool publish_insert;
|
||||
bool publish_update;
|
||||
bool publish_delete;
|
||||
bool publish_truncate;
|
||||
ObjectAddress obj;
|
||||
|
||||
parse_publication_options(stmt->options,
|
||||
&publish_given, &publish_insert,
|
||||
&publish_update, &publish_delete);
|
||||
&publish_update, &publish_delete,
|
||||
&publish_truncate);
|
||||
|
||||
/* Everything ok, form a new tuple. */
|
||||
memset(values, 0, sizeof(values));
|
||||
@ -258,6 +269,9 @@ AlterPublicationOptions(AlterPublicationStmt *stmt, Relation rel,
|
||||
|
||||
values[Anum_pg_publication_pubdelete - 1] = BoolGetDatum(publish_delete);
|
||||
replaces[Anum_pg_publication_pubdelete - 1] = true;
|
||||
|
||||
values[Anum_pg_publication_pubtruncate - 1] = BoolGetDatum(publish_truncate);
|
||||
replaces[Anum_pg_publication_pubtruncate - 1] = true;
|
||||
}
|
||||
|
||||
tup = heap_modify_tuple(tup, RelationGetDescr(rel), values, nulls,
|
||||
|
Reference in New Issue
Block a user