diff options
Diffstat (limited to 'src/backend/utils/misc/guc.c')
-rw-r--r-- | src/backend/utils/misc/guc.c | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 5308896c87f..3449470953a 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -6215,14 +6215,12 @@ ParseLongOption(const char *string, char **name, char **value) /* - * Handle options fetched from pg_db_role_setting.setconfig, - * pg_proc.proconfig, etc. Caller must specify proper context/source/action. - * - * The array parameter must be an array of TEXT (it must not be NULL). + * Transform array of GUC settings into lists of names and values. The lists + * are faster to process in cases where the settings must be applied + * repeatedly (e.g. for each function invocation). */ void -ProcessGUCArray(ArrayType *array, - GucContext context, GucSource source, GucAction action) +TransformGUCArray(ArrayType *array, List **names, List **values) { int i; @@ -6231,6 +6229,8 @@ ProcessGUCArray(ArrayType *array, Assert(ARR_NDIM(array) == 1); Assert(ARR_LBOUND(array)[0] == 1); + *names = NIL; + *values = NIL; for (i = 1; i <= ARR_DIMS(array)[0]; i++) { Datum d; @@ -6262,14 +6262,45 @@ ProcessGUCArray(ArrayType *array, continue; } + *names = lappend(*names, name); + *values = lappend(*values, value); + + pfree(s); + } +} + + +/* + * Handle options fetched from pg_db_role_setting.setconfig, + * pg_proc.proconfig, etc. Caller must specify proper context/source/action. + * + * The array parameter must be an array of TEXT (it must not be NULL). + */ +void +ProcessGUCArray(ArrayType *array, + GucContext context, GucSource source, GucAction action) +{ + List *gucNames; + List *gucValues; + ListCell *lc1; + ListCell *lc2; + + TransformGUCArray(array, &gucNames, &gucValues); + forboth(lc1, gucNames, lc2, gucValues) + { + char *name = lfirst(lc1); + char *value = lfirst(lc2); + (void) set_config_option(name, value, context, source, action, true, 0, false); pfree(name); pfree(value); - pfree(s); } + + list_free(gucNames); + list_free(gucValues); } |