Re: Re: Add support for specifying tables in pg_createsubscriber. - Mailing list pgsql-hackers

From Peter Smith
Subject Re: Re: Add support for specifying tables in pg_createsubscriber.
Date
Msg-id CAHut+PspP4zbb6Q7pjHLUazX=kjWTuWdjOazjnY1tTRLZNq1Ug@mail.gmail.com
Whole thread Raw
In response to Re: Re: Add support for specifying tables in pg_createsubscriber.  (vignesh C <vignesh21@gmail.com>)
List pgsql-hackers
On Thu, Dec 4, 2025 at 1:56 PM vignesh C <vignesh21@gmail.com> wrote:
>
> On Thu, 4 Dec 2025 at 07:47, Peter Smith <smithpb2250@gmail.com> wrote:
> >
> > On Wed, Dec 3, 2025 at 4:47 PM tianbing <tian_bing_0531@163.com> wrote:
> > >
> > > Hi, Peter,
> > > I have reviewed the v21 patch and noticed that there seems to be a memory leak.
> > >
> > > +static bool
> > > +check_publication_exists(PGconn *conn, const char *pubname, const char *dbname)
> > > +{
> > > + PGresult *res;
> > > + bool exists;
> > > + char *query;
> > > +
> > > + query = psprintf("SELECT 1 FROM pg_publication WHERE pubname = %s",
> > > + PQescapeLiteral(conn, pubname, strlen(pubname)));
> > > + res = PQexec(conn, query);
> > > +
> > > + if (PQresultStatus(res) != PGRES_TUPLES_OK)
> > > + pg_fatal("could not check for publication \"%s\" in database \"%s\": %s",
> > > + pubname, dbname, PQerrorMessage(conn));
> > > +
> > > + exists = (PQntuples(res) == 1);
> > > +
> > > + PQclear(res);
> > > + pg_free(query);
> > > + return exists;
> > > +}
> > >
> > > The PQescapeLiteral() function through malloc to allocate memmory,and should be free by PQfreemem。
> > >
> > > I suggest making the following modifications:
> > >
> > > + char *pub = PQescapeLiteral(conn, pubname, strlen(pubname);
> > > + query = psprintf("SELECT 1 FROM pg_publication WHERE pubname = %s", pub);
> > > ......
> > > + PQfreemem(pub);
> > >
> >
> > Fixed in v22.
>
> I felt that instead of adding a new test case, let's try to combine
> with the existing test case, something like below:
> diff --git a/src/bin/pg_basebackup/t/040_pg_createsubscriber.pl
> b/src/bin/pg_basebackup/t/040_pg_createsubscriber.pl
> index e2a78f28c72..981da668507 100644
> --- a/src/bin/pg_basebackup/t/040_pg_createsubscriber.pl
> +++ b/src/bin/pg_basebackup/t/040_pg_createsubscriber.pl
> @@ -443,10 +443,14 @@ is(scalar(() = $stderr =~ /would create the
> replication slot/g),
>  is(scalar(() = $stderr =~ /would create subscription/g),
>         3, "verify subscriptions are created for all databases");
>
> +# Create user-defined publications.
> +$node_p->safe_psql($db2,
> +       "CREATE PUBLICATION test_pub_existing FOR TABLE tbl2");
> +
>  # Run pg_createsubscriber on node S.  --verbose is used twice
>  # to show more information.
> -# In passing, also test the --enable-two-phase option and
> -# --clean option
> +# In passing, also test the --enable-two-phase option,
> +# --clean option and specifying an existing publication test_pub_existing.
>  command_ok(
>         [
>                 'pg_createsubscriber',
> @@ -457,7 +461,7 @@ command_ok(
>                 '--socketdir' => $node_s->host,
>                 '--subscriber-port' => $node_s->port,
>                 '--publication' => 'pub1',
> -               '--publication' => 'pub2',
> +               '--publication' => 'test_pub_existing',
>                 '--replication-slot' => 'replslot1',
>                 '--replication-slot' => 'replslot2',
>                 '--database' => $db1,
> @@ -502,6 +506,17 @@ $result = $node_s->safe_psql(
>  ));
>  is($result, qq(0), 'pre-existing subscription was dropped');
>
> +# Get subscription names and publications
> +$result = $node_s->safe_psql(
> +       'postgres', qq(
> +    SELECT subname, subpublications FROM pg_subscription WHERE
> subname ~ '^pg_createsubscriber_'
> +));
> +like(
> +       $result,
> +       qr/^pg_createsubscriber_\d+_[0-9a-f]+ \|\{pub1\}\n
> +        pg_createsubscriber_\d+_[0-9a-f]+ \|\{test_pub_existing\}$/x,
> +       "Subscription and publication name are ok");
> +
>  # Get subscription names
>  $result = $node_s->safe_psql(
>         'postgres', qq(
>
> Thoughts?
>

Hi Vignesh.

OK. Done as suggested in v23.

Normally, I prefer to keep test cases more focused instead of mushing
lots of different test scenarios together. But in the interest of
reducing total the number of tests, I have removed that last --clean
test and combined it with the earlier ("in passing") --clean test as
suggested.

======
Kind Regards,
Peter Smith.
Fujitsu Australia

Attachment

pgsql-hackers by date:

Previous
From: Chao Li
Date:
Subject: Re: tuple radix sort
Next
From: John Naylor
Date:
Subject: Re: Support loser tree for k-way merge