--
--> Fundamentals
CREATE OR REPLACE FUNCTION
nothing() RETURNS VOID LANGUAGE plpy AS 'pass';
SELECT nothing();
 nothing 
---------
 
(1 row)

--
--> Simple passthroughs
CREATE OR REPLACE FUNCTION
return(int) RETURNS int LANGUAGE plpy AS 'return args[0]';
SELECT return(-3);
 return 
--------
     -3
(1 row)

CREATE OR REPLACE FUNCTION
return(bigint) RETURNS bigint LANGUAGE plpy AS 'return args[0]';
SELECT return(-12839128482);
    return    
--------------
 -12839128482
(1 row)

CREATE OR REPLACE FUNCTION
return(text) RETURNS text LANGUAGE plpy AS 'return args[0]';
SELECT return('\nfoo bar feh   \t\t\n\n');
 return 
--------
 
foo bar feh   		


(1 row)

CREATE OR REPLACE FUNCTION
return(bytea) RETURNS bytea LANGUAGE plpy AS 'return args[0]';
SELECT return('\\0foobar\\0');
   return   
------------
 \0foobar\0
(1 row)

--
--> Test reinitialization
SELECT plpy_finalizer();
 plpy_finalizer 
----------------
 
(1 row)

SELECT nothing();
 nothing 
---------
 
(1 row)

SELECT plpy_finalizer();
 plpy_finalizer 
----------------
 
(1 row)

SELECT nothing();
 nothing 
---------
 
(1 row)

SELECT plpy_finalizer();
 plpy_finalizer 
----------------
 
(1 row)

SELECT nothing();
 nothing 
---------
 
(1 row)

SELECT plpy_finalizer();
 plpy_finalizer 
----------------
 
(1 row)

SELECT nothing();
 nothing 
---------
 
(1 row)

SELECT plpy_finalizer();
 plpy_finalizer 
----------------
 
(1 row)

SELECT nothing();
 nothing 
---------
 
(1 row)

SELECT plpy_finalizer();
 plpy_finalizer 
----------------
 
(1 row)

SELECT nothing();
 nothing 
---------
 
(1 row)

SELECT plpy_finalizer();
 plpy_finalizer 
----------------
 
(1 row)

SELECT nothing();
 nothing 
---------
 
(1 row)

SELECT plpy_finalizer();
 plpy_finalizer 
----------------
 
(1 row)

SELECT nothing();
 nothing 
---------
 
(1 row)

SELECT plpy_finalizer();
 plpy_finalizer 
----------------
 
(1 row)

SELECT nothing();
 nothing 
---------
 
(1 row)

SELECT plpy_finalizer();
 plpy_finalizer 
----------------
 
(1 row)

SELECT nothing();
 nothing 
---------
 
(1 row)

--
--> Test syntax exception
CREATE OR REPLACE FUNCTION syntaxerror () RETURNS VOID
LANGUAGE plpy AS '***';
NOTICE:  additional information
DETAIL:  (most recent call last):
  <NULL Traceback>
exceptions.SyntaxError invalid syntax (line 2)
ERROR:  generic procedure compilation failure.
--
--> Test reinitialization from exception
CREATE OR REPLACE FUNCTION exception () RETURNS VOID
LANGUAGE plpy AS 'foo';
SELECT exception();
ERROR:  function raised exception
DETAIL:  (most recent call last):
  File "Postgres", line 2, in exception

exceptions.NameError global name 'foo' is not defined
SELECT nothing();
 nothing 
---------
 
(1 row)

SELECT exception();
ERROR:  function raised exception
DETAIL:  (most recent call last):
  File "Postgres", line 2, in exception

exceptions.NameError global name 'foo' is not defined
SELECT nothing();
 nothing 
---------
 
(1 row)

SELECT exception();
ERROR:  function raised exception
DETAIL:  (most recent call last):
  File "Postgres", line 2, in exception

exceptions.NameError global name 'foo' is not defined
SELECT nothing();
 nothing 
---------
 
(1 row)

SELECT exception();
ERROR:  function raised exception
DETAIL:  (most recent call last):
  File "Postgres", line 2, in exception

exceptions.NameError global name 'foo' is not defined
SELECT nothing();
 nothing 
---------
 
(1 row)

SELECT exception();
ERROR:  function raised exception
DETAIL:  (most recent call last):
  File "Postgres", line 2, in exception

exceptions.NameError global name 'foo' is not defined
SELECT nothing();
 nothing 
---------
 
(1 row)

SELECT exception();
ERROR:  function raised exception
DETAIL:  (most recent call last):
  File "Postgres", line 2, in exception

exceptions.NameError global name 'foo' is not defined
SELECT nothing();
 nothing 
---------
 
(1 row)

SELECT exception();
ERROR:  function raised exception
DETAIL:  (most recent call last):
  File "Postgres", line 2, in exception

exceptions.NameError global name 'foo' is not defined
SELECT nothing();
 nothing 
---------
 
(1 row)

SELECT exception();
ERROR:  function raised exception
DETAIL:  (most recent call last):
  File "Postgres", line 2, in exception

exceptions.NameError global name 'foo' is not defined
SELECT nothing();
 nothing 
---------
 
(1 row)

SELECT exception();
ERROR:  function raised exception
DETAIL:  (most recent call last):
  File "Postgres", line 2, in exception

exceptions.NameError global name 'foo' is not defined
SELECT nothing();
 nothing 
---------
 
(1 row)

CREATE TABLE complex ( i int, b bigint, t text );
INSERT INTO complex VALUES ( 1, 2, '3' );
CREATE OR REPLACE FUNCTION ctest (complex) RETURNS VOID LANGUAGE plpy
AS 'Postgres.INFO(repr(args))';
SELECT ctest(complex) FROM complex;
INFO:  [( '1' i int4, '2' b int8, '3' t text )]
 ctest 
-------
 
(1 row)

DROP FUNCTION ctest(complex);
DROP TABLE complex;
/* vim: set filetype=sql: */
