|
|
|
@ -10249,16 +10249,25 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<sect1 id="functions-xml"> |
|
|
|
|
|
|
|
|
|
<title>XML Functions</title> |
|
|
|
|
|
|
|
|
|
<indexterm> |
|
|
|
|
<primary>XML Functions</primary> |
|
|
|
|
</indexterm> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
The functions and function-like expressions described in this |
|
|
|
|
section operate on values of type <type>xml</type>. Check <xref |
|
|
|
|
section operate on values of type <type>xml</type>. See <xref |
|
|
|
|
linkend="datatype-xml"/> for information about the <type>xml</type> |
|
|
|
|
type. The function-like expressions <function>xmlparse</function> |
|
|
|
|
and <function>xmlserialize</function> for converting to and from |
|
|
|
|
type <type>xml</type> are not repeated here. Use of most of these |
|
|
|
|
functions requires the installation to have been built |
|
|
|
|
type <type>xml</type> are documented there, not in this section. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
Use of most of these functions |
|
|
|
|
requires <productname>PostgreSQL</productname> to have been built |
|
|
|
|
with <command>configure --with-libxml</command>. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
@ -10453,8 +10462,8 @@ SELECT xmlelement(name foo, xmlattributes('xyz' as bar), |
|
|
|
|
encoding, depending on the setting of the configuration parameter |
|
|
|
|
<xref linkend="guc-xmlbinary"/>. The particular behavior for |
|
|
|
|
individual data types is expected to evolve in order to align the |
|
|
|
|
SQL and PostgreSQL data types with the XML Schema specification, |
|
|
|
|
at which point a more precise description will appear. |
|
|
|
|
PostgreSQL mappings with those specified in SQL:2006 and later, |
|
|
|
|
as discussed in <xref linkend="functions-xml-limits-casts"/>. |
|
|
|
|
</para> |
|
|
|
|
</sect3> |
|
|
|
|
|
|
|
|
@ -10696,10 +10705,13 @@ SELECT xmlagg(x) FROM (SELECT * FROM test ORDER BY y DESC) AS tab; |
|
|
|
|
</synopsis> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
The function <function>xmlexists</function> returns true if the |
|
|
|
|
XPath expression in the first argument returns any nodes, and |
|
|
|
|
false otherwise. (If either argument is null, the result is |
|
|
|
|
null.) |
|
|
|
|
The function <function>xmlexists</function> evaluates an XPath 1.0 |
|
|
|
|
expression (the first argument), with the passed XML value as its context |
|
|
|
|
item. The function returns false if the result of that evaluation |
|
|
|
|
yields an empty node-set, true if it yields any other value. The |
|
|
|
|
function returns null if any argument is null. A nonnull value |
|
|
|
|
passed as the context item must be an XML document, not a content |
|
|
|
|
fragment or any non-XML value. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
@ -10715,25 +10727,14 @@ SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY VALUE '<towns><town>T |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
The <literal>BY REF</literal> or <literal>BY VALUE</literal> clauses |
|
|
|
|
have no effect in <productname>PostgreSQL</productname>, but are allowed |
|
|
|
|
for compatibility with other implementations. Per the <acronym>SQL</acronym> |
|
|
|
|
standard, the one that precedes any argument is required, and indicates |
|
|
|
|
the default for arguments that follow, and one may follow any argument to |
|
|
|
|
override the default. |
|
|
|
|
<productname>PostgreSQL</productname> ignores <literal>BY REF</literal> |
|
|
|
|
and passes by value always. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
In the <acronym>SQL</acronym> standard, an <function>xmlexists</function> |
|
|
|
|
construct evaluates an expression in the XQuery language, allows passing |
|
|
|
|
values for named parameters in the expression as well as for the context |
|
|
|
|
item, and does not require the passed values to be documents, or even of |
|
|
|
|
XML type. |
|
|
|
|
In <productname>PostgreSQL</productname>, this construct currently only |
|
|
|
|
evaluates an XPath 1.0 expression, and allows passing only one value, |
|
|
|
|
which must be an XML document, to be the context item. |
|
|
|
|
The <literal>BY REF</literal> and <literal>BY VALUE</literal> clauses |
|
|
|
|
are accepted in <productname>PostgreSQL</productname>, but are ignored, |
|
|
|
|
as discussed in <xref linkend="functions-xml-limits-postgresql"/>. |
|
|
|
|
In the SQL standard, the <function>xmlexists</function> function |
|
|
|
|
evaluates an expression in the XML Query language, |
|
|
|
|
but <productname>PostgreSQL</productname> allows only an XPath 1.0 |
|
|
|
|
expression, as discussed in |
|
|
|
|
<xref linkend="functions-xml-limits-xpath1"/>. |
|
|
|
|
</para> |
|
|
|
|
</sect3> |
|
|
|
|
|
|
|
|
@ -10839,12 +10840,12 @@ SELECT xml_is_well_formed_document('<pg:foo xmlns:pg="http://postgresql.org/stuf |
|
|
|
|
</synopsis> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
The function <function>xpath</function> evaluates the XPath |
|
|
|
|
The function <function>xpath</function> evaluates the XPath 1.0 |
|
|
|
|
expression <replaceable>xpath</replaceable> (a <type>text</type> value) |
|
|
|
|
against the XML value |
|
|
|
|
<replaceable>xml</replaceable>. It returns an array of XML values |
|
|
|
|
corresponding to the node set produced by the XPath expression. |
|
|
|
|
If the XPath expression returns a scalar value rather than a node set, |
|
|
|
|
corresponding to the node-set produced by the XPath expression. |
|
|
|
|
If the XPath expression returns a scalar value rather than a node-set, |
|
|
|
|
a single-element array is returned. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
@ -10906,9 +10907,10 @@ SELECT xpath('//mydefns:b/text()', '<a xmlns="http://example.com"><b>test</b></a |
|
|
|
|
<para> |
|
|
|
|
The function <function>xpath_exists</function> is a specialized form |
|
|
|
|
of the <function>xpath</function> function. Instead of returning the |
|
|
|
|
individual XML values that satisfy the XPath, this function returns a |
|
|
|
|
Boolean indicating whether the query was satisfied or not. This |
|
|
|
|
function is equivalent to the standard <literal>XMLEXISTS</literal> predicate, |
|
|
|
|
individual XML values that satisfy the XPath 1.0 expression, this function |
|
|
|
|
returns a Boolean indicating whether the query was satisfied or not |
|
|
|
|
(specifically, whether it produced any value other than an empty node-set). |
|
|
|
|
This function is equivalent to the <literal>XMLEXISTS</literal> predicate, |
|
|
|
|
except that it also offers support for a namespace mapping argument. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
@ -10949,8 +10951,8 @@ SELECT xpath_exists('/my:a/text()', '<my:a xmlns:my="http://example.com">test</m |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
The <function>xmltable</function> function produces a table based |
|
|
|
|
on the given XML value, an XPath filter to extract rows, and an |
|
|
|
|
optional set of column definitions. |
|
|
|
|
on the given XML value, an XPath filter to extract rows, and a |
|
|
|
|
set of column definitions. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
@ -10961,30 +10963,34 @@ SELECT xpath_exists('/my:a/text()', '<my:a xmlns:my="http://example.com">test</m |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
The required <replaceable>row_expression</replaceable> argument is an XPath |
|
|
|
|
expression that is evaluated against the supplied XML document to |
|
|
|
|
obtain an ordered sequence of XML nodes. This sequence is what |
|
|
|
|
<function>xmltable</function> transforms into output rows. |
|
|
|
|
The required <replaceable>row_expression</replaceable> argument is |
|
|
|
|
an XPath 1.0 expression that is evaluated, passing the |
|
|
|
|
<replaceable>document_expression</replaceable> as its context item, to |
|
|
|
|
obtain a set of XML nodes. These nodes are what |
|
|
|
|
<function>xmltable</function> transforms into output rows. No rows |
|
|
|
|
will be produced if the <replaceable>document_expression</replaceable> |
|
|
|
|
is null, nor if the <replaceable>row_expression</replaceable> produces |
|
|
|
|
an empty node-set or any value other than a node-set. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
<replaceable>document_expression</replaceable> provides the XML document to |
|
|
|
|
operate on. |
|
|
|
|
The argument must be a well-formed XML document; fragments/forests |
|
|
|
|
are not accepted. |
|
|
|
|
The <literal>BY REF</literal> or <literal>BY VALUE</literal> clauses are |
|
|
|
|
accepted, as described for the <function>xmlexists</function> predicate, |
|
|
|
|
but ignored; PostgreSQL currently passes XML by value always. |
|
|
|
|
<replaceable>document_expression</replaceable> provides the context |
|
|
|
|
item for the <replaceable>row_expression</replaceable>. It must be a |
|
|
|
|
well-formed XML document; fragments/forests are not accepted. |
|
|
|
|
The <literal>BY REF</literal> and <literal>BY VALUE</literal> clauses |
|
|
|
|
are accepted but ignored, as discussed in |
|
|
|
|
<xref linkend="functions-xml-limits-postgresql"/>. |
|
|
|
|
In the SQL standard, the <function>xmltable</function> function |
|
|
|
|
evaluates expressions in the XML Query language, |
|
|
|
|
but <productname>PostgreSQL</productname> allows only XPath 1.0 |
|
|
|
|
expressions, as discussed in |
|
|
|
|
<xref linkend="functions-xml-limits-xpath1"/>. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
The mandatory <literal>COLUMNS</literal> clause specifies the list |
|
|
|
|
of columns in the output table. |
|
|
|
|
If the <literal>COLUMNS</literal> clause is omitted, the rows in the result |
|
|
|
|
set contain a single column of type <literal>xml</literal> containing the |
|
|
|
|
data matched by <replaceable>row_expression</replaceable>. |
|
|
|
|
If <literal>COLUMNS</literal> is specified, each entry describes a |
|
|
|
|
single column. |
|
|
|
|
Each entry describes a single column. |
|
|
|
|
See the syntax summary above for the format. |
|
|
|
|
The column name and type are required; the path, default and |
|
|
|
|
nullability clauses are optional. |
|
|
|
@ -10992,48 +10998,92 @@ SELECT xpath_exists('/my:a/text()', '<my:a xmlns:my="http://example.com">test</m |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
A column marked <literal>FOR ORDINALITY</literal> will be populated |
|
|
|
|
with row numbers matching the order in which the |
|
|
|
|
output rows appeared in the original input XML document. |
|
|
|
|
with row numbers, starting with 1, in the order of nodes retrieved from |
|
|
|
|
the <replaceable>row_expression</replaceable>'s result node-set. |
|
|
|
|
At most one column may be marked <literal>FOR ORDINALITY</literal>. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<note> |
|
|
|
|
<para> |
|
|
|
|
XPath 1.0 does not specify an order for nodes in a node-set, so code |
|
|
|
|
that relies on a particular order of the results will be |
|
|
|
|
implementation-dependent. Details can be found in |
|
|
|
|
<xref linkend="xml-xpath-1-specifics"/>. |
|
|
|
|
</para> |
|
|
|
|
</note> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
The <replaceable>column_expression</replaceable> for a column is an |
|
|
|
|
XPath 1.0 expression that is evaluated for each row, with the current |
|
|
|
|
node from the <replaceable>row_expression</replaceable> result as its |
|
|
|
|
context item, to find the value of the column. If |
|
|
|
|
no <replaceable>column_expression</replaceable> is given, then the |
|
|
|
|
column name is used as an implicit path. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
The <literal>column_expression</literal> for a column is an XPath expression |
|
|
|
|
that is evaluated for each row, relative to the result of the |
|
|
|
|
<replaceable>row_expression</replaceable>, to find the value of the column. |
|
|
|
|
If no <literal>column_expression</literal> is given, then the column name |
|
|
|
|
is used as an implicit path. |
|
|
|
|
If a column's XPath expression returns a non-XML value (limited to |
|
|
|
|
string, boolean, or double in XPath 1.0) and the column has a |
|
|
|
|
PostgreSQL type other than <type>xml</type>, the column will be set |
|
|
|
|
as if by assigning the value's string representation to the PostgreSQL |
|
|
|
|
type. (If the value is a boolean, its string representation is taken |
|
|
|
|
to be <literal>1</literal> or <literal>0</literal> if the output |
|
|
|
|
column's type category is numeric, otherwise <literal>true</literal> or |
|
|
|
|
<literal>false</literal>.) |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
If a column's XPath expression returns multiple elements, an error |
|
|
|
|
is raised. |
|
|
|
|
If the expression matches an empty tag, the result is an |
|
|
|
|
empty string (not <literal>NULL</literal>). |
|
|
|
|
Any <literal>xsi:nil</literal> attributes are ignored. |
|
|
|
|
If a column's XPath expression returns a non-empty set of XML nodes |
|
|
|
|
and the column's PostgreSQL type is <type>xml</type>, the column will |
|
|
|
|
be assigned the expression result exactly, if it is of document or |
|
|
|
|
content form. |
|
|
|
|
<footnote> |
|
|
|
|
<para> |
|
|
|
|
A result containing more than one element node at the top level, or |
|
|
|
|
non-whitespace text outside of an element, is an example of content form. |
|
|
|
|
An XPath result can be of neither form, for example if it returns an |
|
|
|
|
attribute node selected from the element that contains it. Such a result |
|
|
|
|
will be put into content form with each such disallowed node replaced by |
|
|
|
|
its string value, as defined for the XPath 1.0 |
|
|
|
|
<function>string</function> function. |
|
|
|
|
</para> |
|
|
|
|
</footnote> |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
The text body of the XML matched by the <replaceable>column_expression</replaceable> |
|
|
|
|
is used as the column value. Multiple <literal>text()</literal> nodes |
|
|
|
|
within an element are concatenated in order. Any child elements, |
|
|
|
|
processing instructions, and comments are ignored, but the text contents |
|
|
|
|
of child elements are concatenated to the result. |
|
|
|
|
A non-XML result assigned to an <type>xml</type> output column produces |
|
|
|
|
content, a single text node with the string value of the result. |
|
|
|
|
An XML result assigned to a column of any other type may not have more than |
|
|
|
|
one node, or an error is raised. If there is exactly one node, the column |
|
|
|
|
will be set as if by assigning the node's string |
|
|
|
|
value (as defined for the XPath 1.0 <function>string</function> function) |
|
|
|
|
to the PostgreSQL type. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
The string value of an XML element is the concatenation, in document order, |
|
|
|
|
of all text nodes contained in that element and its descendants. The string |
|
|
|
|
value of an element with no descendant text nodes is an |
|
|
|
|
empty string (not <literal>NULL</literal>). |
|
|
|
|
Any <literal>xsi:nil</literal> attributes are ignored. |
|
|
|
|
Note that the whitespace-only <literal>text()</literal> node between two non-text |
|
|
|
|
elements is preserved, and that leading whitespace on a <literal>text()</literal> |
|
|
|
|
node is not flattened. |
|
|
|
|
The XPath 1.0 <function>string</function> function may be consulted for the |
|
|
|
|
rules defining the string value of other XML node types and non-XML values. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
The conversion rules presented here are not exactly those of the SQL |
|
|
|
|
standard, as discussed in <xref linkend="functions-xml-limits-casts"/>. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
If the path expression does not match for a given row but |
|
|
|
|
<replaceable>default_expression</replaceable> is specified, the value resulting |
|
|
|
|
from evaluating that expression is used. |
|
|
|
|
If no <literal>DEFAULT</literal> clause is given for the column, |
|
|
|
|
the field will be set to <literal>NULL</literal>. |
|
|
|
|
It is possible for a <replaceable>default_expression</replaceable> to reference |
|
|
|
|
the value of output columns that appear prior to it in the column list, |
|
|
|
|
so the default of one column may be based on the value of another |
|
|
|
|
column. |
|
|
|
|
If the path expression returns an empty node-set |
|
|
|
|
(typically, when it does not match) |
|
|
|
|
for a given row, the column will be set to <literal>NULL</literal>, unless |
|
|
|
|
a <replaceable>default_expression</replaceable> is specified; then the |
|
|
|
|
value resulting from evaluating that expression is used. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
@ -11045,20 +11095,14 @@ SELECT xpath_exists('/my:a/text()', '<my:a xmlns:my="http://example.com">test</m |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|
Unlike regular PostgreSQL functions, <replaceable>column_expression</replaceable> |
|
|
|
|
and <replaceable>default_expression</replaceable> are not evaluated to a simple |
|
|
|
|
value before calling the function. |
|
|
|
|
<replaceable>column_expression</replaceable> is normally evaluated |
|
|
|
|
exactly once per input row, and <replaceable>default_expression</replaceable> |
|
|
|
|
is evaluated each time a default is needed for a field. |
|
|
|
|
If the expression qualifies as stable or immutable the repeat |
|
|
|
|
A <replaceable>default_expression</replaceable>, rather than being |
|
|
|
|
evaluated immediately when <function>xmltable</function> is called, |
|
|
|
|
is evaluated each time a default is needed for the column. |
|
|
|
|
If the expression qualifies as stable or immutable, the repeat |
|
|
|
|
evaluation may be skipped. |
|
|
|
|
Effectively <function>xmltable</function> behaves more like a subquery than a |
|
|
|
|
function call. |
|
|
|
|
This means that you can usefully use volatile functions like |
|
|
|
|
<function>nextval</function> in <replaceable>default_expression</replaceable>, and |
|
|
|
|
<replaceable>column_expression</replaceable> may depend on other parts of the |
|
|
|
|
XML document. |
|
|
|
|
<function>nextval</function> in |
|
|
|
|
<replaceable>default_expression</replaceable>. |
|
|
|
|
</para> |
|
|
|
|
|
|
|
|
|
<para> |
|
|
|
|