1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-07 00:36:50 +03:00

Transform proconfig for faster execution.

Store function config settings in lists to avoid the need to parse and
allocate for each function execution.

Speedup is modest but significant. Additionally, this change also
seems cleaner and supports some other performance improvements under
discussion.

Discussion: https://postgr.es/m/04c8592dbd694e4114a3ed87139a7a04e4363030.camel@j-davis.com
Reviewed-by: Nathan Bossart
This commit is contained in:
Jeff Davis
2023-08-10 12:43:53 -07:00
parent bee263b087
commit 5765cfe18c
3 changed files with 60 additions and 16 deletions

View File

@ -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);
}