PostgreSQL Source Code git master
Loading...
Searching...
No Matches
pg_publication.h File Reference
#include "catalog/genbki.h"
#include "catalog/objectaddress.h"
#include "catalog/pg_publication_d.h"
Include dependency graph for pg_publication.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  PublicationActions
 
struct  PublicationDesc
 
struct  Publication
 
struct  PublicationRelInfo
 

Typedefs

typedef struct PublicationActions PublicationActions
 
typedef struct PublicationDesc PublicationDesc
 
typedef struct Publication Publication
 
typedef struct PublicationRelInfo PublicationRelInfo
 
typedef enum PublicationPartOpt PublicationPartOpt
 

Enumerations

enum  PublicationPartOpt { PUBLICATION_PART_ROOT , PUBLICATION_PART_LEAF , PUBLICATION_PART_ALL }
 

Functions

BEGIN_CATALOG_STRUCT CATALOG (pg_publication, 6104, PublicationRelationId)
 
 DECLARE_UNIQUE_INDEX_PKEY (pg_publication_oid_index, 6110, PublicationObjectIndexId, pg_publication, btree(oid oid_ops))
 
 DECLARE_UNIQUE_INDEX (pg_publication_pubname_index, 6111, PublicationNameIndexId, pg_publication, btree(pubname name_ops))
 
 MAKE_SYSCACHE (PUBLICATIONOID, pg_publication_oid_index, 8)
 
 MAKE_SYSCACHE (PUBLICATIONNAME, pg_publication_pubname_index, 8)
 
PublicationGetPublication (Oid pubid)
 
PublicationGetPublicationByName (const char *pubname, bool missing_ok)
 
ListGetRelationIncludedPublications (Oid relid)
 
ListGetRelationExcludedPublications (Oid relid)
 
ListGetIncludedPublicationRelations (Oid pubid, PublicationPartOpt pub_partopt)
 
ListGetExcludedPublicationTables (Oid pubid, PublicationPartOpt pub_partopt)
 
ListGetAllTablesPublications (void)
 
ListGetAllPublicationRelations (Oid pubid, char relkind, bool pubviaroot)
 
ListGetPublicationSchemas (Oid pubid)
 
ListGetSchemaPublications (Oid schemaid)
 
ListGetSchemaPublicationRelations (Oid schemaid, PublicationPartOpt pub_partopt)
 
ListGetAllSchemaPublicationRelations (Oid pubid, PublicationPartOpt pub_partopt)
 
ListGetPubPartitionOptionRelations (List *result, PublicationPartOpt pub_partopt, Oid relid)
 
Oid GetTopMostAncestorInPublication (Oid puboid, List *ancestors, int *ancestor_level)
 
bool is_publishable_relation (Relation rel)
 
bool is_schema_publication (Oid pubid)
 
bool is_table_publication (Oid pubid)
 
bool check_and_fetch_column_list (Publication *pub, Oid relid, MemoryContext mcxt, Bitmapset **cols)
 
ObjectAddress publication_add_relation (Oid pubid, PublicationRelInfo *pri, bool if_not_exists, AlterPublicationStmt *alter_stmt)
 
Bitmapsetpub_collist_validate (Relation targetrel, List *columns)
 
ObjectAddress publication_add_schema (Oid pubid, Oid schemaid, bool if_not_exists)
 
Bitmapsetpub_collist_to_bitmapset (Bitmapset *columns, Datum pubcols, MemoryContext mcxt)
 
Bitmapsetpub_form_cols_map (Relation relation, PublishGencolsType include_gencols_type)
 

Variables

END_CATALOG_STRUCT typedef FormData_pg_publicationForm_pg_publication
 
 FormData_pg_publication
 

Typedef Documentation

◆ Publication

◆ PublicationActions

◆ PublicationDesc

◆ PublicationPartOpt

◆ PublicationRelInfo

Enumeration Type Documentation

◆ PublicationPartOpt

Enumerator
PUBLICATION_PART_ROOT 
PUBLICATION_PART_LEAF 
PUBLICATION_PART_ALL 

Definition at line 171 of file pg_publication.h.

