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;

Reply via email to