On Tue, Apr 20, 2021 at 11:32 AM Pavel Stehule <pavel.steh...@gmail.com>
wrote:

>
>
> út 20. 4. 2021 v 5:16 odesílatel Andy Fan <zhihui.fan1...@gmail.com>
> napsal:
>
>>
>>
>> On Tue, Apr 20, 2021 at 10:57 AM Pavel Stehule <pavel.steh...@gmail.com>
>> wrote:
>>
>>>
>>>
>>> út 20. 4. 2021 v 4:47 odesílatel Andy Fan <zhihui.fan1...@gmail.com>
>>> napsal:
>>>
>>>>
>>>>
>>>> > - a PL/PGSQL function's meaning depends on the search path in effect
>>>> when it is called, unless it has a SET search_path clause or it fully
>>>> qualifies all object references, so it isn't actually possible in general
>>>> to determine what a function calls at definition time
>>>>
>>>>
>>>> I'd think this one as a blocker issue at the beginning since I have to
>>>> insist on
>>>> any new features should not cause semantic changes for existing ones.
>>>> Later I
>>>> found the new definition. As for this feature request, I think we can
>>>> define the
>>>> features like this:
>>>>
>>>> 1. We define a new attribute named VOLATILE_AUTO;  The semantic is PG
>>>> will auto
>>>>    detect the volatile info based on current search_path / existing
>>>>    function. If any embedded function can't be found, we can raise an
>>>> error if
>>>>    VOLATILE_AUTO is used. If people change the volatile attribute
>>>> later, we can:
>>>>    a). do nothing. This can be the documented feature. or. b). Maintain
>>>> the
>>>>    dependency tree between functions and if anyone is changed, other
>>>> functions
>>>>    should be recalculated as well.
>>>>
>>>> 2. VOLATILE_AUTO should never be the default value. It only works when
>>>> people
>>>>    requires it.
>>>>
>>>> Then what we can get from this?  Thinking a user is migrating lots of
>>>> UDF from
>>>> other databases.  Asking them to check/set each function's attribute
>>>> might
>>>> be bad. However if we tell them about how VOLATILE_AUTO works, and they
>>>> accept it (I guess most people would accept), then the migration would
>>>> be
>>>> pretty productive.
>>>>
>>>> I'm listening to any obvious reason to reject it.
>>>>
>>>
>>> a) This analyses can be very slow - PLpgSQL does lazy planning - query
>>> plans are planned only when are required - and this feature requires
>>> complete planning current function and all nested VOLATILE_AUTO functions -
>>> so start of function can be significantly slower
>>>
>>
>> Actually I am thinking  we can do this when we compile the function,
>> which means that would
>> happen on the "CREATE FUNCTION " stage.   this would need some hacks for
>> sure.  Does
>> this remove your concern?
>>
>
> you cannot do it - with this you introduce strong dependency on nested
> objects
>

What does the plpgsql_check do in this area?  I checked the README[1], but
can't find
anything about it.


> until we have global temp tables, then it is blocker for usage of
> temporary tables.
>

Can you explain more about this?


>  Can be nice if some functionality of plpgsql_check can be in core,
> because I think so it is necessary for development, but the structure and
> integration of SQL in PLpgSQL is very good (and very practical).
>
>
I'm interested in plpgsql_check.  However I am still confused why we can do
it in this way, but
can't do it in the  VOLATILE_AUTO way.


>
>>
>>> b) When you migrate from Oracle,then you can use the STABLE flag, and it
>>> will be mostly correct.
>>>
>>
>> This was suggested in our team as well, but I don't think it is very
>> strict.  For example:
>> SELECT materialize_bills_for(userId) from users;  Any more proof to say
>> "STABLE" flag
>> is acceptable?
>>
>
> Oracle doesn't allow write operations in functions. Or didn't allow it - I
> am not sure what is possible now. So when you migrate data from Oracle, and
> if the function is not marked as DETERMINISTIC, you can safely mark it as
> STABLE.
>

You are correct.  Good to know the above points.


>  Elsewhere - it works 99% well. In special cases, there is some black
> magic - with fresh snapshots, and with using autonomous transactions, and
> these cases should be solved manually. Sometimes is good enough just
> removing autonomous transactions, sometimes the complete rewrite is
> necessary - or redesign functionality.
>
>
is the 1% == "special cases" ?  Do you mind sharing more information about
these cases,
either document or code?

[1] https://github.com/okbob/plpgsql_check/blob/master/README.md#features

-- 
Best Regards
Andy Fan (https://www.aliyun.com/)

Reply via email to