2015-03-08 19:31 GMT+01:00 Pavel Stehule <pavel.steh...@gmail.com>:

> Hi
>
> I am sending a proof concept. Current implementation is not suboptimal - I
> wrote this code for demonstration of current issues, and checking possible
> side effects of changes in this patch.
>

I am sorry - typo " Current implementation (patch) ***is*** suboptimal"

Best regards

Pavel


>
> The basic problem is strong restrictive implementation of polymorphic
> types - now these types doesn't allow any cast although it is possible. It
> can be changed relatively simply I though (after we implemented variadic
> functions).
>
> CREATE OR REPLACE FUNCTION public.foo1(anyelement, anyelement)
>  RETURNS anyelement
>  LANGUAGE sql
> AS $function$
> SELECT $1 + $2;
> $function$
>
> CREATE OR REPLACE FUNCTION public.foo2(anyelement, anyelement)
>  RETURNS anyarray
>  LANGUAGE sql
> AS $function$
> SELECT ARRAY[$1, $2]
> $function$
>
> Now, polymorphic functions don't allow some natively expected calls:
>
> postgres=# select foo1(1,1);
>  foo1
> ------
>     2
> (1 row)
>
> postgres=# select foo1(1,1.1);
> ERROR:  function foo1(integer, numeric) does not exist
> LINE 1: select foo1(1,1.1);
>                ^
> HINT:  No function matches the given name and argument types. You might
> need to add explicit type casts.
>
> postgres=# select foo2(1,1);
>  foo2
> -------
>  {1,1}
> (1 row)
>
> postgres=# select foo2(1,1.1);
> ERROR:  function foo2(integer, numeric) does not exist
> LINE 1: select foo2(1,1.1);
>                ^
> HINT:  No function matches the given name and argument types. You might
> need to add explicit type casts.
>
>
> CREATE OR REPLACE FUNCTION public.foo3(VARIADIC anyarray)
>  RETURNS anyelement
>  LANGUAGE sql
> AS $function$
> SELECT min(v) FROM unnest($1) g(v)
> $function$
>
> postgres=# SELECT foo3(1,2,3);
>  foo3
> ------
>     1
> (1 row)
>
> postgres=# SELECT foo3(1,2,3.1);
> ERROR:  function foo3(integer, integer, numeric) does not exist
> LINE 1: SELECT foo3(1,2,3.1);
>                ^
> HINT:  No function matches the given name and argument types. You might
> need to add explicit type casts.
>
>
> Some our functions like COALESCE are not too restrictive and allow to use
> types from same category.
>
> postgres=# select coalesce(1,1.1);
>  coalesce
> ----------
>         1
> (1 row)
>
> With attached patch the polymorphic functions use same mechanism as our
> buildin functions. It is applied on ANYARRAY, ANYELEMENT types only.
>
> postgres=# select foo1(1,1.1), foo2(1,1.1), foo3(1.1,2,3.1);
>  foo1 |  foo2   | foo3
> ------+---------+------
>   2.1 | {1,1.1} |  1.1
> (1 row)
>
> Comments, notices, ... ?
>
> Regards
>
> Pavel
>
>
> 2014-11-24 20:52 GMT+01:00 Pavel Stehule <pavel.steh...@gmail.com>:
>
>> Hello
>>
>> now a functions with more than one polymorphic arguments are relative
>> fragile due missing casting to most common type. Some our "functions" like
>> "coalesce" can do it, so it is surprising for our users.
>>
>> our custom polymorphic function foo(anyelement, anyelement) working well
>> for
>>
>> foo(10,20) or foo(10.1, 20.1), but not for foo(10, 20.1)
>>
>> I am thinking, so we can add a searching most common type stage without
>> breaking to backing compatibility.
>>
>> What do you think about it?
>>
>> Regards
>>
>> Pavel
>>
>
>

Reply via email to