Commit 9ae9d8c1 authored by Tom Lane's avatar Tom Lane

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
parent 3955c8c4
...@@ -3670,6 +3670,21 @@ bar ...@@ -3670,6 +3670,21 @@ bar
</listitem> </listitem>
</varlistentry> </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> <varlistentry>
<term><varname>SHOW_CONTEXT</varname></term> <term><varname>SHOW_CONTEXT</varname></term>
<listitem> <listitem>
...@@ -3733,10 +3748,15 @@ bar ...@@ -3733,10 +3748,15 @@ bar
<varlistentry> <varlistentry>
<term><varname>VERSION</varname></term> <term><varname>VERSION</varname></term>
<term><varname>VERSION_NAME</varname></term>
<term><varname>VERSION_NUM</varname></term>
<listitem> <listitem>
<para> <para>
This variable is set at program start-up to These variables are set at program start-up to reflect
reflect <application>psql</>'s version. It can be changed or unset. <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> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
......
...@@ -3337,6 +3337,9 @@ checkWin32Codepage(void) ...@@ -3337,6 +3337,9 @@ checkWin32Codepage(void)
void void
SyncVariables(void) SyncVariables(void)
{ {
char vbuf[32];
const char *server_version;
/* get stuff from connection */ /* get stuff from connection */
pset.encoding = PQclientEncoding(pset.db); pset.encoding = PQclientEncoding(pset.db);
pset.popt.topt.encoding = pset.encoding; pset.popt.topt.encoding = pset.encoding;
...@@ -3348,6 +3351,20 @@ SyncVariables(void) ...@@ -3348,6 +3351,20 @@ SyncVariables(void)
SetVariable(pset.vars, "PORT", PQport(pset.db)); SetVariable(pset.vars, "PORT", PQport(pset.db));
SetVariable(pset.vars, "ENCODING", pg_encoding_to_char(pset.encoding)); 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 */ /* send stuff to it, too */
PQsetErrorVerbosity(pset.db, pset.verbosity); PQsetErrorVerbosity(pset.db, pset.verbosity);
PQsetErrorContextVisibility(pset.db, pset.show_context); PQsetErrorContextVisibility(pset.db, pset.show_context);
...@@ -3366,6 +3383,8 @@ UnsyncVariables(void) ...@@ -3366,6 +3383,8 @@ UnsyncVariables(void)
SetVariable(pset.vars, "HOST", NULL); SetVariable(pset.vars, "HOST", NULL);
SetVariable(pset.vars, "PORT", NULL); SetVariable(pset.vars, "PORT", NULL);
SetVariable(pset.vars, "ENCODING", NULL); SetVariable(pset.vars, "ENCODING", NULL);
SetVariable(pset.vars, "SERVER_VERSION_NAME", NULL);
SetVariable(pset.vars, "SERVER_VERSION_NUM", NULL);
} }
......
...@@ -336,7 +336,7 @@ helpVariables(unsigned short int pager) ...@@ -336,7 +336,7 @@ helpVariables(unsigned short int pager)
* Windows builds currently print one more line than non-Windows builds. * Windows builds currently print one more line than non-Windows builds.
* Using the larger number is fine. * 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")); fprintf(output, _("List of specially treated variables\n\n"));
...@@ -387,6 +387,9 @@ helpVariables(unsigned short int pager) ...@@ -387,6 +387,9 @@ helpVariables(unsigned short int pager)
" specifies the prompt used during COPY ... FROM STDIN\n")); " specifies the prompt used during COPY ... FROM STDIN\n"));
fprintf(output, _(" QUIET\n" fprintf(output, _(" QUIET\n"
" run quietly (same as -q option)\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" fprintf(output, _(" SHOW_CONTEXT\n"
" controls display of message context fields [never, errors, always]\n")); " controls display of message context fields [never, errors, always]\n"));
fprintf(output, _(" SINGLELINE\n" fprintf(output, _(" SINGLELINE\n"
...@@ -397,6 +400,10 @@ helpVariables(unsigned short int pager) ...@@ -397,6 +400,10 @@ helpVariables(unsigned short int pager)
" the currently connected database user\n")); " the currently connected database user\n"));
fprintf(output, _(" VERBOSITY\n" fprintf(output, _(" VERBOSITY\n"
" controls verbosity of error reports [default, verbose, terse]\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, _("\nDisplay settings:\n"));
fprintf(output, _("Usage:\n")); fprintf(output, _("Usage:\n"));
......
...@@ -160,7 +160,10 @@ main(int argc, char *argv[]) ...@@ -160,7 +160,10 @@ main(int argc, char *argv[])
EstablishVariableSpace(); EstablishVariableSpace();
/* Create variables showing psql version number */
SetVariable(pset.vars, "VERSION", PG_VERSION_STR); 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) */ /* Default values for variables (that don't match the result of \unset) */
SetVariableBool(pset.vars, "AUTOCOMMIT"); SetVariableBool(pset.vars, "AUTOCOMMIT");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment