diff --git a/src/backend/main/main.c b/src/backend/main/main.c index ff8e87b6681..1b04596fc6f 100644 --- a/src/backend/main/main.c +++ b/src/backend/main/main.c @@ -183,7 +183,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 b6ebbb8d165..c10ce1a7fe8 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -3525,7 +3525,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, @@ -3541,11 +3541,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); @@ -3568,7 +3563,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 b79ffbfef27..363b60891e0 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -3271,13 +3271,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; @@ -3326,7 +3327,8 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx) break; case 'E': - EchoQuery = true; + if (secure) + EchoQuery = true; break; case 'e': @@ -3351,7 +3353,8 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx) break; case 'j': - UseNewLine = 0; + if (secure) + UseNewLine = 0; break; case 'k': @@ -3466,10 +3469,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) @@ -3485,11 +3490,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. @@ -3498,8 +3498,6 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx) #ifdef HAVE_INT_OPTRESET optreset = 1; /* some systems need this too */ #endif - - return dbname; } @@ -3509,14 +3507,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; @@ -3563,7 +3563,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 045410519fc..c413127daab 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -904,7 +904,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 216980ab9e7..923175c08d0 100644 --- a/src/include/tcop/tcopprot.h +++ b/src/include/tcop/tcopprot.h @@ -69,9 +69,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);