From: Tom Lane <tgl@sss.pgh.pa.us>
To: pgsql-hackers@lists.postgresql.org
Subject: PG versus libxml2 2.12.x
Date: Sat, 27 Jan 2024 14:04:22 -0500
Message-ID: <1389505.1706382262@sss.pgh.pa.us> (raw)
Buildfarm member caiman has been failing build for a couple weeks now.
The reason turns out to be that recent libxml2 has decided to throw
a "const" into the signature required for custom error handlers.
(API compatibility? What's that?)
I don't mind adopting the "const" --- it's a good idea in isolation.
The trouble is in fixing our code to work with both old and new
libxml2 versions. We could thrash around with a configure test or
something, but I think the most expedient answer is just to insert
some explicit casts, as shown in the attached. It's possible though
that some compilers will throw a cast-away-const warning. I'm
not seeing any, but ...
Also, I'm seeing a deprecation warning in contrib/xml2/xpath.c
for
xmlLoadExtDtdDefaultValue = 1;
I'm not sure why that's still there, given that we disabled external
DTD access ages ago. I propose we just remove it.
In short, I suggest the attached.
regards, tom lane
Attachments:
[text/x-diff] v1-cope-with-libxml2-API-changes.patch (2.9K, ../1389505.1706382262@sss.pgh.pa.us/2-v1-cope-with-libxml2-API-changes.patch)
download | inline diff:diff --git a/contrib/xml2/xpath.c b/contrib/xml2/xpath.cindex a967257546..b999b1f706 100644--- a/contrib/xml2/xpath.c+++ b/contrib/xml2/xpath.c@@ -74,8 +74,6 @@ pgxml_parser_init(PgXmlStrictness strictness)
/* Initialize libxml */
xmlInitParser();
- xmlLoadExtDtdDefaultValue = 1;-
return xmlerrcxt;
}
diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.cindex f869c680af..a6734f3550 100644--- a/src/backend/utils/adt/xml.c+++ b/src/backend/utils/adt/xml.c@@ -124,7 +124,7 @@ static xmlParserInputPtr xmlPgEntityLoader(const char *URL, const char *ID,
xmlParserCtxtPtr ctxt);
static void xml_errsave(Node *escontext, PgXmlErrorContext *errcxt,
int sqlcode, const char *msg);
-static void xml_errorHandler(void *data, xmlErrorPtr error);+static void xml_errorHandler(void *data, const xmlError *error);
static int errdetail_for_xml_code(int code);
static void chopStringInfoNewlines(StringInfo str);
static void appendStringInfoLineSeparator(StringInfo str);
@@ -1196,7 +1196,8 @@ pg_xml_init(PgXmlStrictness strictness)
errcxt->saved_errcxt = xmlGenericErrorContext;
#endif
- xmlSetStructuredErrorFunc((void *) errcxt, xml_errorHandler);+ xmlSetStructuredErrorFunc((void *) errcxt,+ (xmlStructuredErrorFunc) xml_errorHandler);
/*
* Verify that xmlSetStructuredErrorFunc set the context variable we
@@ -2024,7 +2025,7 @@ xml_errsave(Node *escontext, PgXmlErrorContext *errcxt,
* Error handler for libxml errors and warnings
*/
static void
-xml_errorHandler(void *data, xmlErrorPtr error)+xml_errorHandler(void *data, const xmlError *error)
{
PgXmlErrorContext *xmlerrcxt = (PgXmlErrorContext *) data;
xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) error->ctxt;
@@ -4803,7 +4804,8 @@ XmlTableFetchRow(TableFuncScanState *state)
xtCxt = GetXmlTableBuilderPrivateData(state, "XmlTableFetchRow");
/* Propagate our own error context to libxml2 */
- xmlSetStructuredErrorFunc((void *) xtCxt->xmlerrcxt, xml_errorHandler);+ xmlSetStructuredErrorFunc((void *) xtCxt->xmlerrcxt,+ (xmlStructuredErrorFunc) xml_errorHandler);
if (xtCxt->xpathobj == NULL)
{
@@ -4857,7 +4859,8 @@ XmlTableGetValue(TableFuncScanState *state, int colnum,
xtCxt->xpathobj->nodesetval != NULL);
/* Propagate our own error context to libxml2 */
- xmlSetStructuredErrorFunc((void *) xtCxt->xmlerrcxt, xml_errorHandler);+ xmlSetStructuredErrorFunc((void *) xtCxt->xmlerrcxt,+ (xmlStructuredErrorFunc) xml_errorHandler);
*isnull = false;
@@ -5000,7 +5003,8 @@ XmlTableDestroyOpaque(TableFuncScanState *state)
xtCxt = GetXmlTableBuilderPrivateData(state, "XmlTableDestroyOpaque");
/* Propagate our own error context to libxml2 */
- xmlSetStructuredErrorFunc((void *) xtCxt->xmlerrcxt, xml_errorHandler);+ xmlSetStructuredErrorFunc((void *) xtCxt->xmlerrcxt,+ (xmlStructuredErrorFunc) xml_errorHandler);
if (xtCxt->xpathscomp != NULL)
{
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: tgl@sss.pgh.pa.us, pgsql-hackers@lists.postgresql.org
Subject: Re: PG versus libxml2 2.12.x
In-Reply-To: <1389505.1706382262@sss.pgh.pa.us>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox