0001-pg_dump-reject-combination-of-only-and-with.patch
text/x-patch
Filename: 0001-pg_dump-reject-combination-of-only-and-with.patch
Type: text/x-patch
Part: 0
Message:
Re: pg_dump --with-* options
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch 0001
Subject: pg_dump: reject combination of "only" and "with"
| File | + | − |
|---|---|---|
| src/bin/pg_dump/pg_dump.c | 17 | 5 |
| src/bin/pg_dump/pg_restore.c | 17 | 5 |
| src/bin/pg_dump/t/002_pg_dump.pl | 11 | 7 |
From f668a980ca73a608a9d00b9eff07667b3f8a7869 Mon Sep 17 00:00:00 2001
From: Jeff Davis <jeff@j-davis.com>
Date: Tue, 29 Jul 2025 10:58:05 -0700
Subject: [PATCH] pg_dump: reject combination of "only" and "with"
Discussion: https://postgr.es/m/8ce896d1a05040905cc1a3afbc04e94d8e95669a.camel@j-davis.com
---
src/bin/pg_dump/pg_dump.c | 22 +++++++++++++++++-----
src/bin/pg_dump/pg_restore.c | 22 +++++++++++++++++-----
src/bin/pg_dump/t/002_pg_dump.pl | 18 +++++++++++-------
3 files changed, 45 insertions(+), 17 deletions(-)
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 6298edb26b5..1b19cd66008 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -860,6 +860,20 @@ 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)
+ pg_fatal("options -a/--data-only and --with-schema cannot be used together");
+ if (data_only && with_statistics)
+ pg_fatal("options -a/--data-only and --with-statistics cannot be used together");
+ if (schema_only && with_data)
+ pg_fatal("options -s/--schema-only and --with-data cannot be used together");
+ if (schema_only && with_statistics)
+ pg_fatal("options -s/--schema-only and --with-statistics cannot be used together");
+ if (statistics_only && with_data)
+ pg_fatal("options --statistics-only and --with-data cannot be used together");
+ if (statistics_only && with_schema)
+ pg_fatal("options --statistics-only and --with-schema cannot be used together");
+
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 +887,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..4ca6c750bc7 100644
--- a/src/bin/pg_dump/pg_restore.c
+++ b/src/bin/pg_dump/pg_restore.c
@@ -425,6 +425,20 @@ 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)
+ pg_fatal("options -a/--data-only and --with-schema cannot be used together");
+ if (data_only && with_statistics)
+ pg_fatal("options -a/--data-only and --with-statistics cannot be used together");
+ if (schema_only && with_data)
+ pg_fatal("options -s/--schema-only and --with-data cannot be used together");
+ if (schema_only && with_statistics)
+ pg_fatal("options -s/--schema-only and --with-statistics cannot be used together");
+ if (statistics_only && with_data)
+ pg_fatal("options --statistics-only and --with-data cannot be used together");
+ if (statistics_only && with_schema)
+ pg_fatal("options --statistics-only and --with-schema cannot be used together");
+
if (data_only && opts->dropSchema)
pg_fatal("options -c/--clean and -a/--data-only cannot be used together");
@@ -443,11 +457,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