From 93d3b51e884d844a2cafb93acd3abfca8edbd869 Mon Sep 17 00:00:00 2001
From: Mahendra Singh Thalor <mahi6run@gmail.com>
Date: Fri, 27 Feb 2026 00:35:01 +0530
Subject: [PATCH] pg_restore: add --no-globals option to skip globals

Do not restore global objects (roles and tablespaces) and even don't create new database if
--create or -C is not specified.
Note: database will be created only if -C is specified, otherwise
restore will be skiped for particular database. If db is already
created, then data of particular db will be restored.
---
 doc/src/sgml/ref/pg_restore.sgml | 16 +++++++++++++++-
 src/bin/pg_dump/pg_restore.c     | 27 +++++++++++++++++++++++----
 src/bin/pg_dump/t/001_basic.pl   |  6 ++++++
 3 files changed, 44 insertions(+), 5 deletions(-)

diff --git a/doc/src/sgml/ref/pg_restore.sgml b/doc/src/sgml/ref/pg_restore.sgml
index 4a21a089840..74107380a75 100644
--- a/doc/src/sgml/ref/pg_restore.sgml
+++ b/doc/src/sgml/ref/pg_restore.sgml
@@ -294,7 +294,21 @@ PostgreSQL documentation
         <option>--exit-on-error</option>,
         <option>--single-transaction</option>,
         <option>--clean</option>, or
-        <option>--transaction-size</option>.
+        <option>--transaction-size</option>,
+        <option>--no-globals</option>.
+       </para>
+      </listitem>
+     </varlistentry>
+
+<varlistentry>
+      <term><option>--no-globals</option></term>
+      <listitem>
+       <para>
+        Do not restore global objects (roles and tablespaces) and even don't create new database if
+        <term><option>--create</option></term> or <term><option>--C</option></term> is not specified.
+       </para>
+       <para>
+        This option is only relevant when restoring from a non-plain-text archive made using <application>pg_dumpall</application>.
        </para>
       </listitem>
      </varlistentry>
diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c
index 14d886fc86e..8810f9215d4 100644
--- a/src/bin/pg_dump/pg_restore.c
+++ b/src/bin/pg_dump/pg_restore.c
@@ -108,6 +108,7 @@ main(int argc, char **argv)
 	static int	no_security_labels = 0;
 	static int	no_statistics = 0;
 	static int	no_subscriptions = 0;
+	static int      no_globals = 0;
 	static int	strict_names = 0;
 	static int	statistics_only = 0;
 	static int	with_statistics = 0;
@@ -171,6 +172,7 @@ main(int argc, char **argv)
 		{"filter", required_argument, NULL, 4},
 		{"restrict-key", required_argument, NULL, 6},
 		{"exclude-database", required_argument, NULL, 7},
+		{"no-globals", no_argument, &no_globals, 1},
 
 		{NULL, 0, NULL, 0}
 	};
@@ -489,6 +491,10 @@ main(int argc, char **argv)
 		pg_fatal("options %s and %s cannot be used together",
 				 "--statistics", "-g/--globals-only");
 
+	if (no_globals && globals_only)
+		pg_fatal("options %s and %s cannot be used together",
+				"--no-globals", "-g/--globals-only");
+
 	/*
 	 * -C is not compatible with -1, because we can't create a database inside
 	 * a transaction block.
@@ -614,9 +620,10 @@ main(int argc, char **argv)
 
 		/*
 		 * To restore from a pg_dumpall archive, -C (create database) option
-		 * must be specified unless we are only restoring globals.
+		 * must be specified unless we are only restoring globals or we are
+		 * skiping globals.
 		 */
-		if (!globals_only && opts->createDB != 1)
+		if (!no_globals && !globals_only && opts->createDB != 1)
 		{
 			pg_log_error("option %s must be specified when restoring an archive created by pg_dumpall",
 						 "-C/--create");
@@ -626,13 +633,17 @@ main(int argc, char **argv)
 		}
 
 		/*
-		 * Always restore global objects, even if --exclude-database results
+		 * Restore global objects, even if --exclude-database results
 		 * in zero databases to process. If 'globals-only' is set, exit
 		 * immediately.
 		 */
 		snprintf(global_path, MAXPGPATH, "%s/toc.glo", inputFileSpec);
 
-		n_errors = restore_global_objects(global_path, tmpopts);
+		if (!no_globals)
+			n_errors = restore_global_objects(global_path, tmpopts);
+		else
+			pg_log_info("toc.glo(globals) restoring skipped because option %s is specified",
+					"--no-globals");
 
 		if (globals_only)
 			pg_log_info("database restoring skipped because option %s was specified",
@@ -831,6 +842,7 @@ usage(const char *progname)
 	printf(_("  --no-subscriptions           do not restore subscriptions\n"));
 	printf(_("  --no-table-access-method     do not restore table access methods\n"));
 	printf(_("  --no-tablespaces             do not restore tablespace assignments\n"));
+	printf(_("  --no-globals                 do not restore global objects (roles and tablespaces)\n"));
 	printf(_("  --restrict-key=RESTRICT_KEY  use provided string as psql \\restrict key\n"));
 	printf(_("  --section=SECTION            restore named section (pre-data, data, or post-data)\n"));
 	printf(_("  --statistics                 restore the statistics\n"));
@@ -1349,6 +1361,13 @@ restore_all_databases(const char *inputFileSpec,
 			}
 			else
 			{
+				if (!tmpopts->createDB)
+				{
+					pg_log_info("database %s restoring skipped because options %s and %s=false are specified with dump of pg_dumpall",
+							dbidname->str, "--no-globals", "-C/--create" );
+					continue;
+				}
+
 				/* We'll have to create it */
 				tmpopts->createDB = 1;
 				tmpopts->cparams.dbname = connected_db;
diff --git a/src/bin/pg_dump/t/001_basic.pl b/src/bin/pg_dump/t/001_basic.pl
index a895bc314b0..e2d6b30e437 100644
--- a/src/bin/pg_dump/t/001_basic.pl
+++ b/src/bin/pg_dump/t/001_basic.pl
@@ -299,4 +299,10 @@ command_fails_like(
 	qr/\Qpg_restore: error: option -g\/--globals-only can be used only when restoring an archive created by pg_dumpall\E/,
 	'When option --globals-only is used in pg_restore with the dump of pg_dump'
 );
+
+command_fails_like(
+        [ 'pg_restore', '--globals-only', '--no-globals', '-d', 'xxx', 'dumpdir' ],
+	qr/\Qpg_restore: error: options --no-globals and -g\/--globals-only cannot be used together\E/,
+        'pg_restore: error: options --no-globals and -g/--globals-only cannot be used together'
+);
 done_testing();
-- 
2.52.0

