mirror of
https://github.com/postgres/postgres.git
synced 2025-07-31 22:04:40 +03:00
Support [NO] INDENT option in XMLSERIALIZE().
This adds the ability to pretty-print XML documents ... according to libxml's somewhat idiosyncratic notions of what's pretty, anyway. One notable divergence from a strict reading of the spec is that libxml is willing to collapse empty nodes "<node></node>" to just "<node/>", whereas SQL and the underlying XML spec say that this option should only result in whitespace tweaks. Nonetheless, it seems close enough to justify using the SQL-standard syntax. Jim Jones, reviewed by Peter Smith and myself Discussion: https://postgr.es/m/2f5df461-dad8-6d7d-4568-08e10608a69b@uni-muenster.de
This commit is contained in:
@ -613,7 +613,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
|
||||
%type <node> xml_root_version opt_xml_root_standalone
|
||||
%type <node> xmlexists_argument
|
||||
%type <ival> document_or_content
|
||||
%type <boolean> xml_whitespace_option
|
||||
%type <boolean> xml_indent_option xml_whitespace_option
|
||||
%type <list> xmltable_column_list xmltable_column_option_list
|
||||
%type <node> xmltable_column_el
|
||||
%type <defelt> xmltable_column_option_el
|
||||
@ -702,7 +702,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
|
||||
HANDLER HAVING HEADER_P HOLD HOUR_P
|
||||
|
||||
IDENTITY_P IF_P ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IMPORT_P IN_P INCLUDE
|
||||
INCLUDING INCREMENT INDEX INDEXES INHERIT INHERITS INITIALLY INLINE_P
|
||||
INCLUDING INCREMENT INDENT INDEX INDEXES INHERIT INHERITS INITIALLY INLINE_P
|
||||
INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER
|
||||
INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION
|
||||
|
||||
@ -15532,13 +15532,14 @@ func_expr_common_subexpr:
|
||||
$$ = makeXmlExpr(IS_XMLROOT, NULL, NIL,
|
||||
list_make3($3, $5, $6), @1);
|
||||
}
|
||||
| XMLSERIALIZE '(' document_or_content a_expr AS SimpleTypename ')'
|
||||
| XMLSERIALIZE '(' document_or_content a_expr AS SimpleTypename xml_indent_option ')'
|
||||
{
|
||||
XmlSerialize *n = makeNode(XmlSerialize);
|
||||
|
||||
n->xmloption = $3;
|
||||
n->expr = $4;
|
||||
n->typeName = $6;
|
||||
n->indent = $7;
|
||||
n->location = @1;
|
||||
$$ = (Node *) n;
|
||||
}
|
||||
@ -15592,6 +15593,11 @@ document_or_content: DOCUMENT_P { $$ = XMLOPTION_DOCUMENT; }
|
||||
| CONTENT_P { $$ = XMLOPTION_CONTENT; }
|
||||
;
|
||||
|
||||
xml_indent_option: INDENT { $$ = true; }
|
||||
| NO INDENT { $$ = false; }
|
||||
| /*EMPTY*/ { $$ = false; }
|
||||
;
|
||||
|
||||
xml_whitespace_option: PRESERVE WHITESPACE_P { $$ = true; }
|
||||
| STRIP_P WHITESPACE_P { $$ = false; }
|
||||
| /*EMPTY*/ { $$ = false; }
|
||||
@ -16828,6 +16834,7 @@ unreserved_keyword:
|
||||
| INCLUDE
|
||||
| INCLUDING
|
||||
| INCREMENT
|
||||
| INDENT
|
||||
| INDEX
|
||||
| INDEXES
|
||||
| INHERIT
|
||||
@ -17384,6 +17391,7 @@ bare_label_keyword:
|
||||
| INCLUDE
|
||||
| INCLUDING
|
||||
| INCREMENT
|
||||
| INDENT
|
||||
| INDEX
|
||||
| INDEXES
|
||||
| INHERIT
|
||||
|
@ -2331,6 +2331,7 @@ transformXmlSerialize(ParseState *pstate, XmlSerialize *xs)
|
||||
typenameTypeIdAndMod(pstate, xs->typeName, &targetType, &targetTypmod);
|
||||
|
||||
xexpr->xmloption = xs->xmloption;
|
||||
xexpr->indent = xs->indent;
|
||||
xexpr->location = xs->location;
|
||||
/* We actually only need these to be able to parse back the expression. */
|
||||
xexpr->type = targetType;
|
||||
|
Reference in New Issue
Block a user