diff options
author | Peter Eisentraut <peter_e@gmx.net> | 2017-05-03 21:25:01 -0400 |
---|---|---|
committer | Peter Eisentraut <peter_e@gmx.net> | 2017-05-04 21:17:46 -0400 |
commit | 071d13395cc2ea0b87aa5f135c87808d6dd60cd5 (patch) | |
tree | 0b2cd46593fbe22bfb5e5d657ee6a45af4e9251e /src/backend/utils/adt/xml.c | |
parent | 855f0e9247a160bfad00c117ba7d97148cd2a0ec (diff) | |
download | postgresql-071d13395cc2ea0b87aa5f135c87808d6dd60cd5.tar.gz postgresql-071d13395cc2ea0b87aa5f135c87808d6dd60cd5.zip |
Fix cursor_to_xml in tableforest false mode
It only produced <row> elements but no wrapping <table> element.
By contrast, cursor_to_xmlschema produced a schema that is now correct
but did not previously match the XML data produced by cursor_to_xml.
In passing, also fix a minor misunderstanding about moving cursors in
the tests related to this.
Reported-by: filip@jirsak.org
Based-on-patch-by: Thomas Munro <thomas.munro@enterprisedb.com>
Diffstat (limited to 'src/backend/utils/adt/xml.c')
-rw-r--r-- | src/backend/utils/adt/xml.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index b144920ec65..f5348b34657 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -147,6 +147,10 @@ static int xml_xpathobjtoxmlarray(xmlXPathObjectPtr xpathobj, PgXmlErrorContext *xmlerrcxt); #endif /* USE_LIBXML */ +static void xmldata_root_element_start(StringInfo result, const char *eltname, + const char *xmlschema, const char *targetns, + bool top_level); +static void xmldata_root_element_end(StringInfo result, const char *eltname); static StringInfo query_to_xml_internal(const char *query, char *tablename, const char *xmlschema, bool nulls, bool tableforest, const char *targetns, bool top_level); @@ -2381,6 +2385,12 @@ cursor_to_xml(PG_FUNCTION_ARGS) initStringInfo(&result); + if (!tableforest) + { + xmldata_root_element_start(&result, "table", NULL, targetns, true); + appendStringInfoChar(&result, '\n'); + } + SPI_connect(); portal = SPI_cursor_find(name); if (portal == NULL) @@ -2395,6 +2405,9 @@ cursor_to_xml(PG_FUNCTION_ARGS) SPI_finish(); + if (!tableforest) + xmldata_root_element_end(&result, "table"); + PG_RETURN_XML_P(stringinfo_to_xmltype(&result)); } |