PL/Python: How to return an empty set?

1k views Asked by At

I have a function that operates on int[]. I want to have the ability to check if the array is empty and in that case to stop since there is nothing to do.

this is my funcion:

CREATE OR REPLACE FUNCTION func2(c integer[])
  RETURNS SETOF func_type AS
$BODY$
result=plpy.execute("SELECT * FROM func1(ARRAY%s)"%c)
return result;
$BODY$
  LANGUAGE plpythonu VOLATILE

func_type defined as:

CREATE TYPE func_type AS
   (x integer,
    y numeric,
    z integer,
    zz integer);

when I added a check:

$BODY$
if not c:
    return  

I got an error:

ERROR:  returned object cannot be iterated
DETAIL:  PL/Python set-returning functions must return an iterable object.

I understand that I have to return func_type and func_type was not built since there was no plpy.execute but still how can I make it return at this point? Also, assume func3 called func2. How would func3 can check that there are 0 rows returned?

1

There are 1 answers

0
Clodoaldo Neto On BEST ANSWER

If you declare the function strict then it will not be executed and will return null whenever any of its arguments is null

http://www.postgresql.org/docs/current/static/sql-createfunction.html

In case the passed array is empty and you want to return an empty set then return an empty array:

create or replace function func2(c integer[])
  returns setof func_type as
$body$

if not c:
    return []

$body$ language plpythonu;

select * from func2(array[]::int[]);
 x | y | z | zz 
---+---+---+----
(0 rows)