mirror of
https://github.com/postgres/postgres.git
synced 2025-11-18 02:02:55 +03:00
Add decoding of sequences to built-in replication
This commit adds support for decoding of sequences to the built-in
replication (the infrastructure was added by commit 0da92dc530).
The syntax and behavior mostly mimics handling of tables, i.e. a
publication may be defined as FOR ALL SEQUENCES (replicating all
sequences in a database), FOR ALL SEQUENCES IN SCHEMA (replicating
all sequences in a particular schema) or individual sequences.
To publish sequence modifications, the publication has to include
'sequence' action. The protocol is extended with a new message,
describing sequence increments.
A new system view pg_publication_sequences lists all the sequences
added to a publication, both directly and indirectly. Various psql
commands (\d and \dRp) are improved to also display publications
including a given sequence, or sequences included in a publication.
Author: Tomas Vondra, Cary Huang
Reviewed-by: Peter Eisentraut, Amit Kapila, Hannu Krosing, Andres
Freund, Petr Jelinek
Discussion: https://postgr.es/m/d045f3c2-6cfb-06d3-5540-e63c320df8bc@enterprisedb.com
Discussion: https://postgr.es/m/1710ed7e13b.cd7177461430746.3372264562543607781@highgo.ca
This commit is contained in:
28
src/backend/utils/cache/relcache.c
vendored
28
src/backend/utils/cache/relcache.c
vendored
@@ -56,6 +56,7 @@
|
||||
#include "catalog/pg_opclass.h"
|
||||
#include "catalog/pg_proc.h"
|
||||
#include "catalog/pg_publication.h"
|
||||
#include "catalog/pg_publication_namespace.h"
|
||||
#include "catalog/pg_rewrite.h"
|
||||
#include "catalog/pg_shseclabel.h"
|
||||
#include "catalog/pg_statistic_ext.h"
|
||||
@@ -5562,6 +5563,8 @@ RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc)
|
||||
Oid schemaid;
|
||||
List *ancestors = NIL;
|
||||
Oid relid = RelationGetRelid(relation);
|
||||
char relkind = relation->rd_rel->relkind;
|
||||
char objType;
|
||||
|
||||
/*
|
||||
* If not publishable, it publishes no actions. (pgoutput_change() will
|
||||
@@ -5588,8 +5591,15 @@ RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc)
|
||||
/* Fetch the publication membership info. */
|
||||
puboids = GetRelationPublications(relid);
|
||||
schemaid = RelationGetNamespace(relation);
|
||||
puboids = list_concat_unique_oid(puboids, GetSchemaPublications(schemaid));
|
||||
objType = pub_get_object_type_for_relkind(relkind);
|
||||
|
||||
puboids = list_concat_unique_oid(puboids,
|
||||
GetSchemaPublications(schemaid, objType));
|
||||
|
||||
/*
|
||||
* If this is a partion (and thus a table), lookup all ancestors and track
|
||||
* all publications them too.
|
||||
*/
|
||||
if (relation->rd_rel->relispartition)
|
||||
{
|
||||
/* Add publications that the ancestors are in too. */
|
||||
@@ -5601,12 +5611,23 @@ RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc)
|
||||
|
||||
puboids = list_concat_unique_oid(puboids,
|
||||
GetRelationPublications(ancestor));
|
||||
|
||||
/* include all publications publishing schema of all ancestors */
|
||||
schemaid = get_rel_namespace(ancestor);
|
||||
puboids = list_concat_unique_oid(puboids,
|
||||
GetSchemaPublications(schemaid));
|
||||
GetSchemaPublications(schemaid,
|
||||
PUB_OBJTYPE_TABLE));
|
||||
}
|
||||
}
|
||||
puboids = list_concat_unique_oid(puboids, GetAllTablesPublications());
|
||||
|
||||
/*
|
||||
* Consider also FOR ALL TABLES and FOR ALL SEQUENCES publications,
|
||||
* depending on the relkind of the relation.
|
||||
*/
|
||||
if (relation->rd_rel->relkind == RELKIND_SEQUENCE)
|
||||
puboids = list_concat_unique_oid(puboids, GetAllSequencesPublications());
|
||||
else
|
||||
puboids = list_concat_unique_oid(puboids, GetAllTablesPublications());
|
||||
|
||||
foreach(lc, puboids)
|
||||
{
|
||||
@@ -5625,6 +5646,7 @@ RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc)
|
||||
pubdesc->pubactions.pubupdate |= pubform->pubupdate;
|
||||
pubdesc->pubactions.pubdelete |= pubform->pubdelete;
|
||||
pubdesc->pubactions.pubtruncate |= pubform->pubtruncate;
|
||||
pubdesc->pubactions.pubsequence |= pubform->pubsequence;
|
||||
|
||||
/*
|
||||
* Check if all columns referenced in the filter expression are part of
|
||||
|
||||
Reference in New Issue
Block a user