On 18.06.25 07:49, Peter Smith wrote:
I'm also suggesting that "clean" or "cleanup" may be even better than
"drop". Because if you look at related tools such as pg_basebackup,
pg_receivewal, etc., the "create" and "drop" actions all happen on the
remote instance, but what we are talking about here happens on the local
(new) instance, so a slightly different term from those might be
appropriate. Moreover, "clean(up)" has a connotation "don't need it
anymore", which is fitting for this.
I am fine with changing the name to "clean" or "cleanup" as it has
some precedence as well but would like to see if Peter or David has
any opinion on this, as they were previously involved in naming this
option.
My original comment was only considering the resulting action so at
the time I felt "cleaning" publications made less sense to me than
just saying what was really happening ("dropping" the publications).
But I was not taking into account any precedent from other command
option names. So if "clean" is already a precedent, then I am fine
with calling this option clean too.
Here is a patch with a straight rename from --remove to --clean,
dropping the short option. I'm not planning to do anything about the
argument format.
From ca732064488a712fed58f362e1033e119a591b99 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Sun, 22 Jun 2025 17:42:29 +0200
Subject: [PATCH] pg_createsubscriber: Rename option --remove to --clean
After discussion, the name --remove was suboptimally chosen. --clean
has more precedent in other PostgreSQL tools.
---
doc/src/sgml/ref/pg_createsubscriber.sgml | 59 +++++++++----------
src/bin/pg_basebackup/pg_createsubscriber.c | 34 +++++------
.../t/040_pg_createsubscriber.pl | 6 +-
3 files changed, 49 insertions(+), 50 deletions(-)
diff --git a/doc/src/sgml/ref/pg_createsubscriber.sgml
b/doc/src/sgml/ref/pg_createsubscriber.sgml
index 4b1d08d5f16..bb9cc72576c 100644
--- a/doc/src/sgml/ref/pg_createsubscriber.sgml
+++ b/doc/src/sgml/ref/pg_createsubscriber.sgml
@@ -169,36 +169,6 @@ <title>Options</title>
</listitem>
</varlistentry>
- <varlistentry>
- <term><option>-R <replaceable
class="parameter">objtype</replaceable></option></term>
- <term><option>--remove=<replaceable
class="parameter">objtype</replaceable></option></term>
- <listitem>
- <para>
- Remove all objects of the specified type from specified databases on the
- target server.
- </para>
- <para>
- <itemizedlist>
- <listitem>
- <para>
- <literal>publications</literal>:
- The <literal>FOR ALL TABLES</literal> publications established for
this
- subscriber are always removed; specifying this object type causes all
- other publications replicated from the source server to be dropped as
- well.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- The objects selected to be dropped are individually logged, including
during
- a <option>--dry-run</option>. There is no opportunity to affect or
stop the
- dropping of the selected objects, so consider taking a backup of them
- using <application>pg_dump</application>.
- </para>
- </listitem>
- </varlistentry>
-
<varlistentry>
<term><option>-s <replaceable
class="parameter">dir</replaceable></option></term>
<term><option>--socketdir=<replaceable
class="parameter">dir</replaceable></option></term>
@@ -259,6 +229,35 @@ <title>Options</title>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><option>--clean=<replaceable
class="parameter">objtype</replaceable></option></term>
+ <listitem>
+ <para>
+ Drop all objects of the specified type from specified databases on the
+ target server.
+ </para>
+ <para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <literal>publications</literal>:
+ The <literal>FOR ALL TABLES</literal> publications established for
this
+ subscriber are always dropped; specifying this object type causes all
+ other publications replicated from the source server to be dropped as
+ well.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ The objects selected to be dropped are individually logged, including
during
+ a <option>--dry-run</option>. There is no opportunity to affect or
stop the
+ dropping of the selected objects, so consider taking a backup of them
+ using <application>pg_dump</application>.
+ </para>
+ </listitem>
+ </varlistentry>
+
<varlistentry>
<term><option>--config-file=<replaceable
class="parameter">filename</replaceable></option></term>
<listitem>
diff --git a/src/bin/pg_basebackup/pg_createsubscriber.c
b/src/bin/pg_basebackup/pg_createsubscriber.c
index c43c0cbbba5..11f71c03801 100644
--- a/src/bin/pg_basebackup/pg_createsubscriber.c
+++ b/src/bin/pg_basebackup/pg_createsubscriber.c
@@ -46,7 +46,7 @@ struct CreateSubscriberOptions
SimpleStringList replslot_names; /* list of replication slot
names */
int recovery_timeout; /* stop recovery after
this time */
bool all_dbs; /* all option */
- SimpleStringList objecttypes_to_remove; /* list of object types to
remove */
+ SimpleStringList objecttypes_to_clean; /* list of object types to
cleanup */
};
/* per-database publication/subscription info */
@@ -71,8 +71,8 @@ struct LogicalRepInfos
{
struct LogicalRepInfo *dbinfo;
bool two_phase; /* enable-two-phase option */
- bits32 objecttypes_to_remove; /* flags indicating which
object types
-
* to remove on subscriber */
+ bits32 objecttypes_to_clean; /* flags indicating which
object types
+
* to clean up on subscriber */
};
static void cleanup_objects_atexit(void);
@@ -253,13 +253,13 @@ usage(void)
printf(_(" -n, --dry-run dry run, just show what
would be done\n"));
printf(_(" -p, --subscriber-port=PORT subscriber port number
(default %s)\n"), DEFAULT_SUB_PORT);
printf(_(" -P, --publisher-server=CONNSTR publisher connection
string\n"));
- printf(_(" -R, --remove=OBJECTTYPE remove all objects of the
specified type from specified\n"
- " databases on the
subscriber; accepts: \"%s\"\n"), "publications");
printf(_(" -s, --socketdir=DIR socket directory to use
(default current dir.)\n"));
printf(_(" -t, --recovery-timeout=SECS seconds to wait for
recovery to end\n"));
printf(_(" -T, --enable-two-phase enable two-phase commit for
all subscriptions\n"));
printf(_(" -U, --subscriber-username=NAME user name for subscriber
connection\n"));
printf(_(" -v, --verbose output verbose
messages\n"));
+ printf(_(" --clean=OBJECTTYPE drop all objects of the
specified type from specified\n"
+ " databases on the
subscriber; accepts: \"%s\"\n"), "publications");
printf(_(" --config-file=FILENAME use specified main server
configuration\n"
" file when running
target cluster\n"));
printf(_(" --publication=NAME publication name\n"));
@@ -1730,7 +1730,7 @@ static void
check_and_drop_publications(PGconn *conn, struct LogicalRepInfo *dbinfo)
{
PGresult *res;
- bool drop_all_pubs = dbinfos.objecttypes_to_remove &
OBJECTTYPE_PUBLICATIONS;
+ bool drop_all_pubs = dbinfos.objecttypes_to_clean &
OBJECTTYPE_PUBLICATIONS;
Assert(conn != NULL);
@@ -2026,7 +2026,6 @@ main(int argc, char **argv)
{"dry-run", no_argument, NULL, 'n'},
{"subscriber-port", required_argument, NULL, 'p'},
{"publisher-server", required_argument, NULL, 'P'},
- {"remove", required_argument, NULL, 'R'},
{"socketdir", required_argument, NULL, 's'},
{"recovery-timeout", required_argument, NULL, 't'},
{"enable-two-phase", no_argument, NULL, 'T'},
@@ -2038,6 +2037,7 @@ main(int argc, char **argv)
{"publication", required_argument, NULL, 2},
{"replication-slot", required_argument, NULL, 3},
{"subscription", required_argument, NULL, 4},
+ {"clean", required_argument, NULL, 5},
{NULL, 0, NULL, 0}
};
@@ -2109,7 +2109,7 @@ main(int argc, char **argv)
get_restricted_token();
- while ((c = getopt_long(argc, argv, "ad:D:np:P:R:s:t:TU:v",
+ while ((c = getopt_long(argc, argv, "ad:D:np:P:s:t:TU:v",
long_options,
&option_index)) != -1)
{
switch (c)
@@ -2139,12 +2139,6 @@ main(int argc, char **argv)
case 'P':
opt.pub_conninfo_str = pg_strdup(optarg);
break;
- case 'R':
- if
(!simple_string_list_member(&opt.objecttypes_to_remove, optarg))
-
simple_string_list_append(&opt.objecttypes_to_remove, optarg);
- else
- pg_fatal("object type \"%s\" specified
more than once for -R/--remove", optarg);
- break;
case 's':
opt.socket_dir = pg_strdup(optarg);
canonicalize_path(opt.socket_dir);
@@ -2191,6 +2185,12 @@ main(int argc, char **argv)
else
pg_fatal("subscription \"%s\" specified
more than once for --subscription", optarg);
break;
+ case 5:
+ if
(!simple_string_list_member(&opt.objecttypes_to_clean, optarg))
+
simple_string_list_append(&opt.objecttypes_to_clean, optarg);
+ else
+ pg_fatal("object type \"%s\" specified
more than once for --clean", optarg);
+ break;
default:
/* getopt_long already emitted a complaint */
pg_log_error_hint("Try \"%s --help\" for more
information.", progname);
@@ -2334,13 +2334,13 @@ main(int argc, char **argv)
}
/* Verify the object types specified for removal from the subscriber */
- for (SimpleStringListCell *cell = opt.objecttypes_to_remove.head; cell;
cell = cell->next)
+ for (SimpleStringListCell *cell = opt.objecttypes_to_clean.head; cell;
cell = cell->next)
{
if (pg_strcasecmp(cell->val, "publications") == 0)
- dbinfos.objecttypes_to_remove |=
OBJECTTYPE_PUBLICATIONS;
+ dbinfos.objecttypes_to_clean |= OBJECTTYPE_PUBLICATIONS;
else
{
- pg_log_error("invalid object type \"%s\" specified for
-R/--remove", cell->val);
+ pg_log_error("invalid object type \"%s\" specified for
--clean", cell->val);
pg_log_error_hint("The valid value is: \"%s\"",
"publications");
exit(1);
}
diff --git a/src/bin/pg_basebackup/t/040_pg_createsubscriber.pl
b/src/bin/pg_basebackup/t/040_pg_createsubscriber.pl
index df4924023fd..229fef5b3b5 100644
--- a/src/bin/pg_basebackup/t/040_pg_createsubscriber.pl
+++ b/src/bin/pg_basebackup/t/040_pg_createsubscriber.pl
@@ -331,7 +331,7 @@ sub generate_db
$node_p->wait_for_replay_catchup($node_s);
# Create user-defined publications, wait for streaming replication to sync them
-# to the standby, then verify that '--remove'
+# to the standby, then verify that '--clean'
# removes them.
$node_p->safe_psql(
$db1, qq(
@@ -446,7 +446,7 @@ sub generate_db
# Run pg_createsubscriber on node S. --verbose is used twice
# to show more information.
# In passing, also test the --enable-two-phase option and
-# --remove option
+# --clean option
command_ok(
[
'pg_createsubscriber',
@@ -463,7 +463,7 @@ sub generate_db
'--database' => $db1,
'--database' => $db2,
'--enable-two-phase',
- '--remove' => 'publications',
+ '--clean' => 'publications',
],
'run pg_createsubscriber on node S');
--
2.50.0