From 718df54759fb4261c2bf6b02ee3a792ffc3f7eb8 Mon Sep 17 00:00:00 2001 From: "houzj.fnst" Date: Tue, 6 Sep 2022 15:20:13 +0800 Subject: [PATCH] Ignore dropped columns in pg_publication_tables Ignore dropped columns in pg_publication_tables. While on it, improve the query by removing the join-to-unnest business and putting the restriction in a WHERE clause on the pg_attribute scan. --- src/backend/catalog/system_views.sql | 10 +++++----- src/test/regress/expected/rules.out | 9 ++------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index 5a844b63a1..091912c4f1 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -370,11 +370,11 @@ CREATE VIEW pg_publication_tables AS N.nspname AS schemaname, C.relname AS tablename, ( SELECT array_agg(a.attname ORDER BY a.attnum) - FROM unnest(CASE WHEN GPT.attrs IS NOT NULL THEN GPT.attrs - ELSE (SELECT array_agg(g) FROM generate_series(1, C.relnatts) g) - END) k - JOIN pg_attribute a - ON (a.attrelid = GPT.relid AND a.attnum = k) + FROM pg_attribute a + WHERE a.attrelid = GPT.relid AND + NOT a.attisdropped AND + a.attnum > 0 AND + (a.attnum = ANY(GPT.attrs) OR GPT.attrs IS NULL) ) AS attnames, pg_get_expr(GPT.qual, GPT.relid) AS rowfilter FROM pg_publication P, diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index 7ec3d2688f..de87e707a8 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -1440,13 +1440,8 @@ pg_publication_tables| SELECT p.pubname, n.nspname AS schemaname, c.relname AS tablename, ( SELECT array_agg(a.attname ORDER BY a.attnum) AS array_agg - FROM (unnest( - CASE - WHEN (gpt.attrs IS NOT NULL) THEN (gpt.attrs)::integer[] - ELSE ( SELECT array_agg(g.g) AS array_agg - FROM generate_series(1, (c.relnatts)::integer) g(g)) - END) k(k) - JOIN pg_attribute a ON (((a.attrelid = gpt.relid) AND (a.attnum = k.k))))) AS attnames, + FROM pg_attribute a + WHERE ((a.attrelid = gpt.relid) AND (NOT a.attisdropped) AND (a.attnum > 0) AND ((a.attnum = ANY ((gpt.attrs)::smallint[])) OR (gpt.attrs IS NULL)))) 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.18.4