On Tue, 2025-07-29 at 20:22 +0200, Álvaro Herrera wrote:
> Please move the switches themselves out of the translatable message,
> otherwise there are too many of them.  For instance,

Thank you for looking, v2 attached.

Regards,
        Jeff Davis

From 61b0239f17a1c7220de32699e95c6b365accbb88 Mon Sep 17 00:00:00 2001
From: Jeff Davis <j...@j-davis.com>
Date: Tue, 29 Jul 2025 10:58:05 -0700
Subject: [PATCH v2] pg_dump: reject combination of "only" and "with"

Discussion: https://postgr.es/m/8ce896d1a05040905cc1a3afbc04e94d8e95669a.ca...@j-davis.com
---
 src/bin/pg_dump/pg_dump.c        | 19 ++++++++++++++-----
 src/bin/pg_dump/pg_restore.c     | 19 ++++++++++++++-----
 src/bin/pg_dump/t/002_pg_dump.pl | 18 +++++++++++-------
 3 files changed, 39 insertions(+), 17 deletions(-)

diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 6298edb26b5..1886d18f36c 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -860,6 +860,17 @@ main(int argc, char **argv)
 	if (with_statistics && no_statistics)
 		pg_fatal("options --with-statistics and --no-statistics cannot be used together");
 
+	/* reject conflicting "-only" and "with-" options */
+	if (data_only && (with_schema || with_statistics))
+		pg_fatal("options %s and %s cannot be used together",
+				 "-a/--data-only", with_schema ? "--with-schema" : "--with-statistics");
+	if (schema_only && (with_data || with_statistics))
+		pg_fatal("options %s and %s cannot be used together",
+				 "-s/--schema-only", with_data ? "--with-data" : "--with-statistics");
+	if (statistics_only && (with_data || with_schema))
+		pg_fatal("options %s and %s cannot be used together",
+				 "--statistics-only", with_data ? "--with-data" : "--with-schema");
+
 	if (schema_only && foreign_servers_include_patterns.head != NULL)
 		pg_fatal("options -s/--schema-only and --include-foreign-data cannot be used together");
 
@@ -873,11 +884,9 @@ main(int argc, char **argv)
 		pg_fatal("option --if-exists requires option -c/--clean");
 
 	/*
-	 * Set derivative flags. An "-only" option may be overridden by an
-	 * explicit "with-" option; e.g. "--schema-only --with-statistics" will
-	 * include schema and statistics. Other ambiguous or nonsensical
-	 * combinations, e.g. "--schema-only --no-schema", will have already
-	 * caused an error in one of the checks above.
+	 * Set derivative flags. Ambiguous or nonsensical combinations, e.g.
+	 * "--schema-only --no-schema", will have already caused an error in one
+	 * of the checks above.
 	 */
 	dopt.dumpData = ((dopt.dumpData && !schema_only && !statistics_only) ||
 					 (data_only || with_data)) && !no_data;
diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c
index 6ef789cb06d..202721eaaff 100644
--- a/src/bin/pg_dump/pg_restore.c
+++ b/src/bin/pg_dump/pg_restore.c
@@ -425,6 +425,17 @@ main(int argc, char **argv)
 	if (with_statistics && no_statistics)
 		pg_fatal("options --with-statistics and --no-statistics cannot be used together");
 
+	/* reject conflicting "only-" and "with-" options */
+	if (data_only && (with_schema || with_statistics))
+		pg_fatal("options %s and %s cannot be used together",
+				 "-a/--data-only", with_schema ? "--with-schema" : "--with-statistics");
+	if (schema_only && (with_data || with_statistics))
+		pg_fatal("options %s and %s cannot be used together",
+				 "-s/--schema-only", with_data ? "--with-data" : "--with-statistics");
+	if (statistics_only && (with_data || with_schema))
+		pg_fatal("options %s and %s cannot be used together",
+				 "--statistics-only", with_data ? "--with-data" : "--with-schema");
+
 	if (data_only && opts->dropSchema)
 		pg_fatal("options -c/--clean and -a/--data-only cannot be used together");
 
@@ -443,11 +454,9 @@ main(int argc, char **argv)
 		pg_fatal("cannot specify both --single-transaction and multiple jobs");
 
 	/*
-	 * Set derivative flags. An "-only" option may be overridden by an
-	 * explicit "with-" option; e.g. "--schema-only --with-statistics" will
-	 * include schema and statistics. Other ambiguous or nonsensical
-	 * combinations, e.g. "--schema-only --no-schema", will have already
-	 * caused an error in one of the checks above.
+	 * Set derivative flags. Ambiguous or nonsensical combinations, e.g.
+	 * "--schema-only --no-schema", will have already caused an error in one
+	 * of the checks above.
 	 */
 	opts->dumpData = ((opts->dumpData && !schema_only && !statistics_only) ||
 					  (data_only || with_data)) && !no_data;
diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl
index 6c7ec80e271..d597842908e 100644
--- a/src/bin/pg_dump/t/002_pg_dump.pl
+++ b/src/bin/pg_dump/t/002_pg_dump.pl
@@ -799,13 +799,6 @@ my %pgdump_runs = (
 			'postgres',
 		],
 	},
-	schema_only_with_statistics => {
-		dump_cmd => [
-			'pg_dump', '--no-sync',
-			"--file=$tempdir/schema_only_with_statistics.sql",
-			'--schema-only', '--with-statistics', 'postgres',
-		],
-	},
 	no_schema => {
 		dump_cmd => [
 			'pg_dump', '--no-sync',
@@ -5207,6 +5200,17 @@ command_fails_like(
 	qr/\Qpg_dump: error: no matching schemas were found for pattern\E/,
 	'no matching schemas');
 
+command_fails_like(
+	[
+		'pg_dump',
+		'--port' => $port,
+		'--strict-names',
+		'--schema-only',
+		'--with-statistics',
+	],
+	qr/\Qpg_dump: error: options -s\/--schema-only and --with-statistics cannot be used together\E/,
+	'cannot use --schema-only and --with-statistics together');
+
 command_fails_like(
 	[
 		'pg_dump',
-- 
2.43.0

Reply via email to