xpath_nonutf8.patch
application/octet-stream
Filename: xpath_nonutf8.patch
Type: application/octet-stream
Part: 0
Message:
XPATH vs. server_encoding != UTF-8
diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c
index f3db3f0..7405e17 100644
*** a/src/backend/utils/adt/xml.c
--- b/src/backend/utils/adt/xml.c
*************** xpath_internal(text *xpath_expr_text, xm
*** 3665,3670 ****
--- 3665,3671 ----
int32 len;
int32 xpath_len;
xmlChar *string;
+ const char *string_encoding;
xmlChar *xpath_expr;
int i;
int ndim;
*************** xpath_internal(text *xpath_expr_text, xm
*** 3717,3722 ****
--- 3718,3728 ----
ereport(ERROR,
(errcode(ERRCODE_DATA_EXCEPTION),
errmsg("empty XPath expression")));
+
+ if (GetDatabaseEncoding() == PG_UTF8)
+ string_encoding = "UTF-8";
+ else
+ string_encoding = "ASCII";
string = (xmlChar *) palloc((len + 1) * sizeof(xmlChar));
memcpy(string, datastr, len);
*************** xpath_internal(text *xpath_expr_text, xm
*** 3740,3746 ****
if (ctxt == NULL || xmlerrcxt->err_occurred)
xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
"could not allocate parser context");
! doc = xmlCtxtReadMemory(ctxt, (char *) string, len, NULL, NULL, 0);
if (doc == NULL || xmlerrcxt->err_occurred)
xml_ereport(xmlerrcxt, ERROR, ERRCODE_INVALID_XML_DOCUMENT,
"could not parse XML document");
--- 3746,3753 ----
if (ctxt == NULL || xmlerrcxt->err_occurred)
xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
"could not allocate parser context");
! doc = xmlCtxtReadMemory(ctxt, (char *) string, len, NULL,
! string_encoding, 0);
if (doc == NULL || xmlerrcxt->err_occurred)
xml_ereport(xmlerrcxt, ERROR, ERRCODE_INVALID_XML_DOCUMENT,
"could not parse XML document");