aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/init/postinit.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/init/postinit.c')
-rw-r--r--src/backend/utils/init/postinit.c37
1 files changed, 22 insertions, 15 deletions
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
index a8af269591e..ddbe08d5daa 100644
--- a/src/backend/utils/init/postinit.c
+++ b/src/backend/utils/init/postinit.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.137 2004/08/29 05:06:51 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.138 2004/11/14 19:35:32 tgl Exp $
*
*
*-------------------------------------------------------------------------
@@ -221,14 +221,21 @@ BaseInit(void)
* InitPostgres
* Initialize POSTGRES.
*
+ * In bootstrap mode neither of the parameters are used.
+ *
+ * The return value indicates whether the userID is a superuser. (That
+ * can only be tested inside a transaction, so we want to do it during
+ * the startup transaction rather than doing a separate one in postgres.c.)
+ *
* Note:
* Be very careful with the order of calls in the InitPostgres function.
* --------------------------------
*/
-void
+bool
InitPostgres(const char *dbname, const char *username)
{
bool bootstrap = IsBootstrapProcessingMode();
+ bool am_superuser;
/*
* Set up the global variables holding database id and path.
@@ -398,15 +405,19 @@ InitPostgres(const char *dbname, const char *username)
RelationCacheInitializePhase3();
/*
+ * Check if user is a superuser.
+ */
+ if (bootstrap)
+ am_superuser = true;
+ else
+ am_superuser = superuser();
+
+ /*
* Check a normal user hasn't connected to a superuser reserved slot.
- * We can't do this till after we've read the user information, and we
- * must do it inside a transaction since checking superuserness may
- * require database access. The superuser check is probably the most
- * expensive part; don't do it until necessary.
*/
- if (ReservedBackends > 0 &&
- CountEmptyBackendSlots() < ReservedBackends &&
- !superuser())
+ if (!am_superuser &&
+ ReservedBackends > 0 &&
+ CountEmptyBackendSlots() < ReservedBackends)
ereport(FATAL,
(errcode(ERRCODE_TOO_MANY_CONNECTIONS),
errmsg("connection limit exceeded for non-superusers")));
@@ -423,12 +434,6 @@ InitPostgres(const char *dbname, const char *username)
InitializeClientEncoding();
/*
- * Now all default states are fully set up. Report them to client if
- * appropriate.
- */
- BeginReportingGUCOptions();
-
- /*
* Set up process-exit callback to do pre-shutdown cleanup. This
* should be last because we want shmem_exit to call this routine
* before the exit callbacks that are registered by buffer manager,
@@ -440,6 +445,8 @@ InitPostgres(const char *dbname, const char *username)
/* close the transaction we started above */
if (!bootstrap)
CommitTransactionCommand();
+
+ return am_superuser;
}
/*