diff options
Diffstat (limited to 'src/backend/utils/fmgr/fmgr.c')
-rw-r--r-- | src/backend/utils/fmgr/fmgr.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/src/backend/utils/fmgr/fmgr.c b/src/backend/utils/fmgr/fmgr.c index 9208c31fe06..6b2d7d7be38 100644 --- a/src/backend/utils/fmgr/fmgr.c +++ b/src/backend/utils/fmgr/fmgr.c @@ -612,7 +612,8 @@ struct fmgr_security_definer_cache { FmgrInfo flinfo; /* lookup info for target function */ Oid userid; /* userid to set, or InvalidOid */ - ArrayType *proconfig; /* GUC values to set, or NULL */ + List *configNames; /* GUC names to set, or NIL */ + List *configValues; /* GUC values to set, or NIL */ Datum arg; /* passthrough argument for plugin modules */ }; @@ -634,6 +635,8 @@ fmgr_security_definer(PG_FUNCTION_ARGS) FmgrInfo *save_flinfo; Oid save_userid; int save_sec_context; + ListCell *lc1; + ListCell *lc2; volatile int save_nestlevel; PgStat_FunctionCallUsage fcusage; @@ -666,8 +669,11 @@ fmgr_security_definer(PG_FUNCTION_ARGS) &isnull); if (!isnull) { + ArrayType *array; oldcxt = MemoryContextSwitchTo(fcinfo->flinfo->fn_mcxt); - fcache->proconfig = DatumGetArrayTypePCopy(datum); + array = DatumGetArrayTypeP(datum); + TransformGUCArray(array, &fcache->configNames, + &fcache->configValues); MemoryContextSwitchTo(oldcxt); } @@ -680,7 +686,7 @@ fmgr_security_definer(PG_FUNCTION_ARGS) /* GetUserIdAndSecContext is cheap enough that no harm in a wasted call */ GetUserIdAndSecContext(&save_userid, &save_sec_context); - if (fcache->proconfig) /* Need a new GUC nesting level */ + if (fcache->configNames != NIL) /* Need a new GUC nesting level */ save_nestlevel = NewGUCNestLevel(); else save_nestlevel = 0; /* keep compiler quiet */ @@ -689,12 +695,17 @@ fmgr_security_definer(PG_FUNCTION_ARGS) SetUserIdAndSecContext(fcache->userid, save_sec_context | SECURITY_LOCAL_USERID_CHANGE); - if (fcache->proconfig) + forboth(lc1, fcache->configNames, lc2, fcache->configValues) { - ProcessGUCArray(fcache->proconfig, - (superuser() ? PGC_SUSET : PGC_USERSET), - PGC_S_SESSION, - GUC_ACTION_SAVE); + GucContext context = superuser() ? PGC_SUSET : PGC_USERSET; + GucSource source = PGC_S_SESSION; + GucAction action = GUC_ACTION_SAVE; + char *name = lfirst(lc1); + char *value = lfirst(lc2); + + (void) set_config_option(name, value, + context, source, + action, true, 0, false); } /* function manager hook */ @@ -737,7 +748,7 @@ fmgr_security_definer(PG_FUNCTION_ARGS) fcinfo->flinfo = save_flinfo; - if (fcache->proconfig) + if (fcache->configNames != NIL) AtEOXact_GUC(true, save_nestlevel); if (OidIsValid(fcache->userid)) SetUserIdAndSecContext(save_userid, save_sec_context); |