čt 14. 11. 2019 v 12:12 odesílatel vignesh C <vignes...@gmail.com> napsal:
> On Wed, Nov 13, 2019 at 8:05 PM Pavel Stehule <pavel.steh...@gmail.com> > wrote: > > > > > > > > st 13. 11. 2019 v 7:13 odesílatel Pavel Stehule <pavel.steh...@gmail.com> > napsal: > >> > >> > >> > >> st 13. 11. 2019 v 7:12 odesílatel Amit Kapila <amit.kapil...@gmail.com> > napsal: > >>> > >>> On Tue, Nov 12, 2019 at 11:17 AM Amit Kapila <amit.kapil...@gmail.com> > wrote: > >>> > > >>> > I am planning to commit this patch tomorrow unless I see more > comments > >>> > or interest from someone else to review this. > >>> > > >>> > >>> Pushed. Pavel, feel free to submit dropdb utility-related patch if > you want. > >> > >> > >> I hope I send this patch today. It's simply job. > > > > > > here it is. It's based on Filip Rembialkowski's patch if I remember > correctly > > > > Thanks for working on the patch. > Few minor comments: > + Force termination of connected backends before removing the > database. > + </para> > + <para> > + This will add the <literal>FORCE</literal> option to the > <literal>DROP > + DATABASE</literal> command sent to the server. > + </para> > > The above documentation can be changed similar to drop_database.sgml: > <para> > Attempt to terminate all existing connections to the target database. > It doesn't terminate if prepared transactions, active logical > replication > slots or subscriptions are present in the target database. > </para> > <para> > This will fail if the current user has no permissions to terminate > other > connections. Required permissions are the same as with > <literal>pg_terminate_backend</literal>, described in > <xref linkend="functions-admin-signal"/>. This will also fail if we > are not able to terminate connections. > </para> > > done > We can make the modification in the same location as earlier in the below > case: > - appendPQExpBuffer(&sql, "DROP DATABASE %s%s;", > - (if_exists ? "IF EXISTS " : ""), fmtId(dbname)); > - > /* Avoid trying to drop postgres db while we are connected to it. */ > if (maintenance_db == NULL && strcmp(dbname, "postgres") == 0) > maintenance_db = "template1"; > @@ -134,6 +136,12 @@ main(int argc, char *argv[]) > host, port, username, > prompt_password, > progname, echo); > > + /* now, only FORCE option can be used, so usage is very simple */ > + appendPQExpBuffer(&sql, "DROP DATABASE %s%s%s;", > + (if_exists ? "IF EXISTS " : ""), > + fmtId(dbname), > + force ? " WITH (FORCE)" : ""); > + > > done > We can slightly rephrase the below: > + printf(_(" -f, --force force termination of > connected backends\n")); > can be changed to: > + printf(_(" -f, --force terminate the existing > connections to the target database forcefully\n")); > the proposed text is too long - I changed the sentence, and any other can fix it > We can slightly rephrase the below: > + /* now, only FORCE option can be used, so usage is very simple */ > + appendPQExpBuffer(&sql, "DROP DATABASE %s%s%s;", > can be changed to: > + /* Generate drop db command using the options specified */ > + appendPQExpBuffer(&sql, "DROP DATABASE %s%s%s;", > I would to say, so generating is simple due only one supported option. If we support two or more options there, then the code should be more complex. I changed comment to /* Currently, only FORCE option is supported */ updated patch attached Thank you for review Pavel > Regards, > Vignesh > EnterpriseDB: http://www.enterprisedb.com >
diff --git a/doc/src/sgml/ref/dropdb.sgml b/doc/src/sgml/ref/dropdb.sgml index 3fbdb33716..63b90005b4 100644 --- a/doc/src/sgml/ref/dropdb.sgml +++ b/doc/src/sgml/ref/dropdb.sgml @@ -86,6 +86,27 @@ PostgreSQL documentation </listitem> </varlistentry> + <varlistentry> + <term><option>-f</option></term> + <term><option>--force</option></term> + <listitem> + <para> + Attempt to terminate all existing connections to the + target database. It doesn't terminate if prepared + transactions, active logical replication slots or + subscriptions are present in the target database. + </para> + <para> + This will fail if the current user has no permissions + to terminate other connections. Required permissions + are the same as with <literal>pg_terminate_backend</literal>, + described in <xref linkend="functions-admin-signal"/>. + This will also fail if we are not able to terminate + connections. + </para> + </listitem> + </varlistentry> + <varlistentry> <term><option>-V</option></term> <term><option>--version</option></term> diff --git a/src/bin/scripts/dropdb.c b/src/bin/scripts/dropdb.c index dacd8e5f1d..ea7e5d8f75 100644 --- a/src/bin/scripts/dropdb.c +++ b/src/bin/scripts/dropdb.c @@ -34,6 +34,7 @@ main(int argc, char *argv[]) {"interactive", no_argument, NULL, 'i'}, {"if-exists", no_argument, &if_exists, 1}, {"maintenance-db", required_argument, NULL, 2}, + {"force", no_argument, NULL, 'f'}, {NULL, 0, NULL, 0} }; @@ -49,6 +50,7 @@ main(int argc, char *argv[]) enum trivalue prompt_password = TRI_DEFAULT; bool echo = false; bool interactive = false; + bool force = false; PQExpBufferData sql; @@ -61,7 +63,7 @@ main(int argc, char *argv[]) handle_help_version_opts(argc, argv, "dropdb", help); - while ((c = getopt_long(argc, argv, "h:p:U:wWei", long_options, &optindex)) != -1) + while ((c = getopt_long(argc, argv, "h:p:U:wWeif", long_options, &optindex)) != -1) { switch (c) { @@ -86,6 +88,9 @@ main(int argc, char *argv[]) case 'i': interactive = true; break; + case 'f': + force = true; + break; case 0: /* this covers the long options */ break; @@ -123,8 +128,11 @@ main(int argc, char *argv[]) initPQExpBuffer(&sql); - appendPQExpBuffer(&sql, "DROP DATABASE %s%s;", - (if_exists ? "IF EXISTS " : ""), fmtId(dbname)); + /* Currently, only FORCE option is supported */ + appendPQExpBuffer(&sql, "DROP DATABASE %s%s%s;", + (if_exists ? "IF EXISTS " : ""), + fmtId(dbname), + force ? " WITH (FORCE)" : ""); /* Avoid trying to drop postgres db while we are connected to it. */ if (maintenance_db == NULL && strcmp(dbname, "postgres") == 0) @@ -159,6 +167,7 @@ help(const char *progname) printf(_("\nOptions:\n")); printf(_(" -e, --echo show the commands being sent to the server\n")); printf(_(" -i, --interactive prompt before deleting anything\n")); + printf(_(" -f, --force try to terminate other connection before\n")); printf(_(" -V, --version output version information, then exit\n")); printf(_(" --if-exists don't report error if database doesn't exist\n")); printf(_(" -?, --help show this help, then exit\n")); diff --git a/src/bin/scripts/t/050_dropdb.pl b/src/bin/scripts/t/050_dropdb.pl index 25aa54a4ae..c51babe093 100644 --- a/src/bin/scripts/t/050_dropdb.pl +++ b/src/bin/scripts/t/050_dropdb.pl @@ -3,7 +3,7 @@ use warnings; use PostgresNode; use TestLib; -use Test::More tests => 11; +use Test::More tests => 13; program_help_ok('dropdb'); program_version_ok('dropdb'); @@ -19,5 +19,11 @@ $node->issues_sql_like( qr/statement: DROP DATABASE foobar1/, 'SQL DROP DATABASE run'); +$node->safe_psql('postgres', 'CREATE DATABASE foobar2'); +$node->issues_sql_like( + [ 'dropdb', '--force', 'foobar2' ], + qr/statement: DROP DATABASE foobar2 WITH \(FORCE\);/, + 'SQL DROP DATABASE (FORCE) run'); + $node->command_fails([ 'dropdb', 'nonexistent' ], 'fails with nonexistent database');