Thread: Arrays in pl/pgsql functions

Arrays in pl/pgsql functions

From
"Donald Fraser"
Date:
PostgreSQL version 7.3.3

With reference to pl/pgsql functions.
I can declare a function to return an array type and I get no complaints when
defining or executing it.
I can declare a variable within the function as an array type and I don't get
any complaints defining or executing the function.
When I try to access the array I have problems.
I cannot find any documentation on accessing array types so I assumed they
would follow the pgSQL notation of for example:

CREATE OR REPLACE FUNCTION test_arrays() RETURNS int4[] AS '
DECLARE
     test int4[];
BEGIN
    test[1] := 1;
    RETURN test;
END ' LANGUAGE 'plpgsql';

If I try to execute this function I get:
WARNING:  plpgsql: ERROR during compile of test_arrays near line 5
ERROR:  syntax error at or near "["

If I comment out the line:
test[1] := 1;
then the function executes ok.

Could someone be please inform me what the correct syntax for accessing arrays
is or tell me if its not possible with pl/pgSQL functions.

Thanks in advance,
Donald Fraser.


Re: Arrays in pl/pgsql functions

From
Joe Conway
Date:
Donald Fraser wrote:
> Could someone be please inform me what the correct syntax for accessing arrays
> is or tell me if its not possible with pl/pgSQL functions.
>

It won't work in 7.3.x or before, as you've noted. In 7.4 this will work:

CREATE OR REPLACE FUNCTION test_arrays() RETURNS int4[] AS '
DECLARE
      test int4[] := ''{}'';
BEGIN
     test[1] := 1;
     RETURN test;
END ' LANGUAGE 'plpgsql';

regression=# select test_arrays();
  test_arrays
-------------
  {1}
(1 row)

Note that you have to initialize "test" to an empty array, because
otherwise you are trying to add an element to a NULL::int4[], the result
of which is still NULL.

Joe


Re: Arrays in pl/pgsql functions

From
"Donald Fraser"
Date:
Many thanks for clearing that one up.
I have avoided using arrays for the mean time and gone for the more elegant
solution of using an additional table. More flexible and powerful but, in the
simple case that I needed, meant more work... Roll on 7.4 !

Regards
Donald Fraser.

----- Original Message -----
From: "Joe Conway" <mail@joeconway.com>
To: "Donald Fraser" <demolish@cwgsy.net>
Cc: "[ADMIN]" <pgsql-admin@postgresql.org>
Sent: Thursday, July 17, 2003 6:50 PM
Subject: Re: [ADMIN] Arrays in pl/pgsql functions


> Donald Fraser wrote:
> > Could someone be please inform me what the correct syntax for accessing
arrays
> > is or tell me if its not possible with pl/pgSQL functions.
> >
>
> It won't work in 7.3.x or before, as you've noted. In 7.4 this will work:
>
> CREATE OR REPLACE FUNCTION test_arrays() RETURNS int4[] AS '
> DECLARE
>       test int4[] := ''{}'';
> BEGIN
>      test[1] := 1;
>      RETURN test;
> END ' LANGUAGE 'plpgsql';
>
> regression=# select test_arrays();
>   test_arrays
> -------------
>   {1}
> (1 row)
>
> Note that you have to initialize "test" to an empty array, because
> otherwise you are trying to add an element to a NULL::int4[], the result
> of which is still NULL.
>
> Joe
>
>


Re: Arrays in pl/pgsql functions

From
Tom Lane
Date:
"Donald Fraser" <demolish@cwgsy.net> writes:
> CREATE OR REPLACE FUNCTION test_arrays() RETURNS int4[] AS '
> DECLARE
>      test int4[];
> BEGIN
>     test[1] := 1;
>     RETURN test;
> END ' LANGUAGE 'plpgsql';

> If I try to execute this function I get:
> WARNING:  plpgsql: ERROR during compile of test_arrays near line 5
> ERROR:  syntax error at or near "["

Existing releases of plpgsql don't support assignment to array elements.
I believe Joe Conway has fixed this for 7.4, though.

            regards, tom lane