diff --git a/doc/src/sgml/ref/pg_dump.sgml b/doc/src/sgml/ref/pg_dump.sgml
index 450383083d7..a10ae0c6227 100644
--- a/doc/src/sgml/ref/pg_dump.sgml
+++ b/doc/src/sgml/ref/pg_dump.sgml
@@ -143,7 +143,8 @@ PostgreSQL documentation
Output commands to clean (drop)
database objects prior to outputting the commands for creating them.
- (Restore might generate some harmless errors.)
+ (Restore might generate some harmless error messages, if any objects
+ were not present in the destination database.)
@@ -161,8 +162,10 @@ PostgreSQL documentation
Begin the output with a command to create the
database itself and reconnect to the created database. (With a
- script of this form, it doesn't matter which database you connect
- to before running the script.)
+ script of this form, it doesn't matter which database in the
+ destination installation you connect to before running the script.)
+ If is also specified, the script drops and
+ recreates the target database before reconnecting to it.
diff --git a/doc/src/sgml/ref/pg_restore.sgml b/doc/src/sgml/ref/pg_restore.sgml
index b276da6afe6..d4f61669b88 100644
--- a/doc/src/sgml/ref/pg_restore.sgml
+++ b/doc/src/sgml/ref/pg_restore.sgml
@@ -109,6 +109,8 @@
Clean (drop) database objects before recreating them.
+ (This might generate some harmless error messages, if any objects
+ were not present in the destination database.)
@@ -118,11 +120,16 @@
- Create the database before restoring into it. (When this
- option is used, the database named with is
- used only to issue the initial CREATE DATABASE>
- command. All data is restored into the database name that
- appears in the archive.)
+ Create the database before restoring into it.
+ If is also specified, drop and
+ recreate the target database before connecting to it.
+
+
+
+ When this option is used, the database named with
+ is used only to issue the initial DROP DATABASE> and
+ CREATE DATABASE> commands. All data is restored into the
+ database name that appears in the archive.
diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c
index 7f47a7c51a3..1fead285e96 100644
--- a/src/bin/pg_dump/pg_backup_archiver.c
+++ b/src/bin/pg_dump/pg_backup_archiver.c
@@ -303,15 +303,6 @@ RestoreArchive(Archive *AHX)
/*
* Check for nonsensical option combinations.
*
- * NB: createDB+dropSchema is useless because if you're creating the DB,
- * there's no need to drop individual items in it. Moreover, if we tried
- * to do that then we'd issue the drops in the database initially
- * connected to, not the one we will create, which is very bad...
- */
- if (ropt->createDB && ropt->dropSchema)
- exit_horribly(modulename, "-C and -c are incompatible options\n");
-
- /*
* -C is not compatible with -1, because we can't create a database inside
* a transaction block.
*/
@@ -456,7 +447,25 @@ RestoreArchive(Archive *AHX)
{
AH->currentTE = te;
- /* We want anything that's selected and has a dropStmt */
+ /*
+ * In createDB mode, issue a DROP *only* for the database as a
+ * whole. Issuing drops against anything else would be wrong,
+ * because at this point we're connected to the wrong database.
+ * Conversely, if we're not in createDB mode, we'd better not
+ * issue a DROP against the database at all.
+ */
+ if (ropt->createDB)
+ {
+ if (strcmp(te->desc, "DATABASE") != 0)
+ continue;
+ }
+ else
+ {
+ if (strcmp(te->desc, "DATABASE") == 0)
+ continue;
+ }
+
+ /* Otherwise, drop anything that's selected and has a dropStmt */
if (((te->reqs & (REQ_SCHEMA | REQ_DATA)) != 0) && te->dropStmt)
{
ahlog(AH, 1, "dropping %s %s\n", te->desc, te->tag);
@@ -938,9 +947,6 @@ PrintTOCSummary(Archive *AHX, RestoreOptions *ropt)
ahprintf(AH, ";\n;\n; Selected TOC Entries:\n;\n");
- /* We should print DATABASE entries whether or not -C was specified */
- ropt->createDB = 1;
-
curSection = SECTION_PRE_DATA;
for (te = AH->toc->next; te != AH->toc; te = te->next)
{