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 363 of file pg_publication.c.

365{
367 bool found = false;
368
369 if (pub->alltables)
370 return false;
371
373 ObjectIdGetDatum(relid),
374 ObjectIdGetDatum(pub->oid));
376 {
378 bool isnull;
379
380 /* Lookup the column list attribute. */
383
384 /* Was a column list found? */
385 if (!isnull)
386 {
387 /* Build the column list bitmap in the given memory context. */
388 if (cols)
389 *cols = pub_collist_to_bitmapset(*cols, cfdatum, mcxt);
390
391 found = true;
392 }
393
395 }
396
397 return found;
398}
#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 1045 of file pg_publication.c.

1046{
1048 ScanKeyData key[1];
1049 TableScanDesc scan;
1050 HeapTuple tuple;
1051 List *result = NIL;
1052 List *exceptlist = NIL;
1053
1054 Assert(!(relkind == RELKIND_SEQUENCE && pubviaroot));
1055
1056 /* EXCEPT filtering applies only to relations, not sequences */
1057 if (relkind == RELKIND_RELATION)
1058 exceptlist = GetExcludedPublicationTables(pubid, pubviaroot ?
1061
1063
1064 ScanKeyInit(&key[0],
1067 CharGetDatum(relkind));
1068
1069 scan = table_beginscan_catalog(classRel, 1, key);
1070
1071 while ((tuple = heap_getnext(scan, ForwardScanDirection)) != NULL)
1072 {
1074 Oid relid = relForm->oid;
1075
1076 if (is_publishable_class(relid, relForm) &&
1077 !(relForm->relispartition && pubviaroot) &&
1078 !list_member_oid(exceptlist, relid))
1079 result = lappend_oid(result, relid);
1080 }
1081
1082 table_endscan(scan);
1083
1084 if (pubviaroot)
1085 {
1086 ScanKeyInit(&key[0],
1090
1091 scan = table_beginscan_catalog(classRel, 1, key);
1092
1093 while ((tuple = heap_getnext(scan, ForwardScanDirection)) != NULL)
1094 {
1096 Oid relid = relForm->oid;
1097
1098 if (is_publishable_class(relid, relForm) &&
1099 !relForm->relispartition &&
1100 !list_member_oid(exceptlist, relid))
1101 result = lappend_oid(result, relid);
1102 }
1103
1104 table_endscan(scan);
1105 }
1106
1108 return result;
1109}
#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 1238 of file pg_publication.c.

1239{
1240 List *result = NIL;
1242 ListCell *cell;
1243
1244 foreach(cell, pubschemalist)
1245 {
1246 Oid schemaid = lfirst_oid(cell);
1247 List *schemaRels = NIL;
1248
1251 }
1252
1253 return result;
1254}
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 999 of file pg_publication.c.

1000{
1001 List *result;
1002 Relation rel;
1004 SysScanDesc scan;
1005 HeapTuple tup;
1006
1007 /* Find all publications that are marked as for all tables. */
1009
1013 BoolGetDatum(true));
1014
1015 scan = systable_beginscan(rel, InvalidOid, false,
1016 NULL, 1, &scankey);
1017
1018 result = NIL;
1019 while (HeapTupleIsValid(tup = systable_getnext(scan)))
1020 {
1021 Oid oid = ((Form_pg_publication) GETSTRUCT(tup))->oid;
1022
1023 result = lappend_oid(result, oid);
1024 }
1025
1026 systable_endscan(scan);
1028
1029 return result;
1030}
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 988 of file pg_publication.c.

989{
990 Assert(GetPublication(pubid)->alltables);
991
992 return get_publication_relations(pubid, pub_partopt, true);
993}
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 1262 of file pg_publication.c.

1263{
1264 HeapTuple tup;
1265 Publication *pub;
1267
1269 if (!HeapTupleIsValid(tup))
1270 elog(ERROR, "cache lookup failed for publication %u", pubid);
1271
1273
1275 pub->oid = pubid;
1276 pub->name = pstrdup(NameStr(pubform->pubname));
1277 pub->alltables = pubform->puballtables;
1278 pub->allsequences = pubform->puballsequences;
1279 pub->pubactions.pubinsert = pubform->pubinsert;
1280 pub->pubactions.pubupdate = pubform->pubupdate;
1281 pub->pubactions.pubdelete = pubform->pubdelete;
1282 pub->pubactions.pubtruncate = pubform->pubtruncate;
1283 pub->pubviaroot = pubform->pubviaroot;
1284 pub->pubgencols_type = pubform->pubgencols;
1285
1287
1288 return pub;
1289}
#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:89
char * pstrdup(const char *in)
Definition mcxt.c:1910
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 1295 of file pg_publication.c.

1296{
1297 Oid oid;
1298
1299 oid = get_publication_oid(pubname, missing_ok);
1300
1301 return OidIsValid(oid) ? GetPublication(oid) : NULL;
1302}
#define OidIsValid(objectId)
Definition c.h:858
Oid get_publication_oid(const char *pubname, bool missing_ok)
Definition lsyscache.c:3903

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 405 of file pg_publication.c.

407{
410 {
412 NULL);
413
417 {
418 ListCell *lc;
419
420 foreach(lc, all_parts)
421 {
423
426 }
427 }
428 else
429 Assert(false);
430 }
431 else
432 result = lappend_oid(result, relid);
433
434 return result;
435}
#define NoLock
Definition lockdefs.h:34
char get_rel_relkind(Oid relid)
Definition lsyscache.c:2234
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 912 of file pg_publication.c.

