diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c
index a453f76bb37d195a76eb2965dab2822e8c48036e..d50c3c0feb03bb8f9af9075b9ab33981dd7e52f0 100644
--- a/src/backend/utils/adt/xml.c
+++ b/src/backend/utils/adt/xml.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.58 2007/11/15 22:25:16 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.59 2007/11/20 23:14:41 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1109,12 +1109,14 @@ parse_xml_decl(const xmlChar * str, size_t *lenp,
 			return XML_ERR_STANDALONE_VALUE;
 		p += 1;
 		SKIP_XML_SPACE(p);
-		if (xmlStrncmp(p, (xmlChar *) "'yes'", 5) == 0 || xmlStrncmp(p, (xmlChar *) "\"yes\"", 5) == 0)
+		if (xmlStrncmp(p, (xmlChar *) "'yes'", 5) == 0 ||
+			xmlStrncmp(p, (xmlChar *) "\"yes\"", 5) == 0)
 		{
 			*standalone = 1;
 			p += 5;
 		}
-		else if (xmlStrncmp(p, (xmlChar *) "'no'", 4) == 0 || xmlStrncmp(p, (xmlChar *) "\"no\"", 4) == 0)
+		else if (xmlStrncmp(p, (xmlChar *) "'no'", 4) == 0 ||
+				 xmlStrncmp(p, (xmlChar *) "\"no\"", 4) == 0)
 		{
 			*standalone = 0;
 			p += 4;
@@ -3305,6 +3307,8 @@ xpath(PG_FUNCTION_ARGS)
 				(errcode(ERRCODE_DATA_EXCEPTION),
 				 errmsg("empty XPath expression")));
 
+	xml_init();
+
 	/*
 	 * To handle both documents and fragments, regardless of the fact whether
 	 * the XML datum has a single root (XML well-formedness), we wrap the XML
@@ -3324,20 +3328,22 @@ xpath(PG_FUNCTION_ARGS)
 						"could not parse XML data");
 
 		++i;
-		string = xmlStrncatNew((xmlChar *) "<x>",
-							   (xmlChar *) datastr + i, len - i);
+
+		datastr += i;
+		len -= i;
 	}
-	else
-		string = xmlStrncatNew((xmlChar *) "<x>",
-							   (xmlChar *) datastr, len);
 
-	string = xmlStrncat(string, (xmlChar *) "</x>", 5);
+	string = (xmlChar *) palloc((len + 8) * sizeof(xmlChar));
+	memcpy(string, "<x>", 3);
+	memcpy(string + 3, datastr, len);
+	memcpy(string + 3 + len, "</x>", 5);
 	len += 7;
-	xpath_expr = xmlStrncatNew((xmlChar *) "/x",
-							(xmlChar *) VARDATA(xpath_expr_text), xpath_len);
-	xpath_len += 2;
 
-	xml_init();
+	xpath_expr = (xmlChar *) palloc((xpath_len + 3) * sizeof(xmlChar));
+	memcpy(xpath_expr, "/x", 2);
+	memcpy(xpath_expr + 2, VARDATA(xpath_expr_text), xpath_len);
+	xpath_expr[xpath_len + 2] = '\0';
+	xpath_len += 2;
 
 	/* We use a PG_TRY block to ensure libxml parser is cleaned up on error */
 	PG_TRY();