On 01/20/25 14:56, Jim Jones wrote: > If I understand correctly, the compliant approach would be to always > treat the input expression as CONTENT: > > |PG_RETURN_XML_P(xmlparse((text *) data, XMLOPTION_DOCUMENT, true));| > > Is that right?"
Did you mean XMLOPTION_CONTENT? I think that would be right ... which, to be honest, leaves me in doubt that there is any substantive work at all for an XMLDOCUMENT constructor in PostgreSQL to do. Possibly that's why it wasn't provided originally. We don't have the XML(SEQUENCE) type, and our single XML type essentially corresponds to XML(CONTENT(ANY)). Any value that has already been accepted by the input function should already have the same serialized form you'd expect from XMLDOCUMENT. We don't have BY REF and passing XML node trees around, so there's really no way to notice that you've applied XMLDOCUMENT to wrap stuff in a 'document node' that isn't visible in the serialized form that is all we store. Likewise, I'm not thinking of any way to combine our other XML constructors / aggregates to produce a result that isn't already XML(CONTENT(ANY)). (If I could think of a way, I think it would mean those weren't well-specified.) Therefore I'm thinking that, given the specifics of our XML support, a fully conformant and efficient XMLDOCUMENT could be implemented just by returning its XML argument. That opens a question of whether it's worth the effort to supply it at all. Maybe it could reduce the surprise for people coming from another DBMS and finding it missing, and/or be a placeholder in case we ever implement enough more of the newer SQL/XML standard for it to have a real effect. (In a DBMS implementing the whole XML type hierarchy, you could have an XML(SEQUENCE) containing a single element node, which you might think you could easily cast to XML(CONTENT(ANY)) or even XML(DOCUMENT(ANY)), but the cast would raise 2200U or 2200L, respectively: the sequence would first need to be transformed into a sequence of a single document node wrapping the original sequence, which is exactly what you'd use XMLDOCUMENT to do. And of course you could put RETURNING CONTENT on that XMLDOCUMENT to accomplish the cast in the same step.) Regards, -Chap