aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2020-10-05 16:27:33 -0400
committerBruce Momjian <bruce@momjian.us>2020-10-05 16:27:33 -0400
commit54ec775e39cda4bf4047a03699e191e5a9f1fd27 (patch)
treea82c0b00fdbc594cfcd965415a9f581da905db68
parente3bd026fbb91c64e99c2a66eceb2dba3cc3ec6f0 (diff)
downloadpostgresql-54ec775e39cda4bf4047a03699e191e5a9f1fd27.tar.gz
postgresql-54ec775e39cda4bf4047a03699e191e5a9f1fd27.zip
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
-rw-r--r--doc/src/sgml/queries.sgml30
1 files changed, 29 insertions, 1 deletions
diff --git a/doc/src/sgml/queries.sgml b/doc/src/sgml/queries.sgml
index 013997149ea..7f997657412 100644
--- a/doc/src/sgml/queries.sgml
+++ b/doc/src/sgml/queries.sgml
@@ -764,7 +764,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 pseudotype <type>record</>. When such a function is used in
+ the pseudotype <type>record</> 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:
@@ -805,6 +806,33 @@ SELECT *
that the parser knows, for example, what <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">