From 6217d7a09c893a00760017191602cb89eb0747df Mon Sep 17 00:00:00 2001 From: Shi Yu Date: Mon, 9 Jan 2023 14:24:34 +0800 Subject: [PATCH v1 1/2] Modify pg_get_publication_tables() to show all columns when no column list is specified. Modify function pg_get_publication_tables() to contain all supported columns if no column list is specified. This fixes the problem that pg_publication_tables's column "attnames" contains generated columns. --- src/backend/catalog/pg_publication.c | 30 +++++++++++++++++++++ src/backend/catalog/system_views.sql | 5 ++-- src/backend/replication/logical/tablesync.c | 7 +---- src/test/regress/expected/rules.out | 2 +- 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 9571c669f7..e340bfacad 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -1153,6 +1153,36 @@ pg_get_publication_tables(PG_FUNCTION_ARGS) nulls[2] = true; } + /* If column list attribute is null, show all columns. */ + if (nulls[1] == true) + { + Relation rel = table_open(relid, AccessShareLock); + int nattnums = 0; + int16 *attnums; + TupleDesc desc = RelationGetDescr(rel); + int i; + + attnums = (int16 *) palloc(desc->natts * sizeof(int16)); + + for (i = 0; i < desc->natts; i++) + { + Form_pg_attribute att = TupleDescAttr(desc, i); + + if (att->attisdropped || att->attgenerated) + continue; + + attnums[nattnums++] = att->attnum; + } + + if (nattnums > 0) + { + values[1] = PointerGetDatum(buildint2vector(attnums, nattnums)); + nulls[1] = false; + } + + table_close(rel, AccessShareLock); + } + rettuple = heap_form_tuple(funcctx->tuple_desc, values, nulls); SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(rettuple)); diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index 447c9b970f..d2a8c82900 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -371,9 +371,8 @@ CREATE VIEW pg_publication_tables AS C.relname AS tablename, ( SELECT array_agg(a.attname ORDER BY a.attnum) FROM pg_attribute a - WHERE a.attrelid = GPT.relid AND a.attnum > 0 AND - NOT a.attisdropped AND - (a.attnum = ANY(GPT.attrs) OR GPT.attrs IS NULL) + WHERE a.attrelid = GPT.relid AND + a.attnum = ANY(GPT.attrs) ) AS attnames, pg_get_expr(GPT.qual, GPT.relid) AS rowfilter FROM pg_publication P, diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index 38dfce7129..73be457c7b 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -832,9 +832,7 @@ fetch_remote_table_info(char *nspname, char *relname, */ resetStringInfo(&cmd); appendStringInfo(&cmd, - "SELECT DISTINCT" - " (CASE WHEN (array_length(gpt.attrs, 1) = c.relnatts)" - " THEN NULL ELSE gpt.attrs END)" + "SELECT DISTINCT gpt.attrs" " FROM pg_publication p," " LATERAL pg_get_publication_tables(p.pubname) gpt," " pg_class c" @@ -868,9 +866,6 @@ fetch_remote_table_info(char *nspname, char *relname, /* * Get the column list and build a single bitmap with the attnums. - * - * If we find a NULL value, it means all the columns should be - * replicated. */ tslot = MakeSingleTupleTableSlot(pubres->tupledesc, &TTSOpsMinimalTuple); if (tuplestore_gettupleslot(pubres->tuplestore, true, false, tslot)) diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index fb9f936d43..a969ae63eb 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -1446,7 +1446,7 @@ pg_publication_tables| SELECT p.pubname, c.relname AS tablename, ( SELECT array_agg(a.attname ORDER BY a.attnum) AS array_agg FROM pg_attribute a - WHERE ((a.attrelid = gpt.relid) AND (a.attnum > 0) AND (NOT a.attisdropped) AND ((a.attnum = ANY ((gpt.attrs)::smallint[])) OR (gpt.attrs IS NULL)))) AS attnames, + WHERE ((a.attrelid = gpt.relid) AND (a.attnum = ANY ((gpt.attrs)::smallint[])))) AS attnames, pg_get_expr(gpt.qual, gpt.relid) AS rowfilter FROM pg_publication p, LATERAL pg_get_publication_tables((p.pubname)::text) gpt(relid, attrs, qual), -- 2.31.1