diff --git a/src/backend/main/main.c b/src/backend/main/main.c index 8d4218e00bf..a77e05da90f 100644 --- a/src/backend/main/main.c +++ b/src/backend/main/main.c @@ -189,7 +189,9 @@ main(int argc, char *argv[]) else if (argc > 1 && strcmp(argv[1], "--describe-config") == 0) GucInfoMain(); /* does not return */ else if (argc > 1 && strcmp(argv[1], "--single") == 0) - PostgresMain(argc, argv, get_current_username(progname)); /* does not return */ + PostgresMain(argc, argv, + NULL, /* no dbname */ + get_current_username(progname)); /* does not return */ else PostmasterMain(argc, argv); /* does not return */ abort(); /* should not get here */ diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 15c23204611..298ad5e1ec4 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -3943,7 +3943,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, @@ -3959,11 +3959,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); @@ -3986,7 +3981,7 @@ BackendRun(Port *port) */ MemoryContextSwitchTo(TopMemoryContext); - PostgresMain(ac, av, port->user_name); + PostgresMain(ac, av, port->database_name, port->user_name); } diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 587d065f1cc..f0783031808 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -3247,13 +3247,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; @@ -3304,7 +3305,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 'C': @@ -3321,7 +3323,8 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx) break; case 'E': - EchoQuery = true; + if (secure) + EchoQuery = true; break; case 'e': @@ -3346,7 +3349,8 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx) break; case 'j': - UseNewLine = 0; + if (secure) + UseNewLine = 0; break; case 'k': @@ -3464,13 +3468,10 @@ 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 && secure && argc - optind >= 1) - dbname = strdup(argv[optind++]); - else - dbname = NULL; + if (!errs && dbname && *dbname == NULL && argc - optind >= 1) + *dbname = strdup(argv[optind++]); if (errs || argc != optind) { @@ -3499,8 +3500,6 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx) #ifdef HAVE_INT_OPTRESET optreset = 1; /* some systems need this too */ #endif - - return dbname; } @@ -3510,14 +3509,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. * ---------------------------------------------------------------- */ void -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; @@ -3564,7 +3565,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 da3127ea9c9..5b52bd27973 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -969,7 +969,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 e6f0afbedfe..035a442e35f 100644 --- a/src/include/tcop/tcopprot.h +++ b/src/include/tcop/tcopprot.h @@ -69,9 +69,11 @@ 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 void PostgresMain(int argc, char *argv[], const char *username) __attribute__((noreturn)); +extern void process_postgres_switches(int argc, char *argv[], + GucContext ctx, const char **dbname); +extern void PostgresMain(int argc, char *argv[], + const char *dbname, + const char *username) __attribute__((noreturn)); extern long get_stack_depth_rlimit(void); extern void ResetUsage(void); extern void ShowUsage(const char *title);