linkend="datatype-xml"/> for information about the xml
type. The function-like expressions xmlparse
and xmlserialize for converting to and from
- type xml are not repeated here. Use of most of these
- functions requires the installation to have been built
+ type xml are documented there, not in this section.
+
+
+ Use of most of these functions
+ requires
PostgreSQL to have been built
with configure --with-libxml.
encoding, depending on the setting of the configuration parameter
. 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 .
- The function xmlexists 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 xmlexists 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.
- The BY REF or BY VALUE clauses
- have no effect in
PostgreSQL, but are allowed
- for compatibility with other implementations. Per the
SQL
- 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.
-
PostgreSQL ignores
BY REF
- and passes by value always.
-
-
- In the
SQL standard, an
xmlexists
- 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
PostgreSQL, 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 BY REF and BY VALUE clauses
+ are accepted in
PostgreSQL, but are ignored,
+ as discussed in .
+ In the SQL standard, the xmlexists function
+ evaluates an expression in the XML Query language,
+ but
PostgreSQL allows only an XPath 1.0
+ expression, as discussed in
+ .
- The function xpath evaluates the XPath
+ The function xpath evaluates the XPath 1.0
expression xpath (a text value)
against the XML value
xml. 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.
The function xpath_exists is a specialized form
of the xpath 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 XMLEXISTS 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 XMLEXISTS predicate,
except that it also offers support for a namespace mapping argument.
The xmltable 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.
- The required row_expression 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
- xmltable transforms into output rows.
+ The required row_expression argument is
+ an XPath 1.0 expression that is evaluated, passing the
+ document_expression as its context item, to
+ obtain a set of XML nodes. These nodes are what
+ xmltable transforms into output rows. No rows
+ will be produced if the document_expression
+ is null, nor if the row_expression produces
+ an empty node-set or any value other than a node-set.
- document_expression provides the XML document to
- operate on.
- The argument must be a well-formed XML document; fragments/forests
- are not accepted.
- The BY REF or BY VALUE clauses are
- accepted, as described for the xmlexists predicate,
- but ignored; PostgreSQL currently passes XML by value always.
+ document_expression provides the context
+ item for the row_expression. It must be a
+ well-formed XML document; fragments/forests are not accepted.
+ The BY REF and BY VALUE clauses
+ are accepted but ignored, as discussed in
+ .
+ In the SQL standard, the xmltable function
+ evaluates expressions in the XML Query language,
+ but
PostgreSQL allows only XPath 1.0
+ expressions, as discussed in
+ .
The mandatory COLUMNS clause specifies the list
of columns in the output table.
- If the COLUMNS clause is omitted, the rows in the result
- set contain a single column of type xml containing the
- data matched by row_expression.
- If COLUMNS 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.
A column marked FOR ORDINALITY 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 row_expression's result node-set.
At most one column may be marked FOR ORDINALITY.
+
+ 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
+ .
+
+
+
+ The column_expression for a column is an
+ XPath 1.0 expression that is evaluated for each row, with the current
+ node from the row_expression result as its
+ context item, to find the value of the column. If
+ no column_expression is given, then the
+ column name is used as an implicit path.
+
+
- The column_expression for a column is an XPath expression
- that is evaluated for each row, relative to the result of the
- row_expression, to find the value of the column.
- If no column_expression 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 xml, 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 1 or 0 if the output
+ column's type category is numeric, otherwise true or
+ false.)
- 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 NULL).
- Any xsi:nil attributes are ignored.
+ If a column's XPath expression returns a non-empty set of XML nodes
+ and the column's PostgreSQL type is xml, the column will
+ be assigned the expression result exactly, if it is of document or
+ content form.
+
+ 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
+ string function.
+
+
- The text body of the XML matched by the column_expression
- is used as the column value. Multiple text() 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 xml 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 string function)
+ to the PostgreSQL type.
+
+
+ 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 NULL).
+ Any xsi:nil attributes are ignored.
Note that the whitespace-only text() node between two non-text
elements is preserved, and that leading whitespace on a text()
node is not flattened.
+ The XPath 1.0 string function may be consulted for the
+ rules defining the string value of other XML node types and non-XML values.
+
+
+ The conversion rules presented here are not exactly those of the SQL
+ standard, as discussed in .
- If the path expression does not match for a given row but
- default_expression is specified, the value resulting
- from evaluating that expression is used.
- If no DEFAULT clause is given for the column,
- the field will be set to NULL.
- It is possible for a default_expression 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 NULL, unless
+ a default_expression is specified; then the
+ value resulting from evaluating that expression is used.
- Unlike regular PostgreSQL functions, column_expression
- and default_expression are not evaluated to a simple
- value before calling the function.
- column_expression is normally evaluated
- exactly once per input row, and default_expression
- is evaluated each time a default is needed for a field.
- If the expression qualifies as stable or immutable the repeat
+ A default_expression, rather than being
+ evaluated immediately when xmltable 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 xmltable behaves more like a subquery than a
- function call.
This means that you can usefully use volatile functions like
- nextval in default_expression, and
- column_expression may depend on other parts of the
- XML document.
+ nextval in
+ default_expression.