summaryrefslogtreecommitdiff
path: root/src/backend/utils/misc/guc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/misc/guc.c')
-rw-r--r--src/backend/utils/misc/guc.c25
1 files changed, 9 insertions, 16 deletions
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 58a4cf97ba5..bee9cc5be4d 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -446,6 +446,7 @@ char *event_source;
bool row_security;
bool check_function_bodies = true;
bool default_with_oids = false;
+bool session_auth_is_superuser;
int log_min_error_statement = ERROR;
int log_min_messages = WARNING;
@@ -492,7 +493,6 @@ int huge_pages;
* and is kept in sync by assign_hooks.
*/
static char *syslog_ident_str;
-static bool session_auth_is_superuser;
static double phony_random_seed;
static char *client_encoding_string;
static char *datestyle_string;
@@ -8986,12 +8986,18 @@ read_nondefault_variables(void)
* constants; a few, like server_encoding and lc_ctype, are handled specially
* outside the serialize/restore procedure. Therefore, SerializeGUCState()
* never sends these, and RestoreGUCState() never changes them.
+ *
+ * Role is a special variable in the sense that its current value can be an
+ * invalid value and there are multiple ways by which that can happen (like
+ * after setting the role, someone drops it). So we handle it outside of
+ * serialize/restore machinery.
*/
static bool
can_skip_gucvar(struct config_generic *gconf)
{
return gconf->context == PGC_POSTMASTER ||
- gconf->context == PGC_INTERNAL || gconf->source == PGC_S_DEFAULT;
+ gconf->context == PGC_INTERNAL || gconf->source == PGC_S_DEFAULT ||
+ strcmp(gconf->name, "role") == 0;
}
/*
@@ -9252,7 +9258,6 @@ SerializeGUCState(Size maxsize, char *start_address)
Size actual_size;
Size bytes_left;
int i;
- int i_role = -1;
/* Reserve space for saving the actual size of the guc state */
Assert(maxsize > sizeof(actual_size));
@@ -9260,19 +9265,7 @@ SerializeGUCState(Size maxsize, char *start_address)
bytes_left = maxsize - sizeof(actual_size);
for (i = 0; i < num_guc_variables; i++)
- {
- /*
- * It's pretty ugly, but we've got to force "role" to be initialized
- * after "session_authorization"; otherwise, the latter will override
- * the former.
- */
- if (strcmp(guc_variables[i]->name, "role") == 0)
- i_role = i;
- else
- serialize_variable(&curptr, &bytes_left, guc_variables[i]);
- }
- if (i_role >= 0)
- serialize_variable(&curptr, &bytes_left, guc_variables[i_role]);
+ serialize_variable(&curptr, &bytes_left, guc_variables[i]);
/* Store actual size without assuming alignment of start_address. */
actual_size = maxsize - bytes_left - sizeof(actual_size);