Re: default result formats setting - Mailing list pgsql-hackers
From | Tom Lane |
---|---|
Subject | Re: default result formats setting |
Date | |
Msg-id | 1100110.1616601675@sss.pgh.pa.us Whole thread Raw |
In response to | Re: default result formats setting (Robert Haas <robertmhaas@gmail.com>) |
Responses |
Re: default result formats setting
|
List | pgsql-hackers |
Robert Haas <robertmhaas@gmail.com> writes: > On Wed, Mar 24, 2021 at 10:58 AM Tom Lane <tgl@sss.pgh.pa.us> wrote: >> A client that is sending -1 and assuming that it will get back >> a particular format could get broken if the GUC doesn't have the >> value it thinks, true. But I'd argue that such code is unreasonably >> non-robust. Can't we solve this by recommending that clients using >> this feature always double-check which format they actually got? >> ISTM that the use-cases for the feature involve checking what data >> type you got anyway, so that's not an unreasonable added requirement. > I suppose that's a fair idea, but to me it still feels a bit like a > round peg in the square hole. Suppose for example that there's a > client application which wants to talk to a connection pooler which in > turn wants to talk to the server. Let's also suppose that connection > pooler isn't just a pass-through, but wants to redirect client > connections to various servers or even intercept queries and result > sets and make changes as the data passes by. It can do that by parsing > SQL and solving the halting problem, whereas if this were a > protocol-level option it would be completely doable. Now you could say > "well, by that argument, DateStyle ought to be a protocol-level > option, too," and that's pretty a pretty fair criticism of what I'm > saying here. On the other hand, I'm not too sure that wouldn't have > been the right call. Using SQL to tailor the wire protocol format > feels like some kind of layering inversion to me. I can't say that I'm 100% comfortable with it either, but the alternative seems quite unpleasant, precisely because the client side might have multiple layers involved. If we make it a wire-protocol thing then a whole lot of client API thrashing is going to ensue to transmit the desired setting up and down the stack. As an example, libpq doesn't really give a darn which data format is returned: it is the application using libpq that would want to be able to set this option. If libpq has to be involved in transmitting the option to the backend, then we need a new libpq API call to tell it to do that. Rinse and repeat for anything that wraps libpq. And, in the end, it's not real clear which client-side layer *should* have control of this. In some cases you might want the decision to be taken quite high up, because which format is really more efficient will depend on the total usage picture for a given application, which low-level code like libpq wouldn't know. Having a library decide that "this buck stops with me" is likely to be the wrong thing. I do not understand the structure of the client stack for JDBC, but I wonder whether there won't be similar issues there. As you say, DateStyle and the like are precedents for things that *could* break application stacks, and in another universe maybe we'd have managed them differently. In the end though, they've been like that for a long time and we've not heard many complaints about them. So I'm inclined to think that that precedent says this is OK too. BTW, I thought briefly about whether we could try to lock things down a bit by marking the GUC as PGC_BACKEND, which would effectively mean that clients would have to send it in the startup packet. However, that would verge on making it unusable for non-built-in datatypes, for which you need to look up the OID first. So I don't think that'd be an improvement. > I think we should be > working toward a state where it's more clear which things are "owned" > at the wire protocol level and which things are "owned" at the SQL > level, and this seems to be going in exactly the opposite direction, I don't think I buy the premise that there are exactly two levels on the client side. regards, tom lane
pgsql-hackers by date: