diff options
author | Amit Kapila <akapila@postgresql.org> | 2023-01-13 14:49:23 +0530 |
---|---|---|
committer | Amit Kapila <akapila@postgresql.org> | 2023-01-13 14:49:23 +0530 |
commit | b7ae03953690a1dee455ba3823cc8f71a72cbe1d (patch) | |
tree | c427ef729c28f708b01a5b56536509c0f570d280 /src/backend/replication/pgoutput/pgoutput.c | |
parent | dca8b01f5f1f7c83c59a16393724fbd8a29ddecb (diff) | |
download | postgresql-b7ae03953690a1dee455ba3823cc8f71a72cbe1d.tar.gz postgresql-b7ae03953690a1dee455ba3823cc8f71a72cbe1d.zip |
Ignore dropped and generated columns from the column list.
We don't allow different column lists for the same table in the different
publications of the single subscription. A publication with a column list
except for dropped and generated columns should be considered the same as
a publication with no column list (which implicitly includes all columns
as part of the columns list). However, as we were not excluding the
dropped and generated columns from the column list combining such
publications leads to an error "cannot use different column lists for
table ...".
We decided not to backpatch this fix as there is a risk of users seeing
this as a behavior change and also we didn't see any field report of this
case.
Author: Shi yu
Reviewed-by: Amit Kapila
Discussion: https://postgr.es/m/OSZPR01MB631091CCBC56F195B1B9ACB0FDFE9@OSZPR01MB6310.jpnprd01.prod.outlook.com
Diffstat (limited to 'src/backend/replication/pgoutput/pgoutput.c')
-rw-r--r-- | src/backend/replication/pgoutput/pgoutput.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index 19c10c028f9..1a80d67bb9c 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -1058,16 +1058,31 @@ pgoutput_column_list_init(PGOutputData *data, List *publications, /* Build the column list bitmap in the per-entry context. */ if (!pub_no_list) /* when not null */ { + int i; + int nliveatts = 0; + TupleDesc desc = RelationGetDescr(relation); + pgoutput_ensure_entry_cxt(data, entry); cols = pub_collist_to_bitmapset(cols, cfdatum, entry->entry_cxt); + /* Get the number of live attributes. */ + for (i = 0; i < desc->natts; i++) + { + Form_pg_attribute att = TupleDescAttr(desc, i); + + if (att->attisdropped || att->attgenerated) + continue; + + nliveatts++; + } + /* * If column list includes all the columns of the table, * set it to NULL. */ - if (bms_num_members(cols) == RelationGetNumberOfAttributes(relation)) + if (bms_num_members(cols) == nliveatts) { bms_free(cols); cols = NULL; |