1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-30 11:03:19 +03:00

Improve pl/pgsql to support composite-type expressions in RETURN.

For some reason lost in the mists of prehistory, RETURN was only coded to
allow a simple reference to a composite variable when the function's return
type is composite.  Allow an expression instead, while preserving the
efficiency of the original code path in the case where the expression is
indeed just a composite variable's name.  Likewise for RETURN NEXT.

As is true in various other places, the supplied expression must yield
exactly the number and data types of the required columns.  There was some
discussion of relaxing that for pl/pgsql, but no consensus yet, so this
patch doesn't address that.

Asif Rehman, reviewed by Pavel Stehule
This commit is contained in:
Tom Lane
2012-12-06 23:09:52 -05:00
parent da07a1e856
commit 31a891857a
7 changed files with 508 additions and 138 deletions

View File

@ -1571,11 +1571,11 @@ RETURN <replaceable>expression</replaceable>;
</para>
<para>
When returning a scalar type, any expression can be used. The
expression's result will be automatically cast into the
function's return type as described for assignments. To return a
composite (row) value, you must write a record or row variable
as the <replaceable>expression</replaceable>.
In a function that returns a scalar type, the expression's result will
automatically be cast into the function's return type as described for
assignments. But to return a composite (row) value, you must write an
expression delivering exactly the requested column set. This may
require use of explicit casting.
</para>
<para>
@ -1600,6 +1600,20 @@ RETURN <replaceable>expression</replaceable>;
however. In those cases a <command>RETURN</command> statement is
automatically executed if the top-level block finishes.
</para>
<para>
Some examples:
<programlisting>
-- functions returning a scalar type
RETURN 1 + 2;
RETURN scalar_var;
-- functions returning a composite type
RETURN composite_type_var;
RETURN (1, 2, 'three'::text); -- must cast columns to correct types
</programlisting>
</para>
</sect3>
<sect3>