On 08/16/18 21:31, Bruce Momjian wrote:

> I understand you don't like that a search_path changed by a function is
> passed down to functions it calls, but what would you like the system to
> use as a search path for called functions?  The search path of the
> session?

This is beginning to sound like an exercise in /emulating/ lexical scoping
in a system that can run bits of code supplied in many different PLs, not
all of which can necessarily participate in "real" lexical scoping.

It could look like another flavor of setting a GUC. There's SET SESSION,
SET LOCAL, and maybe now SET LEXICAL. The key to the emulation is to
temporarily unstack the SET LEXICAL when the function it "lexically"
applies to makes calls to other functions. And restack it when those
other functions return.

Then there's room for bikeshedding on just where those unstacks/restacks
happen. I would think at clearly defined places in the core code, so as
to be independent of any PL. Any execution of command/query through SPI ?
Any function call through fmgr?

Emulating lexical scoping through dynamic means will have an overhead.
The usual use case would not involve a SET LEXICAL command issued on
its own, but such a command bound into a function declaration, as the
current SET commands can be. /Some/ PLs may be amenable to a static
analysis able to determine what objects are referred to in the code
and bind those ahead of time. Maybe, like the lanvalidator entry in
pg_language, there could be a lanprebind function, for those PLs
where that's tractable, and it would be called when the function is
created with any "lexically" bound variables. Record with each function
whether lanprebind returned success; if it did, skip the dynamic variable
futzing around calls to that function.

If the PL has no lanprebind function, or if it returned no-can-do for
a particular function and set of lexical settings, then the dynamic
emulation steps in.

Sounds a bit elaborate, but as it happens, there are further reasons
it could be good to have such "lexical" settings. There are some called
for in the SQL standard, for example. [1]

-Chap

[1] https://www.postgresql.org/message-id/5AAEAE0F.20006%40anastigmatix.net

Reply via email to