RE: row filtering for logical replication

From: "houzj(dot)fnst(at)fujitsu(dot)com" <houzj(dot)fnst(at)fujitsu(dot)com>
To: Peter Smith <smithpb2250(at)gmail(dot)com>
Cc: Amit Kapila <amit(dot)kapila16(at)gmail(dot)com>, Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, Euler Taveira <euler(at)eulerto(dot)com>, Greg Nancarrow <gregn4422(at)gmail(dot)com>, vignesh C <vignesh21(at)gmail(dot)com>, Ajin Cherian <itsajin(at)gmail(dot)com>, "tanghy(dot)fnst(at)fujitsu(dot)com" <tanghy(dot)fnst(at)fujitsu(dot)com>, Dilip Kumar <dilipbalaut(at)gmail(dot)com>, Rahila Syed <rahilasyed90(at)gmail(dot)com>, Peter Eisentraut <peter(dot)eisentraut(at)enterprisedb(dot)com>, Önder Kalacı <onderkalaci(at)gmail(dot)com>, japin <japinli(at)hotmail(dot)com>, Michael Paquier <michael(at)paquier(dot)xyz>, David Steele <david(at)pgmasters(dot)net>, Craig Ringer <craig(at)2ndquadrant(dot)com>, Amit Langote <amitlangote09(at)gmail(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: RE: row filtering for logical replication
Date: 2022-01-26 01:42:36
Message-ID: OS0PR01MB5716BFE16C6F617CF2685B4494209@OS0PR01MB5716.jpnprd01.prod.outlook.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Tuesday, January 25, 2022 1:55 PM Peter Smith <smithpb2250(at)gmail(dot)com> wrote:
>
> A couple more comments for the v69-0001 TAP tests.
>

Thanks for the comments!

>
> 1. src/test/subscription/t/027_row_filter.pl
>
> +# The subscription of the ALL TABLES IN SCHEMA publication means
> there should be
> +# no filtering on the tablesync COPY, so all expect all 5 will be present.
> +$result = $node_subscriber->safe_psql('postgres', "SELECT count(x)
> FROM schema_rf_x.tab_rf_x");
> +is($result, qq(5), 'check initial data copy from table tab_rf_x
> should not be filtered');
> +
> +# Similarly, normal filtering after the initial phase will also have
> not effect.
> +# Expected:
> +# tab_rf_x : 5 initial rows + 2 new rows = 7 rows
> +# tab_rf_partition : 1 initial row + 1 new row = 2 rows
> +$node_publisher->safe_psql('postgres', "INSERT INTO
> schema_rf_x.tab_rf_x (x) VALUES (-99), (99)");
> +$node_publisher->safe_psql('postgres', "INSERT INTO
> schema_rf_x.tab_rf_partitioned (x) VALUES (5), (25)");
> +$node_publisher->wait_for_catchup($appname);
> +$result = $node_subscriber->safe_psql('postgres', "SELECT count(x)
> FROM schema_rf_x.tab_rf_x");
> +is($result, qq(7), 'check table tab_rf_x should not be filtered');
> +$result = $node_subscriber->safe_psql('postgres', "SELECT * FROM
> public.tab_rf_partition");
> +is($result, qq(20
> +25), 'check table tab_rf_partition should be filtered');
>
> That comment ("Similarly, normal filtering after the initial phase will also have
> not effect.") seems no good:
> - it is too vague for the tab_rf_x tablesync
> - it seems completely wrong for the tab_rf_partition table (because that filter is
> working fine)
>
> I'm not sure exactly what the comment should say, but possibly something like
> this (??):
>
> BEFORE:
> Similarly, normal filtering after the initial phase will also have not effect.
> AFTER:
> Similarly, the table filter for tab_rf_x (after the initial phase) has no effect when
> combined with the ALL TABLES IN SCHEMA. Meanwhile, the filter for the
> tab_rf_partition does work because that partition belongs to a different
> schema (and publish_via_partition_root = false).
>

Thanks, I think your change looks good. Changed.

>
> 2. src/test/subscription/t/027_row_filter.pl
>
> Here is a 2nd place with the same broken comment:
>
> +# The subscription of the FOR ALL TABLES publication means there should
> +be no # filtering on the tablesync COPY, so all expect all 5 will be present.
> +my $result = $node_subscriber->safe_psql('postgres', "SELECT count(x)
> FROM tab_rf_x");
> +is($result, qq(5), 'check initial data copy from table tab_rf_x
> should not be filtered');
> +
> +# Similarly, normal filtering after the initial phase will also have
> not effect.
> +# Expected: 5 initial rows + 2 new rows = 7 rows
> +$node_publisher->safe_psql('postgres', "INSERT INTO tab_rf_x (x)
> VALUES (-99), (99)");
> +$node_publisher->wait_for_catchup($appname);
> +$result = $node_subscriber->safe_psql('postgres', "SELECT count(x)
> FROM tab_rf_x");
> +is($result, qq(7), 'check table tab_rf_x should not be filtered');
>
> Here I also think the comment maybe should just say something like:
>
> BEFORE:
> Similarly, normal filtering after the initial phase will also have not effect.
> AFTER:
> Similarly, the table filter for tab_rf_x (after the initial phase) has no effect when
> combined with the ALL TABLES IN SCHEMA.

Changed.

Attach the V71 patch set which addressed the above comments.
The patch also includes the changes:
- Changed the function RelationBuildPublicationDesc's signature to be void and
pass the PublicationDesc* from stack instead of palloc-ing it. [1]
- Removed the Push/Pop ActiveSnapshot related code. IIRC, these functions are
needed when we execute functions which will execute SQL(via SPI functions) to
access the database. I think we don't need the ActiveSnapshot for now as we
only support built-in immutable in the row filter which should only use the
argument values passed to the function.
- Adjusted some comments in pgoutput.c.

[1] https://www.postgresql.org/message-id/CAHut%2BPsRTtXoYQiRqxwvyrcmkDMm-kR4GkvD9-nAqNrk4A3aCQ%40mail.gmail.com

Best regards,
Hou zj

Attachment Content-Type Size
v71-0002-Row-filter-tab-auto-complete-and-pgdump.patch application/octet-stream 6.0 KB
v71-0001-Allow-specifying-row-filters-for-logical-replication.patch application/octet-stream 155.9 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message tanghy.fnst@fujitsu.com 2022-01-26 01:46:01 RE: Support tab completion for upper character inputs in psql
Previous Message Michael Paquier 2022-01-26 01:29:29 Re: refactoring basebackup.c