út 25. 1. 2022 v 6:18 odesílatel Julien Rouhaud <rjuju123@gmail.com> napsal:
Hi,
On Mon, Jan 24, 2022 at 12:33:11PM +0100, Pavel Stehule wrote: > > here is updated patch with locking support
Thanks for updating the patch!
While the locking is globally working as intended, I found a few problems with it.
First, I don't think that acquiring the lock in get_session_variable_type_typmod_collid() and prepare_variable_for_reading() is the correct approach. In transformColumnRef() and transformLetStmt() you first call IdentifyVariable() to check if the given name is a variable without locking it and later try to lock the variable if you get a valid Oid. This is bug prone as any other backend could drop the variable between the two calls and you would end up with a cache lookup failure. I think the lock should be acquired during IdentifyVariable. It should probably be optional as one codepath only needs the information to raise a warning when a variable is shadowed, so a concurrent drop isn't a problem there.
There is a problem, because before the IdentifyVariable call I don't know if the variable will be shadowed or not.
If I lock a variable inside IdentifyVariable, then I need to remember if I did lock there, or if the variable was locked already, and If the variable is shadowed and if lock is fresh, then I can unlock the variable.