aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/main/main.c2
-rw-r--r--src/backend/postmaster/postmaster.c9
-rw-r--r--src/backend/tcop/postgres.c45
-rw-r--r--src/backend/utils/init/postinit.c2
-rw-r--r--src/include/tcop/tcopprot.h7
5 files changed, 31 insertions, 34 deletions
diff --git a/src/backend/main/main.c b/src/backend/main/main.c
index 8d9cb9428df..2eee3ef72ae 100644
--- a/src/backend/main/main.c
+++ b/src/backend/main/main.c
@@ -194,7 +194,7 @@ main(int argc, char *argv[])
exit(GucInfoMain());
if (argc > 1 && strcmp(argv[1], "--single") == 0)
- exit(PostgresMain(argc, argv, get_current_username(progname)));
+ exit(PostgresMain(argc, argv, NULL, get_current_username(progname)));
exit(PostmasterMain(argc, argv));
}
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index f11ce227b4f..873ae4a2c4a 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -3571,7 +3571,7 @@ BackendRun(Port *port)
* from ExtraOptions is (strlen(ExtraOptions) + 1) / 2; see
* pg_split_opts().
*/
- maxac = 5; /* for fixed args supplied below */
+ maxac = 2; /* for fixed args supplied below */
maxac += (strlen(ExtraOptions) + 1) / 2;
av = (char **) MemoryContextAlloc(TopMemoryContext,
@@ -3587,11 +3587,6 @@ BackendRun(Port *port)
*/
pg_split_opts(av, &ac, ExtraOptions);
- /*
- * Tell the backend which database to use.
- */
- av[ac++] = port->database_name;
-
av[ac] = NULL;
Assert(ac < maxac);
@@ -3614,7 +3609,7 @@ BackendRun(Port *port)
*/
MemoryContextSwitchTo(TopMemoryContext);
- return (PostgresMain(ac, av, port->user_name));
+ return PostgresMain(ac, av, port->database_name, port->user_name);
}
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index dda82358eb6..ad33ae079bd 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -3256,13 +3256,14 @@ get_stats_option_name(const char *arg)
* coming from the client, or PGC_SUSET for insecure options coming from
* a superuser client.
*
- * Returns the database name extracted from the command line, if any.
+ * If a database name is present in the command line arguments, it's
+ * returned into *dbname (this is allowed only if *dbname is initially NULL).
* ----------------------------------------------------------------
*/
-const char *
-process_postgres_switches(int argc, char *argv[], GucContext ctx)
+void
+process_postgres_switches(int argc, char *argv[], GucContext ctx,
+ const char **dbname)
{
- const char *dbname;
bool secure = (ctx == PGC_POSTMASTER);
int errs = 0;
GucSource gucsource;
@@ -3303,7 +3304,8 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx)
case 'b':
/* Undocumented flag used for binary upgrades */
- IsBinaryUpgrade = true;
+ if (secure)
+ IsBinaryUpgrade = true;
break;
case 'D':
@@ -3316,7 +3318,8 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx)
break;
case 'E':
- EchoQuery = true;
+ if (secure)
+ EchoQuery = true;
break;
case 'e':
@@ -3341,7 +3344,8 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx)
break;
case 'j':
- UseNewLine = 0;
+ if (secure)
+ UseNewLine = 0;
break;
case 'k':
@@ -3456,10 +3460,12 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx)
}
/*
- * Should be no more arguments except an optional database name, and
- * that's only in the secure case.
+ * Optional database name should be there only if *dbname is NULL.
*/
- if (errs || argc - optind > 1 || (argc != optind && !secure))
+ if (!errs && dbname && *dbname == NULL && argc - optind >= 1)
+ *dbname = strdup(argv[optind++]);
+
+ if (errs || argc != optind)
{
/* spell the error message a bit differently depending on context */
if (IsUnderPostmaster)
@@ -3475,11 +3481,6 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx)
errhint("Try \"%s --help\" for more information.", progname)));
}
- if (argc - optind == 1)
- dbname = strdup(argv[optind]);
- else
- dbname = NULL;
-
/*
* Reset getopt(3) library so that it will work correctly in subprocesses
* or when this function is called a second time with another array.
@@ -3488,8 +3489,6 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx)
#ifdef HAVE_INT_OPTRESET
optreset = 1; /* some systems need this too */
#endif
-
- return dbname;
}
@@ -3499,14 +3498,16 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx)
*
* argc/argv are the command line arguments to be used. (When being forked
* by the postmaster, these are not the original argv array of the process.)
- * username is the (possibly authenticated) PostgreSQL user name to be used
- * for the session.
+ * dbname is the name of the database to connect to, or NULL if the database
+ * name should be extracted from the command line arguments or defaulted.
+ * username is the PostgreSQL user name to be used for the session.
* ----------------------------------------------------------------
*/
int
-PostgresMain(int argc, char *argv[], const char *username)
+PostgresMain(int argc, char *argv[],
+ const char *dbname,
+ const char *username)
{
- const char *dbname;
int firstchar;
StringInfoData input_message;
sigjmp_buf local_sigjmp_buf;
@@ -3553,7 +3554,7 @@ PostgresMain(int argc, char *argv[], const char *username)
/*
* Parse command-line options.
*/
- dbname = process_postgres_switches(argc, argv, PGC_POSTMASTER);
+ process_postgres_switches(argc, argv, PGC_POSTMASTER, &dbname);
/* Must have gotten a database name, or have a default (the username) */
if (dbname == NULL)
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
index efb48d92ec2..f8d8626a92c 100644
--- a/src/backend/utils/init/postinit.c
+++ b/src/backend/utils/init/postinit.c
@@ -912,7 +912,7 @@ process_startup_options(Port *port, bool am_superuser)
Assert(ac < maxac);
- (void) process_postgres_switches(ac, av, gucctx);
+ (void) process_postgres_switches(ac, av, gucctx, NULL);
}
/*
diff --git a/src/include/tcop/tcopprot.h b/src/include/tcop/tcopprot.h
index d5192d98558..31dee4e4f48 100644
--- a/src/include/tcop/tcopprot.h
+++ b/src/include/tcop/tcopprot.h
@@ -68,9 +68,10 @@ extern void RecoveryConflictInterrupt(ProcSignalReason reason); /* called from S
* handler */
extern void prepare_for_client_read(void);
extern void client_read_ended(void);
-extern const char *process_postgres_switches(int argc, char *argv[],
- GucContext ctx);
-extern int PostgresMain(int argc, char *argv[], const char *username);
+extern void process_postgres_switches(int argc, char *argv[],
+ GucContext ctx, const char **dbname);
+extern int PostgresMain(int argc, char *argv[],
+ const char *dbname, const char *username);
extern long get_stack_depth_rlimit(void);
extern void ResetUsage(void);
extern void ShowUsage(const char *title);