From 5b352d8e127b695ab6facf92dbd6af47038d54e3 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan <andrew@dunslane.net> Date: Tue, 22 Nov 2005 15:24:18 +0000 Subject: [PATCH] DROP DATABASE IF EXISTS variant --- doc/src/sgml/ref/drop_database.sgml | 14 ++++++++++++-- src/backend/commands/dbcommands.c | 22 +++++++++++++++++++--- src/backend/nodes/copyfuncs.c | 3 ++- src/backend/nodes/equalfuncs.c | 3 ++- src/backend/parser/gram.y | 12 ++++++++++-- src/backend/tcop/utility.c | 4 ++-- src/include/commands/dbcommands.h | 4 ++-- src/include/nodes/parsenodes.h | 3 ++- 8 files changed, 51 insertions(+), 14 deletions(-) diff --git a/doc/src/sgml/ref/drop_database.sgml b/doc/src/sgml/ref/drop_database.sgml index 6a51ec356f9..ee63c11815a 100644 --- a/doc/src/sgml/ref/drop_database.sgml +++ b/doc/src/sgml/ref/drop_database.sgml @@ -1,5 +1,5 @@ <!-- -$PostgreSQL: pgsql/doc/src/sgml/ref/drop_database.sgml,v 1.20 2005/06/21 04:02:31 tgl Exp $ +$PostgreSQL: pgsql/doc/src/sgml/ref/drop_database.sgml,v 1.21 2005/11/22 15:24:17 adunstan Exp $ PostgreSQL documentation --> @@ -20,7 +20,7 @@ PostgreSQL documentation <refsynopsisdiv> <synopsis> -DROP DATABASE <replaceable class="PARAMETER">name</replaceable> +DROP DATABASE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable> </synopsis> </refsynopsisdiv> @@ -45,6 +45,16 @@ DROP DATABASE <replaceable class="PARAMETER">name</replaceable> <title>Parameters</title> <variablelist> + <varlistentry> + <term><literal>IF EXISTS</literal></term> + <listitem> + <para> + Do not throw an error if the database does not exist. A notice is issued + in this case. + </para> + </listitem> + </varlistentry> + <varlistentry> <term><replaceable class="PARAMETER">name</replaceable></term> <listitem> diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index accbafc8486..119e525d7cd 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -15,7 +15,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.173 2005/10/15 02:49:15 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.174 2005/11/22 15:24:17 adunstan Exp $ * *------------------------------------------------------------------------- */ @@ -551,7 +551,7 @@ createdb(const CreatedbStmt *stmt) * DROP DATABASE */ void -dropdb(const char *dbname) +dropdb(const char *dbname, bool missing_ok) { Oid db_id; bool db_istemplate; @@ -585,9 +585,25 @@ dropdb(const char *dbname) if (!get_db_info(dbname, &db_id, NULL, NULL, &db_istemplate, NULL, NULL, NULL, NULL, NULL)) - ereport(ERROR, + { + if (! missing_ok) + { + ereport(ERROR, (errcode(ERRCODE_UNDEFINED_DATABASE), errmsg("database \"%s\" does not exist", dbname))); + } + else + { + + /* Close pg_database, release the lock, since we changed nothing */ + heap_close(pgdbrel, ExclusiveLock); + ereport(NOTICE, + (errmsg("database \"%s\" does not exist, skipping", + dbname))); + + return; + } + } if (!pg_database_ownercheck(db_id, GetUserId())) aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_DATABASE, diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index bfce72b4057..4dcfbd02ff2 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -15,7 +15,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.319 2005/11/21 12:49:31 alvherre Exp $ + * $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.320 2005/11/22 15:24:17 adunstan Exp $ * *------------------------------------------------------------------------- */ @@ -2261,6 +2261,7 @@ _copyDropdbStmt(DropdbStmt *from) DropdbStmt *newnode = makeNode(DropdbStmt); COPY_STRING_FIELD(dbname); + COPY_SCALAR_FIELD(missing_ok); return newnode; } diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index fa27e5871b9..ee80712dfc5 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -18,7 +18,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.256 2005/11/21 12:49:31 alvherre Exp $ + * $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.257 2005/11/22 15:24:17 adunstan Exp $ * *------------------------------------------------------------------------- */ @@ -1188,6 +1188,7 @@ static bool _equalDropdbStmt(DropdbStmt *a, DropdbStmt *b) { COMPARE_STRING_FIELD(dbname); + COMPARE_SCALAR_FIELD(missing_ok); return true; } diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 15b079ca6ff..90c0fd3d544 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.514 2005/11/21 12:49:31 alvherre Exp $ + * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.515 2005/11/22 15:24:17 adunstan Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -4698,7 +4698,7 @@ alterdb_opt_item: /***************************************************************************** * - * DROP DATABASE + * DROP DATABASE [ IF EXISTS ] * * This is implicitly CASCADE, no need for drop behavior *****************************************************************************/ @@ -4707,6 +4707,14 @@ DropdbStmt: DROP DATABASE database_name { DropdbStmt *n = makeNode(DropdbStmt); n->dbname = $3; + n->missing_ok = FALSE; + $$ = (Node *)n; + } + | DROP DATABASE IF_P EXISTS database_name + { + DropdbStmt *n = makeNode(DropdbStmt); + n->dbname = $5; + n->missing_ok = TRUE; $$ = (Node *)n; } ; diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index a17021eb291..7ad06baf517 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.247 2005/11/21 12:49:32 alvherre Exp $ + * $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.248 2005/11/22 15:24:18 adunstan Exp $ * *------------------------------------------------------------------------- */ @@ -840,7 +840,7 @@ ProcessUtility(Node *parsetree, { DropdbStmt *stmt = (DropdbStmt *) parsetree; - dropdb(stmt->dbname); + dropdb(stmt->dbname, stmt->missing_ok); } break; diff --git a/src/include/commands/dbcommands.h b/src/include/commands/dbcommands.h index 9c629aff342..bd5511325ca 100644 --- a/src/include/commands/dbcommands.h +++ b/src/include/commands/dbcommands.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/commands/dbcommands.h,v 1.42 2005/10/15 02:49:44 momjian Exp $ + * $PostgreSQL: pgsql/src/include/commands/dbcommands.h,v 1.43 2005/11/22 15:24:18 adunstan Exp $ * *------------------------------------------------------------------------- */ @@ -53,7 +53,7 @@ typedef struct xl_dbase_drop_rec } xl_dbase_drop_rec; extern void createdb(const CreatedbStmt *stmt); -extern void dropdb(const char *dbname); +extern void dropdb(const char *dbname, bool missing_ok); extern void RenameDatabase(const char *oldname, const char *newname); extern void AlterDatabase(AlterDatabaseStmt *stmt); extern void AlterDatabaseSet(AlterDatabaseSetStmt *stmt); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index a482abfb351..f2d00b593e4 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.294 2005/11/21 12:49:32 alvherre Exp $ + * $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.295 2005/11/22 15:24:18 adunstan Exp $ * *------------------------------------------------------------------------- */ @@ -1672,6 +1672,7 @@ typedef struct DropdbStmt { NodeTag type; char *dbname; /* database to drop */ + bool missing_ok; /* skip error if db is missing? */ } DropdbStmt; /* ---------------------- -- GitLab