Thread

  1. Re: Proposal to allow setting cursor options on Portals

    Jelte Fennema-Nio <postgres@jeltef.nl> — 2025-12-10T23:01:15Z

    On Wed, 10 Dec 2025 at 18:41, Jacob Champion
    <jacob.champion@enterprisedb.com> wrote:
    > I think it'd be helpful for proposals to describe why a minor version
    > bump was chosen over a protocol extension parameter (or vice versa),
    > so that we can begin to develop some consensus.
    
    Agreed.
    
    > With the
    > minor-version strategy, if we added new bits in 3.6, clients who just
    > wanted those new bits would then have to implement support for every
    > feature in versions 3.4, 3.5, and 3.6 just to improve that one use
    > case, and that incentive mismatch leads to more ossification IMO.
    
    I think in this optional bitmap field case, there's no work for the
    client to "implement" it. It can simply request 3.3, but not send the
    bitmap field. Similarly for my proposed GoAway message, a client can
    simply ignore that message completely when it receives it.
    
    If we keep the features that are bundled with a protocol version bump
    of the kind where a client, either has to do nothing to implement it,
    or at worst has to ignore the contents of a new message/field. Then
    implementing support becomes so trivial for clients that I don't think
    it'd be a hurdle for client authors to implement support for 3.3, 3.4,
    3.5 and if they only wanted a feature from the 3.6 protocol.^1 I'll
    call these things "no-op implementations" from now on.
    
    > I've talked about it face-to-face with people, but to go on the public
    > record: I don't think this is a wise use of a minor version upgrade
    > strategy. I prefer protocol architectures that introduce separate
    > extensions first, then periodically bundle the critical and
    > highly-used extensions into a new minor version once they're sure that
    > _everyone_ should support those things.
    
    I think we disagree on this. I think the downside of using protocol
    extensions for everything is that we then end up with N*N different
    combinations of features in the wild that servers and clients need to
    deal with. We have to start to define what happens when features
    interact, but either of them is not enabled. With incrementing
    versions you don't have that problem, which results in simpler logic
    in the spec, servers and clients.
    
    Finally, because we don't have any protocol extensions yet. All
    clients still need to build infrastructure for them, including libpq.
    So I'd argue that if we make such "no-op implementation" features use
    protocol extensions, then it'd be more work for everyone.
    
    > I know that 3.2 didn't do that. My view of 3.2 is that it was a big
    > compromise to get some things unstuck, so overall I'm glad we have it
    > -- but now that we have it, I'd rather that 3.next be more
    > intentional.
    
    > Plus I think it's unwise to introduce a 3.3 before we're
    > confident that 3.2 can be widely deployed, and I'm trying to put
    > effort into the latter for 19, so that I'm not just sitting here
    > gatekeeping.
    
    I'm not sure what you mean with this. People use libpq18 and PG18, and
    I've heard no complaints about protocol problems. So I think it was a
    success. Do you mean widely deployed by default? Why exactly does that
    matter for 3.3? Anything that stands default deployment in the way for
    3.2, will continue to stand default deployment in the way for 3.3.
    
    Personally, if we flip the default in e.g. 5 years from now. I'd much
    rather have it be flipped to a very nice 3.6 protocol, than still only
    having the single new feature that was added in 3.2.
    
    > IETF has a bunch of related case studies [1,2,3] that might be useful
    > reading, even if we decide that their experience differs heavily from
    > ours.
    
    I gave them a skim and they seem like a good read (which I'll do
    later). But I'm not sure part of them you thought was actionable for
    the discussion about version bumps vs protocol extensions. (I did see
    useful stuff for the grease thread, but that seems better to discuss
    there)
    
    ^1: You and I only talked about clients above, but obviously there's
    also proxies and other servers that implement the protocol to
    consider. If a feature that is "no-op implementation" on the client is
    a complicated implementation on the proxy/server then maybe a protocol
    extension is indeed the better choice. I think for GoAway it's trivial
    to "no-op implement" too on the proxy/server. For this cursor option
    proposal it's less clear cut imo. Proxies can probably simply forward
    the message to the server, although maybe PgBouncer would want to
    throw an error when a client uses a hold cursor (but it also doesn't
    do that for SQL level hold cursors, so that seems like an optional
    enhancement). Other servers might not even support hold cursors, but
    then they could simply throw a clear error (like pgbouncer would do).
    If throwing an error is an acceptable server implementation, then I
    think a "no-op implementation" is again trivial.