diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index 5810f8825e9..e01dca9b7c1 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -345,7 +345,7 @@ BootstrapModeMain(int argc, char *argv[], bool check_only) if (pg_link_canary_is_frontend()) elog(ERROR, "backend is incorrectly linked to frontend functions"); - InitPostgres(NULL, InvalidOid, NULL, InvalidOid, false, false, NULL); + InitPostgres(NULL, InvalidOid, NULL, InvalidOid, 0, NULL); /* Initialize stuff for bootstrap-file processing */ for (i = 0; i < MAXATTR; i++) diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index ae9be9b9113..327ea0d45ad 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -488,7 +488,7 @@ AutoVacLauncherMain(int argc, char *argv[]) /* Early initialization */ BaseInit(); - InitPostgres(NULL, InvalidOid, NULL, InvalidOid, false, false, NULL); + InitPostgres(NULL, InvalidOid, NULL, InvalidOid, 0, NULL); SetProcessingMode(NormalProcessing); @@ -1706,8 +1706,7 @@ AutoVacWorkerMain(int argc, char *argv[]) * Note: if we have selected a just-deleted database (due to using * stale stats info), we'll fail and exit here. */ - InitPostgres(NULL, dbid, NULL, InvalidOid, false, false, - dbname); + InitPostgres(NULL, dbid, NULL, InvalidOid, 0, dbname); SetProcessingMode(NormalProcessing); set_ps_display(dbname); ereport(DEBUG1, diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 0761b38bf88..3d7fec995ae 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -5562,6 +5562,11 @@ void BackgroundWorkerInitializeConnection(const char *dbname, const char *username, uint32 flags) { BackgroundWorker *worker = MyBgworkerEntry; + bits32 init_flags = 0; /* never honor session_preload_libraries */ + + /* ignore datallowconn? */ + if (flags & BGWORKER_BYPASS_ALLOWCONN) + init_flags |= INIT_PG_OVERRIDE_ALLOW_CONNS; /* XXX is this the right errcode? */ if (!(worker->bgw_flags & BGWORKER_BACKEND_DATABASE_CONNECTION)) @@ -5571,8 +5576,7 @@ BackgroundWorkerInitializeConnection(const char *dbname, const char *username, u InitPostgres(dbname, InvalidOid, /* database to connect to */ username, InvalidOid, /* role to connect as */ - false, /* never honor session_preload_libraries */ - (flags & BGWORKER_BYPASS_ALLOWCONN) != 0, /* ignore datallowconn? */ + init_flags, NULL); /* no out_dbname */ /* it had better not gotten out of "init" mode yet */ @@ -5589,6 +5593,11 @@ void BackgroundWorkerInitializeConnectionByOid(Oid dboid, Oid useroid, uint32 flags) { BackgroundWorker *worker = MyBgworkerEntry; + bits32 init_flags = 0; /* never honor session_preload_libraries */ + + /* ignore datallowconn? */ + if (flags & BGWORKER_BYPASS_ALLOWCONN) + init_flags |= INIT_PG_OVERRIDE_ALLOW_CONNS; /* XXX is this the right errcode? */ if (!(worker->bgw_flags & BGWORKER_BACKEND_DATABASE_CONNECTION)) @@ -5598,8 +5607,7 @@ BackgroundWorkerInitializeConnectionByOid(Oid dboid, Oid useroid, uint32 flags) InitPostgres(NULL, dboid, /* database to connect to */ NULL, useroid, /* role to connect as */ - false, /* never honor session_preload_libraries */ - (flags & BGWORKER_BYPASS_ALLOWCONN) != 0, /* ignore datallowconn? */ + init_flags, NULL); /* no out_dbname */ /* it had better not gotten out of "init" mode yet */ diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 21b9763183e..f3c9f1f9bab 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -4206,11 +4206,12 @@ PostgresMain(const char *dbname, const char *username) * NOTE: if you are tempted to add code in this vicinity, consider putting * it inside InitPostgres() instead. In particular, anything that * involves database access should be there, not here. + * + * Honor session_preload_libraries if not dealing with a WAL sender. */ InitPostgres(dbname, InvalidOid, /* database to connect to */ username, InvalidOid, /* role to connect as */ - !am_walsender, /* honor session_preload_libraries? */ - false, /* don't ignore datallowconn */ + (!am_walsender) ? INIT_PG_LOAD_SESSION_LIBS : 0, NULL); /* no out_dbname */ /* diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index df4d15a50fb..449541e9422 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -681,8 +681,9 @@ BaseInit(void) * Parameters: * in_dbname, dboid: specify database to connect to, as described below * username, useroid: specify role to connect as, as described below - * load_session_libraries: TRUE to honor [session|local]_preload_libraries - * override_allow_connections: TRUE to connect despite !datallowconn + * flags: + * - INIT_PG_LOAD_SESSION_LIBS to honor [session|local]_preload_libraries. + * - INIT_PG_OVERRIDE_ALLOW_CONNS to connect despite !datallowconn. * out_dbname: optional output parameter, see below; pass NULL if not used * * The database can be specified by name, using the in_dbname parameter, or by @@ -701,8 +702,8 @@ BaseInit(void) * database but not a username; conversely, a physical walsender specifies * username but not database. * - * By convention, load_session_libraries should be passed as true in - * "interactive" sessions (including standalone backends), but false in + * By convention, INIT_PG_LOAD_SESSION_LIBS should be passed in "flags" in + * "interactive" sessions (including standalone backends), but not in * background processes such as autovacuum. Note in particular that it * shouldn't be true in parallel worker processes; those have another * mechanism for replicating their leader's set of loaded libraries. @@ -717,8 +718,7 @@ BaseInit(void) void InitPostgres(const char *in_dbname, Oid dboid, const char *username, Oid useroid, - bool load_session_libraries, - bool override_allow_connections, + bits32 flags, char *out_dbname) { bool bootstrap = IsBootstrapProcessingMode(); @@ -1189,7 +1189,8 @@ InitPostgres(const char *in_dbname, Oid dboid, * user is a superuser, so the above stuff has to happen first.) */ if (!bootstrap) - CheckMyDatabase(dbname, am_superuser, override_allow_connections); + CheckMyDatabase(dbname, am_superuser, + (flags & INIT_PG_OVERRIDE_ALLOW_CONNS) != 0); /* * Now process any command-line switches and any additional GUC variable @@ -1227,7 +1228,7 @@ InitPostgres(const char *in_dbname, Oid dboid, * during the initial transaction in case anything that requires database * access needs to be done. */ - if (load_session_libraries) + if ((flags & INIT_PG_LOAD_SESSION_LIBS) != 0) process_session_preload_libraries(); /* report this backend in the PgBackendStatus array */ diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index 14bd574fc24..1cc3712c0ff 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -463,12 +463,14 @@ extern PGDLLIMPORT AuxProcType MyAuxProcType; *****************************************************************************/ /* in utils/init/postinit.c */ +/* flags for InitPostgres() */ +#define INIT_PG_LOAD_SESSION_LIBS 0x0001 +#define INIT_PG_OVERRIDE_ALLOW_CONNS 0x0002 extern void pg_split_opts(char **argv, int *argcp, const char *optstr); extern void InitializeMaxBackends(void); extern void InitPostgres(const char *in_dbname, Oid dboid, const char *username, Oid useroid, - bool load_session_libraries, - bool override_allow_connections, + bits32 flags, char *out_dbname); extern void BaseInit(void);