172{
PublicationPartOpt
@ PUBLICATION_PART_LEAF
@ PUBLICATION_PART_ROOT
@ PUBLICATION_PART_ALL

Function Documentation

◆ CATALOG()

Definition at line 31 of file pg_publication.h.

32{
33 Oid oid; /* oid */
34
35 NameData pubname; /* name of the publication */
36
37 Oid pubowner BKI_LOOKUP(pg_authid); /* publication owner */
38
39 /*
40 * indicates that this is special publication which should encompass all
41 * tables in the database (except for the unlogged and temp ones)
42 */
43 bool puballtables;
44
45 /*
46 * indicates that this is special publication which should encompass all
47 * sequences in the database (except for the unlogged and temp ones)
48 */
49 bool puballsequences;
50
51 /* true if inserts are published */
52 bool pubinsert;
53
54 /* true if updates are published */
55 bool pubupdate;
56
57 /* true if deletes are published */
58 bool pubdelete;
59
60 /* true if truncates are published */
61 bool pubtruncate;
62
63 /* true if partition changes are published using root schema */
64 bool pubviaroot;
65
66 /*
67 * 'n'(none) if generated column data should not be published. 's'(stored)
68 * if stored generated column data should be published.
69 */
70 char pubgencols;
#define BKI_LOOKUP(catalog)
Definition genbki.h:65
FormData_pg_publication
unsigned int Oid
static int fb(int x)
Definition c.h:830

References BKI_LOOKUP, and fb().

◆ check_and_fetch_column_list()

bool check_and_fetch_column_list ( Publication pub,
Oid  relid,
MemoryContext  mcxt,
Bitmapset **  cols 
)
extern

Definition at line 356 of file pg_publication.c.

358{
360 bool found = false;
361
362 if (pub->alltables)
363 return false;
364
366 ObjectIdGetDatum(relid),
367 ObjectIdGetDatum(pub->oid));
369 {
371 bool isnull;
372
373 /* Lookup the column list attribute. */
376
377 /* Was a column list found? */
378 if (!isnull)
379 {
380 /* Build the column list bitmap in the given memory context. */
381 if (cols)
382 *cols = pub_collist_to_bitmapset(*cols, cfdatum, mcxt);
383
384 found = true;
385 }
386
388 }
389
390 return found;
391}
#define HeapTupleIsValid(tuple)
Definition htup.h:78
Bitmapset * pub_collist_to_bitmapset(Bitmapset *columns, Datum pubcols, MemoryContext mcxt)
static Datum ObjectIdGetDatum(Oid X)
Definition postgres.h:252
uint64_t Datum
Definition postgres.h:70
void ReleaseSysCache(HeapTuple tuple)
Definition syscache.c:265
HeapTuple SearchSysCache2(SysCacheIdentifier cacheId, Datum key1, Datum key2)
Definition syscache.c:231
Datum SysCacheGetAttr(SysCacheIdentifier cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
Definition syscache.c:596

References Publication::alltables, fb(), HeapTupleIsValid, ObjectIdGetDatum(), Publication::oid, pub_collist_to_bitmapset(), ReleaseSysCache(), SearchSysCache2(), and SysCacheGetAttr().

Referenced by check_and_init_gencol(), pgoutput_column_list_init(), and pub_contains_invalid_column().

◆ DECLARE_UNIQUE_INDEX()

DECLARE_UNIQUE_INDEX ( pg_publication_pubname_index  ,
6111  ,
PublicationNameIndexId  ,
pg_publication  ,
btree(pubname name_ops  
)

◆ DECLARE_UNIQUE_INDEX_PKEY()

DECLARE_UNIQUE_INDEX_PKEY ( pg_publication_oid_index  ,
6110  ,
PublicationObjectIndexId  ,
pg_publication  ,
btree(oid oid_ops  
)

◆ GetAllPublicationRelations()

List * GetAllPublicationRelations ( Oid  pubid,
char  relkind,
bool  pubviaroot 
)
extern

Definition at line 1038 of file pg_publication.c.

1039{
1041 ScanKeyData key[1];
1042 TableScanDesc scan;
1043 HeapTuple tuple;
1044 List *result = NIL;
1045 List *exceptlist = NIL;
1046
1047 Assert(!(relkind == RELKIND_SEQUENCE && pubviaroot));
1048
1049 /* EXCEPT filtering applies only to relations, not sequences */
1050 if (relkind == RELKIND_RELATION)
1051 exceptlist = GetExcludedPublicationTables(pubid, pubviaroot ?
1054
1056
1057 ScanKeyInit(&key[0],
1060 CharGetDatum(relkind));
1061
1062 scan = table_beginscan_catalog(classRel, 1, key);
1063
1064 while ((tuple = heap_getnext(scan, ForwardScanDirection)) != NULL)
1065 {
1067 Oid relid = relForm->oid;
1068
1069 if (is_publishable_class(relid, relForm) &&
1070 !(relForm->relispartition && pubviaroot) &&
1071 !list_member_oid(exceptlist, relid))
1072 result = lappend_oid(result, relid);
1073 }
1074
1075 table_endscan(scan);
1076
1077 if (pubviaroot)
1078 {
1079 ScanKeyInit(&key[0],
1083
1084 scan = table_beginscan_catalog(classRel, 1, key);
1085
1086 while ((tuple = heap_getnext(scan, ForwardScanDirection)) != NULL)
1087 {
1089 Oid relid = relForm->oid;
1090
1091 if (is_publishable_class(relid, relForm) &&
1092 !relForm->relispartition &&
1093 !list_member_oid(exceptlist, relid))
1094 result = lappend_oid(result, relid);
1095 }
1096
1097 table_endscan(scan);
1098 }
1099
1101 return result;
1102}
#define Assert(condition)
Definition c.h:943
uint32 result
HeapTuple heap_getnext(TableScanDesc sscan, ScanDirection direction)
Definition heapam.c:1435
static void * GETSTRUCT(const HeapTupleData *tuple)
List * lappend_oid(List *list, Oid datum)
Definition list.c:375
bool list_member_oid(const List *list, Oid datum)
Definition list.c:722
#define AccessShareLock
Definition lockdefs.h:36
FormData_pg_class * Form_pg_class
Definition pg_class.h:160
#define NIL
Definition pg_list.h:68
static bool is_publishable_class(Oid relid, Form_pg_class reltuple)
List * GetExcludedPublicationTables(Oid pubid, PublicationPartOpt pub_partopt)
static Datum CharGetDatum(char X)
Definition postgres.h:132
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
Definition scankey.c:76
@ ForwardScanDirection
Definition sdir.h:28
#define BTEqualStrategyNumber
Definition stratnum.h:31
Definition pg_list.h:54
void table_close(Relation relation, LOCKMODE lockmode)
Definition table.c:126
Relation table_open(Oid relationId, LOCKMODE lockmode)
Definition table.c:40
TableScanDesc table_beginscan_catalog(Relation relation, int nkeys, ScanKeyData *key)
Definition tableam.c:113
static void table_endscan(TableScanDesc scan)
Definition tableam.h:1061

References AccessShareLock, Assert, BTEqualStrategyNumber, CharGetDatum(), fb(), ForwardScanDirection, GetExcludedPublicationTables(), GETSTRUCT(), heap_getnext(), is_publishable_class(), lappend_oid(), list_member_oid(), NIL, PUBLICATION_PART_LEAF, PUBLICATION_PART_ROOT, result, ScanKeyInit(), table_beginscan_catalog(), table_close(), table_endscan(), and table_open().

Referenced by pg_get_publication_sequences(), and pg_get_publication_tables().

◆ GetAllSchemaPublicationRelations()

List * GetAllSchemaPublicationRelations ( Oid  pubid,
PublicationPartOpt  pub_partopt 
)
extern

Definition at line 1231 of file pg_publication.c.

1232{
1233 List *result = NIL;
1235 ListCell *cell;
1236
1237 foreach(cell, pubschemalist)
1238 {
1239 Oid schemaid = lfirst_oid(cell);
1240 List *schemaRels = NIL;
1241
1244 }
1245
1246 return result;
1247}
List * list_concat(List *list1, const List *list2)
Definition list.c:561
#define lfirst_oid(lc)
Definition pg_list.h:174
List * GetPublicationSchemas(Oid pubid)
List * GetSchemaPublicationRelations(Oid schemaid, PublicationPartOpt pub_partopt)

References fb(), GetPublicationSchemas(), GetSchemaPublicationRelations(), lfirst_oid, list_concat(), NIL, and result.

Referenced by AlterPublicationOptions(), InvalidatePubRelSyncCache(), and pg_get_publication_tables().

◆ GetAllTablesPublications()

List * GetAllTablesPublications ( void  )
extern

Definition at line 992 of file pg_publication.c.

993{
994 List *result;
995 Relation rel;
997 SysScanDesc scan;
999
1000 /* Find all publications that are marked as for all tables. */
1002
1006 BoolGetDatum(true));
1007
1008 scan = systable_beginscan(rel, InvalidOid, false,
1009 NULL, 1, &scankey);
1010
1011 result = NIL;
1012 while (HeapTupleIsValid(tup = systable_getnext(scan)))
1013 {
1014 Oid oid = ((Form_pg_publication) GETSTRUCT(tup))->oid;
1015
1016 result = lappend_oid(result, oid);
1017 }
1018
1019 systable_endscan(scan);
1021
1022 return result;
1023}
void systable_endscan(SysScanDesc sysscan)
Definition genam.c:612
HeapTuple systable_getnext(SysScanDesc sysscan)
Definition genam.c:523
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
Definition genam.c:388
END_CATALOG_STRUCT typedef FormData_pg_publication * Form_pg_publication
static Datum BoolGetDatum(bool X)
Definition postgres.h:112
#define InvalidOid

References AccessShareLock, BoolGetDatum(), BTEqualStrategyNumber, fb(), Form_pg_publication, GETSTRUCT(), HeapTupleIsValid, InvalidOid, lappend_oid(), NIL, result, ScanKeyInit(), systable_beginscan(), systable_endscan(), systable_getnext(), table_close(), and table_open().

Referenced by RelationBuildPublicationDesc().

◆ GetExcludedPublicationTables()

List * GetExcludedPublicationTables ( Oid  pubid,
PublicationPartOpt  pub_partopt 
)
extern

Definition at line 981 of file pg_publication.c.

982{
983 Assert(GetPublication(pubid)->alltables);
984
985 return get_publication_relations(pubid, pub_partopt, true);
986}
static List * get_publication_relations(Oid pubid, PublicationPartOpt pub_partopt, bool except_flag)
Publication * GetPublication(Oid pubid)

References Assert, fb(), get_publication_relations(), and GetPublication().

Referenced by AlterPublicationTables(), and GetAllPublicationRelations().

◆ GetIncludedPublicationRelations()

List * GetIncludedPublicationRelations ( Oid  pubid,
PublicationPartOpt  pub_partopt 
)
extern

◆ GetPublication()

Publication * GetPublication ( Oid  pubid)
extern

Definition at line 1255 of file pg_publication.c.

1256{
1257 HeapTuple tup;
1258 Publication *pub;
1260
1262 if (!HeapTupleIsValid(tup))
1263 elog(ERROR, "cache lookup failed for publication %u", pubid);
1264
1266
1268 pub->oid = pubid;
1269 pub->name = pstrdup(NameStr(pubform->pubname));
1270 pub->alltables = pubform->puballtables;
1271 pub->allsequences = pubform->puballsequences;
1272 pub->pubactions.pubinsert = pubform->pubinsert;
1273 pub->pubactions.pubupdate = pubform->pubupdate;
1274 pub->pubactions.pubdelete = pubform->pubdelete;
1275 pub->pubactions.pubtruncate = pubform->pubtruncate;
1276 pub->pubviaroot = pubform->pubviaroot;
1277 pub->pubgencols_type = pubform->pubgencols;
1278
1280
1281 return pub;
1282}
#define NameStr(name)
Definition c.h:835
#define ERROR
Definition elog.h:40
#define elog(elevel,...)
Definition elog.h:228
#define palloc_object(type)
Definition fe_memutils.h:74
char * pstrdup(const char *in)
Definition mcxt.c:1781
PublishGencolsType pubgencols_type
PublicationActions pubactions
HeapTuple SearchSysCache1(SysCacheIdentifier cacheId, Datum key1)
Definition syscache.c:221

References Publication::allsequences, Publication::alltables, elog, ERROR, fb(), Form_pg_publication, GETSTRUCT(), HeapTupleIsValid, Publication::name, NameStr, ObjectIdGetDatum(), Publication::oid, palloc_object, pstrdup(), Publication::pubactions, PublicationActions::pubdelete, Publication::pubgencols_type, PublicationActions::pubinsert, PublicationActions::pubtruncate, PublicationActions::pubupdate, Publication::pubviaroot, ReleaseSysCache(), and SearchSysCache1().

Referenced by GetExcludedPublicationTables(), GetIncludedPublicationRelations(), GetPublicationByName(), pg_get_publication_tables(), pub_contains_invalid_column(), publication_add_relation(), and publication_add_schema().

◆ GetPublicationByName()

Publication * GetPublicationByName ( const char pubname,
bool  missing_ok 
)
extern

Definition at line 1288 of file pg_publication.c.

1289{
1290 Oid oid;
1291
1292 oid = get_publication_oid(pubname, missing_ok);
1293
1294 return OidIsValid(oid) ? GetPublication(oid) : NULL;
1295}
#define OidIsValid(objectId)
Definition c.h:858
Oid get_publication_oid(const char *pubname, bool missing_ok)
Definition lsyscache.c:3872

References fb(), get_publication_oid(), GetPublication(), and OidIsValid.

Referenced by get_object_address_publication_rel(), get_object_address_publication_schema(), LoadPublications(), pg_get_publication_sequences(), and pg_get_publication_tables().

◆ GetPublicationSchemas()

List * GetPublicationSchemas ( Oid  pubid)
extern

◆ GetPubPartitionOptionRelations()

List * GetPubPartitionOptionRelations ( List result,
PublicationPartOpt  pub_partopt,
Oid  relid 
)
extern

Definition at line 398 of file pg_publication.c.

400{
403 {
405 NULL);
406
410 {
411 ListCell *lc;
412
413 foreach(lc, all_parts)
414 {
416
419 }
420 }
421 else
422 Assert(false);
423 }
424 else
425 result = lappend_oid(result, relid);
426
427 return result;
428}
#define NoLock
Definition lockdefs.h:34
char get_rel_relkind(Oid relid)
Definition lsyscache.c:2223
List * find_all_inheritors(Oid parentrelId, LOCKMODE lockmode, List **numparents)

References Assert, fb(), find_all_inheritors(), get_rel_relkind(), lappend_oid(), lfirst_oid, list_concat(), NoLock, PUBLICATION_PART_ALL, PUBLICATION_PART_LEAF, PUBLICATION_PART_ROOT, and result.

Referenced by AlterPublicationOptions(), get_publication_relations(), GetSchemaPublicationRelations(), publication_add_relation(), and RemovePublicationRelById().

◆ GetRelationExcludedPublications()

List * GetRelationExcludedPublications ( Oid  relid)
extern

Definition at line 905 of file pg_publication.c.

906{
907 return get_relation_publications(relid, true);
908}
static List * get_relation_publications(Oid relid, bool except_flag)

References get_relation_publications().

Referenced by ATExecAttachPartition(), get_rel_sync_entry(), and RelationBuildPublicationDesc().

◆ GetRelationIncludedPublications()

List * GetRelationIncludedPublications ( Oid  relid)
extern

◆ GetSchemaPublicationRelations()

List * GetSchemaPublicationRelations ( Oid  schemaid,
PublicationPartOpt  pub_partopt 
)
extern

Definition at line 1174 of file pg_publication.c.

1175{
1177 ScanKeyData key[1];
1178 TableScanDesc scan;
1179 HeapTuple tuple;
1180 List *result = NIL;
1181
1183
1185
1186 ScanKeyInit(&key[0],
1190
1191 /* get all the relations present in the specified schema */
1192 scan = table_beginscan_catalog(classRel, 1, key);
1193 while ((tuple = heap_getnext(scan, ForwardScanDirection)) != NULL)
1194 {
1196 Oid relid = relForm->oid;
1197 char relkind;
1198
1199 if (!is_publishable_class(relid, relForm))
1200 continue;
1201
1202 relkind = get_rel_relkind(relid);
1203 if (relkind == RELKIND_RELATION)
1204 result = lappend_oid(result, relid);
1205 else if (relkind == RELKIND_PARTITIONED_TABLE)
1206 {
1208
1209 /*
1210 * It is quite possible that some of the partitions are in a
1211 * different schema than the parent table, so we need to get such
1212 * partitions separately.
1213 */
1216 relForm->oid);
1218 }
1219 }
1220
1221 table_endscan(scan);
1223 return result;
1224}
List * list_concat_unique_oid(List *list1, const List *list2)
Definition list.c:1469
List * GetPubPartitionOptionRelations(List *result, PublicationPartOpt pub_partopt, Oid relid)

References AccessShareLock, Assert, BTEqualStrategyNumber, fb(), ForwardScanDirection, get_rel_relkind(), GetPubPartitionOptionRelations(), GETSTRUCT(), heap_getnext(), is_publishable_class(), lappend_oid(), list_concat_unique_oid(), NIL, ObjectIdGetDatum(), OidIsValid, result, ScanKeyInit(), table_beginscan_catalog(), table_close(), table_endscan(), and table_open().

Referenced by GetAllSchemaPublicationRelations(), publication_add_schema(), and RemovePublicationSchemaById().

◆ GetSchemaPublications()

List * GetSchemaPublications ( Oid  schemaid)
extern

Definition at line 1148 of file pg_publication.c.

1149{
1150 List *result = NIL;
1152 int i;
1153
1154 /* Find all publications associated with the schema */
1157 for (i = 0; i < pubschlist->n_members; i++)
1158 {
1159 HeapTuple tup = &pubschlist->members[i]->tuple;
1161
1162 result = lappend_oid(result, pubid);
1163 }
1164
1166
1167 return result;
1168}
int i
Definition isn.c:77
#define ReleaseSysCacheList(x)
Definition syscache.h:134
#define SearchSysCacheList1(cacheId, key1)
Definition syscache.h:127

References fb(), Form_pg_publication_namespace, GETSTRUCT(), i, lappend_oid(), NIL, ObjectIdGetDatum(), ReleaseSysCacheList, result, and SearchSysCacheList1.

Referenced by get_rel_sync_entry(), GetTopMostAncestorInPublication(), and RelationBuildPublicationDesc().

◆ GetTopMostAncestorInPublication()

Oid GetTopMostAncestorInPublication ( Oid  puboid,
List ancestors,
int ancestor_level 
)
extern

Definition at line 442 of file pg_publication.c.

443{
444 ListCell *lc;
446 int level = 0;
447
448 /*
449 * Find the "topmost" ancestor that is in this publication.
450 */
451 foreach(lc, ancestors)
452 {
456
457 level++;
458
460 {
462
463 if (ancestor_level)
464 *ancestor_level = level;
465 }
466 else
467 {
470 {
472
473 if (ancestor_level)
474 *ancestor_level = level;
475 }
476 }
477
480 }
481
482 return topmost_relid;
483}
void list_free(List *list)
Definition list.c:1546
Oid get_rel_namespace(Oid relid)
Definition lsyscache.c:2172
List * GetRelationIncludedPublications(Oid relid)
List * GetSchemaPublications(Oid schemaid)

References fb(), get_rel_namespace(), GetRelationIncludedPublications(), GetSchemaPublications(), InvalidOid, lfirst_oid, list_free(), list_member_oid(), and NIL.

Referenced by get_rel_sync_entry(), is_table_publishable_in_publication(), pub_contains_invalid_column(), and pub_rf_contains_invalid_column().

◆ is_publishable_relation()

bool is_publishable_relation ( Relation  rel)
extern

Definition at line 161 of file pg_publication.c.

162{
164}
#define RelationGetRelid(relation)
Definition rel.h:516
Form_pg_class rd_rel
Definition rel.h:111

References is_publishable_class(), RelationData::rd_rel, and RelationGetRelid.

Referenced by pgoutput_change(), pgoutput_truncate(), and RelationBuildPublicationDesc().

◆ is_schema_publication()

◆ is_table_publication()

bool is_table_publication ( Oid  pubid)
extern

Definition at line 309 of file pg_publication.c.

310{
313 SysScanDesc scan;
315 bool result = false;
316
321 ObjectIdGetDatum(pubid));
322
325 true, NULL, 1, &scankey);
326 tup = systable_getnext(scan);
328 {
330
332
333 /*
334 * For any publication, pg_publication_rel contains either only EXCEPT
335 * entries or only explicitly included tables. Therefore, examining
336 * the first tuple is sufficient to determine table inclusion.
337 */
338 result = !pubrel->prexcept;
339 }
340
341 systable_endscan(scan);
343
344 return result;
345}
END_CATALOG_STRUCT typedef FormData_pg_publication_rel * Form_pg_publication_rel

References AccessShareLock, BTEqualStrategyNumber, fb(), Form_pg_publication_rel, GETSTRUCT(), HeapTupleIsValid, ObjectIdGetDatum(), result, ScanKeyInit(), systable_beginscan(), systable_endscan(), systable_getnext(), table_close(), and table_open().

Referenced by CheckAlterPublication().

◆ MAKE_SYSCACHE() [1/2]

MAKE_SYSCACHE ( PUBLICATIONNAME  ,
pg_publication_pubname_index  ,
 
)

◆ MAKE_SYSCACHE() [2/2]

MAKE_SYSCACHE ( PUBLICATIONOID  ,
pg_publication_oid_index  ,
 
)

◆ pub_collist_to_bitmapset()

Bitmapset * pub_collist_to_bitmapset ( Bitmapset columns,
Datum  pubcols,
MemoryContext  mcxt 
)
extern

Definition at line 717 of file pg_publication.c.

718{
719 Bitmapset *result = columns;
720 ArrayType *arr;
721 int nelems;
722 int16 *elems;
724
726 nelems = ARR_DIMS(arr)[0];
727 elems = (int16 *) ARR_DATA_PTR(arr);
728
729 /* If a memory context was specified, switch to it. */
730 if (mcxt)
732
733 for (int i = 0; i < nelems; i++)
734 result = bms_add_member(result, elems[i]);
735
736 if (mcxt)
738
739 return result;
740}
#define ARR_DATA_PTR(a)
Definition array.h:322
#define DatumGetArrayTypeP(X)
Definition array.h:261
#define ARR_DIMS(a)
Definition array.h:294
Bitmapset * bms_add_member(Bitmapset *a, int x)
Definition bitmapset.c:799
int16_t int16
Definition c.h:619
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition palloc.h:124

References ARR_DATA_PTR, ARR_DIMS, bms_add_member(), DatumGetArrayTypeP, fb(), i, MemoryContextSwitchTo(), and result.

Referenced by AlterPublicationTables(), and check_and_fetch_column_list().

◆ pub_collist_validate()

Bitmapset * pub_collist_validate ( Relation  targetrel,
List columns 
)
extern

Definition at line 668 of file pg_publication.c.

669{
670 Bitmapset *set = NULL;
671 ListCell *lc;
673
674 foreach(lc, columns)
675 {
676 char *colname = strVal(lfirst(lc));
678
682 errmsg("column \"%s\" of relation \"%s\" does not exist",
684
688 errmsg("cannot use system column \"%s\" in publication column list",
689 colname));
690
691 if (TupleDescAttr(tupdesc, attnum - 1)->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
694 errmsg("cannot use virtual generated column \"%s\" in publication column list",
695 colname));
696
697 if (bms_is_member(attnum, set))
700 errmsg("duplicate column \"%s\" in publication column list",
701 colname));
702
703 set = bms_add_member(set, attnum);
704 }
705
706 return set;
707}
int16 AttrNumber
Definition attnum.h:21
#define AttrNumberIsForUserDefinedAttr(attributeNumber)
Definition attnum.h:41
#define InvalidAttrNumber
Definition attnum.h:23
bool bms_is_member(int x, const Bitmapset *a)
Definition bitmapset.c:510
int errcode(int sqlerrcode)
Definition elog.c:874
#define ereport(elevel,...)
Definition elog.h:152
AttrNumber get_attnum(Oid relid, const char *attname)
Definition lsyscache.c:977
static char * errmsg
int16 attnum
#define lfirst(lc)
Definition pg_list.h:172
#define RelationGetDescr(relation)
Definition rel.h:542
#define RelationGetRelationName(relation)
Definition rel.h:550
#define ERRCODE_DUPLICATE_OBJECT
Definition streamutil.c:30
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
Definition tupdesc.h:178
#define strVal(v)
Definition value.h:82

References attnum, AttrNumberIsForUserDefinedAttr, bms_add_member(), bms_is_member(), ereport, errcode(), ERRCODE_DUPLICATE_OBJECT, errmsg, ERROR, fb(), get_attnum(), InvalidAttrNumber, lfirst, RelationGetDescr, RelationGetRelationName, RelationGetRelid, strVal, and TupleDescAttr().

Referenced by AlterPublicationTables(), and publication_add_relation().

◆ pub_form_cols_map()

Bitmapset * pub_form_cols_map ( Relation  relation,
PublishGencolsType  include_gencols_type 
)
extern

Definition at line 749 of file pg_publication.c.

750{
752 TupleDesc desc = RelationGetDescr(relation);
753
754 for (int i = 0; i < desc->natts; i++)
755 {
756 Form_pg_attribute att = TupleDescAttr(desc, i);
757
758 if (att->attisdropped)
759 continue;
760
761 if (att->attgenerated)
762 {
763 /* We only support replication of STORED generated cols. */
764 if (att->attgenerated != ATTRIBUTE_GENERATED_STORED)
765 continue;
766
767 /* User hasn't requested to replicate STORED generated cols. */
768 if (include_gencols_type != PUBLISH_GENCOLS_STORED)
769 continue;
770 }
771
772 result = bms_add_member(result, att->attnum);
773 }
774
775 return result;
776}
FormData_pg_attribute * Form_pg_attribute

References bms_add_member(), fb(), i, TupleDescData::natts, RelationGetDescr, result, and TupleDescAttr().

Referenced by pgoutput_column_list_init().

◆ publication_add_relation()

ObjectAddress publication_add_relation ( Oid  pubid,
PublicationRelInfo pri,
bool  if_not_exists,
AlterPublicationStmt alter_stmt 
)
extern

Definition at line 516 of file pg_publication.c.

518{
519 Relation rel;
522 bool nulls[Natts_pg_publication_rel];
523 Relation targetrel = pri->relation;
526 Bitmapset *attnums;
527 Publication *pub = GetPublication(pubid);
530 List *relids = NIL;
531 int i;
533
535
536 /*
537 * Check for duplicates. Note that this does not really prevent
538 * duplicates, it's here just to provide nicer error message in common
539 * case. The real protection is the unique key on the catalog.
540 */
542 ObjectIdGetDatum(pubid)))
543 {
545
546 if (if_not_exists)
548
551 errmsg("relation \"%s\" is already member of publication \"%s\"",
553 }
554
556
557 /* Validate and translate column names into a Bitmapset of attnums. */
558 attnums = pub_collist_validate(pri->relation, pri->columns);
559
560 /* Form a tuple. */
561 memset(values, 0, sizeof(values));
562 memset(nulls, false, sizeof(nulls));
563
568 ObjectIdGetDatum(pubid);
570 ObjectIdGetDatum(relid);
572 BoolGetDatum(pri->except);
573
574 /* Add qualifications, if available */
575 if (pri->whereClause != NULL)
577 else
578 nulls[Anum_pg_publication_rel_prqual - 1] = true;
579
580 /* Add column list, if available */
581 if (pri->columns)
583 else
584 nulls[Anum_pg_publication_rel_prattrs - 1] = true;
585
587
588 /* Insert tuple into catalog. */
591
592 /* Register dependencies as needed */
594
595 /* Add dependency on the publication */
598
599 /* Add dependency on the relation */
602
603 /* Add dependency on the objects mentioned in the qualifications */
604 if (pri->whereClause)
605 recordDependencyOnSingleRelExpr(&myself, pri->whereClause, relid,
607 false);
608
609 /* Add dependency on the columns, if any are listed */
610 i = -1;
611 while ((i = bms_next_member(attnums, i)) >= 0)
612 {
615 }
616
617 /* Close the table. */
619
620 /*
621 * Determine whether EXCEPT tables require explicit relcache invalidation.
622 *
623 * For CREATE PUBLICATION with EXCEPT tables, invalidation is skipped
624 * here, as CreatePublication() function invalidates all relations as part
625 * of defining a FOR ALL TABLES publication.
626 *
627 * For ALTER PUBLICATION, invalidation is needed only when adding an
628 * EXCEPT table to a publication already marked as ALL TABLES. For
629 * publications that were originally empty or defined as ALL SEQUENCES and
630 * are being converted to ALL TABLES, invalidation is skipped here, as
631 * AlterPublicationAllFlags() function invalidates all relations while
632 * marking the publication as ALL TABLES publication.
633 */
635 (alter_stmt->for_all_tables && pri->except);
636
637 if (!pri->except || inval_except_table)
638 {
639 /*
640 * Invalidate relcache so that publication info is rebuilt.
641 *
642 * For the partitioned tables, we must invalidate all partitions
643 * contained in the respective partition hierarchies, not just the one
644 * explicitly mentioned in the publication. This is required because
645 * we implicitly publish the child tables when the parent table is
646 * published.
647 */
649 relid);
650
652 }
653
654 return myself;
655}
int bms_next_member(const Bitmapset *a, int prevbit)
Definition bitmapset.c:1290
static Datum values[MAXATTR]
Definition bootstrap.c:190
#define CStringGetTextDatum(s)
Definition builtins.h:98
Oid GetNewOidWithIndex(Relation relation, Oid indexId, AttrNumber oidcolumn)
Definition catalog.c:448
void recordDependencyOnSingleRelExpr(const ObjectAddress *depender, Node *expr, Oid relId, DependencyType behavior, DependencyType self_behavior, bool reverse_self)
@ DEPENDENCY_AUTO
Definition dependency.h:34
@ DEPENDENCY_NORMAL
Definition dependency.h:33
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
Definition heaptuple.c:1025
void heap_freetuple(HeapTuple htup)
Definition heaptuple.c:1372
void CatalogTupleInsert(Relation heapRel, HeapTuple tup)
Definition indexing.c:233
#define RowExclusiveLock
Definition lockdefs.h:38
const ObjectAddress InvalidObjectAddress
#define ObjectAddressSet(addr, class_id, object_id)
#define ObjectAddressSubSet(addr, class_id, object_id, object_sub_id)
char * nodeToString(const void *obj)
Definition outfuncs.c:811
void recordDependencyOn(const ObjectAddress *depender, const ObjectAddress *referenced, DependencyType behavior)
Definition pg_depend.c:47
static int2vector * attnumstoint2vector(Bitmapset *attrs)
Bitmapset * pub_collist_validate(Relation targetrel, List *columns)
static void check_publication_add_relation(PublicationRelInfo *pri)
static Datum PointerGetDatum(const void *X)
Definition postgres.h:342
void InvalidatePublicationRels(List *relids)
#define SearchSysCacheExists2(cacheId, key1, key2)
Definition syscache.h:102

