Thread: BUG #4533: Plpgsql complex type failure

BUG #4533: Plpgsql complex type failure

From
"Rod Taylor"
Date:
The following bug has been logged online:

Bug reference:      4533
Logged by:          Rod Taylor
Email address:      rod.taylor@gmail.com
PostgreSQL version: 8.3.5
Operating system:   FreeBSD 7.0 Stable
Description:        Plpgsql complex type failure
Details:

The below script should be able to correctly set v_time to the complex type
timestamp_with_precision. It seems to take it as "timestamp with time zone"
instead creating interesting errors like this:

BEGIN
CREATE TYPE
CREATE FUNCTION
psql:/home/rbt/foo.sql:19: ERROR:  invalid input syntax for type timestamp
with time zone: "("2008-11-16 00:00:00-05",day)"
CONTEXT:  PL/pgSQL function "testfunc" line 4 at SQL statement
ROLLBACK


Note, the below continues to fail in the same way using
timestamp_with_precision%ROWTYPE.


BEGIN;

CREATE TYPE timestamp_with_precision AS
( timestamp timestamp with time zone
, timestamp_precision varchar
);

CREATE OR REPLACE FUNCTION testfunc() RETURNS boolean AS $FUNC$
DECLARE
  v_time timestamp_with_precision;
BEGIN
  SELECT (CURRENT_DATE, 'day')::timestamp_with_precision
    INTO v_time;

  RETURN true;
END;
$FUNC$ LANGUAGE plpgsql VOLATILE SECURITY DEFINER RETURNS NULL ON NULL
INPUT;

SELECT testfunc();


ROLLBACK;

Re: BUG #4533: Plpgsql complex type failure

From
Tom Lane
Date:
"Rod Taylor" <rod.taylor@gmail.com> writes:
> DECLARE
>   v_time timestamp_with_precision;
> BEGIN
>   SELECT (CURRENT_DATE, 'day')::timestamp_with_precision
>     INTO v_time;

You're overthinking the problem, it should just read

  SELECT CURRENT_DATE, 'day'
    INTO v_time;

            regards, tom lane

Re: BUG #4533: Plpgsql complex type failure

From
Tom Lane
Date:
"Rod Taylor" <rod.taylor@gmail.com> writes:
> That was the short form exhibiting the bug. Selecting the complex
> column from a table into a value results in the same error.

Well, you could do "SELECT t.* INTO v_time".  The fundamental point here
is that when the INTO target is a rowtype variable, plpgsql expects to
assign the columns of the SELECT result to the fields of the variable.
We can't change that without breaking enormous amounts of existing code.

            regards, tom lane

Re: BUG #4533: Plpgsql complex type failure

From
"Rod Taylor"
Date:
That was the short form exhibiting the bug. Selecting the complex
column from a table into a value results in the same error.


BEGIN;

CREATE TYPE timestamp_with_precision AS
( timestamp timestamp with time zone
, timestamp_precision varchar
);

CREATE TABLE timetest(t timestamp_with_precision);
INSERT INTO timetest VALUES ((CURRENT_DATE, 'day')::timestamp_with_precision);

CREATE OR REPLACE FUNCTION testfunc() RETURNS boolean AS $FUNC$
DECLARE
 v_time timestamp_with_precision;
BEGIN
 SELECT t
   INTO v_time
   FROM timetest;

 RETURN true;
END;
$FUNC$ LANGUAGE plpgsql VOLATILE SECURITY DEFINER RETURNS NULL ON NULL
INPUT;

SELECT testfunc();

ROLLBACK;





On Sat, Nov 22, 2008 at 1:37 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> "Rod Taylor" <rod.taylor@gmail.com> writes:
>> DECLARE
>>   v_time timestamp_with_precision;
>> BEGIN
>>   SELECT (CURRENT_DATE, 'day')::timestamp_with_precision
>>     INTO v_time;
>
> You're overthinking the problem, it should just read
>
>  SELECT CURRENT_DATE, 'day'
>    INTO v_time;
>
>                        regards, tom lane
>