On 03.09.25 17:04, Peter Eisentraut wrote:
Consider a third-party extension that does something like dblink or postgres_fdw.  It will compile against a server and also a libpq.  The server and the libpq might not be of the same major version.  (On Debian, only the latest libpq will be available.)  If you have for example server version 17 and libpq version 18, then you will get the pg_int64 typedef both from postgres_ext.h (from the PG17 server includes) and from libpq-fe.h (from PG18 libpq).  That is not allowed in C99, and even if it were, the underlying types of PG_INT64_TYPE (in PG17) and int64_t (in PG18) might be different (long int vs. long long int) and this would fail.

I think this could be fixed by moving the definition of pg_int64 back to postgres_ext.h.  Then extension builds would only get one definition, because of the header guards.  Depending on include order, they could get a different underlying type, but that's a smaller problem, since the type is supposed to be deprecated anyway.

Here is a patch that has been reported to fix the problem.
From c4e0c2e406adfa15c4f0916f18616ca44b2419ef Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Wed, 3 Sep 2025 17:45:18 +0200
Subject: [PATCH v0] Move pg_int64 back to postgres_ext.h

Fix for commit 3c86223c998.  Details TODO ...
---
 src/include/postgres_ext.h      | 3 +++
 src/interfaces/libpq/libpq-fe.h | 3 ---
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/include/postgres_ext.h b/src/include/postgres_ext.h
index bf45c50dcf3..c8eb26a3c2e 100644
--- a/src/include/postgres_ext.h
+++ b/src/include/postgres_ext.h
@@ -42,6 +42,9 @@ typedef unsigned int Oid;
 /* the above needs <stdlib.h> */
 
 
+/* deprecated name for int64_t */
+typedef int64_t pg_int64;
+
 /*
  * Identifiers of error message fields.  Kept here to keep common
  * between frontend and backend, and also to export them to libpq
diff --git a/src/interfaces/libpq/libpq-fe.h b/src/interfaces/libpq/libpq-fe.h
index af8004f952a..0852584edae 100644
--- a/src/interfaces/libpq/libpq-fe.h
+++ b/src/interfaces/libpq/libpq-fe.h
@@ -234,9 +234,6 @@ typedef struct pgNotify
        struct pgNotify *next;          /* list link */
 } PGnotify;
 
-/* deprecated name for int64_t */
-typedef int64_t pg_int64;
-
 /* pg_usec_time_t is like time_t, but with microsecond resolution */
 typedef int64_t pg_usec_time_t;
 
-- 
2.51.0

Reply via email to