Skip site navigation (1) Skip section navigation (2)

Peripheral Links

Header And Logo

PostgreSQL
| The world's most advanced open source database.

Site Navigation

Search for
  Advanced Search

Re: [GENERAL] Returning a RECORD, not SETOF RECORD


  • From: Michael Fuhr <mike(at)fuhr(dot)org>
  • To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
  • Cc: Thomas Hallgren <thhal(at)mailblocks(dot)com>, pgsql-hackers(at)postgresql(dot)org
  • Subject: Re: [GENERAL] Returning a RECORD, not SETOF RECORD
  • Date: Fri, 29 Apr 2005 11:21:35 -0600
  • Message-id: <20050429172135(dot)GA2695(at)winnie(dot)fuhr(dot)org>

On Fri, Apr 29, 2005 at 10:36:05AM -0400, Tom Lane wrote:
>
> regression=# select (xyz(unique1,unique2)).* from tenk1 limit 5;

This is a little off topic, but I've noticed that the above invokes
the function once per output column:

CREATE FUNCTION xyz(INOUT x integer, INOUT y integer, OUT z integer) AS $$
BEGIN
    RAISE INFO 'calling xyz';
    z := x + y;
END;
$$ LANGUAGE plpgsql IMMUTABLE;

SELECT xyz(1,2);
INFO:  calling xyz
   xyz   
---------
 (1,2,3)
(1 row)

SELECT (xyz(1,2)).*;
INFO:  calling xyz
INFO:  calling xyz
INFO:  calling xyz
 x | y | z 
---+---+---
 1 | 2 | 3
(1 row)

Is that because the splat causes the query to be expanded into
"SELECT (xyz(1,2)).x, (xyz(1,2)).y, (xyz(1,2)).z"?  Is it possible
or desirable to optimize that into a single call, at least if the
function were stable or immutable?

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



Home | Main Index | Thread Index

Privacy Policy | PostgreSQL Archives hosted by Command Prompt, Inc. | Designed by tinysofa
Copyright © 1996 – 2008 PostgreSQL Global Development Group