Commit dd0a64ed authored by Bruce Momjian's avatar Bruce Momjian

doc: show functions returning record types and use of ROWS FROM

Previously it was unclear exactly how ROWS FROM behaved and how to cast
the data types of columns returned by FROM functions.  Also document
that only non-OUT record functions can have their columns cast to data
types.

Reported-by: guyren@gmail.com

Discussion: https://postgr.es/m/158638264419.662.2482095087061084020@wrigleys.postgresql.org

Backpatch-through: 9.5
parent 253f1025
......@@ -762,7 +762,8 @@ SELECT * FROM vw_getfoo;
In some cases it is useful to define table functions that can
return different column sets depending on how they are invoked.
To support this, the table function can be declared as returning
the pseudo-type <type>record</type>. When such a function is used in
the pseudo-type <type>record</type> with no <literal>OUT</literal>
parameters. When such a function is used in
a query, the expected row structure must be specified in the
query itself, so that the system can know how to parse and plan
the query. This syntax looks like:
......@@ -803,6 +804,33 @@ SELECT *
that the parser knows, for example, what <literal>*</literal> should
expand to.
</para>
<para>
This example uses <literal>ROWS FROM</literal>:
<programlisting>
SELECT *
FROM ROWS FROM
(
json_to_recordset('[{"a":40,"b":"foo"},{"a":"100","b":"bar"}]')
AS (a INTEGER, b TEXT),
generate_series(1, 3)
) AS x (p, q, s)
ORDER BY p;
p | q | s
-----+-----+---
40 | foo | 1
100 | bar | 2
| | 3
</programlisting>
It joins two functions into a single <literal>FROM</literal>
target. <function>json_to_recordset()</function> is instructed
to return two columns, the first <type>integer</type>
and the second <type>text</type>. The result of
<function>generate_series()</function> is used directly.
The <literal>ORDER BY</literal> clause sorts the column values
as integers.
</para>
</sect3>
<sect3 id="queries-lateral">
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment