Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
doc: show functions returning record types and use of ROWS FROM
authorBruce Momjian <bruce@momjian.us>
Mon, 5 Oct 2020 20:27:33 +0000 (16:27 -0400)
committerBruce Momjian <bruce@momjian.us>
Mon, 5 Oct 2020 20:27:33 +0000 (16:27 -0400)
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

doc/src/sgml/queries.sgml

index 781ea43d4bef4f704cabc154b61d9222cfa37653..634b91908f6fc233209f6498d7080093e1de6e2b 100644 (file)
@@ -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">