913{
914 return get_relation_publications(relid, true);
915}
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 1181 of file pg_publication.c.

1182{
1184 ScanKeyData key[1];
1185 TableScanDesc scan;
1186 HeapTuple tuple;
1187 List *result = NIL;
1188
1190
1192
1193 ScanKeyInit(&key[0],
1197
1198 /* get all the relations present in the specified schema */
1199 scan = table_beginscan_catalog(classRel, 1, key);
1200 while ((tuple = heap_getnext(scan, ForwardScanDirection)) != NULL)
1201 {
1203 Oid relid = relForm->oid;
1204 char relkind;
1205
1206 if (!is_publishable_class(relid, relForm))
1207 continue;
1208
1209 relkind = get_rel_relkind(relid);
1210 if (relkind == RELKIND_RELATION)
1211 result = lappend_oid(result, relid);
1212 else if (relkind == RELKIND_PARTITIONED_TABLE)
1213 {
1215
1216 /*
1217 * It is quite possible that some of the partitions are in a
1218 * different schema than the parent table, so we need to get such
1219 * partitions separately.
1220 */
1223 relForm->oid);
1225 }
1226 }
1227
1228 table_endscan(scan);
1230 return result;
1231}
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 1155 of file pg_publication.c.

1156{
1157 List *result = NIL;
1159 int i;
1160
1161 /* Find all publications associated with the schema */
1164 for (i = 0; i < pubschlist->n_members; i++)
1165 {
1166 HeapTuple tup = &pubschlist->members[i]->tuple;
1168
1169 result = lappend_oid(result, pubid);
1170 }
1171
1173
1174 return result;
1175}
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 449 of file pg_publication.c.

450{
451 ListCell *lc;
453 int level = 0;
454
455 /*
456 * Find the "topmost" ancestor that is in this publication.
457 */
458 foreach(lc, ancestors)
459 {
463
464 level++;
465
467 {
469
470 if (ancestor_level)
471 *ancestor_level = level;
472 }
473 else
474 {
477 {
479
480 if (ancestor_level)
481 *ancestor_level = level;
482 }
483 }
484
487 }
488
489 return topmost_relid;
490}
void list_free(List *list)
Definition list.c:1546
Oid get_rel_namespace(Oid relid)
Definition lsyscache.c:2183
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 168 of file pg_publication.c.

169{
171}
#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 316 of file pg_publication.c.

317{
320 SysScanDesc scan;
322 bool result = false;
323
328 ObjectIdGetDatum(pubid));
329
332 true, NULL, 1, &scankey);
333 tup = systable_getnext(scan);
335 {
337
339
340 /*
341 * For any publication, pg_publication_rel contains either only EXCEPT
342 * entries or only explicitly included tables. Therefore, examining
343 * the first tuple is sufficient to determine table inclusion.
344 */
345 result = !pubrel->prexcept;
346 }
347
348 systable_endscan(scan);
350
351 return result;
352}
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 724 of file pg_publication.c.

725{
726 Bitmapset *result = columns;
727 ArrayType *arr;
728 int nelems;
729 int16 *elems;
731
733 nelems = ARR_DIMS(arr)[0];
734 elems = (int16 *) ARR_DATA_PTR(arr);
735
736 /* If a memory context was specified, switch to it. */
737 if (mcxt)
739
740 for (int i = 0; i < nelems; i++)
741 result = bms_add_member(result, elems[i]);
742
743 if (mcxt)
745
746 return result;
747}
#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:138

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 675 of file pg_publication.c.

676{
677 Bitmapset *set = NULL;
678 ListCell *lc;
680
681 foreach(lc, columns)
682 {
683 char *colname = strVal(lfirst(lc));
685
689 errmsg("column \"%s\" of relation \"%s\" does not exist",
691
695 errmsg("cannot use system column \"%s\" in publication column list",
696 colname));
697
698 if (TupleDescAttr(tupdesc, attnum - 1)->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
701 errmsg("cannot use virtual generated column \"%s\" in publication column list",
702 colname));
703
704 if (bms_is_member(attnum, set))
707 errmsg("duplicate column \"%s\" in publication column list",
708 colname));
709
710 set = bms_add_member(set, attnum);
711 }
712
713 return set;
714}
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:875
#define ereport(elevel,...)
Definition elog.h:152
AttrNumber get_attnum(Oid relid, const char *attname)
Definition lsyscache.c:1015
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 756 of file pg_publication.c.

