Peter Eisentraut wrote:
Our version of SQL/XML support references SQL:2003 which references XML
1.0, where omitting the XMLDecl is legal.  You can't omit the XMLDecl in
XML 1.1, because you need it to communicate the fact that it's version
1.1.



Hmm. OK. Well here is a patch that tries to fix the xmlconcat error, anyway. It seems to work, but maybe could stand a little tightening.

cheers

andrew
Index: src/backend/utils/adt/xml.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/adt/xml.c,v
retrieving revision 1.97
diff -c -r1.97 xml.c
*** src/backend/utils/adt/xml.c	3 Mar 2010 17:29:45 -0000	1.97
--- src/backend/utils/adt/xml.c	24 Mar 2010 22:05:19 -0000
***************
*** 418,424 ****
--- 418,466 ----
  #endif
  }
  
+ #ifdef USE_LIBXML
+ static inline void
+ strip_dtd(char ** xmlstr)
+ {
+ 
+ 	xmlDocPtr	doc;
+ 	xmlChar *xmlbuff;
+ 	int buffersize;
+ 	bool        dtd_found = false;
+ 	xmlNodePtr child;
+ 	char * skip_xmldecl;
+ 
+ 	if (strstr(*xmlstr,"<!DOCTYPE") == NULL)
+ 		return ;
+ 
+ 	doc = xml_parse(cstring_to_text(*xmlstr), XMLOPTION_DOCUMENT, true, GetDatabaseEncoding());
+ 
+ 	for (child = doc->children; child != NULL; child = child->next)
+ 	{
+ 		if (child->type == XML_DOCUMENT_TYPE_NODE || 
+ 			child->type == XML_DTD_NODE)
+ 		{
+ 			xmlUnlinkNode(child);
+ 			xmlFreeNode(child);
+ 			dtd_found = true;
+ 		}
+ 	}
+ 	if (dtd_found)
+ 	{
+ 		pfree(*xmlstr);
+ 		xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 0);
+ 		if (strncmp((char *)xmlbuff,"<?xml",5) == 0)
+ 			skip_xmldecl = strstr((char *)xmlbuff,"?>\n") + 3;
+ 		else
+ 			skip_xmldecl = (char *) xmlbuff;
+ 		*xmlstr = pstrdup(skip_xmldecl);
+ 		xmlFree(xmlbuff);
+ 		
+ 	}
+ 	xmlFreeDoc(doc);
  
+ }
+ #endif
  
  /*
   * TODO: xmlconcat needs to merge the notations and unparsed entities
***************
*** 460,465 ****
--- 502,509 ----
  		else if (xmlStrcmp(version, global_version) != 0)
  			global_version_no_value = true;
  
+ 		strip_dtd(&str);
+ 
  		appendStringInfoString(&buf, str + len);
  		pfree(str);
  	}
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to