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>
This commit is contained in:
parent
4dd4104342
commit
0de791ed76
@ -149,6 +149,10 @@ static int xml_xpathobjtoxmlarray(xmlXPathObjectPtr xpathobj,
|
|||||||
static xmlChar *pg_xmlCharStrndup(char *str, size_t len);
|
static xmlChar *pg_xmlCharStrndup(char *str, size_t len);
|
||||||
#endif /* USE_LIBXML */
|
#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,
|
static StringInfo query_to_xml_internal(const char *query, char *tablename,
|
||||||
const char *xmlschema, bool nulls, bool tableforest,
|
const char *xmlschema, bool nulls, bool tableforest,
|
||||||
const char *targetns, bool top_level);
|
const char *targetns, bool top_level);
|
||||||
@ -2451,6 +2455,12 @@ cursor_to_xml(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
initStringInfo(&result);
|
initStringInfo(&result);
|
||||||
|
|
||||||
|
if (!tableforest)
|
||||||
|
{
|
||||||
|
xmldata_root_element_start(&result, "table", NULL, targetns, true);
|
||||||
|
appendStringInfoChar(&result, '\n');
|
||||||
|
}
|
||||||
|
|
||||||
SPI_connect();
|
SPI_connect();
|
||||||
portal = SPI_cursor_find(name);
|
portal = SPI_cursor_find(name);
|
||||||
if (portal == NULL)
|
if (portal == NULL)
|
||||||
@ -2465,6 +2475,9 @@ cursor_to_xml(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
SPI_finish();
|
SPI_finish();
|
||||||
|
|
||||||
|
if (!tableforest)
|
||||||
|
xmldata_root_element_end(&result, "table");
|
||||||
|
|
||||||
PG_RETURN_XML_P(stringinfo_to_xmltype(&result));
|
PG_RETURN_XML_P(stringinfo_to_xmltype(&result));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -696,20 +696,58 @@ SELECT cursor_to_xml('xc'::refcursor, 5, false, true, '');
|
|||||||
|
|
||||||
(1 row)
|
(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, '');
|
SELECT cursor_to_xml('xc'::refcursor, 5, true, false, '');
|
||||||
cursor_to_xml
|
cursor_to_xml
|
||||||
---------------
|
---------------------------------------------------------------
|
||||||
<row> +
|
<table xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">+
|
||||||
<a>1</a> +
|
+
|
||||||
<b>one</b> +
|
<row> +
|
||||||
</row> +
|
<a>-1</a> +
|
||||||
+
|
<b xsi:nil="true"/> +
|
||||||
<row> +
|
</row> +
|
||||||
<a>2</a> +
|
+
|
||||||
<b>two</b> +
|
<row> +
|
||||||
</row> +
|
<a>1</a> +
|
||||||
+
|
<b>one</b> +
|
||||||
|
</row> +
|
||||||
|
+
|
||||||
|
<row> +
|
||||||
|
<a>2</a> +
|
||||||
|
<b>two</b> +
|
||||||
|
</row> +
|
||||||
|
+
|
||||||
|
</table> +
|
||||||
|
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
@ -78,7 +78,11 @@ SELECT cursor_to_xml('xc'::refcursor, 5, false, true, '');
|
|||||||
ERROR: unsupported XML feature
|
ERROR: unsupported XML feature
|
||||||
DETAIL: This functionality requires the server to be built with libxml support.
|
DETAIL: This functionality requires the server to be built with libxml support.
|
||||||
HINT: You need to rebuild PostgreSQL using --with-libxml.
|
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, '');
|
SELECT cursor_to_xml('xc'::refcursor, 5, true, false, '');
|
||||||
ERROR: unsupported XML feature
|
ERROR: unsupported XML feature
|
||||||
DETAIL: This functionality requires the server to be built with libxml support.
|
DETAIL: This functionality requires the server to be built with libxml support.
|
||||||
|
@ -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;
|
DECLARE xc CURSOR WITH HOLD FOR SELECT * FROM testxmlschema.test1 ORDER BY 1, 2;
|
||||||
SELECT cursor_to_xml('xc'::refcursor, 5, false, true, '');
|
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_xml('xc'::refcursor, 5, true, false, '');
|
||||||
SELECT cursor_to_xmlschema('xc'::refcursor, true, false, '');
|
SELECT cursor_to_xmlschema('xc'::refcursor, true, false, '');
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user