return query with set-returning functions

From: Robert Treat <xzilla(at)users(dot)sourceforge(dot)net>
To: pgsql-bugs(at)postgresql(dot)org
Subject: return query with set-returning functions
Date: 2008-08-11 22:27:34
Message-ID: 200808111827.34685.xzilla@users.sourceforge.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

we might have found a bug in postgres... first draft of bug report looks like
so

using 8.3.3, i have the following 2 plpgsql functions

reconnoiter=# \df stratcon.fetch_dataset
List of
functions
Schema | Name | Result data type |
Argument data types
----------+---------------+-----------------------------------------+-------------------------------------------------------------------------------------
stratcon | fetch_dataset | setof stratcon.rollup_matrix_numeric_5m | integer,
text, timestamp with time zone, timestamp with time zone, integer, boolean
stratcon | fetch_dataset | setof stratcon.rollup_matrix_numeric_5m | uuid,
text, timestamp with time zone, timestamp with time zone, integer, boolean

the second function takes a uuid, looks up an integer representation, and then
calls the first function. whenever I run it, I get the following error:

reconnoiter=# select * from
stratcon.fetch_dataset('cfe2aad7-71e5-400b-8418-a6d5834a0386'::uuid,'inoctets','2008-08-04
15:01:13-04','2008-08-11 15:01:13-04',500,'t');
ERROR: structure of query does not match function result type
CONTEXT: PL/pgSQL function "fetch_dataset" line 9 at RETURN QUERY

if i run the first function manually though, that function runs fine. looking
at pg_proc, the return types seem like they should be fine (same type, is a
set)

reconnoiter=# select proname, proargtypes, proretset, prorettype from pg_proc
where proname = 'fetch_dataset';
proname | proargtypes | proretset | prorettype
---------------+-------------------------+-----------+------------
fetch_dataset | 23 25 1184 1184 23 16 | t | 16905
fetch_dataset | 2950 25 1184 1184 23 16 | t | 16905

i even made a modified version to make sure the return type would match up
with the datatype:

CREATE or replace FUNCTION stratcon.fetch_dataset(in_uuid uuid, in_name text,
in_start_time timestamp with time zone, in_end_time timestamp with time zone,
in_hopeful_nperiods integer, derive boolean) RETURNS SETOF
stratcon.rollup_matrix_numeric_5m
AS $$
declare
v_sid int;
v_record stratcon.rollup_matrix_numeric_5m%rowtype;
begin
select sid into v_sid from stratcon.map_uuid_to_sid where id = in_uuid;
if not found then
return;
end if;

for v_record in select sid, name, rollup_time, count_rows, avg_value from
stratcon.fetch_dataset(v_sid::integer, in_name, in_start_time, in_end_time,
in_hopeful_nperiods, derive) loop
return next v_record;
end loop;

--- return query select sid, name, rollup_time, count_rows, avg_value from
stratcon.fetch_dataset(v_sid::integer, in_name, in_start_time, in_end_time,
in_hopeful_nperiods, derive);
return;
end
$$
LANGUAGE plpgsql;

in this case, the loop version works fine, even though I get an error with
return query. is there some limitation with return query and set returning
functions, or is this just a bug?

btw, table looks like this:
reconnoiter=# \d stratcon.rollup_matrix_numeric_5m
Table "stratcon.rollup_matrix_numeric_5m"
Column | Type | Modifiers
-------------+--------------------------+-----------
sid | integer | not null
name | text | not null
rollup_time | timestamp with time zone | not null
count_rows | integer |
avg_value | numeric |
Indexes:
"rollup_matrix_numeric_5m_pkey" PRIMARY KEY, btree (rollup_time, sid,
name) CLUSTER

the full code for the int version of the function can be found at
https://labs.omniti.com/trac/reconnoiter/browser/trunk/sql/reconnoiter_ddl_dump.sql#L402

--
Robert Treat
Build A Brighter LAMP :: Linux Apache {middleware} PostgreSQL

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Tom Lane 2008-08-12 01:30:39 Re: BUG #4351: Full text search performance
Previous Message Lawrence Cohan 2008-08-11 21:28:22 BUG #4351: Full text search performance