From f7521bf721d169c4a91e765edb52cf4d05a39c16 Mon Sep 17 00:00:00 2001 From: Jacob Champion Date: Fri, 23 Jan 2026 12:57:15 -0800 Subject: [PATCH] pqcomm.h: Explicitly reserve protocol v3.1 Document this unused version alongside the other special protocol numbers. Reviewed-by: Jelte Fennema-Nio Reviewed-by: Tom Lane Discussion: https://postgr.es/m/CAOYmi%2BkKyw%3Dh-5NKqqpc7HC5M30_QmzFx3kgq2AdipyNj47nUw%40mail.gmail.com --- src/include/libpq/pqcomm.h | 6 ++++++ src/interfaces/libpq/fe-protocol3.c | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/include/libpq/pqcomm.h b/src/include/libpq/pqcomm.h index 6df6e0f902d..1bbe5b9ee45 100644 --- a/src/include/libpq/pqcomm.h +++ b/src/include/libpq/pqcomm.h @@ -98,6 +98,12 @@ is_unixsock_path(const char *path) * Reserved protocol numbers, which have special semantics: */ +/* + * 3.1 would have collided with old pgbouncer deployments, and was skipped. We + * neither emit it nor accept it on the wire. + */ +#define PG_PROTOCOL_RESERVED_31 PG_PROTOCOL(3,1) + /* * A client can send a cancel-current-operation request to the postmaster. * This is uglier than sending it directly to the client's backend, but it diff --git a/src/interfaces/libpq/fe-protocol3.c b/src/interfaces/libpq/fe-protocol3.c index 34518bbe6ea..103428033ef 100644 --- a/src/interfaces/libpq/fe-protocol3.c +++ b/src/interfaces/libpq/fe-protocol3.c @@ -1465,7 +1465,7 @@ pqGetNegotiateProtocolVersion3(PGconn *conn) } /* 3.1 never existed, we went straight from 3.0 to 3.2 */ - if (their_version == PG_PROTOCOL(3, 1)) + if (their_version == PG_PROTOCOL_RESERVED_31) { libpq_append_conn_error(conn, "received invalid protocol negotiation message: server requested downgrade to non-existent 3.1 protocol version"); goto failure;