From 6ce035ffff444479e63ea6276d56e33cc8b991d9 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Mon, 8 Jun 2026 12:19:29 +0530 Subject: [PATCH] pg_createsubscriber: Fix duplicate publication name rejection. pg_createsubscriber rejected duplicate --publication values while parsing command-line options, even when the duplicate names referred to publications in different databases. Since publication names are database-local objects, the same name is perfectly valid across multiple databases. This restriction was not a practical problem before commit 85ddcc2f4c, which added support for reusing pre-existing publications. After that change, users who have identically-named publications in multiple databases (a common convention) could not use the feature without renaming their publications. The analogous restriction on --subscription names is intentionally kept as they are reused as replication slot names, which are cluster-global, so allowing duplicate subscription names without additional guards could cause a slot-name collision. That work is left for a future release. Author: Chao Li Reviewed-by: Shlok Kyal Reviewed-by: Amit Kapila Reviewed-by: Hayato Kuroda Discussion: https://postgr.es/m/B08A7C89-B3DE-4C1D-A671-32AD8BAB7E22@gmail.com --- src/bin/pg_basebackup/pg_createsubscriber.c | 9 ++------- .../t/040_pg_createsubscriber.pl | 19 ++++--------------- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/src/bin/pg_basebackup/pg_createsubscriber.c b/src/bin/pg_basebackup/pg_createsubscriber.c index cb16a608002..4d705778454 100644 --- a/src/bin/pg_basebackup/pg_createsubscriber.c +++ b/src/bin/pg_basebackup/pg_createsubscriber.c @@ -2381,13 +2381,8 @@ main(int argc, char **argv) opt.config_file = pg_strdup(optarg); break; case 2: - if (!simple_string_list_member(&opt.pub_names, optarg)) - { - simple_string_list_append(&opt.pub_names, optarg); - num_pubs++; - } - else - pg_fatal("publication \"%s\" specified more than once for --publication", optarg); + simple_string_list_append(&opt.pub_names, optarg); + num_pubs++; break; case 3: if (!simple_string_list_member(&opt.replslot_names, optarg)) diff --git a/src/bin/pg_basebackup/t/040_pg_createsubscriber.pl b/src/bin/pg_basebackup/t/040_pg_createsubscriber.pl index 858082c70df..9252d1c3c5c 100644 --- a/src/bin/pg_basebackup/t/040_pg_createsubscriber.pl +++ b/src/bin/pg_basebackup/t/040_pg_createsubscriber.pl @@ -67,18 +67,6 @@ command_fails( '--database' => 'pg1', ], 'duplicate database name'); -command_fails( - [ - 'pg_createsubscriber', - '--verbose', - '--pgdata' => $datadir, - '--publisher-server' => 'port=5432', - '--publication' => 'foo1', - '--publication' => 'foo1', - '--database' => 'pg1', - '--database' => 'pg2', - ], - 'duplicate publication name'); command_fails( [ 'pg_createsubscriber', @@ -346,7 +334,8 @@ is($node_s->safe_psql($db1, "SELECT COUNT(*) FROM pg_publication"), $node_s->stop; -# dry run mode on node S +# dry run mode on node S. Use the same publication name for different +# databases, since publication names are database-local. command_ok( [ 'pg_createsubscriber', @@ -357,8 +346,8 @@ command_ok( '--publisher-server' => $node_p->connstr($db1), '--socketdir' => $node_s->host, '--subscriber-port' => $node_s->port, - '--publication' => 'pub1', - '--publication' => 'pub2', + '--publication' => 'same_pub', + '--publication' => 'same_pub', '--subscription' => 'sub1', '--subscription' => 'sub2', '--database' => $db1,