1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-07 00:36:50 +03:00

Fix new pg_publication_tables query.

The addition of published column names forgot to filter on attisdropped,
leading to cases where you could see "........pg.dropped.1........"
or the like as a reportedly-published column.

While we're here, rewrite the new subquery to get a more efficient plan
for it.

Hou Zhijie, per report from Jaime Casanova.  Back-patch to v15 where
the bug was introduced.  (Sadly, this means we need a post-beta4
catversion bump before beta4 has even hit the streets.  I see no
good alternative though.)

Discussion: https://postgr.es/m/Yxa1SU4nH2HfN3/i@ahch-to
This commit is contained in:
Tom Lane
2022-09-06 18:00:32 -04:00
parent 6e55ea79fa
commit e25631265a
3 changed files with 7 additions and 13 deletions

View File

@ -370,11 +370,10 @@ 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 a.attnum > 0 AND
NOT a.attisdropped 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,

View File

@ -53,6 +53,6 @@
*/
/* yyyymmddN */
#define CATALOG_VERSION_NO 202209011
#define CATALOG_VERSION_NO 202209061
#endif

View File

@ -1439,13 +1439,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 (a.attnum > 0) AND (NOT a.attisdropped) 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),