From e4155c8483084e2a8d5779002e3b07854c85baf8 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Fri, 13 Aug 2010 14:38:04 +0000
Subject: [PATCH] Fix pg_restore to complain if any arguments remain after
 parsing the switches and input file name, per bug #5617 from Leo Shklovskii. 
 Rearrange the corresponding code in pg_dump and pg_dumpall so that all three
 programs handle this in a consistent, straightforward fashion.

Back-patch to 9.0, but no further.  Although this is certainly a bug, it's
possible that people have scripts that will be broken by the added error
check, so it seems better not to change the behavior in stable branches.
---
 src/bin/pg_dump/pg_dump.c    | 15 +++++++-------
 src/bin/pg_dump/pg_dumpall.c | 39 ++++++++++++++++++------------------
 src/bin/pg_dump/pg_restore.c | 15 ++++++++++++--
 3 files changed, 41 insertions(+), 28 deletions(-)

diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 1fd43b55e17..b137c387283 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -25,7 +25,7 @@
  *	http://archives.postgresql.org/pgsql-bugs/2010-02/msg00187.php
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.584 2010/08/03 19:24:04 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.585 2010/08/13 14:38:03 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -480,19 +480,20 @@ main(int argc, char **argv)
 		}
 	}
 
-	if (optind < (argc - 1))
+	/* Get database name from command line */
+	if (optind < argc)
+		dbname = argv[optind++];
+
+	/* Complain if any arguments remain */
+	if (optind < argc)
 	{
 		fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
-				progname, argv[optind + 1]);
+				progname, argv[optind]);
 		fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
 				progname);
 		exit(1);
 	}
 
-	/* Get database name from command line */
-	if (optind < argc)
-		dbname = argv[optind];
-
 	/* --column-inserts implies --inserts */
 	if (column_inserts)
 		dump_inserts = 1;
diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c
index c9cbc8e73f8..3c15fe68c96 100644
--- a/src/bin/pg_dump/pg_dumpall.c
+++ b/src/bin/pg_dump/pg_dumpall.c
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
- * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dumpall.c,v 1.137 2010/08/03 19:24:05 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dumpall.c,v 1.138 2010/08/13 14:38:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -316,24 +316,7 @@ main(int argc, char *argv[])
 		}
 	}
 
-	/* Add long options to the pg_dump argument list */
-	if (binary_upgrade)
-		appendPQExpBuffer(pgdumpopts, " --binary-upgrade");
-	if (column_inserts)
-		appendPQExpBuffer(pgdumpopts, " --column-inserts");
-	if (disable_dollar_quoting)
-		appendPQExpBuffer(pgdumpopts, " --disable-dollar-quoting");
-	if (disable_triggers)
-		appendPQExpBuffer(pgdumpopts, " --disable-triggers");
-	if (inserts)
-		appendPQExpBuffer(pgdumpopts, " --inserts");
-	if (no_tablespaces)
-		appendPQExpBuffer(pgdumpopts, " --no-tablespaces");
-	if (quote_all_identifiers)
-		appendPQExpBuffer(pgdumpopts, " --quote-all-identifiers");
-	if (use_setsessauth)
-		appendPQExpBuffer(pgdumpopts, " --use-set-session-authorization");
-
+	/* Complain if any arguments remain */
 	if (optind < argc)
 	{
 		fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
@@ -371,6 +354,24 @@ main(int argc, char *argv[])
 		exit(1);
 	}
 
+	/* Add long options to the pg_dump argument list */
+	if (binary_upgrade)
+		appendPQExpBuffer(pgdumpopts, " --binary-upgrade");
+	if (column_inserts)
+		appendPQExpBuffer(pgdumpopts, " --column-inserts");
+	if (disable_dollar_quoting)
+		appendPQExpBuffer(pgdumpopts, " --disable-dollar-quoting");
+	if (disable_triggers)
+		appendPQExpBuffer(pgdumpopts, " --disable-triggers");
+	if (inserts)
+		appendPQExpBuffer(pgdumpopts, " --inserts");
+	if (no_tablespaces)
+		appendPQExpBuffer(pgdumpopts, " --no-tablespaces");
+	if (quote_all_identifiers)
+		appendPQExpBuffer(pgdumpopts, " --quote-all-identifiers");
+	if (use_setsessauth)
+		appendPQExpBuffer(pgdumpopts, " --use-set-session-authorization");
+
 	/*
 	 * If there was a database specified on the command line, use that,
 	 * otherwise try to connect to database "postgres", and failing that
diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c
index 4927471dce4..67a24b6e62c 100644
--- a/src/bin/pg_dump/pg_restore.c
+++ b/src/bin/pg_dump/pg_restore.c
@@ -34,7 +34,7 @@
  *
  *
  * IDENTIFICATION
- *		$PostgreSQL: pgsql/src/bin/pg_dump/pg_restore.c,v 1.102 2010/05/15 21:41:16 tgl Exp $
+ *		$PostgreSQL: pgsql/src/bin/pg_dump/pg_restore.c,v 1.103 2010/08/13 14:38:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -295,11 +295,22 @@ main(int argc, char **argv)
 		}
 	}
 
+	/* Get file name from command line */
 	if (optind < argc)
-		inputFileSpec = argv[optind];
+		inputFileSpec = argv[optind++];
 	else
 		inputFileSpec = NULL;
 
+	/* Complain if any arguments remain */
+	if (optind < argc)
+	{
+		fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
+				progname, argv[optind]);
+		fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+				progname);
+		exit(1);
+	}
+
 	/* Should get at most one of -d and -f, else user is confused */
 	if (opts->dbname)
 	{
-- 
GitLab