mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-16 03:17:00 +08:00
This feature adds row filtering for publication tables. When a publication is defined or modified, an optional WHERE clause can be specified. Rows that don't satisfy this WHERE clause will be filtered out. This allows a set of tables to be partially replicated. The row filter is per table. A new row filter can be added simply by specifying a WHERE clause after the table name. The WHERE clause must be enclosed by parentheses. The row filter WHERE clause for a table added to a publication that publishes UPDATE and/or DELETE operations must contain only columns that are covered by REPLICA IDENTITY. The row filter WHERE clause for a table added to a publication that publishes INSERT can use any column. If the row filter evaluates to NULL, it is regarded as "false". The WHERE clause only allows simple expressions that don't have user-defined functions, user-defined operators, user-defined types, user-defined collations, non-immutable built-in functions, or references to system columns. These restrictions could be addressed in the future. If you choose to do the initial table synchronization, only data that satisfies the row filters is copied to the subscriber. If the subscription has several publications in which a table has been published with different WHERE clauses, rows that satisfy ANY of the expressions will be copied. If a subscriber is a pre-15 version, the initial table synchronization won't use row filters even if they are defined in the publisher. The row filters are applied before publishing the changes. If the subscription has several publications in which the same table has been published with different filters (for the same publish operation), those expressions get OR'ed together so that rows satisfying any of the expressions will be replicated. This means all the other filters become redundant if (a) one of the publications have no filter at all, (b) one of the publications was created using FOR ALL TABLES, (c) one of the publications was created using FOR ALL TABLES IN SCHEMA and the table belongs to that same schema. If your publication contains a partitioned table, the publication parameter publish_via_partition_root determines if it uses the partition's row filter (if the parameter is false, the default) or the root partitioned table's row filter. Psql commands \dRp+ and \d <table-name> will display any row filters. Author: Hou Zhijie, Euler Taveira, Peter Smith, Ajin Cherian Reviewed-by: Greg Nancarrow, Haiying Tang, Amit Kapila, Tomas Vondra, Dilip Kumar, Vignesh C, Alvaro Herrera, Andres Freund, Wei Wang Discussion: https://www.postgresql.org/message-id/flat/CAHE3wggb715X%2BmK_DitLXF25B%3DjE6xyNCH4YOwM860JR7HarGQ%40mail.gmail.com
154 lines
4.7 KiB
C
154 lines
4.7 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* relcache.h
|
|
* Relation descriptor cache definitions.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/utils/relcache.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef RELCACHE_H
|
|
#define RELCACHE_H
|
|
|
|
#include "access/tupdesc.h"
|
|
#include "nodes/bitmapset.h"
|
|
|
|
|
|
/*
|
|
* Name of relcache init file(s), used to speed up backend startup
|
|
*/
|
|
#define RELCACHE_INIT_FILENAME "pg_internal.init"
|
|
|
|
typedef struct RelationData *Relation;
|
|
|
|
/* ----------------
|
|
* RelationPtr is used in the executor to support index scans
|
|
* where we have to keep track of several index relations in an
|
|
* array. -cim 9/10/89
|
|
* ----------------
|
|
*/
|
|
typedef Relation *RelationPtr;
|
|
|
|
/*
|
|
* Routines to open (lookup) and close a relcache entry
|
|
*/
|
|
extern Relation RelationIdGetRelation(Oid relationId);
|
|
extern void RelationClose(Relation relation);
|
|
|
|
/*
|
|
* Routines to compute/retrieve additional cached information
|
|
*/
|
|
extern List *RelationGetFKeyList(Relation relation);
|
|
extern List *RelationGetIndexList(Relation relation);
|
|
extern List *RelationGetStatExtList(Relation relation);
|
|
extern Oid RelationGetPrimaryKeyIndex(Relation relation);
|
|
extern Oid RelationGetReplicaIndex(Relation relation);
|
|
extern List *RelationGetIndexExpressions(Relation relation);
|
|
extern List *RelationGetDummyIndexExpressions(Relation relation);
|
|
extern List *RelationGetIndexPredicate(Relation relation);
|
|
extern Datum *RelationGetIndexRawAttOptions(Relation relation);
|
|
extern bytea **RelationGetIndexAttOptions(Relation relation, bool copy);
|
|
|
|
typedef enum IndexAttrBitmapKind
|
|
{
|
|
INDEX_ATTR_BITMAP_KEY,
|
|
INDEX_ATTR_BITMAP_PRIMARY_KEY,
|
|
INDEX_ATTR_BITMAP_IDENTITY_KEY,
|
|
INDEX_ATTR_BITMAP_HOT_BLOCKING
|
|
} IndexAttrBitmapKind;
|
|
|
|
extern Bitmapset *RelationGetIndexAttrBitmap(Relation relation,
|
|
IndexAttrBitmapKind attrKind);
|
|
|
|
extern Bitmapset *RelationGetIdentityKeyBitmap(Relation relation);
|
|
|
|
extern void RelationGetExclusionInfo(Relation indexRelation,
|
|
Oid **operators,
|
|
Oid **procs,
|
|
uint16 **strategies);
|
|
|
|
extern void RelationInitIndexAccessInfo(Relation relation);
|
|
|
|
/* caller must include pg_publication.h */
|
|
struct PublicationDesc;
|
|
extern void RelationBuildPublicationDesc(Relation relation,
|
|
struct PublicationDesc *pubdesc);
|
|
|
|
extern void RelationInitTableAccessMethod(Relation relation);
|
|
|
|
/*
|
|
* Routines to support ereport() reports of relation-related errors
|
|
*/
|
|
extern int errtable(Relation rel);
|
|
extern int errtablecol(Relation rel, int attnum);
|
|
extern int errtablecolname(Relation rel, const char *colname);
|
|
extern int errtableconstraint(Relation rel, const char *conname);
|
|
|
|
/*
|
|
* Routines for backend startup
|
|
*/
|
|
extern void RelationCacheInitialize(void);
|
|
extern void RelationCacheInitializePhase2(void);
|
|
extern void RelationCacheInitializePhase3(void);
|
|
|
|
/*
|
|
* Routine to create a relcache entry for an about-to-be-created relation
|
|
*/
|
|
extern Relation RelationBuildLocalRelation(const char *relname,
|
|
Oid relnamespace,
|
|
TupleDesc tupDesc,
|
|
Oid relid,
|
|
Oid accessmtd,
|
|
Oid relfilenode,
|
|
Oid reltablespace,
|
|
bool shared_relation,
|
|
bool mapped_relation,
|
|
char relpersistence,
|
|
char relkind);
|
|
|
|
/*
|
|
* Routines to manage assignment of new relfilenode to a relation
|
|
*/
|
|
extern void RelationSetNewRelfilenode(Relation relation, char persistence);
|
|
extern void RelationAssumeNewRelfilenode(Relation relation);
|
|
|
|
/*
|
|
* Routines for flushing/rebuilding relcache entries in various scenarios
|
|
*/
|
|
extern void RelationForgetRelation(Oid rid);
|
|
|
|
extern void RelationCacheInvalidateEntry(Oid relationId);
|
|
|
|
extern void RelationCacheInvalidate(bool debug_discard);
|
|
|
|
extern void RelationCloseSmgrByOid(Oid relationId);
|
|
|
|
#ifdef USE_ASSERT_CHECKING
|
|
extern void AssertPendingSyncs_RelationCache(void);
|
|
#else
|
|
#define AssertPendingSyncs_RelationCache() do {} while (0)
|
|
#endif
|
|
extern void AtEOXact_RelationCache(bool isCommit);
|
|
extern void AtEOSubXact_RelationCache(bool isCommit, SubTransactionId mySubid,
|
|
SubTransactionId parentSubid);
|
|
|
|
/*
|
|
* Routines to help manage rebuilding of relcache init files
|
|
*/
|
|
extern bool RelationIdIsInInitFile(Oid relationId);
|
|
extern void RelationCacheInitFilePreInvalidate(void);
|
|
extern void RelationCacheInitFilePostInvalidate(void);
|
|
extern void RelationCacheInitFileRemove(void);
|
|
|
|
/* should be used only by relcache.c and catcache.c */
|
|
extern bool criticalRelcachesBuilt;
|
|
|
|
/* should be used only by relcache.c and postinit.c */
|
|
extern bool criticalSharedRelcachesBuilt;
|
|
|
|
#endif /* RELCACHE_H */
|