757{
759 TupleDesc desc = RelationGetDescr(relation);
760
761 for (int i = 0; i < desc->natts; i++)
762 {
763 Form_pg_attribute att = TupleDescAttr(desc, i);
764
765 if (att->attisdropped)
766 continue;
767
768 if (att->attgenerated)
769 {
770 /* We only support replication of STORED generated cols. */
771 if (att->attgenerated != ATTRIBUTE_GENERATED_STORED)
772 continue;
773
774 /* User hasn't requested to replicate STORED generated cols. */
775 if (include_gencols_type != PUBLISH_GENCOLS_STORED)
776 continue;
777 }
778
779 result = bms_add_member(result, att->attnum);
780 }
781
782 return result;
783}
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 523 of file pg_publication.c.

525{
526 Relation rel;
529 bool nulls[Natts_pg_publication_rel];
530 Relation targetrel = pri->relation;
533 Bitmapset *attnums;
534 Publication *pub = GetPublication(pubid);
537 List *relids = NIL;
538 int i;
540
542
543 /*
544 * Check for duplicates. Note that this does not really prevent
545 * duplicates, it's here just to provide nicer error message in common
546 * case. The real protection is the unique key on the catalog.
547 */
549 ObjectIdGetDatum(pubid)))
550 {
552
553 if (if_not_exists)
555
558 errmsg("relation \"%s\" is already member of publication \"%s\"",
560 }
561
563
564 /* Validate and translate column names into a Bitmapset of attnums. */
565 attnums = pub_collist_validate(pri->relation, pri->columns);
566
567 /* Form a tuple. */
568 memset(values, 0, sizeof(values));
569 memset(nulls, false, sizeof(nulls));
570
575 ObjectIdGetDatum(pubid);
577 ObjectIdGetDatum(relid);
579 BoolGetDatum(pri->except);
580
581 /* Add qualifications, if available */
582 if (pri->whereClause != NULL)
584 else
585 nulls[Anum_pg_publication_rel_prqual - 1] = true;
586
587 /* Add column list, if available */
588 if (pri->columns)
590 else
591 nulls[Anum_pg_publication_rel_prattrs - 1] = true;
592
594
595 /* Insert tuple into catalog. */
598
599 /* Register dependencies as needed */
601
602 /* Add dependency on the publication */
605
606 /* Add dependency on the relation */
609
610 /* Add dependency on the objects mentioned in the qualifications */
611 if (pri->whereClause)
612 recordDependencyOnSingleRelExpr(&myself, pri->whereClause, relid,
614 false);
615
616 /* Add dependency on the columns, if any are listed */
617 i = -1;
618 while ((i = bms_next_member(attnums, i)) >= 0)
619 {
622 }
623
624 /* Close the table. */
626
627 /*
628 * Determine whether EXCEPT tables require explicit relcache invalidation.
629 *
630 * For CREATE PUBLICATION with EXCEPT tables, invalidation is skipped
631 * here, as CreatePublication() function invalidates all relations as part
632 * of defining a FOR ALL TABLES publication.
633 *
634 * For ALTER PUBLICATION, invalidation is needed only when adding an
635 * EXCEPT table to a publication already marked as ALL TABLES. For
636 * publications that were originally empty or defined as ALL SEQUENCES and
637 * are being converted to ALL TABLES, invalidation is skipped here, as
638 * AlterPublicationAllFlags() function invalidates all relations while
639 * marking the publication as ALL TABLES publication.
640 */
642 (alter_stmt->for_all_tables && pri->except);
643
644 if (!pri->except || inval_except_table)
645 {
646 /*
647 * Invalidate relcache so that publication info is rebuilt.
648 *
649 * For the partitioned tables, we must invalidate all partitions
650 * contained in the respective partition hierarchies, not just the one
651 * explicitly mentioned in the publication. This is required because
652 * we implicitly publish the child tables when the parent table is
653 * published.
654 */
656 relid);
657
659 }
660
661 return myself;
662}
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)
#define PointerGetDatum(X)
Definition postgres.h:354
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 789 of file pg_publication.c.

790{
791 Relation rel;
795 Oid psschid;
796 Publication *pub = GetPublication(pubid);
800
802
803 /*
804 * Check for duplicates. Note that this does not really prevent
805 * duplicates, it's here just to provide nicer error message in common
806 * case. The real protection is the unique key on the catalog.
807 */
810 ObjectIdGetDatum(pubid)))
811 {
813
814 if (if_not_exists)
816
819 errmsg("schema \"%s\" is already member of publication \"%s\"",
821 }
822
824
825 /* Form a tuple */
826 memset(values, 0, sizeof(values));
827 memset(nulls, false, sizeof(nulls));
828
833 ObjectIdGetDatum(pubid);
836
838
839 /* Insert tuple into catalog */
842
844
845 /* Add dependency on the publication */
848
849 /* Add dependency on the schema */
852
853 /* Close the table */
855
856 /*
857 * Invalidate relcache so that publication info is rebuilt. See
858 * publication_add_relation for why we need to consider all the
859 * partitions.
860 */
864
865 return myself;
866}
char * get_namespace_name(Oid nspid)
Definition lsyscache.c:3599
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.