Fix new pg_publication_tables query.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 6 Sep 2022 22:00:32 +0000 (18:00 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 6 Sep 2022 22:00:32 +0000 (18:00 -0400)
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

src/backend/catalog/system_views.sql
src/include/catalog/catversion.h
src/test/regress/expected/rules.out

index 5a844b63a1c6ca76384a152ccaba4a452876cae0..55f7ec79e052c05454c43288204425bd325f9fdc 100644 (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,
index 78d25036b351a7d77113d124e6627ad96f4f3a81..c6a82d679b128bb7b6b58b7b3ee11060265c573a 100644 (file)
@@ -57,6 +57,6 @@
  */
 
 /*                         yyyymmddN */
-#define CATALOG_VERSION_NO 202209011
+#define CATALOG_VERSION_NO 202209062
 
 #endif
index 7ec3d2688f04b77c28bcde28124e79d26c3ba52d..9dd137415e867beb8b799a3cda6ff253a094ec1d 100644 (file)
@@ -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 (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),