Hi Tom On 25.09.24 18:02, Tom Lane wrote: > AFAICS, all we do with an embedded XML version string is pass it to > libxml2's xmlNewDoc(), which is the authority on whether it means > anything. I'd be inclined to do the same here.
Thanks. I used xml_is_document(), which calls xmlNewDoc(), to check if the returned document is valid or not. It then decides if an unexpected version deserves an error or just a warning. Attached v1 with the first attempt to implement these features. ==== INCLUDING / EXCLUDING XMLDECLARATION (SQL/XML X078) ==== The flags INCLUDING XMLDECLARATION and EXCLUDING XMLDECLARATION include or remove the XML declaration in the XMLSerialize output of the given DOCUMENT or CONTENT, respectively. SELECT xmlserialize( DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); xmlserialize --------------------------------------------------------------- <?xml version="1.0" encoding="UTF8"?><foo><bar>42</bar></foo> (1 row) SELECT xmlserialize( DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION); xmlserialize -------------------------- <foo><bar>42</bar></foo> (1 row) If omitted, the output will contain an XML declaration only if the given XML value had one. SELECT xmlserialize( DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text); xmlserialize ---------------------------------------------------------------- <?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo> (1 row) SELECT xmlserialize( DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text); xmlserialize -------------------------- <foo><bar>42</bar></foo> (1 row) ==== VERSION (SQL/XML X076)==== VERSION can be used to specify the version in the XML declaration of the serialized DOCUMENT or CONTENT. SELECT xmlserialize( DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INCLUDING XMLDECLARATION); xmlserialize --------------------------------------------------------------- <?xml version="1.0" encoding="UTF8"?><foo><bar>42</bar></foo> (1 row) In case of XML values of type DOCUMENT, the version will be validated by libxml2's xmlNewDoc(), which will raise an error for invalid versions or a warning for unsupported ones. For CONTENT values no validation is performed. SELECT xmlserialize( DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION); WARNING: line 1: Unsupported version '1.1' <?xml version="1.1" encoding="UTF8"?><foo><bar>42</bar></foo> ^ xmlserialize --------------------------------------------------------------- <?xml version="1.1" encoding="UTF8"?><foo><bar>42</bar></foo> (1 row) SELECT xmlserialize( DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '2.0' INCLUDING XMLDECLARATION); ERROR: Invalid XML declaration: VERSION '2.0' SELECT xmlserialize( CONTENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '2.0' INCLUDING XMLDECLARATION); xmlserialize --------------------------------------------------------------- <?xml version="2.0" encoding="UTF8"?><foo><bar>42</bar></foo> (1 row) This option is ignored if the XML value had no XML declaration and INCLUDING XMLDECLARATION was not used. SELECT xmlserialize( CONTENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1111'); xmlserialize -------------------------- <foo><bar>42</bar></foo> (1 row) Best, Jim
From 8bcb91f8b163a9efda1de33ebb7538767c860ad9 Mon Sep 17 00:00:00 2001 From: Jim Jones <jim.jo...@uni-muenster.de> Date: Thu, 26 Sep 2024 13:35:28 +0200 Subject: [PATCH v1] Add XMLSerialize: version and explicit XML declaration * XMLSerialize: explicit XML declaration (SQL/XML X078) This adds the options INCLUDING XMLDECLARATION and EXCLUDING XMLDECLARATION to XMLSerialize, which includes or remove the XML declaration of the given DOCUMENT or CONTENT, respectively. If not specified, the output will contain an XML declaration only if the given XML value had one. * XMLSerialize: version (SQL/XML X076) The option VERSION can be used to specify the version in the XML declaration of the serialized DOCUMENT or CONTENT. In case of XML values of type DOCUMENT, the version will be validated by libxml2's xmlNewDoc(), which will raise an error for invalid versions or a warning for unsupported ones. For CONTENT values no validation is performed. This option is ignored if the XML value had no XML deldaration and INCLUDING XMLDECLARATION was not used. Usage examples: SELECT xmlserialize( DOCUMENT xmlval AS text VERSION '1.0' INCLUDING XMLDECLARATION); SELECT xmlserialize( DOCUMENT xmlval AS text EXCLUDING XMLDECLARATION); This patch also includes regression tests and documentation. --- doc/src/sgml/datatype.sgml | 48 ++- src/backend/catalog/sql_features.txt | 4 +- src/backend/executor/execExprInterp.c | 4 +- src/backend/parser/gram.y | 29 +- src/backend/parser/parse_expr.c | 2 + src/backend/utils/adt/xml.c | 119 +++++-- src/include/nodes/parsenodes.h | 2 + src/include/nodes/primnodes.h | 11 + src/include/parser/kwlist.h | 1 + src/include/utils/xml.h | 3 +- src/test/regress/expected/xml.out | 428 +++++++++++++++++++++++++- src/test/regress/expected/xml_1.out | 275 +++++++++++++++++ src/test/regress/expected/xml_2.out | 401 ++++++++++++++++++++++++ src/test/regress/sql/xml.sql | 72 +++++ 14 files changed, 1347 insertions(+), 52 deletions(-) diff --git a/doc/src/sgml/datatype.sgml b/doc/src/sgml/datatype.sgml index e0d33f12e1..3c81ff57e5 100644 --- a/doc/src/sgml/datatype.sgml +++ b/doc/src/sgml/datatype.sgml @@ -4496,7 +4496,7 @@ xml '<foo>bar</foo>' <type>xml</type>, uses the function <function>xmlserialize</function>:<indexterm><primary>xmlserialize</primary></indexterm> <synopsis> -XMLSERIALIZE ( { DOCUMENT | CONTENT } <replaceable>value</replaceable> AS <replaceable>type</replaceable> [ [ NO ] INDENT ] ) +XMLSERIALIZE ( { DOCUMENT | CONTENT } <replaceable>value</replaceable> AS <replaceable>type</replaceable> [ VERSION <replaceable>xmlversion</replaceable> ] [ INCLUDING XMLDECLARATION | EXCLUDING XMLDECLARATION ] [ [ NO ] INDENT ] ) </synopsis> <replaceable>type</replaceable> can be <type>character</type>, <type>character varying</type>, or @@ -4506,6 +4506,22 @@ XMLSERIALIZE ( { DOCUMENT | CONTENT } <replaceable>value</replaceable> AS <repla you to simply cast the value. </para> + <para> + The option <literal>VERSION</literal> can be used to specify + the version in <replaceable>xmlversion</replaceable> as the + version in the XML declaration. If <literal>NULL</literal> + the version <literal>1.0</literal> is assumed. + </para> + + <para> + The options <literal>INCLUDING XMLDECLARATION</literal> and + <literal>EXCLUDING XMLDECLARATION</literal> specify whether the + XML declaration of an XML <replaceable>value</replaceable> is + included in the serialized string or not, respectively. If not + specified, the output will only contain an XML delcaration if + the XML <replaceable>value</replaceable> had one. + </para> + <para> The <literal>INDENT</literal> option causes the result to be pretty-printed, while <literal>NO INDENT</literal> (which is the @@ -4513,6 +4529,36 @@ XMLSERIALIZE ( { DOCUMENT | CONTENT } <replaceable>value</replaceable> AS <repla type likewise produces the original string. </para> + <para> +Examples: + </para> +<screen><![CDATA[ +SELECT + xmlserialize( + DOCUMENT xmlelement(name foo, xmlelement(name bar,42)) AS text + VERSION '1.0' + INCLUDING XMLDECLARATION + INDENT); + + xmlserialize +--------------------------------------- + <?xml version="1.0" encoding="UTF8"?>+ + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT + xmlserialize( + DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>' AS text + EXCLUDING XMLDECLARATION); + + xmlserialize +-------------------------- + <foo><bar>42</bar></foo> +(1 row) +]]></screen> + <para> When a character string value is cast to or from type <type>xml</type> without going through <type>XMLPARSE</type> or diff --git a/src/backend/catalog/sql_features.txt b/src/backend/catalog/sql_features.txt index c002f37202..6e6be85126 100644 --- a/src/backend/catalog/sql_features.txt +++ b/src/backend/catalog/sql_features.txt @@ -665,9 +665,9 @@ X072 XMLSerialize: character string serialization YES X073 XMLSerialize: binary string serialization and CONTENT option NO X074 XMLSerialize: binary string serialization and DOCUMENT option NO X075 XMLSerialize: binary string serialization NO -X076 XMLSerialize: VERSION NO +X076 XMLSerialize: VERSION YES X077 XMLSerialize: explicit ENCODING option NO -X078 XMLSerialize: explicit XML declaration NO +X078 XMLSerialize: explicit XML declaration YES X080 Namespaces in XML publishing NO X081 Query-level XML namespace declarations NO X082 XML namespace declarations in DML NO diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index 9fd988cc99..332901a1d1 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -4189,7 +4189,9 @@ ExecEvalXmlExpr(ExprState *state, ExprEvalStep *op) *op->resvalue = PointerGetDatum(xmltotext_with_options(DatumGetXmlP(value), xexpr->xmloption, - xexpr->indent)); + xexpr->indent, + xexpr->xmldeclaration, + xexpr->version)); *op->resnull = false; } break; diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index b1d4642c59..4d210ce904 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -625,6 +625,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type <defelt> xmltable_column_option_el %type <list> xml_namespace_list %type <target> xml_namespace_el +%type <ival> opt_xml_declaration_option +%type <str> opt_xml_declaration_version xmlserialize_version %type <node> func_application func_expr_common_subexpr %type <node> func_expr func_expr_windowless @@ -793,8 +795,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); WHEN WHERE WHITESPACE_P WINDOW WITH WITHIN WITHOUT WORK WRAPPER WRITE - XML_P XMLATTRIBUTES XMLCONCAT XMLELEMENT XMLEXISTS XMLFOREST XMLNAMESPACES - XMLPARSE XMLPI XMLROOT XMLSERIALIZE XMLTABLE + XML_P XMLATTRIBUTES XMLCONCAT XMLDECLARATION XMLELEMENT XMLEXISTS XMLFOREST + XMLNAMESPACES XMLPARSE XMLPI XMLROOT XMLSERIALIZE XMLTABLE YEAR_P YES_P @@ -15930,14 +15932,16 @@ func_expr_common_subexpr: $$ = makeXmlExpr(IS_XMLROOT, NULL, NIL, list_make3($3, $5, $6), @1); } - | XMLSERIALIZE '(' document_or_content a_expr AS SimpleTypename xml_indent_option ')' + | XMLSERIALIZE '(' document_or_content a_expr AS SimpleTypename opt_xml_declaration_version opt_xml_declaration_option xml_indent_option ')' { XmlSerialize *n = makeNode(XmlSerialize); n->xmloption = $3; n->expr = $4; n->typeName = $6; - n->indent = $7; + n->version = $7; + n->xmldeclaration = $8; + n->indent = $9; n->location = @1; $$ = (Node *) n; } @@ -16162,6 +16166,21 @@ xml_indent_option: INDENT { $$ = true; } | /*EMPTY*/ { $$ = false; } ; +xmlserialize_version: + VERSION_P Sconst { $$ = $2; } + | VERSION_P NULL_P { $$ = NULL; } + ; + +opt_xml_declaration_version: + xmlserialize_version { $$ = $1; } + | /*EMPTY*/ { $$ = NULL; } + ; + +opt_xml_declaration_option: INCLUDING XMLDECLARATION { $$ = XMLSERIALIZE_INCLUDING_XMLDECLARATION; } + | EXCLUDING XMLDECLARATION { $$ = XMLSERIALIZE_EXCLUDING_XMLDECLARATION; } + | /*EMPTY*/ { $$ = XMLSERIALIZE_NO_XMLDECLARATION_OPTION; } + ; + xml_whitespace_option: PRESERVE WHITESPACE_P { $$ = true; } | STRIP_P WHITESPACE_P { $$ = false; } | /*EMPTY*/ { $$ = false; } @@ -17853,6 +17872,7 @@ unreserved_keyword: | WRAPPER | WRITE | XML_P + | XMLDECLARATION | YEAR_P | YES_P | ZONE @@ -18508,6 +18528,7 @@ bare_label_keyword: | XML_P | XMLATTRIBUTES | XMLCONCAT + | XMLDECLARATION | XMLELEMENT | XMLEXISTS | XMLFOREST diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 36c1b7a88f..b74823ccb2 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -2491,6 +2491,8 @@ transformXmlSerialize(ParseState *pstate, XmlSerialize *xs) xexpr->xmloption = xs->xmloption; xexpr->indent = xs->indent; + xexpr->version = xs->version; + xexpr->xmldeclaration = xs->xmldeclaration; xexpr->location = xs->location; /* We actually only need these to be able to parse back the expression. */ xexpr->type = targetType; diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index 040a896263..9d261fceea 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -153,7 +153,8 @@ static xmlChar *xml_text2xmlChar(text *in); static int parse_xml_decl(const xmlChar *str, size_t *lenp, xmlChar **version, xmlChar **encoding, int *standalone); static bool print_xml_decl(StringInfo buf, const xmlChar *version, - pg_enc encoding, int standalone); + pg_enc encoding, int standalone, + bool force_xmldeclaration); static bool xml_doctype_in_content(const xmlChar *str); static xmlDocPtr xml_parse(text *data, XmlOptionType xmloption_arg, bool preserve_whitespace, int encoding, @@ -326,7 +327,7 @@ xml_out_internal(xmltype *x, pg_enc target_encoding) initStringInfo(&buf); - if (!print_xml_decl(&buf, version, target_encoding, standalone)) + if (!print_xml_decl(&buf, version, target_encoding, standalone, false)) { /* * If we are not going to produce an XML declaration, eat a single @@ -598,7 +599,8 @@ xmlconcat(List *args) print_xml_decl(&buf2, (!global_version_no_value) ? global_version : NULL, 0, - global_standalone); + global_standalone, + NULL); appendBinaryStringInfo(&buf2, buf.data, buf.len); buf = buf2; @@ -653,7 +655,8 @@ xmltotext(PG_FUNCTION_ARGS) text * -xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) +xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent, + XmlSerializeDeclarationOption xmldeclaration, const char *xmlserialize_version) { #ifdef USE_LIBXML text *volatile result; @@ -666,7 +669,9 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) PgXmlErrorContext *xmlerrcxt; #endif - if (xmloption_arg != XMLOPTION_DOCUMENT && !indent) + if (xmloption_arg != XMLOPTION_DOCUMENT && + xmldeclaration == XMLSERIALIZE_NO_XMLDECLARATION_OPTION && + !indent && !xmlserialize_version) { /* * We don't actually need to do anything, so just return the @@ -697,8 +702,12 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) errmsg("not an XML document"))); } - /* If we weren't asked to indent, we're done. */ - if (!indent) + /* + * If we weren't asked to indent or to explicitly hide / show the + * XML declaration, we're done. + */ + if (!indent && !xmlserialize_version && + xmldeclaration == XMLSERIALIZE_NO_XMLDECLARATION_OPTION) { xmlFreeDoc(doc); return (text *) data; @@ -721,18 +730,15 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) /* Detect whether there's an XML declaration */ parse_xml_decl(xml_text2xmlChar(data), &decl_len, NULL, NULL, NULL); - /* - * Emit declaration only if the input had one. Note: some versions of - * xmlSaveToBuffer leak memory if a non-null encoding argument is - * passed, so don't do that. We don't want any encoding conversion - * anyway. + /* Indent the buffer content if the flag INDENT was used. + * Note: some versions of xmlSaveToBuffer leak memory if a + * non-null encoding argument is passed, so don't do that. + * We don't want any encoding conversion anyway. The flag + * XML_SAVE_NO_DECL is used here by default, as we manually + * add the XML declaration later on with xmlBufferAddHead(), + * if applicable. */ - if (decl_len == 0) - ctxt = xmlSaveToBuffer(buf, NULL, - XML_SAVE_NO_DECL | XML_SAVE_FORMAT); - else - ctxt = xmlSaveToBuffer(buf, NULL, - XML_SAVE_FORMAT); + ctxt = xmlSaveToBuffer(buf, NULL, XML_SAVE_NO_DECL | (indent ? XML_SAVE_FORMAT : 0)); if (ctxt == NULL || xmlerrcxt->err_occurred) xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY, @@ -754,7 +760,7 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) * content nodes, and then iterate over the nodes. */ xmlNodePtr root; - xmlNodePtr newline; + xmlNodePtr newline = NULL; root = xmlNewNode(NULL, (const xmlChar *) "content-root"); if (root == NULL || xmlerrcxt->err_occurred) @@ -772,19 +778,24 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) * freeing of this node manually, and pass NULL here to make sure * there's not a dangling link. */ - newline = xmlNewDocText(NULL, (const xmlChar *) "\n"); - if (newline == NULL || xmlerrcxt->err_occurred) - xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY, - "could not allocate xml node"); + if (indent) + { + newline = xmlNewDocText(NULL, (const xmlChar *)"\n"); + + if (newline == NULL || xmlerrcxt->err_occurred) + xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY, + "could not allocate xml node"); + } for (xmlNodePtr node = root->children; node; node = node->next) { /* insert newlines between nodes */ - if (node->type != XML_TEXT_NODE && node->prev != NULL) + if (node->type != XML_TEXT_NODE && node->prev != NULL && newline != NULL) { if (xmlSaveTree(ctxt, newline) == -1 || xmlerrcxt->err_occurred) { - xmlFreeNode(newline); + if(newline != NULL) + xmlFreeNode(newline); xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY, "could not save newline to xmlBuffer"); } @@ -798,7 +809,37 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) } } - xmlFreeNode(newline); + if(newline != NULL) + xmlFreeNode(newline); + } + + /* + * We add the XML declaration if the input had one or if the flag + * INCLUDING XMLDECLARATION was used. + */ + if (xmldeclaration == XMLSERIALIZE_INCLUDING_XMLDECLARATION || + (decl_len != 0 && xmldeclaration != XMLSERIALIZE_EXCLUDING_XMLDECLARATION)) + { + StringInfoData xmldecl; + initStringInfo(&xmldecl); + + print_xml_decl( + &xmldecl, + xmlserialize_version != NULL ? (const xmlChar *) xmlserialize_version : doc->version, + pg_char_to_encoding((const char*) doc->encoding), + doc->standalone, + true); + /* + * We add a trailing newline if the flag INDENT was used, otherwise + * XML declaration and root element will be serialized in the same + * line. + */ + if (indent) + appendStringInfoString(&xmldecl, "\n"); + + xmlBufferAddHead(buf, (const xmlChar *) xmldecl.data, xmldecl.len); + + pfree(xmldecl.data); } if (xmlSaveClose(ctxt) == -1 || xmlerrcxt->err_occurred) @@ -845,6 +886,18 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) pg_xml_done(xmlerrcxt, false); + /* + * If the flag VERSION was used with a DOCUMENT xml value we + * make sure that the passed version is valid. We let xml_parse() + * and xmlNewDoc() decide if an unexpected version deserves an + * error or just a warning. CONTENT xml values won't be validated. + */ + if (xmloption_arg == XMLOPTION_DOCUMENT && xmlserialize_version && + !xml_is_document((xmltype *) result)) + ereport(ERROR, + (errcode(ERRCODE_NOT_AN_XML_DOCUMENT), + errmsg("Invalid XML declaration: VERSION '%s'", xmlserialize_version))); + return result; #else NO_XML_SUPPORT(); @@ -1084,7 +1137,7 @@ xmlroot(xmltype *data, text *version, int standalone) } initStringInfo(&buf); - print_xml_decl(&buf, orig_version, 0, orig_standalone); + print_xml_decl(&buf, orig_version, 0, orig_standalone, false); appendStringInfoString(&buf, str + len); return stringinfo_to_xmltype(&buf); @@ -1589,14 +1642,20 @@ finished: * declaration, we must specify a version (XML requires this). * Otherwise we only make a declaration if the version is not "1.0", * which is the default version specified in SQL:2003. + * + * The parameter 'force_xmldeclaration' forces the function to print + * the XML declaration, indenpendently of version and encoding values. + * This is useful for XMLSerialize calls with the flag INCLUDING + * XMLDECLARATION. */ static bool print_xml_decl(StringInfo buf, const xmlChar *version, - pg_enc encoding, int standalone) + pg_enc encoding, int standalone, + bool force_xmldeclaration) { if ((version && strcmp((const char *) version, PG_XML_DEFAULT_VERSION) != 0) || (encoding && encoding != PG_UTF8) - || standalone != -1) + || standalone != -1 || force_xmldeclaration) { appendStringInfoString(buf, "<?xml"); @@ -1605,7 +1664,7 @@ print_xml_decl(StringInfo buf, const xmlChar *version, else appendStringInfo(buf, " version=\"%s\"", PG_XML_DEFAULT_VERSION); - if (encoding && encoding != PG_UTF8) + if ((encoding && encoding != PG_UTF8) || force_xmldeclaration) { /* * XXX might be useful to convert this to IANA names (ISO-8859-1 diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index e62ce1b753..f573a0a8c5 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -848,6 +848,8 @@ typedef struct XmlSerialize Node *expr; TypeName *typeName; bool indent; /* [NO] INDENT */ + const char *version; /* VERSION 'xmlversion' */ + XmlSerializeDeclarationOption xmldeclaration; /* INCLUDING or EXCLUDING XMLDECLARATION */ ParseLoc location; /* token location, or -1 if unknown */ } XmlSerialize; diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index ea47652adb..d3c7212c65 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -1593,6 +1593,13 @@ typedef enum XmlOptionType XMLOPTION_CONTENT, } XmlOptionType; +typedef enum XmlSerializeDeclarationOption +{ + XMLSERIALIZE_INCLUDING_XMLDECLARATION, /* Add xml declaration in XMLSERIALIZE output */ + XMLSERIALIZE_EXCLUDING_XMLDECLARATION, /* Remove xml declaration in XMLSERIALIZE output */ + XMLSERIALIZE_NO_XMLDECLARATION_OPTION /* Add xml declaration only if XMLSERIALIZE input has one */ +} XmlSerializeDeclarationOption; + typedef struct XmlExpr { Expr xpr; @@ -1615,6 +1622,10 @@ typedef struct XmlExpr int32 typmod pg_node_attr(query_jumble_ignore); /* token location, or -1 if unknown */ ParseLoc location; + /* xmlserialize flags INCLUDING and EXCLUDING XMLDECLARATION */ + XmlSerializeDeclarationOption xmldeclaration pg_node_attr(query_jumble_ignore); + /* VERSION option fo xmlserialize */ + const char *version; } XmlExpr; /* diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h index 899d64ad55..40baf38220 100644 --- a/src/include/parser/kwlist.h +++ b/src/include/parser/kwlist.h @@ -504,6 +504,7 @@ PG_KEYWORD("write", WRITE, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("xml", XML_P, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("xmlattributes", XMLATTRIBUTES, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("xmlconcat", XMLCONCAT, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("xmldeclaration", XMLDECLARATION, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("xmlelement", XMLELEMENT, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("xmlexists", XMLEXISTS, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("xmlforest", XMLFOREST, COL_NAME_KEYWORD, BARE_LABEL) diff --git a/src/include/utils/xml.h b/src/include/utils/xml.h index ed20e21375..248d22971a 100644 --- a/src/include/utils/xml.h +++ b/src/include/utils/xml.h @@ -78,7 +78,8 @@ extern xmltype *xmlpi(const char *target, text *arg, bool arg_is_null, bool *res extern xmltype *xmlroot(xmltype *data, text *version, int standalone); extern bool xml_is_document(xmltype *arg); extern text *xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, - bool indent); + bool indent, XmlSerializeDeclarationOption xmldeclaration, + const char *version); extern char *escape_xml(const char *str); extern char *map_sql_identifier_to_xml_name(const char *ident, bool fully_escaped, bool escape_period); diff --git a/src/test/regress/expected/xml.out b/src/test/regress/expected/xml.out index 361a6f9b27..c56c1d16bc 100644 --- a/src/test/regress/expected/xml.out +++ b/src/test/regress/expected/xml.out @@ -592,23 +592,24 @@ SELECT xmlserialize(CONTENT NULL AS text INDENT); -- indent with XML declaration SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar><val>73</val></bar></foo>' AS text INDENT); - xmlserialize ----------------------------------------- - <?xml version="1.0" encoding="UTF-8"?>+ - <foo> + - <bar> + - <val>73</val> + - </bar> + + xmlserialize +--------------------------------------- + <?xml version="1.0" encoding="UTF8"?>+ + <foo> + + <bar> + + <val>73</val> + + </bar> + </foo> (1 row) SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar><val>73</val></bar></foo>' AS text INDENT); - xmlserialize -------------------- - <foo> + - <bar> + - <val>73</val>+ - </bar> + + xmlserialize +--------------------------------------- + <?xml version="1.0" encoding="UTF8"?>+ + <foo> + + <bar> + + <val>73</val> + + </bar> + </foo> (1 row) @@ -676,6 +677,407 @@ SELECT xmlserialize(CONTENT 'text node<foo> <bar></bar> </foo>' AS text IN </foo> (1 row) +-- 'including xmldeclaration' and 'excluding xmldeclaration'(DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); + xmlserialize +--------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8"?><foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION); + xmlserialize +-------------------------- + <foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); + xmlserialize +--------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8"?><foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION); + xmlserialize +-------------------------- + <foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); + xmlserialize +------------------------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="no"?><foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); + xmlserialize +-------------------------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="yes"?><foo><bar>42</bar></foo> +(1 row) + +-- 'including xmldeclaration' and 'excluding xmldeclaration'(CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); + xmlserialize +------------------------------------------------------------------ + <?xml version="1.0" encoding="UTF8"?>txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION); + xmlserialize +----------------------------- + txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); + xmlserialize +------------------------------------------------------------------ + <?xml version="1.0" encoding="UTF8"?>txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION); + xmlserialize +----------------------------- + txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); + xmlserialize +---------------------------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="no"?>txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); + xmlserialize +----------------------------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="yes"?>txt<foo><bar>42</bar></foo> +(1 row) + +-- 'indent' + 'including xmldeclaration' and 'excluding xmldeclaration' (DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); + xmlserialize +--------------------------------------- + <?xml version="1.0" encoding="UTF8"?>+ + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION INDENT); + xmlserialize +----------------- + <foo> + + <bar>42</bar>+ + </foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); + xmlserialize +--------------------------------------- + <?xml version="1.0" encoding="UTF8"?>+ + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION INDENT); + xmlserialize +----------------- + <foo> + + <bar>42</bar>+ + </foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); + xmlserialize +------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="no"?>+ + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); + xmlserialize +-------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="yes"?>+ + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +-- 'indent' + 'including xmldeclaration' and 'excluding xmldeclaration'(CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); + xmlserialize +--------------------------------------- + <?xml version="1.0" encoding="UTF8"?>+ + txt + + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION INDENT); + xmlserialize +----------------- + txt + + <foo> + + <bar>42</bar>+ + </foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); + xmlserialize +--------------------------------------- + <?xml version="1.0" encoding="UTF8"?>+ + txt + + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION INDENT); + xmlserialize +----------------- + txt + + <foo> + + <bar>42</bar>+ + </foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); + xmlserialize +------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="no"?>+ + txt + + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); + xmlserialize +-------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="yes"?>+ + txt + + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +-- 'version' + 'including xmldeclaration' and 'excluding xmldeclaration'(DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.0'); + xmlserialize +-------------------------- + <foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INCLUDING XMLDECLARATION); + xmlserialize +--------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8"?><foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0'); + xmlserialize +------------------------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="no"?><foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INCLUDING XMLDECLARATION); + xmlserialize +-------------------------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="yes"?><foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' EXCLUDING XMLDECLARATION); + xmlserialize +-------------------------- + <foo><bar>42</bar></foo> +(1 row) + +-- 'version' + 'including xmldeclaration' and 'excluding xmldeclaration'(CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1'); + xmlserialize +----------------------------- + txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION); + xmlserialize +------------------------------------------------------------------ + <?xml version="1.1" encoding="UTF8"?>txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1'); + xmlserialize +----------------------------------------------------------------------------------- + <?xml version="1.1" encoding="UTF8" standalone="yes"?>txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION); + xmlserialize +---------------------------------------------------------------------------------- + <?xml version="1.1" encoding="UTF8" standalone="no"?>txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' EXCLUDING XMLDECLARATION); + xmlserialize +----------------------------- + txt<foo><bar>42</bar></foo> +(1 row) + +-- 'version' + 'indent' (DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INDENT); + xmlserialize +----------------- + <foo> + + <bar>42</bar>+ + </foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INDENT); + xmlserialize +------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="no"?>+ + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +-- 'indent' + 'version' (CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INDENT); + xmlserialize +----------------- + txt + + <foo> + + <bar>42</bar>+ + </foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INDENT); + xmlserialize +-------------------------------------------------------- + <?xml version="1.1" encoding="UTF8" standalone="yes"?>+ + txt + + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +-- 'indent' + 'version' + 'including xmldeclaration' and 'excluding xmldeclaration'(DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INCLUDING XMLDECLARATION INDENT); + xmlserialize +--------------------------------------- + <?xml version="1.0" encoding="UTF8"?>+ + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INCLUDING XMLDECLARATION INDENT); + xmlserialize +-------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="yes"?>+ + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' EXCLUDING XMLDECLARATION INDENT); + xmlserialize +----------------- + <foo> + + <bar>42</bar>+ + </foo> +(1 row) + +-- 'indent' + 'version' + 'including xmldeclaration' and 'excluding xmldeclaration'(CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION INDENT); + xmlserialize +--------------------------------------- + <?xml version="1.1" encoding="UTF8"?>+ + txt + + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION INDENT); + xmlserialize +-------------------------------------------------------- + <?xml version="1.1" encoding="UTF8" standalone="yes"?>+ + txt + + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' EXCLUDING XMLDECLARATION INDENT); + xmlserialize +----------------- + txt + + <foo> + + <bar>42</bar>+ + </foo> +(1 row) + +--'version' with null value (DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION NULL); + xmlserialize +-------------------------- + <foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION NULL EXCLUDING XMLDECLARATION); + xmlserialize +-------------------------- + <foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION NULL INCLUDING XMLDECLARATION); + xmlserialize +--------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8"?><foo><bar>42</bar></foo> +(1 row) + +--'version' with null value (CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION NULL); + xmlserialize +----------------------------- + txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION NULL EXCLUDING XMLDECLARATION); + xmlserialize +----------------------------- + txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION NULL INCLUDING XMLDECLARATION); + xmlserialize +------------------------------------------------------------------ + <?xml version="1.0" encoding="UTF8"?>txt<foo><bar>42</bar></foo> +(1 row) + +-- 'version' + 'including xmldeclaration' warning and error messages +\set VERBOSITY terse +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION); +WARNING: line 1: Unsupported version '1.1' +<?xml version="1.1" encoding="UTF8"?><foo><bar>42</bar></foo> + ^ + xmlserialize +--------------------------------------------------------------- + <?xml version="1.1" encoding="UTF8"?><foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '2.0' INCLUDING XMLDECLARATION); +ERROR: Invalid XML declaration: VERSION '2.0' +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '' INCLUDING XMLDECLARATION); +ERROR: Invalid XML declaration: VERSION '' +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION ' ' INCLUDING XMLDECLARATION); +ERROR: Invalid XML declaration: VERSION ' ' +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION 'foo' INCLUDING XMLDECLARATION); +ERROR: Invalid XML declaration: VERSION 'foo' +\set VERBOSITY default SELECT xml '<foo>bar</foo>' IS DOCUMENT; ?column? ---------- diff --git a/src/test/regress/expected/xml_1.out b/src/test/regress/expected/xml_1.out index d26e10441e..979388ab1b 100644 --- a/src/test/regress/expected/xml_1.out +++ b/src/test/regress/expected/xml_1.out @@ -454,6 +454,281 @@ ERROR: unsupported XML feature LINE 1: SELECT xmlserialize(CONTENT 'text node<foo> <bar></bar> ... ^ DETAIL: This functionality requires the server to be built with libxml support. +-- 'including xmldeclaration' and 'excluding xmldeclaration'(DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +-- 'including xmldeclaration' and 'excluding xmldeclaration'(CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::x... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::x... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="U... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="U... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="U... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="U... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +-- 'indent' + 'including xmldeclaration' and 'excluding xmldeclaration' (DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +-- 'indent' + 'including xmldeclaration' and 'excluding xmldeclaration'(CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::x... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::x... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="U... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="U... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="U... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="U... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +-- 'version' + 'including xmldeclaration' and 'excluding xmldeclaration'(DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.0'); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0'); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' EXCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +-- 'version' + 'including xmldeclaration' and 'excluding xmldeclaration'(CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1'); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::x... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::x... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1'); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="U... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="U... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' EXCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="U... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +-- 'version' + 'indent' (DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +-- 'indent' + 'version' (CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::x... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="U... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +-- 'indent' + 'version' + 'including xmldeclaration' and 'excluding xmldeclaration'(DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INCLUDING XMLDECLARATION INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INCLUDING XMLDECLARATION INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' EXCLUDING XMLDECLARATION INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +-- 'indent' + 'version' + 'including xmldeclaration' and 'excluding xmldeclaration'(CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::x... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="U... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' EXCLUDING XMLDECLARATION INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="U... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +--'version' with null value (DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION NULL); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION NULL EXCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION NULL INCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +--'version' with null value (CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION NULL); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::x... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION NULL EXCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::x... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION NULL INCLUDING XMLDECLARATION); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::x... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +-- 'version' + 'including xmldeclaration' warning and error messages +\set VERBOSITY terse +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION); +ERROR: unsupported XML feature at character 30 +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '2.0' INCLUDING XMLDECLARATION); +ERROR: unsupported XML feature at character 30 +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '' INCLUDING XMLDECLARATION); +ERROR: unsupported XML feature at character 30 +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION ' ' INCLUDING XMLDECLARATION); +ERROR: unsupported XML feature at character 30 +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION 'foo' INCLUDING XMLDECLARATION); +ERROR: unsupported XML feature at character 30 +\set VERBOSITY default SELECT xml '<foo>bar</foo>' IS DOCUMENT; ERROR: unsupported XML feature LINE 1: SELECT xml '<foo>bar</foo>' IS DOCUMENT; diff --git a/src/test/regress/expected/xml_2.out b/src/test/regress/expected/xml_2.out index 73c2851d3f..c0f2d33cad 100644 --- a/src/test/regress/expected/xml_2.out +++ b/src/test/regress/expected/xml_2.out @@ -662,6 +662,407 @@ SELECT xmlserialize(CONTENT 'text node<foo> <bar></bar> </foo>' AS text IN </foo> (1 row) +-- 'including xmldeclaration' and 'excluding xmldeclaration'(DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); + xmlserialize +--------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8"?><foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION); + xmlserialize +-------------------------- + <foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); + xmlserialize +--------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8"?><foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION); + xmlserialize +-------------------------- + <foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); + xmlserialize +------------------------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="no"?><foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); + xmlserialize +-------------------------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="yes"?><foo><bar>42</bar></foo> +(1 row) + +-- 'including xmldeclaration' and 'excluding xmldeclaration'(CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); + xmlserialize +------------------------------------------------------------------ + <?xml version="1.0" encoding="UTF8"?>txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION); + xmlserialize +----------------------------- + txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); + xmlserialize +------------------------------------------------------------------ + <?xml version="1.0" encoding="UTF8"?>txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION); + xmlserialize +----------------------------- + txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); + xmlserialize +---------------------------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="no"?>txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); + xmlserialize +----------------------------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="yes"?>txt<foo><bar>42</bar></foo> +(1 row) + +-- 'indent' + 'including xmldeclaration' and 'excluding xmldeclaration' (DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); + xmlserialize +--------------------------------------- + <?xml version="1.0" encoding="UTF8"?>+ + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION INDENT); + xmlserialize +----------------- + <foo> + + <bar>42</bar>+ + </foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); + xmlserialize +--------------------------------------- + <?xml version="1.0" encoding="UTF8"?>+ + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION INDENT); + xmlserialize +----------------- + <foo> + + <bar>42</bar>+ + </foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); + xmlserialize +------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="no"?>+ + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); + xmlserialize +-------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="yes"?>+ + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +-- 'indent' + 'including xmldeclaration' and 'excluding xmldeclaration'(CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); + xmlserialize +--------------------------------------- + <?xml version="1.0" encoding="UTF8"?>+ + txt + + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION INDENT); + xmlserialize +----------------- + txt + + <foo> + + <bar>42</bar>+ + </foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); + xmlserialize +--------------------------------------- + <?xml version="1.0" encoding="UTF8"?>+ + txt + + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION INDENT); + xmlserialize +----------------- + txt + + <foo> + + <bar>42</bar>+ + </foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); + xmlserialize +------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="no"?>+ + txt + + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); + xmlserialize +-------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="yes"?>+ + txt + + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +-- 'version' + 'including xmldeclaration' and 'excluding xmldeclaration'(DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.0'); + xmlserialize +-------------------------- + <foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INCLUDING XMLDECLARATION); + xmlserialize +--------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8"?><foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0'); + xmlserialize +------------------------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="no"?><foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INCLUDING XMLDECLARATION); + xmlserialize +-------------------------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="yes"?><foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' EXCLUDING XMLDECLARATION); + xmlserialize +-------------------------- + <foo><bar>42</bar></foo> +(1 row) + +-- 'version' + 'including xmldeclaration' and 'excluding xmldeclaration'(CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1'); + xmlserialize +----------------------------- + txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION); + xmlserialize +------------------------------------------------------------------ + <?xml version="1.1" encoding="UTF8"?>txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1'); + xmlserialize +----------------------------------------------------------------------------------- + <?xml version="1.1" encoding="UTF8" standalone="yes"?>txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION); + xmlserialize +---------------------------------------------------------------------------------- + <?xml version="1.1" encoding="UTF8" standalone="no"?>txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' EXCLUDING XMLDECLARATION); + xmlserialize +----------------------------- + txt<foo><bar>42</bar></foo> +(1 row) + +-- 'version' + 'indent' (DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INDENT); + xmlserialize +----------------- + <foo> + + <bar>42</bar>+ + </foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INDENT); + xmlserialize +------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="no"?>+ + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +-- 'indent' + 'version' (CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INDENT); + xmlserialize +----------------- + txt + + <foo> + + <bar>42</bar>+ + </foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INDENT); + xmlserialize +-------------------------------------------------------- + <?xml version="1.1" encoding="UTF8" standalone="yes"?>+ + txt + + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +-- 'indent' + 'version' + 'including xmldeclaration' and 'excluding xmldeclaration'(DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INCLUDING XMLDECLARATION INDENT); + xmlserialize +--------------------------------------- + <?xml version="1.0" encoding="UTF8"?>+ + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INCLUDING XMLDECLARATION INDENT); + xmlserialize +-------------------------------------------------------- + <?xml version="1.0" encoding="UTF8" standalone="yes"?>+ + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' EXCLUDING XMLDECLARATION INDENT); + xmlserialize +----------------- + <foo> + + <bar>42</bar>+ + </foo> +(1 row) + +-- 'indent' + 'version' + 'including xmldeclaration' and 'excluding xmldeclaration'(CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION INDENT); + xmlserialize +--------------------------------------- + <?xml version="1.1" encoding="UTF8"?>+ + txt + + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION INDENT); + xmlserialize +-------------------------------------------------------- + <?xml version="1.1" encoding="UTF8" standalone="yes"?>+ + txt + + <foo> + + <bar>42</bar> + + </foo> +(1 row) + +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' EXCLUDING XMLDECLARATION INDENT); + xmlserialize +----------------- + txt + + <foo> + + <bar>42</bar>+ + </foo> +(1 row) + +--'version' with null value (DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION NULL); + xmlserialize +-------------------------- + <foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION NULL EXCLUDING XMLDECLARATION); + xmlserialize +-------------------------- + <foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION NULL INCLUDING XMLDECLARATION); + xmlserialize +--------------------------------------------------------------- + <?xml version="1.0" encoding="UTF8"?><foo><bar>42</bar></foo> +(1 row) + +--'version' with null value (CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION NULL); + xmlserialize +----------------------------- + txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION NULL EXCLUDING XMLDECLARATION); + xmlserialize +----------------------------- + txt<foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION NULL INCLUDING XMLDECLARATION); + xmlserialize +------------------------------------------------------------------ + <?xml version="1.0" encoding="UTF8"?>txt<foo><bar>42</bar></foo> +(1 row) + +-- 'version' + 'including xmldeclaration' warning and error messages +\set VERBOSITY terse +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION); +WARNING: line 1: Unsupported version '1.1' +<?xml version="1.1" encoding="UTF8"?><foo><bar>42</bar></foo> + ^ + xmlserialize +--------------------------------------------------------------- + <?xml version="1.1" encoding="UTF8"?><foo><bar>42</bar></foo> +(1 row) + +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '2.0' INCLUDING XMLDECLARATION); +ERROR: Invalid XML declaration: VERSION '2.0' +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '' INCLUDING XMLDECLARATION); +ERROR: Invalid XML declaration: VERSION '' +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION ' ' INCLUDING XMLDECLARATION); +ERROR: Invalid XML declaration: VERSION ' ' +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION 'foo' INCLUDING XMLDECLARATION); +ERROR: Invalid XML declaration: VERSION 'foo' +\set VERBOSITY default SELECT xml '<foo>bar</foo>' IS DOCUMENT; ?column? ---------- diff --git a/src/test/regress/sql/xml.sql b/src/test/regress/sql/xml.sql index f752ecb142..91fe599eef 100644 --- a/src/test/regress/sql/xml.sql +++ b/src/test/regress/sql/xml.sql @@ -172,6 +172,78 @@ SELECT xmlserialize(CONTENT '<foo><bar><val x="y">42</val></bar></foo>' AS text SELECT xmlserialize(DOCUMENT '<foo> <bar></bar> </foo>' AS text INDENT); SELECT xmlserialize(CONTENT 'text node<foo> <bar></bar> </foo>' AS text INDENT); +-- 'including xmldeclaration' and 'excluding xmldeclaration'(DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION); +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION); +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); +-- 'including xmldeclaration' and 'excluding xmldeclaration'(CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION); +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION); +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION); +-- 'indent' + 'including xmldeclaration' and 'excluding xmldeclaration' (DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION INDENT); +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION INDENT); +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); +-- 'indent' + 'including xmldeclaration' and 'excluding xmldeclaration'(CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION INDENT); +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text EXCLUDING XMLDECLARATION INDENT); +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text INCLUDING XMLDECLARATION INDENT); +-- 'version' + 'including xmldeclaration' and 'excluding xmldeclaration'(DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.0'); +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INCLUDING XMLDECLARATION); +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0'); +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INCLUDING XMLDECLARATION); +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' EXCLUDING XMLDECLARATION); +-- 'version' + 'including xmldeclaration' and 'excluding xmldeclaration'(CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1'); +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION); +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1'); +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION); +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' EXCLUDING XMLDECLARATION); +-- 'version' + 'indent' (DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INDENT); +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="no"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INDENT); +-- 'indent' + 'version' (CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INDENT); +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INDENT); +-- 'indent' + 'version' + 'including xmldeclaration' and 'excluding xmldeclaration'(DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INCLUDING XMLDECLARATION INDENT); +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' INCLUDING XMLDECLARATION INDENT); +SELECT xmlserialize(DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><foo><bar>42</bar></foo>'::xml AS text VERSION '1.0' EXCLUDING XMLDECLARATION INDENT); +-- 'indent' + 'version' + 'including xmldeclaration' and 'excluding xmldeclaration'(CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION INDENT); +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION INDENT); +SELECT xmlserialize(CONTENT '<?xml version="1.0" encoding="UTF-8"?>txt<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' EXCLUDING XMLDECLARATION INDENT); +--'version' with null value (DOCUMENT) +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION NULL); +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION NULL EXCLUDING XMLDECLARATION); +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION NULL INCLUDING XMLDECLARATION); +--'version' with null value (CONTENT) +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION NULL); +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION NULL EXCLUDING XMLDECLARATION); +SELECT xmlserialize(CONTENT 'txt<foo><bar>42</bar></foo>'::xml AS text VERSION NULL INCLUDING XMLDECLARATION); + +-- 'version' + 'including xmldeclaration' warning and error messages +\set VERBOSITY terse +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '1.1' INCLUDING XMLDECLARATION); +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '2.0' INCLUDING XMLDECLARATION); +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION '' INCLUDING XMLDECLARATION); +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION ' ' INCLUDING XMLDECLARATION); +SELECT xmlserialize(DOCUMENT '<foo><bar>42</bar></foo>'::xml AS text VERSION 'foo' INCLUDING XMLDECLARATION); +\set VERBOSITY default + SELECT xml '<foo>bar</foo>' IS DOCUMENT; SELECT xml '<foo>bar</foo><bar>foo</bar>' IS DOCUMENT; SELECT xml '<abc/>' IS NOT DOCUMENT; -- 2.34.1