I think intuitively, this facility ought to work like client_encoding. There, the client declares its capabilities, and the server has to format the output according to the client's capabilities. That works, and it also works through connection poolers. (It is a GUC.) If we can model it like that as closely as possible, then we have a chance of getting it working reliably. Notably, the value space for client_encoding is a globally known fixed list of strings. We need to figure out what is the right way to globally identify types, like either by fully-qualified name, by base name, some combination, how does it work with extensions, or do we need a new mechanism like UUIDs. I think that is something we need to work out, no matter which protocol mechanism we end up using.
Fantastic write up.
> globally known fixed list of strings
Are you suggesting that we would have a client/server negotiation such as, 'jdbc<version>', 'all', etc where that would identify which types are done which way? If you did that, why would we need to promote names/uuid to permanent global space?