here's a patch for "drop database if exists". Barring objections I will
apply it in a day or two.
cheers
andrew
Index: doc/src/sgml/ref/drop_database.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/ref/drop_database.sgml,v
retrieving revision 1.20
diff -c -r1.20 drop_database.sgml
*** doc/src/sgml/ref/drop_database.sgml 21 Jun 2005 04:02:31 -0000 1.20
--- doc/src/sgml/ref/drop_database.sgml 21 Nov 2005 13:39:55 -0000
***************
*** 20,26 ****
<refsynopsisdiv>
<synopsis>
! DROP DATABASE <replaceable class="PARAMETER">name</replaceable>
</synopsis>
</refsynopsisdiv>
--- 20,26 ----
<refsynopsisdiv>
<synopsis>
! DROP DATABASE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable>
</synopsis>
</refsynopsisdiv>
***************
*** 46,51 ****
--- 46,61 ----
<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>
<para>
Index: src/backend/commands/dbcommands.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v
retrieving revision 1.173
diff -c -r1.173 dbcommands.c
*** src/backend/commands/dbcommands.c 15 Oct 2005 02:49:15 -0000 1.173
--- src/backend/commands/dbcommands.c 21 Nov 2005 13:39:55 -0000
***************
*** 551,557 ****
* DROP DATABASE
*/
void
! dropdb(const char *dbname)
{
Oid db_id;
bool db_istemplate;
--- 551,557 ----
* DROP DATABASE
*/
void
! dropdb(const char *dbname, bool missing_ok)
{
Oid db_id;
bool db_istemplate;
***************
*** 585,593 ****
if (!get_db_info(dbname, &db_id, NULL, NULL,
&db_istemplate, NULL, NULL, NULL, NULL, NULL))
! ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_DATABASE),
errmsg("database \"%s\" does not exist", dbname)));
if (!pg_database_ownercheck(db_id, GetUserId()))
aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_DATABASE,
--- 585,609 ----
if (!get_db_info(dbname, &db_id, NULL, NULL,
&db_istemplate, NULL, NULL, NULL, NULL, NULL))
! {
! 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: src/backend/parser/gram.y
===================================================================
RCS file: /cvsroot/pgsql/src/backend/parser/gram.y,v
retrieving revision 2.514
diff -c -r2.514 gram.y
*** src/backend/parser/gram.y 21 Nov 2005 12:49:31 -0000 2.514
--- src/backend/parser/gram.y 21 Nov 2005 13:40:01 -0000
***************
*** 4698,4704 ****
/*****************************************************************************
*
! * DROP DATABASE
*
* This is implicitly CASCADE, no need for drop behavior
*****************************************************************************/
--- 4698,4704 ----
/*****************************************************************************
*
! * DROP DATABASE [ IF EXISTS ]
*
* This is implicitly CASCADE, no need for drop behavior
*****************************************************************************/
***************
*** 4707,4712 ****
--- 4707,4720 ----
{
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: src/backend/tcop/utility.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/tcop/utility.c,v
retrieving revision 1.247
diff -c -r1.247 utility.c
*** src/backend/tcop/utility.c 21 Nov 2005 12:49:32 -0000 1.247
--- src/backend/tcop/utility.c 21 Nov 2005 13:40:02 -0000
***************
*** 840,846 ****
{
DropdbStmt *stmt = (DropdbStmt *) parsetree;
! dropdb(stmt->dbname);
}
break;
--- 840,846 ----
{
DropdbStmt *stmt = (DropdbStmt *) parsetree;
! dropdb(stmt->dbname, stmt->missing_ok);
}
break;
Index: src/include/commands/dbcommands.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/commands/dbcommands.h,v
retrieving revision 1.42
diff -c -r1.42 dbcommands.h
*** src/include/commands/dbcommands.h 15 Oct 2005 02:49:44 -0000 1.42
--- src/include/commands/dbcommands.h 21 Nov 2005 13:40:03 -0000
***************
*** 53,59 ****
} xl_dbase_drop_rec;
extern void createdb(const CreatedbStmt *stmt);
! extern void dropdb(const char *dbname);
extern void RenameDatabase(const char *oldname, const char *newname);
extern void AlterDatabase(AlterDatabaseStmt *stmt);
extern void AlterDatabaseSet(AlterDatabaseSetStmt *stmt);
--- 53,59 ----
} xl_dbase_drop_rec;
extern void createdb(const CreatedbStmt *stmt);
! 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: src/include/nodes/parsenodes.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/nodes/parsenodes.h,v
retrieving revision 1.294
diff -c -r1.294 parsenodes.h
*** src/include/nodes/parsenodes.h 21 Nov 2005 12:49:32 -0000 1.294
--- src/include/nodes/parsenodes.h 21 Nov 2005 13:40:04 -0000
***************
*** 1672,1677 ****
--- 1672,1678 ----
{
NodeTag type;
char *dbname; /* database to drop */
+ bool missing_ok; /* skip error if db is missing? */
} DropdbStmt;
/* ----------------------