aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2017-09-05 10:51:36 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2017-09-05 10:51:36 -0400
commit9ae9d8c1549c384dbdb8363e1d932b7311d25c56 (patch)
tree70c1db95a90a40a3e7e847675c61fd6b7a4bcb34
parent3955c8c4eda2fd8cb7616285c55d98861382bb3a (diff)
downloadpostgresql-9ae9d8c1549c384dbdb8363e1d932b7311d25c56.tar.gz
postgresql-9ae9d8c1549c384dbdb8363e1d932b7311d25c56.zip
Add psql variables showing server version and psql version.
We already had a psql variable VERSION that shows the verbose form of psql's own version. Add VERSION_NAME to show the short form (e.g., "11devel") and VERSION_NUM to show the numeric form (e.g., 110000). Also add SERVER_VERSION_NAME and SERVER_VERSION_NUM to show the short and numeric forms of the server's version. (We'd probably add SERVER_VERSION with the verbose string if it were readily available; but adding another network round trip to get it seems too expensive.) The numeric forms, in particular, are expected to be useful for scripting purposes, now that psql can do conditional tests. Fabien Coelho, reviewed by Pavel Stehule Discussion: https://postgr.es/m/alpine.DEB.2.20.1704020917220.4632@lancre
-rw-r--r--doc/src/sgml/ref/psql-ref.sgml24
-rw-r--r--src/bin/psql/command.c19
-rw-r--r--src/bin/psql/help.c9
-rw-r--r--src/bin/psql/startup.c3
4 files changed, 52 insertions, 3 deletions
diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index c592edac60a..868de184184 100644
--- a/doc/src/sgml/ref/psql-ref.sgml
+++ b/doc/src/sgml/ref/psql-ref.sgml
@@ -3671,6 +3671,21 @@ bar
</varlistentry>
<varlistentry>
+ <term><varname>SERVER_VERSION_NAME</varname></term>
+ <term><varname>SERVER_VERSION_NUM</varname></term>
+ <listitem>
+ <para>
+ The server's version number as a string, for
+ example <literal>9.6.2</>, <literal>10.1</> or <literal>11beta1</>,
+ and in numeric form, for
+ example <literal>90602</> or <literal>100001</>.
+ These are set every time you connect to a database
+ (including program start-up), but can be changed or unset.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><varname>SHOW_CONTEXT</varname></term>
<listitem>
<para>
@@ -3733,10 +3748,15 @@ bar
<varlistentry>
<term><varname>VERSION</varname></term>
+ <term><varname>VERSION_NAME</varname></term>
+ <term><varname>VERSION_NUM</varname></term>
<listitem>
<para>
- This variable is set at program start-up to
- reflect <application>psql</>'s version. It can be changed or unset.
+ These variables are set at program start-up to reflect
+ <application>psql</>'s version, respectively as a verbose string,
+ a short string (e.g., <literal>9.6.2</>, <literal>10.1</>,
+ or <literal>11beta1</>), and a number (e.g., <literal>90602</>
+ or <literal>100001</>). They can be changed or unset.
</para>
</listitem>
</varlistentry>
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index 96f3a402a40..4283bf35af4 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -3337,6 +3337,9 @@ checkWin32Codepage(void)
void
SyncVariables(void)
{
+ char vbuf[32];
+ const char *server_version;
+
/* get stuff from connection */
pset.encoding = PQclientEncoding(pset.db);
pset.popt.topt.encoding = pset.encoding;
@@ -3348,6 +3351,20 @@ SyncVariables(void)
SetVariable(pset.vars, "PORT", PQport(pset.db));
SetVariable(pset.vars, "ENCODING", pg_encoding_to_char(pset.encoding));
+ /* this bit should match connection_warnings(): */
+ /* Try to get full text form of version, might include "devel" etc */
+ server_version = PQparameterStatus(pset.db, "server_version");
+ /* Otherwise fall back on pset.sversion */
+ if (!server_version)
+ {
+ formatPGVersionNumber(pset.sversion, true, vbuf, sizeof(vbuf));
+ server_version = vbuf;
+ }
+ SetVariable(pset.vars, "SERVER_VERSION_NAME", server_version);
+
+ snprintf(vbuf, sizeof(vbuf), "%d", pset.sversion);
+ SetVariable(pset.vars, "SERVER_VERSION_NUM", vbuf);
+
/* send stuff to it, too */
PQsetErrorVerbosity(pset.db, pset.verbosity);
PQsetErrorContextVisibility(pset.db, pset.show_context);
@@ -3366,6 +3383,8 @@ UnsyncVariables(void)
SetVariable(pset.vars, "HOST", NULL);
SetVariable(pset.vars, "PORT", NULL);
SetVariable(pset.vars, "ENCODING", NULL);
+ SetVariable(pset.vars, "SERVER_VERSION_NAME", NULL);
+ SetVariable(pset.vars, "SERVER_VERSION_NUM", NULL);
}
diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c
index b8cc9d33b89..724cf8e761e 100644
--- a/src/bin/psql/help.c
+++ b/src/bin/psql/help.c
@@ -336,7 +336,7 @@ helpVariables(unsigned short int pager)
* Windows builds currently print one more line than non-Windows builds.
* Using the larger number is fine.
*/
- output = PageOutput(140, pager ? &(pset.popt.topt) : NULL);
+ output = PageOutput(147, pager ? &(pset.popt.topt) : NULL);
fprintf(output, _("List of specially treated variables\n\n"));
@@ -387,6 +387,9 @@ helpVariables(unsigned short int pager)
" specifies the prompt used during COPY ... FROM STDIN\n"));
fprintf(output, _(" QUIET\n"
" run quietly (same as -q option)\n"));
+ fprintf(output, _(" SERVER_VERSION_NAME\n"
+ " SERVER_VERSION_NUM\n"
+ " server's version (in short string or numeric format)\n"));
fprintf(output, _(" SHOW_CONTEXT\n"
" controls display of message context fields [never, errors, always]\n"));
fprintf(output, _(" SINGLELINE\n"
@@ -397,6 +400,10 @@ helpVariables(unsigned short int pager)
" the currently connected database user\n"));
fprintf(output, _(" VERBOSITY\n"
" controls verbosity of error reports [default, verbose, terse]\n"));
+ fprintf(output, _(" VERSION\n"
+ " VERSION_NAME\n"
+ " VERSION_NUM\n"
+ " psql's version (in verbose string, short string, or numeric format)\n"));
fprintf(output, _("\nDisplay settings:\n"));
fprintf(output, _("Usage:\n"));
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
index 7f767976a5b..1e48f4ad5ad 100644
--- a/src/bin/psql/startup.c
+++ b/src/bin/psql/startup.c
@@ -160,7 +160,10 @@ main(int argc, char *argv[])
EstablishVariableSpace();
+ /* Create variables showing psql version number */
SetVariable(pset.vars, "VERSION", PG_VERSION_STR);
+ SetVariable(pset.vars, "VERSION_NAME", PG_VERSION);
+ SetVariable(pset.vars, "VERSION_NUM", CppAsString2(PG_VERSION_NUM));
/* Default values for variables (that don't match the result of \unset) */
SetVariableBool(pset.vars, "AUTOCOMMIT");