v16_misc_changes.nocfbot

application/octet-stream

Filename: v16_misc_changes.nocfbot
Type: application/octet-stream
Part: 0
Message: Re: Non-text mode for pg_dumpall
diff --git a/src/bin/pg_dump/pg_backup.h b/src/bin/pg_dump/pg_backup.h
index 729ffc9e12..1e00fedacd 100644
--- a/src/bin/pg_dump/pg_backup.h
+++ b/src/bin/pg_dump/pg_backup.h
@@ -319,7 +319,7 @@ extern Archive *CreateArchive(const char *FileSpec, const ArchiveFormat fmt,
 							  DataDirSyncMethod sync_method);
 
 /* The --list option */
-extern void PrintTOCSummary(Archive *AHX, bool append_data);
+extern void PrintTOCSummary(Archive *AHX);
 
 extern RestoreOptions *NewRestoreOptions(void);
 
diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c
index 32d645728a..144d97d0f4 100644
--- a/src/bin/pg_dump/pg_backup_archiver.c
+++ b/src/bin/pg_dump/pg_backup_archiver.c
@@ -1275,7 +1275,7 @@ ArchiveEntry(Archive *AHX, CatalogId catalogId, DumpId dumpId,
 
 /* Public */
 void
-PrintTOCSummary(Archive *AHX, bool append_data)
+PrintTOCSummary(Archive *AHX)
 {
 	ArchiveHandle *AH = (ArchiveHandle *) AHX;
 	RestoreOptions *ropt = AH->public.ropt;
@@ -1291,7 +1291,7 @@ PrintTOCSummary(Archive *AHX, bool append_data)
 
 	sav = SaveOutput(AH);
 	if (ropt->filename)
-		SetOutput(AH, ropt->filename, out_compression_spec, append_data);
+		SetOutput(AH, ropt->filename, out_compression_spec, false);
 
 	if (strftime(stamp_str, sizeof(stamp_str), PGDUMP_STRFTIME_FMT,
 				 localtime(&AH->createDate)) == 0)
diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c
index 0b6e974380..b75e4f56f3 100644
--- a/src/bin/pg_dump/pg_dumpall.c
+++ b/src/bin/pg_dump/pg_dumpall.c
@@ -1567,7 +1567,7 @@ dumpDatabases(PGconn *conn, ArchiveFormat archDumpFormat)
 
 		/* Create a subdirectory with 'databases' name under main directory. */
 		if (mkdir(db_subdir, 0755) != 0)
-			pg_log_error("could not create subdirectory \"%s\": %m", db_subdir);
+			pg_fatal("could not create subdirectory \"%s\": %m", db_subdir);
 
 		snprintf(map_file_path, MAXPGPATH, "%s/map.dat", filename);
 
diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c
index af7d815a77..6dd82f08f6 100644
--- a/src/bin/pg_dump/pg_restore.c
+++ b/src/bin/pg_dump/pg_restore.c
@@ -121,7 +121,7 @@ main(int argc, char **argv)
 	static int	strict_names = 0;
 	bool		data_only = false;
 	bool		schema_only = false;
-	bool				globals_only = false;
+	bool		globals_only = false;
 	SimpleStringList	db_exclude_patterns = {NULL, NULL};
 
 	struct option cmdopts[] = {
@@ -391,6 +391,13 @@ main(int argc, char **argv)
 		exit_nicely(1);
 	}
 
+	if (opts->tocSummary && globals_only)
+	{
+		pg_log_error("option -l/--list cannot be used together with -g/--globals-only");
+		pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+		exit_nicely(1);
+	}
+
 	/* Should get at most one of -d and -f, else user is confused */
 	if (opts->cparams.dbname)
 	{
@@ -481,12 +488,6 @@ main(int argc, char **argv)
 			PGconn  *conn = NULL; /* Connection to restore global sql commands. */
 			int     exit_code = 0;
 
-			/*
-			 * User is suggested to use single database dump for --list option.
-			 */
-			if (opts->tocSummary)
-				pg_fatal("option -l/--list cannot be used when using dump of pg_dumpall");
-
 			/*
 			 * Connect to database to execute global sql commands from
 			 * global.dat file.
@@ -531,6 +532,9 @@ main(int argc, char **argv)
 		}
 	}
 
+	if(inputFileSpec != NULL && globals_only)
+		pg_fatal("could not specify --globals-only when restoring a single database");
+
 	return restoreOneDatabase(inputFileSpec, opts, numWorkers, false, NULL);
 }
 /*
@@ -571,7 +575,7 @@ restoreOneDatabase(const char *inputFileSpec, RestoreOptions *opts,
 	AH->numWorkers = numWorkers;
 
 	if (opts->tocSummary)
-		PrintTOCSummary(AH, append_data);
+		PrintTOCSummary(AH);
 	else
 	{
 		ProcessArchiveRestoreOptions(AH);
@@ -1090,8 +1094,11 @@ restoreAllDatabases(PGconn *conn, const char *dumpdirpath,
 	 * To restore multiple databases, -C (create database) option should be specified
 	 * or all databases should be created before pg_restore.
 	 */
-	if (opts->createDB != 1)
-		pg_log_info("restoring dump of pg_dumpall without -C option, there might be multiple databases in directory.");
+	if (opts->createDB != 1 && num_db_restore > 1)
+		pg_log_info("restoring multiple databases without -C option.");
+
+	if (opts->tocSummary && num_db_restore > 1)
+		pg_fatal("option -l/--list cannot be used when restoring multiple databases");
 
 	/* TODO: MAX_ON_EXIT_NICELY is 100 now... max AH handle register on exit .*/
 	if (num_db_restore > MAX_ON_EXIT_NICELY)
@@ -1103,7 +1110,8 @@ restoreAllDatabases(PGconn *conn, const char *dumpdirpath,
 	}
 
 	/* Open global.dat file and execute/append all the global sql commands. */
-	process_global_sql_commands(conn, dumpdirpath, opts->filename);
+	if (!opts->tocSummary)
+		process_global_sql_commands(conn, dumpdirpath, opts->filename);
 
 	/* Close the db connection as we are done with globals and patterns. */
 	if (conn)
@@ -1223,8 +1231,7 @@ process_global_sql_commands(PGconn *conn, const char *dumpdirpath, const char *o
 /*
  * copy_global_file_to_out_file
  *
- * This will copy global.dat file into out file.  If "-" is used as outfile,
- * then print commands to the stdout.
+ * This will copy global.dat file into outfile.
  */
 static void
 copy_global_file_to_out_file(const char *outfile, FILE *pfile)
@@ -1233,19 +1240,13 @@ copy_global_file_to_out_file(const char *outfile, FILE *pfile)
 	FILE	*OPF;
 	int		c;
 
-	/* "-" is used for stdout. */
-	if (strcmp(outfile, "-") == 0)
-		OPF = stdout;
-	else
-	{
-		snprintf(out_file_path, MAXPGPATH, "%s", outfile);
-		OPF = fopen(out_file_path, PG_BINARY_W);
+	snprintf(out_file_path, MAXPGPATH, "%s", outfile);
+	OPF = fopen(out_file_path, PG_BINARY_W);
 
-		if (OPF == NULL)
-		{
-			fclose(pfile);
-			pg_fatal("could not open file: \"%s\"", outfile);
-		}
+	if (OPF == NULL)
+	{
+		fclose(pfile);
+		pg_fatal("could not open file: \"%s\"", outfile);
 	}
 
 	/* Now append global.dat into out file. */
@@ -1253,10 +1254,7 @@ copy_global_file_to_out_file(const char *outfile, FILE *pfile)
 		fputc(c, OPF);
 
 	fclose(pfile);
-
-	/* Close out file. */
-	if (strcmp(outfile, "-") != 0)
-		fclose(OPF);
+	fclose(OPF);
 }
 
 /*
diff --git a/src/bin/pg_dump/t/001_basic.pl b/src/bin/pg_dump/t/001_basic.pl
index de41ec06d8..8bb9edc5b5 100755
--- a/src/bin/pg_dump/t/001_basic.pl
+++ b/src/bin/pg_dump/t/001_basic.pl
@@ -224,6 +224,11 @@ command_fails_like(
 	qr/\Qpg_restore: error: option --exclude-database cannot be used together with -g\/--globals-only\E/,
 	'pg_restore: option --exclude-database cannot be used together with -g/--globals-only');
 
+command_fails_like(
+	[ 'pg_restore', '--list', '--globals-only', '-d', 'xxx' ],
+	qr/\Qpg_restore: error: option -l\/--list cannot be used together with -g\/--globals-only\E/,
+	'pg_restore: option -l/--list cannot be used together with -g/--globals-only');
+
 # also fails for -r and -t, but it seems pointless to add more tests for those.
 command_fails_like(
 	[ 'pg_dumpall', '--exclude-database=foo', '--globals-only' ],