postgres.git / summary / log / commit / refs

commit    b9bf23abb0e9a63ecc5f4b68a8229146291270e5
Author:   Peter Eisentraut <peter_e@gmx.net>
Date:     Sat Feb 24 02:17:57 2018 +0000
First released in: 11.0, 10.3

    Fix filtering of unsupported relations in logical replication
    
    In the pgoutput plugin, skip changes for relations that are not
    publishable, per is_publishable_class().  This concerns in particular
    materialized views and information_schema tables.  While those relations
    cannot be part of a publication, per existing checks, they will be
    considered by a FOR ALL TABLES publication.  A subscription would not
    actually apply changes for those relations, again per existing checks,
    but trying to match incoming changes to local tables on the subscriber
    would lead to errors if no matching local table exists.  Skipping those
    changes on the publisher avoids sending useless changes and eliminates
    the error.
    
    Bug: #15044
    Reported-by: Chad Trabant <chad@iris.washington.edu>
    Reviewed-by: Petr Jelinek <petr.jelinek@2ndquadrant.com>


src/backend/catalog/pg_publication.c | 9 +++++++++ src/backend/replication/pgoutput/pgoutput.c | 3 +++ src/include/catalog/pg_publication.h | 1 + 3 files changed, 13 insertions(+) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 3ef7ba8cd55..a0973f43e27 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -105,6 +105,15 @@ is_publishable_class(Oid relid, Form_pg_class reltuple) relid >= FirstNormalObjectId; } +/* + * Another variant of this, taking a Relation. + */ +bool +is_publishable_relation(Relation rel) +{ + return is_publishable_class(RelationGetRelid(rel), rel->rd_rel); +} + /* * SQL-callable variant of the above diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index 61e53aba193..38b0eab7d2e 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -264,6 +264,9 @@ pgoutput_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, MemoryContext old; RelationSyncEntry *relentry; + if (!is_publishable_relation(relation)) + return; + relentry = get_rel_sync_entry(data, RelationGetRelid(relation)); /* First check the table filter */ diff --git a/src/include/catalog/pg_publication.h b/src/include/catalog/pg_publication.h index aa148960cd9..be4987505d8 100644 --- a/src/include/catalog/pg_publication.h +++ b/src/include/catalog/pg_publication.h @@ -93,6 +93,7 @@ extern List *GetPublicationRelations(Oid pubid); extern List *GetAllTablesPublications(void); extern List *GetAllTablesPublicationRelations(void); +extern bool is_publishable_relation(Relation rel); extern ObjectAddress publication_add_relation(Oid pubid, Relation targetrel, bool if_not_exists); [parent: 0222e897d8dc]