[PATCH v5 2/3] Add core versions to pg_system_versions

Dmitry Dolgov <9erthalion6@gmail.com>

From: Dmitrii Dolgov <9erthalion6@gmail.com>
To:
Date: 2025-11-16T16:30:59Z
Lists: pgsql-hackers
Populate pg_system_versions with a set of core versions: host system
architecture, ICU version, glibc version, PostgreSQL itself and compiler
which was used to build everything. Register the core versions at the
backend startup.

    select * from pg_system_versions;
       name   |   version    |     type
    ----------+--------------+--------------
     Arch     | x86_64-linux | Compile Time
     ICU      | 15.1         | Run Time
     Core     | 18devel      | Compile Time
     Compiler | gcc-14.0.1   | Compile Time
     Glibc    | 2.40         | Run Time
---
 configure                               | 12 ++++
 configure.ac                            |  4 ++
 meson.build                             |  4 ++
 src/backend/tcop/postgres.c             | 12 ++++
 src/backend/utils/misc/system_version.c | 74 +++++++++++++++++++++++++
 src/include/pg_config.h.in              |  4 ++
 src/include/utils/system_version.h      |  1 +
 src/test/regress/expected/sysviews.out  | 10 ++++
 src/test/regress/sql/sysviews.sql       |  6 ++
 9 files changed, 127 insertions(+)

diff --git a/configure b/configure
index 3a0ed11fa8e..f7d5f695679 100755
--- a/configure
+++ b/configure
@@ -19293,6 +19293,18 @@ else
 fi
 
 
+cat >>confdefs.h <<_ACEOF
+#define PG_CC_STR "$cc_string"
+_ACEOF
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define PG_ARCH_STR "$host"
+_ACEOF
+
+
+
 cat >>confdefs.h <<_ACEOF
 #define PG_VERSION_STR "PostgreSQL $PG_VERSION on $host, compiled by $cc_string, `expr $ac_cv_sizeof_void_p \* 8`-bit"
 _ACEOF
diff --git a/configure.ac b/configure.ac
index c2413720a18..9f7f7f75535 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2448,6 +2448,10 @@ else
   cc_string=$CC
 fi
 
+AC_DEFINE_UNQUOTED(PG_CC_STR, ["$cc_string"], [C compiler version])
+
+AC_DEFINE_UNQUOTED(PG_ARCH_STR, ["$host"], [Platform])
+
 AC_DEFINE_UNQUOTED(PG_VERSION_STR,
                    ["PostgreSQL $PG_VERSION on $host, compiled by $cc_string, `expr $ac_cv_sizeof_void_p \* 8`-bit"],
                    [A string containing the version number, platform, and C compiler])
diff --git a/meson.build b/meson.build
index c1e17aa3040..2265eaafb48 100644
--- a/meson.build
+++ b/meson.build
@@ -2972,6 +2972,10 @@ cdata.set('USE_@0@_SEMAPHORES'.format(sema_kind.to_upper()), 1)
 cdata.set('MEMSET_LOOP_LIMIT', memset_loop_limit)
 cdata.set_quoted('DLSUFFIX', dlsuffix)
 
+cdata.set_quoted('PG_CC_STR', '@0@-@1@'.format(cc.get_id(), cc.version()))
+
+cdata.set_quoted('PG_ARCH_STR', '@0@-@1@'.format(
+  host_machine.cpu_family(), host_system))
 
 # built later than the rest of the version metadata, we need SIZEOF_VOID_P
 cdata.set_quoted('PG_VERSION_STR',
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 7dd75a490aa..3a8ff419425 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -81,6 +81,7 @@
 #include "utils/timeout.h"
 #include "utils/timestamp.h"
 #include "utils/varlena.h"
+#include "utils/system_version.h"
 
 /* ----------------
  *		global variables
@@ -186,6 +187,7 @@ static void drop_unnamed_stmt(void);
 static void log_disconnections(int code, Datum arg);
 static void enable_statement_timeout(void);
 static void disable_statement_timeout(void);
+static void register_system_versions(void);
 
 
 /* ----------------------------------------------------------------
@@ -4318,6 +4320,9 @@ PostgresMain(const char *dbname, const char *username)
 	 */
 	BeginReportingGUCOptions();
 
+	/* Prepare information for reporting versions and libraries. */
+	register_system_versions();
+
 	/*
 	 * Also set up handler to log session end; we have to wait till now to be
 	 * sure Log_disconnections has its final value.
@@ -5237,3 +5242,10 @@ disable_statement_timeout(void)
 	if (get_timeout_active(STATEMENT_TIMEOUT))
 		disable_timeout(STATEMENT_TIMEOUT, false);
 }
+
+static void
+register_system_versions()
+{
+	/* Set up reporting of core versions. */
+	register_core_versions();
+}
diff --git a/src/backend/utils/misc/system_version.c b/src/backend/utils/misc/system_version.c
index 6f3445b0539..752546b8e7a 100644
--- a/src/backend/utils/misc/system_version.c
+++ b/src/backend/utils/misc/system_version.c
@@ -27,6 +27,10 @@
 
 #include <unicode/uchar.h>
 
