From eb1bd481d4216bb27db227410cc48edc4bf2634e Mon Sep 17 00:00:00 2001
From: Mahendra Singh Thalor <mahi6run@gmail.com>
Date: Mon, 31 Mar 2025 14:01:41 +0530
Subject: [PATCH] pg_restore: if database is already created, then set createdb
 as 0

If database is already created, then set createdb as 0 so that user
will not get errors.

Also reset some flags for each database.
as dumpData, dumpSchema, dumpStatistics
---
 src/bin/pg_dump/pg_restore.c | 38 ++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c
index ce70b7e12b2..3d8be43241d 100644
--- a/src/bin/pg_dump/pg_restore.c
+++ b/src/bin/pg_dump/pg_restore.c
@@ -1107,6 +1107,14 @@ restoreAllDatabases(PGconn *conn, const char *dumpdirpath,
 	int			num_total_db;
 	int			n_errors_total;
 	int			count = 0;
+	char		*connected_db = NULL;
+	bool		dumpData = opts->dumpData;
+	bool		dumpSchema = opts->dumpSchema;
+	bool		dumpStatistics = opts->dumpSchema;
+
+	/* Save db name. */
+	if (opts->cparams.dbname)
+		connected_db = pg_strdup(opts->cparams.dbname);
 
 	num_total_db = get_dbname_oid_list_from_mfile(dumpdirpath, &dbname_oid_list);
 
@@ -1209,9 +1217,39 @@ restoreAllDatabases(PGconn *conn, const char *dumpdirpath,
 
 		pg_log_info("restoring database \"%s\"", db_cell->str);
 
+		/* If database is already created, then don't set createDB flag. */
+		if (opts->cparams.dbname)
+		{
+			conn = ConnectDatabase(db_cell->str, NULL, opts->cparams.pghost,
+					opts->cparams.pgport, opts->cparams.username, TRI_DEFAULT,
+					false, progname, NULL, NULL, NULL, NULL);
+
+			if (conn)
+			{
+				opts->createDB = 0;
+				PQfinish(conn);
+
+				/* Use already created database for connection. */
+				if (opts->cparams.dbname)
+					opts->cparams.dbname = pg_strdup(db_cell->str);
+			}
+		}
+
 		/* Restore single database. */
 		n_errors = restoreOneDatabase(subdirpath, opts, numWorkers, true, count);
 
+		/* Set opts->createDB flag. */
+		if (opts->createDB == 0)
+		{
+			opts->createDB = 1;
+			opts->cparams.dbname = pg_strdup(connected_db);
+		}
+
+		/* Reset flags for next database. */
+		opts->dumpData = dumpData;
+		opts->dumpSchema = dumpSchema;
+		opts->dumpStatistics = dumpStatistics;
+
 		/* Print a summary of ignored errors during single database restore. */
 		if (n_errors)
 		{
-- 
2.39.3

