diff --git a/doc/src/sgml/ref/drop_database.sgml b/doc/src/sgml/ref/drop_database.sgml index 6a51ec356f9f51194fa9948712f3213c3aae039f..ee63c11815aabc30219e22eb6e23c19159cb423f 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 accbafc84865c8f7984e61e4271f15be7ba23b70..119e525d7cd87c9b00f96b1df19a3c838fd96cfa 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 bfce72b4057bde211d0786a8c3ef15ed39fd6141..4dcfbd02ff2f9ac7428377c674df478d7ddabed4 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 fa27e5871b986a06ee9cd74cd6175d4db4c49bde..ee80712dfc5d34f4fde5cf2d72d829005337b026 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 15b079ca6ff417aa2c0eb734ef272b8a9ebb229b..90c0fd3d544d9c20fc383481cd88807c09d38345 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 a17021eb2916550000bf24d7112652eb31b909d5..7ad06baf51788a9999fb634186695bdf41dd47a7 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 9c629aff34207519c5024f93994e4c28e81ee763..bd5511325ca5e6322ea8ae14c9ff53f9c548fc06 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 a482abfb351e9c5d64605a34a9944e568e63117c..f2d00b593e4e4450a3ec35f706e130cae72ef31f 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; /* ----------------------