+#ifdef __GLIBC__
+#include <gnu/libc-version.h>
+#endif
+
 #include "funcapi.h"
 #include "utils/builtins.h"
 #include "utils/system_version.h"
@@ -66,6 +70,76 @@ add_system_version(const char *name, SystemVersionCB cb, VersionType type)
 	hentry->type = type;
 }
 
+static const char *
+core_get_version(bool *available)
+{
+	*available = true;
+	return (const char *) psprintf("%s", PG_VERSION);
+}
+
+static const char *
+core_get_arch(bool *available)
+{
+	*available = true;
+	return (const char *) psprintf("%s", PG_ARCH_STR);
+}
+
+static const char *
+core_get_compiler(bool *available)
+{
+	*available = true;
+	return (const char *) psprintf("%s", PG_CC_STR);
+}
+
+static const char *
+icu_get_version(bool *available)
+{
+#ifdef USE_ICU
+	UVersionInfo UCDVersion;
+	char	   *version = palloc0(U_MAX_VERSION_STRING_LENGTH);
+
+	*available = true;
+	u_getUnicodeVersion(UCDVersion);
+	u_versionToString(UCDVersion, version);
+	return (const char *) version;
+#else
+	*available = false;
+	return (const char *) "";
+#endif
+}
+
+#ifdef __GLIBC__
+static const char *
+glibc_get_version(bool *available)
+{
+	*available = true;
+	return (const char *) gnu_get_libc_version();
+}
+#endif
+
+void
+jit_register_version(void)
+{
+	add_system_version("LLVM", jit_get_version, RunTime);
+}
+
+/*
+ * Register versions that describe core components and do not correspond to any
+ * individual component.
+ */
+void
+register_core_versions()
+{
+	add_system_version("Core", core_get_version, CompileTime);
+	add_system_version("Arch", core_get_arch, CompileTime);
+	add_system_version("Compiler", core_get_compiler, CompileTime);
+	add_system_version("ICU", icu_get_version, RunTime);
+
+#ifdef __GLIBC__
+	add_system_version("Glibc", glibc_get_version, RunTime);
+#endif
+}
+
 /*
  * pg_get_system_versions
  *
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index b0b0cfdaf79..dacf496ce71 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -621,6 +621,10 @@
 /* PostgreSQL version as a number */
 #undef PG_VERSION_NUM
 
+#undef PG_CC_STR
+
+#undef PG_ARCH_STR
+
 /* A string containing the version number, platform, and C compiler */
 #undef PG_VERSION_STR
 
diff --git a/src/include/utils/system_version.h b/src/include/utils/system_version.h
index 18cb673d4ca..49685b6809f 100644
--- a/src/include/utils/system_version.h
+++ b/src/include/utils/system_version.h
@@ -34,5 +34,6 @@ typedef struct SystemVersion
 } SystemVersion;
 
 void		add_system_version(const char *name, SystemVersionCB cb, VersionType type);
+extern void register_core_versions(void);
 
 #endif							/* SYSTEM_VERSION_H */
diff --git a/src/test/regress/expected/sysviews.out b/src/test/regress/expected/sysviews.out
index 3b37fafa65b..90c2fdeba2d 100644
--- a/src/test/regress/expected/sysviews.out
+++ b/src/test/regress/expected/sysviews.out
@@ -233,3 +233,13 @@ select * from pg_timezone_abbrevs where abbrev = 'LMT';
  LMT    | @ 7 hours 52 mins 58 secs ago | f
 (1 row)
 
+-- Check that the pg_system_versions contains something. Three core versions
+-- should be present: architecture, core and compiler and glibc. More records
+-- may be present depending on the build configuration (e.g. with ICU, GlibC or
+-- JIT support).
+select exists (table pg_system_versions);
+ exists 
+--------
+ t
+(1 row)
+
diff --git a/src/test/regress/sql/sysviews.sql b/src/test/regress/sql/sysviews.sql
index 66179f026b3..c6328ec3d57 100644
--- a/src/test/regress/sql/sysviews.sql
+++ b/src/test/regress/sql/sysviews.sql
@@ -101,3 +101,9 @@ select count(distinct utc_offset) >= 24 as ok from pg_timezone_abbrevs;
 -- One specific case we can check without much fear of breakage
 -- is the historical local-mean-time value used for America/Los_Angeles.
 select * from pg_timezone_abbrevs where abbrev = 'LMT';
+
+-- Check that the pg_system_versions contains something. Three core versions
+-- should be present: architecture, core and compiler and glibc. More records
+-- may be present depending on the build configuration (e.g. with ICU, GlibC or
+-- JIT support).
+select exists (table pg_system_versions);
-- 
2.49.0


--2huv3vfeb63qc7kf
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
	filename="v5-0003-Add-JIT-provider-version-to-pg_system_versions.patch"