diff options
Diffstat (limited to 'src/backend/utils/misc/guc.c')
-rw-r--r-- | src/backend/utils/misc/guc.c | 54 |
1 files changed, 15 insertions, 39 deletions
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 9f179a91295..cacbe904db7 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -4663,9 +4663,6 @@ static struct config_generic **guc_variables; /* Current number of variables contained in the vector */ static int num_guc_variables; -/* Current number of variables marked with GUC_EXPLAIN */ -static int num_guc_explain_variables; - /* Vector capacity */ static int size_guc_variables; @@ -4929,7 +4926,6 @@ build_guc_variables(void) { int size_vars; int num_vars = 0; - int num_explain_vars = 0; struct config_generic **guc_vars; int i; @@ -4940,9 +4936,6 @@ build_guc_variables(void) /* Rather than requiring vartype to be filled in by hand, do this: */ conf->gen.vartype = PGC_BOOL; num_vars++; - - if (conf->gen.flags & GUC_EXPLAIN) - num_explain_vars++; } for (i = 0; ConfigureNamesInt[i].gen.name; i++) @@ -4951,9 +4944,6 @@ build_guc_variables(void) conf->gen.vartype = PGC_INT; num_vars++; - - if (conf->gen.flags & GUC_EXPLAIN) - num_explain_vars++; } for (i = 0; ConfigureNamesReal[i].gen.name; i++) @@ -4962,9 +4952,6 @@ build_guc_variables(void) conf->gen.vartype = PGC_REAL; num_vars++; - - if (conf->gen.flags & GUC_EXPLAIN) - num_explain_vars++; } for (i = 0; ConfigureNamesString[i].gen.name; i++) @@ -4973,9 +4960,6 @@ build_guc_variables(void) conf->gen.vartype = PGC_STRING; num_vars++; - - if (conf->gen.flags & GUC_EXPLAIN) - num_explain_vars++; } for (i = 0; ConfigureNamesEnum[i].gen.name; i++) @@ -4984,9 +4968,6 @@ build_guc_variables(void) conf->gen.vartype = PGC_ENUM; num_vars++; - - if (conf->gen.flags & GUC_EXPLAIN) - num_explain_vars++; } /* @@ -5018,7 +4999,6 @@ build_guc_variables(void) free(guc_variables); guc_variables = guc_vars; num_guc_variables = num_vars; - num_guc_explain_variables = num_explain_vars; size_guc_variables = size_vars; qsort((void *) guc_variables, num_guc_variables, sizeof(struct config_generic *), guc_var_compare); @@ -8967,41 +8947,40 @@ ShowAllGUCConfig(DestReceiver *dest) } /* - * Returns an array of modified GUC options to show in EXPLAIN. Only options - * related to query planning (marked with GUC_EXPLAIN), with values different - * from built-in defaults. + * Return an array of modified GUC options to show in EXPLAIN. + * + * We only report options related to query planning (marked with GUC_EXPLAIN), + * with values different from their built-in defaults. */ struct config_generic ** get_explain_guc_options(int *num) { - int i; struct config_generic **result; *num = 0; /* - * Allocate enough space to fit all GUC_EXPLAIN options. We may not need - * all the space, but there are fairly few such options so we don't waste - * a lot of memory. + * While only a fraction of all the GUC variables are marked GUC_EXPLAIN, + * it doesn't seem worth dynamically resizing this array. */ - result = palloc(sizeof(struct config_generic *) * num_guc_explain_variables); + result = palloc(sizeof(struct config_generic *) * num_guc_variables); - for (i = 0; i < num_guc_variables; i++) + for (int i = 0; i < num_guc_variables; i++) { bool modified; struct config_generic *conf = guc_variables[i]; - /* return only options visible to the user */ + /* return only parameters marked for inclusion in explain */ + if (!(conf->flags & GUC_EXPLAIN)) + continue; + + /* return only options visible to the current user */ if ((conf->flags & GUC_NO_SHOW_ALL) || ((conf->flags & GUC_SUPERUSER_ONLY) && !is_member_of_role(GetUserId(), DEFAULT_ROLE_READ_ALL_SETTINGS))) continue; - /* only parameters explicitly marked for inclusion in explain */ - if (!(conf->flags & GUC_EXPLAIN)) - continue; - - /* return only options that were modified (w.r.t. config file) */ + /* return only options that are different from their boot values */ modified = false; switch (conf->vartype) @@ -9050,15 +9029,12 @@ get_explain_guc_options(int *num) elog(ERROR, "unexpected GUC type: %d", conf->vartype); } - /* skip GUC variables that match the built-in default */ if (!modified) continue; - /* assign to the values array */ + /* OK, report it */ result[*num] = conf; *num = *num + 1; - - Assert(*num <= num_guc_explain_variables); } return result; |