- publishing free software manuals
PostgreSQL Reference Manual - Volume 2 - Programming Guide
by The PostgreSQL Global Development Group
Paperback (6"x9"), 408 pages
ISBN 0954612035
RRP £19.95 ($34.95)

Sales of this book support the PostgreSQL project! Get a printed copy>>>

5.4.6 Polymorphic SQL Functions

SQL functions may be declared to accept and return the polymorphic types anyelement and anyarray. See section 5.2.5 Polymorphic Types for a more detailed explanation of polymorphic functions. Here is a polymorphic function make_array that builds up an array from two arbitrary data type elements:

CREATE FUNCTION make_array(anyelement, anyelement) RETURNS
 anyarray AS $$
    SELECT ARRAY[$1, $2];

SELECT make_array(1, 2) AS intarray, make_array('a'::text,
 'b') AS textarray;
 intarray | textarray
 {1,2}    | {a,b}
(1 row)

Notice the use of the typecast 'a'::text to specify that the argument is of type text. This is required if the argument is just a string literal, since otherwise it would be treated as type unknown, and array of unknown is not a valid type. Without the typecast, you will get errors like this:

ERROR:  could not determine "anyarray"/"anyelement" type
 because input has type "unknown"

It is permitted to have polymorphic arguments with a fixed return type, but the converse is not. For example:

CREATE FUNCTION is_greater(anyelement, anyelement) RETURNS
 boolean AS $$
    SELECT $1 > $2;

SELECT is_greater(1, 2);
(1 row)

CREATE FUNCTION invalid_func() RETURNS anyelement AS $$
    SELECT 1;
ERROR:  cannot determine result data type
DETAIL:  A function returning "anyarray" or "anyelement" must
 have at least one argument of either type.

Polymorphism can be used with functions that have output arguments. For example:

CREATE FUNCTION dup (f1 anyelement, OUT f2 anyelement, OUT f3
AS 'select $1, array[$1,$1]' LANGUAGE sql;

SELECT * FROM dup(22);
 f2 |   f3
 22 | {22,22}
(1 row)
ISBN 0954612035PostgreSQL Reference Manual - Volume 2 - Programming GuideSee the print edition