Add PQfullProtocolVersion() to surface the precise protocol version.
authorRobert Haas <[email protected]>
Mon, 9 Sep 2024 15:54:55 +0000 (11:54 -0400)
committerRobert Haas <[email protected]>
Mon, 9 Sep 2024 15:54:55 +0000 (11:54 -0400)
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
src/include/libpq/pqcomm.h
src/interfaces/libpq/fe-connect.c
src/interfaces/libpq/libpq-fe.h

index 25646f6f8e0d6401fa7ac2b7fdb0aef46101512e..783e8e750bb7ff5103421a4d14b63ff4c68457e9 100644 (file)
@@ -2678,22 +2678,44 @@ const char *PQparameterStatus(const PGconn *conn, const char *paramName);
      </listitem>
     </varlistentry>
 
+    <varlistentry id="libpq-PQfullProtocolVersion">
+     <term><function>PQfullProtocolVersion</function><indexterm><primary>PQfullProtocolVersion</primary></indexterm></term>
+
+     <listitem>
+      <para>
+       Interrogates the frontend/backend protocol being used.
+<synopsis>
+int PQfullProtocolVersion(const PGconn *conn);
+</synopsis>
+       Applications might wish to use this function to determine whether certain
+       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 <productname>PostgreSQL</productname> server
+       versions 7.4 and above.
+      </para>
+      <para>
+       The protocol version will not change after connection startup is
+       complete, but it could theoretically change during a connection reset.
+      </para>
+     </listitem>
+    </varlistentry>
+
     <varlistentry id="libpq-PQprotocolVersion">
      <term><function>PQprotocolVersion</function><indexterm><primary>PQprotocolVersion</primary></indexterm></term>
 
      <listitem>
       <para>
-       Interrogates the frontend/backend protocol being used.
+       Interrogates the frontend/backend protocol major version.
 <synopsis>
 int PQprotocolVersion(const PGconn *conn);
 </synopsis>
-       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 <productname>PostgreSQL</productname> server versions 7.4
-       and above.
+       Unlike <xref linkend="libpq-PQfullProtocolVersion"/>, 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).
       </para>
      </listitem>
     </varlistentry>
index 527735e3dba7a6d66417806d3aeb31f7827ceb12..6925f10602b67ff41238e984a161b1f7fc0dc859 100644 (file)
@@ -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))
 
 /*
index 9febdaa2885a73766451951bac588c35a98dc426..d5a72587d24e62f9d359daaec6c10dbeab8fba55 100644 (file)
@@ -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)
 {
index ca3e028a512d032ffb3c85703bfa444853b1e32b..15012c770c4a6a146f71383fb6ea4944c46758ba 100644 (file)
@@ -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);