From cdb6b0fdb0b2face270406905d31f8f513b015cc Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Mon, 9 Sep 2024 11:54:55 -0400 Subject: [PATCH] Add PQfullProtocolVersion() to surface the precise protocol version. The existing function PQprotocolVersion() does not include the minor version of the protocol. In preparation for pending work that will bump that number for the first time, add a new function to provide it to clients that may care, using the (major * 10000 + minor) convention already used by PQserverVersion(). Jacob Champion based on earlier work by Jelte Fennema-Nio Discussion: http://postgr.es/m/CAOYmi+mM8+6Swt1k7XsLcichJv8xdhPnuNv7-02zJWsezuDL+g@mail.gmail.com --- doc/src/sgml/libpq.sgml | 40 ++++++++++++++++++++++++------- src/include/libpq/pqcomm.h | 1 + src/interfaces/libpq/fe-connect.c | 10 ++++++++ src/interfaces/libpq/libpq-fe.h | 5 ++++ 4 files changed, 47 insertions(+), 9 deletions(-) diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml index 25646f6f8e..783e8e750b 100644 --- a/doc/src/sgml/libpq.sgml +++ b/doc/src/sgml/libpq.sgml @@ -2678,22 +2678,44 @@ const char *PQparameterStatus(const PGconn *conn, const char *paramName); - - PQprotocolVersionPQprotocolVersion + + PQfullProtocolVersionPQfullProtocolVersion Interrogates the frontend/backend protocol being used. -int PQprotocolVersion(const PGconn *conn); +int PQfullProtocolVersion(const PGconn *conn); Applications might wish to use this function to determine whether certain - features are supported. Currently, the possible values are 3 - (3.0 protocol), or zero (connection bad). The protocol version will - not change after connection startup is complete, but it could - theoretically change during a connection reset. The 3.0 protocol is - supported by PostgreSQL server versions 7.4 - and above. + features are supported. The result is formed by multiplying the server's + major version number by 10000 and adding the minor version number. For + example, version 3.2 would be returned as 30002, and version 4.0 would + be returned as 40000. Zero is returned if the connection is bad. The 3.0 + protocol is supported by PostgreSQL server + versions 7.4 and above. + + + The protocol version will not change after connection startup is + complete, but it could theoretically change during a connection reset. + + + + + + PQprotocolVersionPQprotocolVersion + + + + Interrogates the frontend/backend protocol major version. + +int PQprotocolVersion(const PGconn *conn); + + Unlike , this returns only + the major protocol version in use, but it is supported by a wider range + of libpq releases back to version 7.4. Currently, the possible values are + 3 (3.0 protocol), or zero (connection bad). Prior to release version + 14.0, libpq could additionally return 2 (2.0 protocol). diff --git a/src/include/libpq/pqcomm.h b/src/include/libpq/pqcomm.h index 527735e3db..6925f10602 100644 --- a/src/include/libpq/pqcomm.h +++ b/src/include/libpq/pqcomm.h @@ -86,6 +86,7 @@ is_unixsock_path(const char *path) #define PG_PROTOCOL_MAJOR(v) ((v) >> 16) #define PG_PROTOCOL_MINOR(v) ((v) & 0x0000ffff) +#define PG_PROTOCOL_FULL(v) (PG_PROTOCOL_MAJOR(v) * 10000 + PG_PROTOCOL_MINOR(v)) #define PG_PROTOCOL(m,n) (((m) << 16) | (n)) /* diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 9febdaa288..d5a72587d2 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -7158,6 +7158,16 @@ PQprotocolVersion(const PGconn *conn) return PG_PROTOCOL_MAJOR(conn->pversion); } +int +PQfullProtocolVersion(const PGconn *conn) +{ + if (!conn) + return 0; + if (conn->status == CONNECTION_BAD) + return 0; + return PG_PROTOCOL_FULL(conn->pversion); +} + int PQserverVersion(const PGconn *conn) { diff --git a/src/interfaces/libpq/libpq-fe.h b/src/interfaces/libpq/libpq-fe.h index ca3e028a51..15012c770c 100644 --- a/src/interfaces/libpq/libpq-fe.h +++ b/src/interfaces/libpq/libpq-fe.h @@ -56,6 +56,10 @@ extern "C" /* Indicates presence of PQsocketPoll, PQgetCurrentTimeUSec */ #define LIBPQ_HAS_SOCKET_POLL 1 +/* Features added in PostgreSQL v18: */ +/* Indicates presence of PQfullProtocolVersion */ +#define LIBPQ_HAS_FULL_PROTOCOL_VERSION 1 + /* * Option flags for PQcopyResult */ @@ -393,6 +397,7 @@ extern PGTransactionStatusType PQtransactionStatus(const PGconn *conn); extern const char *PQparameterStatus(const PGconn *conn, const char *paramName); extern int PQprotocolVersion(const PGconn *conn); +extern int PQfullProtocolVersion(const PGconn *conn); extern int PQserverVersion(const PGconn *conn); extern char *PQerrorMessage(const PGconn *conn); extern int PQsocket(const PGconn *conn);