aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/src/sgml/libpq.sgml38
-rw-r--r--src/include/libpq/pqcomm.h1
-rw-r--r--src/interfaces/libpq/fe-connect.c10
-rw-r--r--src/interfaces/libpq/libpq-fe.h5
4 files changed, 46 insertions, 8 deletions
diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml
index 25646f6f8e0..783e8e750bb 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);
</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>
diff --git a/src/include/libpq/pqcomm.h b/src/include/libpq/pqcomm.h
index 527735e3dba..6925f10602b 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 9febdaa2885..d5a72587d24 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -7159,6 +7159,16 @@ PQprotocolVersion(const PGconn *conn)
}
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)
{
if (!conn)
diff --git a/src/interfaces/libpq/libpq-fe.h b/src/interfaces/libpq/libpq-fe.h
index ca3e028a512..15012c770c4 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);