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

Reply via email to