Thread: Bug? Unexpected argument handling in pl-python variadic argument function

Unexpected argument handling in pl/python variadic argument function

create or replace function variadic_sql(template text, variadic args text[], out text)language sql as$$    select $1 ||
' --  ' || $2::text$$; 

create or replace function variadic_python(template text, variadic args text[], out text)language plpythonu as$$
returntemplate + '  --  ' + str(args)$$; 


-- expected
select variadic_sql('<html>{foo}{bar}</html>', '1', '2');           variadic_sql
------------------------------------<html>{foo}{bar}</html>  --  {1,2}


-- first scalar arg also in the variadic args
select variadic_python('<html>{foo}{bar}</html>', '1', '2');

                          variadic_python
----------------------------------------------------------------------<html>{foo}{bar}</html>  --
['<html>{foo}{bar}</html>',['1', '2']] 


select version();PostgreSQL 9.0.1 on i686-pc-linux-gnu, compiled by GCC
i686-pc-linux-gnu-gcc (Gentoo 4.4.2 p1.0) 4.4.2, 32-bit
(1 row)


I could not find very much documentation and only this on the lists:

from Jan Urbański on his planned improvements for pl/python:
http://archives.postgresql.org/pgsql-hackers/2010-12/msg00551.php

> * variadic argument handling (is this possible for a non-plpgsql pl?)

Does this mean this is already a recognized flaw or it was unknown at
the time if the feature was implemented?  I would definitely would not
expect the argument to duplicated.  I know there is big patch for
pl/python being reviewed right now.  Perhaps this is being fixed? It
would be wonderful for plpython to support complex arguments
gracefully.



--
Thanks,
Nate Carson


Re: Bug? Unexpected argument handling in pl-python variadic argument function

From
Jan Urbański
Date:
On 24/01/11 02:01, Nate C wrote:
> Unexpected argument handling in pl/python variadic argument function
> 
> create or replace function variadic_sql
>     (template text, variadic args text[], out text)
>     language sql as
>     $$
>         select $1 || '  --  ' || $2::text
>     $$;
> 
> create or replace function variadic_python
>     (template text, variadic args text[], out text)
>     language plpythonu as
>     $$
>         return template + '  --  ' + str(args)
>     $$;
> 
> 
> -- expected
> select variadic_sql('<html>{foo}{bar}</html>', '1', '2');
>             variadic_sql
> ------------------------------------
>  <html>{foo}{bar}</html>  --  {1,2}
> 
> 
> -- first scalar arg also in the variadic args
> select variadic_python('<html>{foo}{bar}</html>', '1', '2');
> 
> 
>                            variadic_python
> ----------------------------------------------------------------------
>  <html>{foo}{bar}</html>  --  ['<html>{foo}{bar}</html>', ['1', '2']]

You've chosen an unfortunate name for the variadic argument: see
http://www.postgresql.org/docs/current/static/plpython-funcs.html

PL/Python functions automatically have a global "args" variable that is
a list of all the arguments. That's necessary because you can have
functions that don't assign names to variables, like

create function noname_concat(text, text) returns text language
plpythonu as $$ return args[0] + args[1]
$$;

Perhaps we should throw an error if you try to define a function with an
explicit "args" variable? It'd be a backwards-compatibility problem, but
then again these functions are probably already broken for people.


> I could not find very much documentation and only this on the lists:
> 
> from Jan Urbański on his planned improvements for pl/python:
> http://archives.postgresql.org/pgsql-hackers/2010-12/msg00551.php
> 
>> * variadic argument handling (is this possible for a non-plpgsql pl?)

Yes, I thought it would require some work but it turned out that the
generic mechanism already worked for variadic arguments, so there's no
need for specific PL/Python code to support them.

Cheers,
Jan