Re: another plperl bug - Mailing list pgsql-hackers

From Michael Fuhr
Subject Re: another plperl bug
Date
Msg-id 20041123065623.GA23197@winnie.fuhr.org
Whole thread Raw
In response to Re: another plperl bug  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: another plperl bug  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
On Mon, Nov 22, 2004 at 03:34:17PM -0500, Tom Lane wrote:
> 
> Thanks for the examples.  I extended this into a simple regression test
> which I've added to CVS.  If anyone would like to add some test cases
> for more interesting stuff (triggers and error handling come to mind),
> step right up ...

How far do you want to go with checking return types?  Some of the
following test cases are approaching "garbage in, garbage out"
territory and I don't know how much effort you want to put into
protecting programmers from themselves.  Some of the cases already
raise errors; for consistency I'm inclined to think they all should.

Tests run against plperl.c 1.63, SPI.xs 1.11.


Test Case 1: scalar expected, non-scalar returned

CREATE FUNCTION test1() RETURNS TEXT AS $$
return ["test"];
$$ LANGUAGE plperl;

SELECT test1();     test1       
------------------ARRAY(0x8427a58)
(1 row)


Test Case 2: list of scalars expected, scalar returned

CREATE FUNCTION test2() RETURNS SETOF TEXT AS $$
return "test";  
$$ LANGUAGE plperl;

SELECT * FROM test2();
ERROR:  plperl: set-returning function must return reference to array


Test Case 3: list of scalars expected, list of non-scalars returned

CREATE FUNCTION test3() RETURNS SETOF TEXT AS $$
return [["test 1"], ["test 2"]];
$$ LANGUAGE plperl;

SELECT * FROM test3();     test3       
------------------ARRAY(0x8424e10)ARRAY(0x8424fcc)
(2 rows)


Test Case 4: hash expected, non-hash returned

CREATE TYPE footype AS (txtval TEXT, intval INTEGER);

CREATE FUNCTION test4() RETURNS footype AS $$
return "test"; 
$$ LANGUAGE plperl;

SELECT test4();
ERROR:  plperl: composite-returning function must return a reference to hash


Test Case 5: hash expected, keys not scalars

CREATE FUNCTION test5() RETURNS footype AS $$
return {["txtval"] => "test", ["intval"] => 42};
$$ LANGUAGE plperl;

SELECT test5();
ERROR:  plperl: invalid attribute "ARRAY(0x8431950)" in hash


Test Case 6: hash expected, value not scalar

CREATE FUNCTION test6() RETURNS footype AS $$
return {txtval => ["test"], intval => 42};
$$ LANGUAGE plperl;

SELECT * FROM test6();     txtval      | intval 
------------------+--------ARRAY(0x8433f9c) |     42
(1 row)


Test Case 7: list of hashes expected, list of non-hashes returned

CREATE FUNCTION test7() RETURNS SETOF footype AS $$
return ["test 1", 42];
$$ LANGUAGE plperl;

SELECT * FROM test7();
ERROR:  plperl: element of result array is not a reference to hash


Test Case 8: list of hashes expected, hash key not scalar

CREATE FUNCTION test8() RETURNS SETOF footype AS $$
return [{["txtval"] => "test 1", ["intval"] => 1}];
$$ LANGUAGE plperl;

SELECT * FROM test8();
ERROR:  plperl: invalid attribute "ARRAY(0x8437b48)" in hash


Test Case 9: list of hashes expected, hash value not scalar

CREATE FUNCTION test9() RETURNS SETOF footype AS $$
return [{txtval => ["test 1"], intval => 42}];  
$$ LANGUAGE plperl;

SELECT * FROM test9();     txtval      | intval 
------------------+--------ARRAY(0x8438d74) |     42
(1 row)


-- 
Michael Fuhr
http://www.fuhr.org/~mfuhr/


pgsql-hackers by date:

Previous
From: "Barry Lind"
Date:
Subject: Re: [JDBC] Strange server error with current 8.0beta driver
Next
From: Matt
Date:
Subject: Re: patch: plpgsql - access records with rec.(expr)