]> granicus.if.org Git - postgresql/commitdiff
DROP DATABASE IF EXISTS variant
authorAndrew Dunstan <andrew@dunslane.net>
Tue, 22 Nov 2005 15:24:18 +0000 (15:24 +0000)
committerAndrew Dunstan <andrew@dunslane.net>
Tue, 22 Nov 2005 15:24:18 +0000 (15:24 +0000)
doc/src/sgml/ref/drop_database.sgml
src/backend/commands/dbcommands.c
src/backend/nodes/copyfuncs.c
src/backend/nodes/equalfuncs.c
src/backend/parser/gram.y
src/backend/tcop/utility.c
src/include/commands/dbcommands.h
src/include/nodes/parsenodes.h

index 6a51ec356f9f51194fa9948712f3213c3aae039f..ee63c11815aabc30219e22eb6e23c19159cb423f 100644 (file)
@@ -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>
index accbafc84865c8f7984e61e4271f15be7ba23b70..119e525d7cd87c9b00f96b1df19a3c838fd96cfa 100644 (file)
@@ -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,
index bfce72b4057bde211d0786a8c3ef15ed39fd6141..4dcfbd02ff2f9ac7428377c674df478d7ddabed4 100644 (file)
@@ -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;
 }
index fa27e5871b986a06ee9cd74cd6175d4db4c49bde..ee80712dfc5d34f4fde5cf2d72d829005337b026 100644 (file)
@@ -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;
 }
index 15b079ca6ff417aa2c0eb734ef272b8a9ebb229b..90c0fd3d544d9c20fc383481cd88807c09d38345 100644 (file)
@@ -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;
                                }
                ;
index a17021eb2916550000bf24d7112652eb31b909d5..7ad06baf51788a9999fb634186695bdf41dd47a7 100644 (file)
@@ -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;
 
index 9c629aff34207519c5024f93994e4c28e81ee763..bd5511325ca5e6322ea8ae14c9ff53f9c548fc06 100644 (file)
@@ -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);
index a482abfb351e9c5d64605a34a9944e568e63117c..f2d00b593e4e4450a3ec35f706e130cae72ef31f 100644 (file)
@@ -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;
 
 /* ----------------------