RE: Data is copied twice when specifying both child and parent table in publication

From: "shiy(dot)fnst(at)fujitsu(dot)com" <shiy(dot)fnst(at)fujitsu(dot)com>
To: "wangw(dot)fnst(at)fujitsu(dot)com" <wangw(dot)fnst(at)fujitsu(dot)com>, Amit Kapila <amit(dot)kapila16(at)gmail(dot)com>
Cc: "houzj(dot)fnst(at)fujitsu(dot)com" <houzj(dot)fnst(at)fujitsu(dot)com>, Amit Langote <amitlangote09(at)gmail(dot)com>, Peter Eisentraut <peter(dot)eisentraut(at)enterprisedb(dot)com>, "pgsql-hackers(at)lists(dot)postgresql(dot)org" <pgsql-hackers(at)lists(dot)postgresql(dot)org>, Dilip Kumar <dilipbalaut(at)gmail(dot)com>, Greg Nancarrow <gregn4422(at)gmail(dot)com>, vignesh C <vignesh21(at)gmail(dot)com>
Subject: RE: Data is copied twice when specifying both child and parent table in publication
Date: 2022-04-28 01:22:13
Message-ID: OSZPR01MB631098CBD1208A4B5A2241E1FDFD9@OSZPR01MB6310.jpnprd01.prod.outlook.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Sun, Apr 24, 2022 2:16 PM Wang, Wei/王 威 <wangw(dot)fnst(at)fujitsu(dot)com> wrote:
>
> Attach the new patches.[suggestions by Amit-San]
> The patch for HEAD:
> 1. Add a new function to get tables info by a publications array.
> The patch for REL14:
> 1. Use an alias to make the statement understandable. BTW, I adjusted the
> alignment.
> 2. Improve the test cast about the column list and row filter to cover this bug.
>

Thanks for your patches.

Here's a comment on the patch for REL14.

+ appendStringInfo(&cmd, "SELECT DISTINCT ns.nspname, c.relname\n"
+ " FROM pg_catalog.pg_publication_tables t\n"
+ " JOIN pg_catalog.pg_namespace ns\n"
+ " ON ns.nspname = t.schemaname\n"
+ " JOIN pg_catalog.pg_class c\n"
+ " ON c.relname = t.tablename AND c.relnamespace = ns.oid\n"
+ " WHERE t.pubname IN (%s)\n"
+ " AND (c.relispartition IS FALSE\n"
+ " OR NOT EXISTS\n"
+ " ( SELECT 1 FROM pg_partition_ancestors(c.oid) as relid\n"
+ " WHERE relid IN\n"
+ " (SELECT DISTINCT (schemaname || '.' || tablename)::regclass::oid\n"
+ " FROM pg_catalog.pg_publication_tables t\n"
+ " WHERE t.pubname IN (%s))\n"
+ " AND relid != c.oid))\n",
+ pub_names.data, pub_names.data);

I think we can use an alias like 'pa' for pg_partition_ancestors, and modify the SQL as follows.

+ appendStringInfo(&cmd, "SELECT DISTINCT ns.nspname, c.relname\n"
+ " FROM pg_catalog.pg_publication_tables t\n"
+ " JOIN pg_catalog.pg_namespace ns\n"
+ " ON ns.nspname = t.schemaname\n"
+ " JOIN pg_catalog.pg_class c\n"
+ " ON c.relname = t.tablename AND c.relnamespace = ns.oid\n"
+ " WHERE t.pubname IN (%s)\n"
+ " AND (c.relispartition IS FALSE\n"
+ " OR NOT EXISTS\n"
+ " ( SELECT 1 FROM pg_partition_ancestors(c.oid) pa\n"
+ " WHERE pa.relid IN\n"
+ " (SELECT DISTINCT (t.schemaname || '.' || t.tablename)::regclass::oid\n"
+ " FROM pg_catalog.pg_publication_tables t\n"
+ " WHERE t.pubname IN (%s))\n"
+ " AND pa.relid != c.oid))\n",
+ pub_names.data, pub_names.data);

Regards,
Shi yu

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Andres Freund 2022-04-28 01:26:34 Re: Unstable tests for recovery conflict handling
Previous Message Euler Taveira 2022-04-28 00:27:08 trivial comment fix