]> granicus.if.org Git - postgresql/commitdiff
Add psql variables showing server version and psql version.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 6 Sep 2017 15:35:31 +0000 (11:35 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 6 Sep 2017 15:35:31 +0000 (11:35 -0400)
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.

Back-patch of commit 9ae9d8c1549c384dbdb8363e1d932b7311d25c56.

Fabien Coelho, reviewed by Pavel Stehule

Discussion: https://postgr.es/m/alpine.DEB.2.20.1704020917220.4632@lancre

doc/src/sgml/ref/psql-ref.sgml
src/bin/psql/command.c
src/bin/psql/help.c
src/bin/psql/startup.c

index c592edac60a3e86801741dc84ebecc206b28350f..868de184184cff10dd31900f38bbadfc3ca5d9d8 100644 (file)
@@ -3670,6 +3670,21 @@ bar
         </listitem>
       </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>
@@ -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>
index 4e04459d45ea53a5104fe92814e37fe6cf00ffea..d427488748492815ed77b604fe7a5d99173ba9da 100644 (file)
@@ -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);
 }
 
 
index 57b826af1669a6ca710282a6e2a410e203f44948..c163d35df0447a7c760a702fdd32e03a8e4bb6c1 100644 (file)
@@ -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(88, pager ? &(pset.popt.topt) : NULL);
+       output = PageOutput(93, pager ? &(pset.popt.topt) : NULL);
 
        fprintf(output, _("List of specially treated variables\n\n"));
 
@@ -368,11 +368,16 @@ helpVariables(unsigned short int pager)
        fprintf(output, _("  PROMPT2            specifies the prompt used when a statement continues from a previous line\n"));
        fprintf(output, _("  PROMPT3            specifies the prompt used during COPY ... FROM STDIN\n"));
        fprintf(output, _("  QUIET              run quietly (same as -q option)\n"));
+       fprintf(output, _("  SERVER_VERSION_NAME  server's version (short string)\n"));
+       fprintf(output, _("  SERVER_VERSION_NUM   server's version (numeric format)\n"));
        fprintf(output, _("  SHOW_CONTEXT       controls display of message context fields [never, errors, always]\n"));
        fprintf(output, _("  SINGLELINE         end of line terminates SQL command mode (same as -S option)\n"));
        fprintf(output, _("  SINGLESTEP         single-step mode (same as -s option)\n"));
        fprintf(output, _("  USER               the currently connected database user\n"));
        fprintf(output, _("  VERBOSITY          controls verbosity of error reports [default, verbose, terse]\n"));
+       fprintf(output, _("  VERSION            psql's version (verbose string)\n"));
+       fprintf(output, _("  VERSION_NAME       psql's version (short string)\n"));
+       fprintf(output, _("  VERSION_NUM        psql's version (numeric format)\n"));
 
        fprintf(output, _("\nDisplay settings:\n"));
        fprintf(output, _("Usage:\n"));
index 7f767976a5b76805d10c58f74f12fe4e7d44b925..1e48f4ad5adeacd7f91a738cf96e5ad700659ea2 100644 (file)
@@ -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");