References Publication::alltables, attnumstoint2vector(), bms_next_member(), BoolGetDatum(), CatalogTupleInsert(), check_publication_add_relation(), CStringGetTextDatum, DEPENDENCY_AUTO, DEPENDENCY_NORMAL, ereport, errcode(), ERRCODE_DUPLICATE_OBJECT, errmsg, ERROR, fb(), GetNewOidWithIndex(), GetPublication(), GetPubPartitionOptionRelations(), heap_form_tuple(), heap_freetuple(), i, InvalidatePublicationRels(), InvalidObjectAddress, Publication::name, NIL, nodeToString(), ObjectAddressSet, ObjectAddressSubSet, ObjectIdGetDatum(), PointerGetDatum(), pub_collist_validate(), PUBLICATION_PART_ALL, recordDependencyOn(), recordDependencyOnSingleRelExpr(), RelationGetDescr, RelationGetRelationName, RelationGetRelid, RowExclusiveLock, SearchSysCacheExists2, table_close(), table_open(), and values.

Referenced by PublicationAddTables().

◆ publication_add_schema()

ObjectAddress publication_add_schema ( Oid  pubid,
Oid  schemaid,
bool  if_not_exists 
)
extern

Definition at line 782 of file pg_publication.c.

783{
784 Relation rel;
788 Oid psschid;
789 Publication *pub = GetPublication(pubid);
793
795
796 /*
797 * Check for duplicates. Note that this does not really prevent
798 * duplicates, it's here just to provide nicer error message in common
799 * case. The real protection is the unique key on the catalog.
800 */
803 ObjectIdGetDatum(pubid)))
804 {
806
807 if (if_not_exists)
809
812 errmsg("schema \"%s\" is already member of publication \"%s\"",
814 }
815
817
818 /* Form a tuple */
819 memset(values, 0, sizeof(values));
820 memset(nulls, false, sizeof(nulls));
821
826 ObjectIdGetDatum(pubid);
829
831
832 /* Insert tuple into catalog */
835
837
838 /* Add dependency on the publication */
841
842 /* Add dependency on the schema */
845
846 /* Close the table */
848
849 /*
850 * Invalidate relcache so that publication info is rebuilt. See
851 * publication_add_relation for why we need to consider all the
852 * partitions.
853 */
857
858 return myself;
859}
char * get_namespace_name(Oid nspid)
Definition lsyscache.c:3588
static void check_publication_add_schema(Oid schemaid)

References CatalogTupleInsert(), check_publication_add_schema(), DEPENDENCY_AUTO, ereport, errcode(), ERRCODE_DUPLICATE_OBJECT, errmsg, ERROR, fb(), get_namespace_name(), GetNewOidWithIndex(), GetPublication(), GetSchemaPublicationRelations(), heap_form_tuple(), heap_freetuple(), InvalidatePublicationRels(), InvalidObjectAddress, Publication::name, NIL, ObjectAddressSet, ObjectIdGetDatum(), PUBLICATION_PART_ALL, recordDependencyOn(), RelationGetDescr, RowExclusiveLock, SearchSysCacheExists2, table_close(), table_open(), and values.

Referenced by PublicationAddSchemas().

Variable Documentation

◆ Form_pg_publication

◆ FormData_pg_publication

FormData_pg_publication

Definition at line 71 of file pg_publication.h.