1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-28 18:48:04 +03:00

Fix namespace handling in xpath function

Previously, the xml value resulting from an xpath query would not have
namespace declarations if the namespace declarations were attached to
an ancestor element in the input xml value.  That means the output value
was not correct XML.  Fix that by running the result value through
xmlCopyNode(), which produces the correct namespace declarations.

Author: Ali Akbar <the.apaan@gmail.com>
This commit is contained in:
Peter Eisentraut
2015-01-06 23:06:13 -05:00
parent 1c49561762
commit c975fa4713
4 changed files with 45 additions and 1 deletions

View File

@@ -3286,19 +3286,34 @@ xml_xmlnodetoxmltype(xmlNodePtr cur)
if (cur->type == XML_ELEMENT_NODE)
{
xmlBufferPtr buf;
xmlNodePtr cur_copy;
buf = xmlBufferCreate();
/*
* The result of xmlNodeDump() won't contain namespace definitions
* from parent nodes, but xmlCopyNode() duplicates a node along with
* its required namespace definitions.
*/
cur_copy = xmlCopyNode(cur, 1);
if (cur_copy == NULL)
xml_ereport(ERROR, ERRCODE_OUT_OF_MEMORY,
"could not copy node");
PG_TRY();
{
xmlNodeDump(buf, NULL, cur, 0, 1);
xmlNodeDump(buf, NULL, cur_copy, 0, 1);
result = xmlBuffer_to_xmltype(buf);
}
PG_CATCH();
{
xmlFreeNode(cur_copy);
xmlBufferFree(buf);
PG_RE_THROW();
}
PG_END_TRY();
xmlFreeNode(cur_copy);
xmlBufferFree(buf);
}
else