Hello.
I do some very regular testing on HEAD and my scripts need to know if
the catalog version has changed to determine if it needs to pg_restore
or if a basebackup is okay. In order to get it, I have to do this:
# Get the catalog version (there is no better way to do this)
tmp=$(mktemp --directory)
$bin/initdb --pgdata=$tmp
catversion=$($bin/pg_controldata $tmp | grep "Catalog version" \
| cut --delimiter=: --fields=2 | xargs)
rm --recursive --force $tmp
I find this less than attractive, especially since the catalog version
is a property of the binaries and not the data directory. Attached is a
patchset so that the above can become simply:
catversion=$($bin/pg_config --catversion)
and a second patch that adds a read-only guc to get at it on the SQL
level using SHOW catalog_version; or similar. I need that because I
also do a dump of pg_settings and I would like for it to appear there.
Please consider.
--
Vik Fearing
>From a06fd975ef14930bbef2dac3597272289d6b10eb Mon Sep 17 00:00:00 2001
From: Vik Fearing <[email protected]>
Date: Fri, 13 Nov 2020 11:55:58 +0100
Subject: [PATCH 1/2] Add catalog version to pg_config
---
doc/src/sgml/ref/pg_config-ref.sgml | 9 +++++++++
src/bin/pg_config/pg_config.c | 2 ++
src/common/config_info.c | 7 ++++++-
3 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/doc/src/sgml/ref/pg_config-ref.sgml b/doc/src/sgml/ref/pg_config-ref.sgml
index e177769188..826cd5bf07 100644
--- a/doc/src/sgml/ref/pg_config-ref.sgml
+++ b/doc/src/sgml/ref/pg_config-ref.sgml
@@ -268,6 +268,15 @@ PostgreSQL documentation
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><option>--catversion</option></term>
+ <listitem>
+ <para>
+ Print the version number of <productname>PostgreSQL</productname>'s catalog.
+ </para>
+ </listitem>
+ </varlistentry>
+
<varlistentry>
<term><option>--version</option></term>
<listitem>
diff --git a/src/bin/pg_config/pg_config.c b/src/bin/pg_config/pg_config.c
index c40bb3282e..ca048f6eff 100644
--- a/src/bin/pg_config/pg_config.c
+++ b/src/bin/pg_config/pg_config.c
@@ -64,6 +64,7 @@ static const InfoItem info_items[] = {
{"--ldflags_sl", "LDFLAGS_SL"},
{"--libs", "LIBS"},
{"--version", "VERSION"},
+ {"--catversion", "CATALOG_VERSION"},
{NULL, NULL}
};
@@ -99,6 +100,7 @@ help(void)
printf(_(" --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"));
printf(_(" --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"));
printf(_(" --libs show LIBS value used when PostgreSQL was built\n"));
+ printf(_(" --catversion show the PostgreSQL catalog version\n"));
printf(_(" --version show the PostgreSQL version\n"));
printf(_(" -?, --help show this help, then exit\n"));
printf(_("\nWith no arguments, all known items are shown.\n\n"));
diff --git a/src/common/config_info.c b/src/common/config_info.c
index e72e7292a0..30c3168890 100644
--- a/src/common/config_info.c
+++ b/src/common/config_info.c
@@ -20,6 +20,7 @@
#include "postgres_fe.h"
#endif
+#include "catalog/catversion.h"
#include "common/config_info.h"
@@ -38,7 +39,7 @@ get_configdata(const char *my_exec_path, size_t *configdata_len)
int i = 0;
/* Adjust this to match the number of items filled below */
- *configdata_len = 23;
+ *configdata_len = 24;
configdata = (ConfigData *) palloc(*configdata_len * sizeof(ConfigData));
configdata[i].name = pstrdup("BINDIR");
@@ -191,6 +192,10 @@ get_configdata(const char *my_exec_path, size_t *configdata_len)
#endif
i++;
+ configdata[i].name = pstrdup("CATALOG_VERSION");
+ configdata[i].setting = pstrdup(psprintf("%d", CATALOG_VERSION_NO));
+ i++;
+
configdata[i].name = pstrdup("VERSION");
configdata[i].setting = pstrdup("PostgreSQL " PG_VERSION);
i++;
--
2.25.1
>From 05d0bca68096dba522075fa76ff1af490a050107 Mon Sep 17 00:00:00 2001
From: Vik Fearing <[email protected]>
Date: Fri, 13 Nov 2020 11:56:03 +0100
Subject: [PATCH 2/2] Add catalog_version guc, accessible from SQL
---
doc/src/sgml/config.sgml | 14 ++++++++++++++
src/backend/utils/misc/check_guc | 2 +-
src/backend/utils/misc/guc.c | 14 ++++++++++++++
3 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index e81141e45c..0b877b531c 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -9725,6 +9725,20 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
</listitem>
</varlistentry>
+ <varlistentry id="guc-catalog-version" xreflabel="catalog_version">
+ <term><varname>catalog_version</varname> (<type>string</type>)
+ <indexterm>
+ <primary><varname>catalog_version</varname> configuration parameter</primary>
+ </indexterm>
+ </term>
+ <listitem>
+ <para>
+ Reports the catalog version of the server. It is determined by the
+ value of <literal>CATALOG_VERSION_NO</literal> when building the server.
+ </para>
+ </listitem>
+ </varlistentry>
+
<varlistentry id="guc-data-checksums" xreflabel="data_checksums">
<term><varname>data_checksums</varname> (<type>boolean</type>)
<indexterm>
diff --git a/src/backend/utils/misc/check_guc b/src/backend/utils/misc/check_guc
index b171ef0e4f..a45f7f1727 100755
--- a/src/backend/utils/misc/check_guc
+++ b/src/backend/utils/misc/check_guc
@@ -16,7 +16,7 @@
## if an option is valid but shows up in only one file (guc.c but not
## postgresql.conf.sample), it should be listed here so that it
## can be ignored
-INTENTIONALLY_NOT_INCLUDED="debug_deadlocks in_hot_standby \
+INTENTIONALLY_NOT_INCLUDED="catalog_version_num debug_deadlocks in_hot_standby \
is_superuser lc_collate lc_ctype lc_messages lc_monetary lc_numeric lc_time \
pre_auth_delay role seed server_encoding server_version server_version_num \
session_authorization trace_lock_oidmin trace_lock_table trace_locks trace_lwlocks \
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 00018abb7d..a619a17922 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -37,6 +37,7 @@
#include "access/twophase.h"
#include "access/xact.h"
#include "access/xlog_internal.h"
+#include "catalog/catversion.h"
#include "catalog/namespace.h"
#include "catalog/pg_authid.h"
#include "catalog/storage.h"
@@ -598,6 +599,7 @@ static char *locale_ctype;
static char *server_encoding_string;
static char *server_version_string;
static int server_version_num;
+static int catalog_version_no;
static char *timezone_string;
static char *log_timezone_string;
static char *timezone_abbreviations_string;
@@ -3367,6 +3369,18 @@ static struct config_int ConfigureNamesInt[] =
NULL, NULL, NULL
},
+ {
+ /* Can't be set in postgresql.conf */
+ {"catalog_version", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows the catalog version number."),
+ NULL,
+ GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &catalog_version_no,
+ CATALOG_VERSION_NO, CATALOG_VERSION_NO, CATALOG_VERSION_NO,
+ NULL, NULL, NULL
+ },
+
{
{"log_temp_files", PGC_SUSET, LOGGING_WHAT,
gettext_noop("Log the use of temporary files larger than this number of kilobytes."),
--
2.25.1