Modernize our parsing of XML data in CONTENT mode.

The main goal of this patch is to get rid of our use of
xmlKeepBlanksDefault, which libxml2 has deprecated.
To do that, we want to use xmlParseInNodeContext instead of
xmlParseBalancedChunkMemory, so that we can pass an options
mask that includes XML_PARSE_NOBLANKS.

xmlParseInNodeContext wants an xmlNode rather than an xmlDoc as
context.  This gives us an opportunity for simplification though:
we can make that node be a dummy root node for xml_parse's result
document, and then attach the content node(s) as children of the root,
essentially moving the data structure hack in xmltotext_with_options
into xml_parse.  The main benefit of this is that callers no longer
need to free the content node list separately; freeing the document is
sufficient.  (There were error paths in xmltotext_with_options that
I think would have leaked that list, though they could only be
reached in OOM or similar conditions.)

We also do some fooling with doc->encoding, to be bug-compatible
with our previous behavior on as many libxml2 versions as practical.
Some small discrepancies with previous behavior are known with older
libxml2 versions.  Therefore, it seems inadvisable to back-patch this,
at least not before it's gotten a good deal of field experience.

Author: Tom Lane <[email protected]>
Fix-suggested-by: Andrew Dunstan <[email protected]>
Reviewed-by: Rui Zhao <[email protected]>
Discussion: 
https://postgr.es/m/zr2ppff1830b8772632fa23847d7482168fd2...@zr2ppff1830b877.chep278.prod.outlook.com

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/30d4a6daac8b61fd18dfe0d990d00943a170e48b

Modified Files
--------------
src/backend/utils/adt/xml.c       | 156 ++++++++++++++++++++------------------
src/test/regress/expected/xml.out |  29 +++++++
src/test/regress/sql/xml.sql      |  30 ++++++++
3 files changed, 143 insertions(+), 72 deletions(-)

Reply via email to