1. to_xmlstr can be replaced with calls to xmlCharStrdup.
I checked this idea, and it doesn't look well - xmlCharStrdup created xml string in own memory - and it should be explicitly released with xmlFree(). In this case is more practical using PostgreSQL memory context - because this memory is released safely in exception. I can rename this function to more conventional pg_xmlCharStrndup. This function can be used more time in current code.
2. don't need xml_xmlnodetostr either -- just use xml_xmlnodetoxmltype (which returns text*) and extract the cstring from the varlena. It's a bit more wasteful in terms of cycles, but I don't think we care. If we do care, change the function so that it returns cstring, and have the callers that want text wrap it in cstring_to_text.
done - it is related to not too often use case, and possible slowdown is minimal
3. have a new perValueCxt memcxt in TableExprState, child of buildercxt, and switch to it just before GetValue() (reset it just before switching). Then, don't worry about leaks in GetValue. This way, the text* conversions et al don't matter.
done
After that I think we're going to need to get this working on top of Andres' changes. Which I'm afraid is going to be rather major surgery, but I haven't looked.
I am waiting on new commits in this area. This moment I have not idea what will be broken.