From e4155c8483084e2a8d5779002e3b07854c85baf8 Mon Sep 17 00:00:00 2001 From: Tom Lane 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 1fd43b55e1..b137c38728 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 c9cbc8e73f..3c15fe68c9 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 4927471dce..67a24b6e62 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) { -- 2.11.0