On Tue, Nov 5, 2024 at 12:32 PM Peter Smith <smithpb2...@gmail.com> wrote: > > has_column_list_defined: > > 1. > + if (HeapTupleIsValid(cftuple)) > + { > + bool isnull = true; > + > + /* Lookup the column list attribute. */ > + (void) SysCacheGetAttr(PUBLICATIONRELMAP, cftuple, > + Anum_pg_publication_rel_prattrs, > + &isnull); > > AFAIK it is not necessary to assign a default value to 'isnull' here. > e.g. most of the other 100s of calls to SysCacheGetAttr elsewhere in > PostgreSQL source don't bother to do this. >
Can we try to reuse this new function has_column_list_defined() in pgoutput_column_list_init() where we are trying to check and form a column list? For that, we need to change this function such that it also returns a column list when requested. Some more comments: 1. extern bool is_schema_publication(Oid pubid); +extern bool has_column_list_defined(Publication *pub, Oid relid); The order of declaration doesn't match with its definition in .c file. It would be better to define this function after is_schema_publication(). 2. + * 'include_gencols' flag indicates whether generated columns should be + * published when there is no column list. Typically, this will have the same + * value as the 'publish_generated_columns' publication parameter. + * + * Note that generated columns can be published only when present in a + * publication column list, or when include_gencols is true. */ bool -logicalrep_should_publish_column(Form_pg_attribute att, Bitmapset *columns) +logicalrep_should_publish_column(Form_pg_attribute att, Bitmapset *columns, + bool include_gencols) { if (att->attisdropped) return false; - /* - * Skip publishing generated columns if they are not included in the - * column list. - */ - if (!columns && att->attgenerated) - return false; + /* If a column list is provided, publish only the cols in that list. */ + if (columns) + return bms_is_member(att->attnum, columns); /* - * Check if a column is covered by a column list. + * If no column list is provided, generated columns will be published only + * if include_gencols is true, while all non-generated columns will always + * be published. The similar information is repeated multiple times in different words. I have adjusted the comments in this part of the code to avoid repetition. I have changed comments at a few other places in the patch. See attached. -- With Regards, Amit Kapila.
diff --git a/src/backend/replication/logical/proto.c b/src/backend/replication/logical/proto.c index 2c8fbc593a..2c2085b2f9 100644 --- a/src/backend/replication/logical/proto.c +++ b/src/backend/replication/logical/proto.c @@ -1272,10 +1272,6 @@ logicalrep_should_publish_column(Form_pg_attribute att, Bitmapset *columns, if (columns) return bms_is_member(att->attnum, columns); - /* - * If no column list is provided, generated columns will be published only - * if include_gencols is true, while all non-generated columns will always - * be published. - */ + /* All non-generated columns are always published. */ return att->attgenerated ? include_gencols : true; } diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index 386b087f79..014454d67b 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -168,9 +168,8 @@ typedef struct RelationSyncEntry Bitmapset *columns; /* - * Include generated columns for publication is set to true if - * 'publish_generated_columns' parameter is true, and the relation - * contains generated columns. + * This is set if the 'publish_generated_columns' parameter is true, and + * the relation contains generated columns. */ bool include_gencols; @@ -1098,7 +1097,6 @@ pgoutput_column_list_init(PGOutputData *data, List *publications, * fetch_table_list. But one can later change the publication so we still * need to check all the given publication-table mappings and report an * error if any publications have a different column list. - * */ foreach(lc, publications) { @@ -1157,11 +1155,8 @@ pgoutput_column_list_init(PGOutputData *data, List *publications, if (!cols) { /* - * For the first publication with no specified column list, we - * retrieve and cache the table columns. This allows comparison - * with the column lists of other publications to detect any - * differences. Columns are retrieved only when there is more than - * one publication, as differences can only arise in that case. + * Cache the table columns for the first publication with no specified + * column list to detect publication with a different column list. */ if (!relcols && (list_length(publications) > 1)) { @@ -1187,8 +1182,8 @@ pgoutput_column_list_init(PGOutputData *data, List *publications, } /* loop all subscribed publications */ /* - * If no column list publications exist, columns will be selected later - * according to the 'publish_generated_columns' parameter. + * If no column list publications exist, columns to be published will be + * computed later according to the 'publish_generated_columns' parameter. */ if (!found_pub_with_collist) entry->columns = NULL;