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:20:26 -0400 |
commit | 9750a9583aacefbde15d9ed4ebfed84f1fb3aae8 (patch) | |
tree | e3689fae722513fcdc0313112d473cd440f76efc | |
parent | 6cfb428b05a8742ac0ec17145c90c4672d44177d (diff) | |
download | postgresql-9750a9583aacefbde15d9ed4ebfed84f1fb3aae8.tar.gz postgresql-9750a9583aacefbde15d9ed4ebfed84f1fb3aae8.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>
-rw-r--r-- | src/backend/utils/adt/xml.c | 13 | ||||
-rw-r--r-- | src/test/regress/expected/xmlmap.out | 64 | ||||
-rw-r--r-- | src/test/regress/expected/xmlmap_1.out | 6 | ||||
-rw-r--r-- | src/test/regress/sql/xmlmap.sql | 3 |
4 files changed, 71 insertions, 15 deletions
diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index 31dfc4d2a7a..268d577b94b 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); @@ -2383,6 +2387,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) @@ -2397,6 +2407,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)); } diff --git a/src/test/regress/expected/xmlmap.out b/src/test/regress/expected/xmlmap.out index b50396face9..c08f8a0d9c1 100644 --- a/src/test/regress/expected/xmlmap.out +++ b/src/test/regress/expected/xmlmap.out @@ -696,20 +696,58 @@ SELECT cursor_to_xml('xc'::refcursor, 5, false, true, ''); (1 row) -MOVE FIRST IN xc; +SELECT cursor_to_xmlschema('xc'::refcursor, false, true, ''); + cursor_to_xmlschema +---------------------------------------------------------------------------------------------- + <xsd:schema + + xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + + + <xsd:simpleType name="INTEGER"> + + <xsd:restriction base="xsd:int"> + + <xsd:maxInclusive value="2147483647"/> + + <xsd:minInclusive value="-2147483648"/> + + </xsd:restriction> + + </xsd:simpleType> + + + + <xsd:simpleType name="UDT.regression.pg_catalog.text"> + + <xsd:restriction base="xsd:string"> + + </xsd:restriction> + + </xsd:simpleType> + + + + <xsd:complexType name="RowType"> + + <xsd:sequence> + + <xsd:element name="a" type="INTEGER" minOccurs="0"></xsd:element> + + <xsd:element name="b" type="UDT.regression.pg_catalog.text" minOccurs="0"></xsd:element>+ + </xsd:sequence> + + </xsd:complexType> + + + + <xsd:element name="row" type="RowType"/> + + + + </xsd:schema> +(1 row) + +MOVE BACKWARD ALL IN xc; SELECT cursor_to_xml('xc'::refcursor, 5, true, false, ''); - cursor_to_xml ---------------- - <row> + - <a>1</a> + - <b>one</b> + - </row> + - + - <row> + - <a>2</a> + - <b>two</b> + - </row> + - + + cursor_to_xml +--------------------------------------------------------------- + <table xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">+ + + + <row> + + <a>-1</a> + + <b xsi:nil="true"/> + + </row> + + + + <row> + + <a>1</a> + + <b>one</b> + + </row> + + + + <row> + + <a>2</a> + + <b>two</b> + + </row> + + + + </table> + (1 row) diff --git a/src/test/regress/expected/xmlmap_1.out b/src/test/regress/expected/xmlmap_1.out index d67ef6d3e24..f6dbf81666a 100644 --- a/src/test/regress/expected/xmlmap_1.out +++ b/src/test/regress/expected/xmlmap_1.out @@ -78,7 +78,11 @@ SELECT cursor_to_xml('xc'::refcursor, 5, false, true, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. HINT: You need to rebuild PostgreSQL using --with-libxml. -MOVE FIRST IN xc; +SELECT cursor_to_xmlschema('xc'::refcursor, false, true, ''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +HINT: You need to rebuild PostgreSQL using --with-libxml. +MOVE BACKWARD ALL IN xc; SELECT cursor_to_xml('xc'::refcursor, 5, true, false, ''); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. diff --git a/src/test/regress/sql/xmlmap.sql b/src/test/regress/sql/xmlmap.sql index 8f8d6808139..fde1b9eb597 100644 --- a/src/test/regress/sql/xmlmap.sql +++ b/src/test/regress/sql/xmlmap.sql @@ -30,7 +30,8 @@ SELECT query_to_xml_and_xmlschema('SELECT * FROM testxmlschema.test1', true, tru DECLARE xc CURSOR WITH HOLD FOR SELECT * FROM testxmlschema.test1 ORDER BY 1, 2; SELECT cursor_to_xml('xc'::refcursor, 5, false, true, ''); -MOVE FIRST IN xc; +SELECT cursor_to_xmlschema('xc'::refcursor, false, true, ''); +MOVE BACKWARD ALL IN xc; SELECT cursor_to_xml('xc'::refcursor, 5, true, false, ''); SELECT cursor_to_xmlschema('xc'::refcursor, true, false, ''); |