On Sunday, June 28, 2015, Pavel Stehule <pavel.steh...@gmail.com> wrote:

>
>
> 2015-06-28 14:26 GMT+02:00 Tomas Vondra <tomas.von...@2ndquadrant.com
> <javascript:_e(%7B%7D,'cvml','tomas.von...@2ndquadrant.com');>>:
>
>> Hi,
>>
>> On 06/28/2015 08:01 AM, Pavel Stehule wrote:
>>
>>>
>>> you can use PL/pgSQL - but there are some limits
>>>
>>> * maintenance large plpgsql functions
>>>
>>> * the plpgsql functions or anonymous functions create a transaction
>>> borders - what should not be wanted
>>>
>>
>> But why is that a problem? Generally (sub)transactions are a good thing,
>> but if you want, you may create one huge function. If you want to
>> modularize this a bit, you may split that into multiple functions, but
>> that's an option, not a requirement.
>>
>>
>>> * I cannot to use psql variables simply in plpgsql code (plpgsql has
>>> not any macro language) - so some patterns are implemented in plpgsql
>>> less readable
>>>
>>> for example, if you can create a script that create some plpgsql
>>> function for specified PostgreSQL version, then using PLpgSQL for this
>>> purpose is suboptimal due less readability and maintainability
>>>
>>
>> I don't really see how a block of PL/pgSQL code is less maintainable than
>> a similar block of code written in a pseudo-scripting language specific to
>> psql. Actually I'd expect exactly the opposite, as PL/pgSQL has neat
>> features like exception handling and such, which is completely absent in
>> psql, or proper variables, which is somehow mimicked by session variables
>> in psql.
>>
>> If you really need to do the scripting outsite PL/pgSQL, there's plenty
>> of suitable tools for that purpose IMHO. Starting with bash, or languages
>> like Perl or Python.
>>
>
> <b>I don't propose psql scripting.</b>
>
> I propose simple statement for conditional statement execution. The core
> of my proposal are commands
>
> \if_ver_gt, \if_ver_lt
>
> Example:
>
> \if_ver_le 8.3.0
>
> CREATE OR REPLACE FUNCTION unnest(anyarray)
> RETURNS SETOF anyelement AS $$
> BEGIN ... END
> $$ LANGUAGE plpgsql;
>
> \endif
>
> instead
>
> DO $xx$
> BEGIN
>   IF version_le(version(), '8.3.0') THEN
>
> CREATE OR REPLACE FUNCTION unnest(anyarray)
> RETURNS SETOF anyelement AS $$
> BEGIN ... END
> $$ LANGUAGE plpgsql;
>
>   END IF;
> END;
>
>>
>>
why require a script language in the first place, at least for this
specific use case?

CREATE FUNCTION IF (VERSION <= 8.3.0) unnest(...)

Similar to the existing CINE syntax.

I am partial to making psql more powerful and self-contained but
conditionals on versions as a primitive (albeit extension) of SQL seems
reasonable at first blush.

David J.

Reply via email to