Re: [HACKERS] Variable substitution in psql backtick expansion - Mailing list pgsql-hackers

From Tom Lane
Subject Re: [HACKERS] Variable substitution in psql backtick expansion
Date
Msg-id 2947.1504542679@sss.pgh.pa.us
Whole thread Raw
In response to Re: [HACKERS] Variable substitution in psql backtick expansion  (Fabien COELHO <coelho@cri.ensmp.fr>)
Responses Re: [HACKERS] Variable substitution in psql backtick expansion  (Tom Lane <tgl@sss.pgh.pa.us>)
Re: [HACKERS] Variable substitution in psql backtick expansion  (Pavel Stehule <pavel.stehule@gmail.com>)
Re: [HACKERS] Variable substitution in psql backtick expansion  ("Daniel Verite" <daniel@manitou-mail.org>)
Re: [HACKERS] Variable substitution in psql backtick expansion  (Fabien COELHO <coelho@cri.ensmp.fr>)
List pgsql-hackers
So I thought we were done bikeshedding the variable names for this
feature, but as I was reviewing the patch with intent to commit,
I noticed you hadn't updated helpVariables() to mention them.
Possibly you missed this because it doesn't mention VERSION either,
but that doesn't seem very defensible.

I inserted text to describe all five variables --- but
"SERVER_VERSION_NAME" is too long to fit in the available column space.
In the attached updated patch, I moved all the descriptive text over one
column, and really should have moved it over two columns; but adding even
one space makes a couple of the lines longer than 80 columns when they
were not before.  Since we've blown past 80 columns on some of the other
output, maybe that doesn't matter.  Or maybe we should shorten this
variable name so it doesn't force reformatting of all this text.

Possible ideas include "DB_VERSION_NAME", "SERVER_VER_NAME", or
"SERVER_VERSION_STR".  (The last saves only one character, whereas
we really need to save two if we're trying not to be wider than any
other documented variable.)

Thoughts?

Attached updated patch changes helpVariables() as we'd need to do if
not renaming, and does some minor doc/comment wordsmithing elsewhere.

            regards, tom lane

diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index c592eda..a693fb9 100644
*** a/doc/src/sgml/ref/psql-ref.sgml
--- b/doc/src/sgml/ref/psql-ref.sgml
*************** bar
*** 3688,3693 ****
--- 3688,3717 ----
        </varlistentry>

        <varlistentry>
+         <term><varname>SERVER_VERSION_NAME</varname></term>
+         <listitem>
+         <para>
+         The server's version number as a string, for
+         example <literal>9.6.2</>, <literal>10.1</>, or <literal>11beta1</>.
+         This is set every time you connect to a database (including
+         program start-up), but can be changed or unset.
+         </para>
+         </listitem>
+       </varlistentry>
+
+       <varlistentry>
+         <term><varname>SERVER_VERSION_NUM</varname></term>
+         <listitem>
+         <para>
+         The server's version number in numeric form, for
+         example <literal>90602</> or <literal>100001</>.
+         This is set every time you connect to a database (including
+         program start-up), but can be changed or unset.
+         </para>
+         </listitem>
+       </varlistentry>
+
+       <varlistentry>
          <term><varname>SINGLELINE</varname></term>
          <listitem>
          <para>
*************** bar
*** 3733,3742 ****

        <varlistentry>
          <term><varname>VERSION</varname></term>
          <listitem>
          <para>
!         This variable is set at program start-up to
!         reflect <application>psql</>'s version.  It can be changed or unset.
          </para>
          </listitem>
        </varlistentry>
--- 3757,3771 ----

        <varlistentry>
          <term><varname>VERSION</varname></term>
+         <term><varname>VERSION_NAME</varname></term>
+         <term><varname>VERSION_NUM</varname></term>
          <listitem>
          <para>
!         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 96f3a40..4283bf3 100644
*** a/src/bin/psql/command.c
--- b/src/bin/psql/command.c
*************** checkWin32Codepage(void)
*** 3337,3342 ****
--- 3337,3345 ----
  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;
*************** SyncVariables(void)
*** 3348,3353 ****
--- 3351,3370 ----
      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);
*************** UnsyncVariables(void)
*** 3366,3371 ****
--- 3383,3390 ----
      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 b3dbb59..ee612b0 100644
*** a/src/bin/psql/help.c
--- b/src/bin/psql/help.c
*************** helpVariables(unsigned short int pager)
*** 336,342 ****
       * 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);

      fprintf(output, _("List of specially treated variables\n\n"));

--- 336,342 ----
       * Windows builds currently print one more line than non-Windows builds.
       * Using the larger number is fine.
       */
!     output = PageOutput(93, pager ? &(pset.popt.topt) : NULL);

      fprintf(output, _("List of specially treated variables\n\n"));

*************** helpVariables(unsigned short int pager)
*** 344,378 ****
      fprintf(output, _("Usage:\n"));
      fprintf(output, _("  psql --set=NAME=VALUE\n  or \\set NAME VALUE inside psql\n\n"));

!     fprintf(output, _("  AUTOCOMMIT         if set, successful SQL commands are automatically committed\n"));
!     fprintf(output, _("  COMP_KEYWORD_CASE  determines the case used to complete SQL key words\n"
!                       "                     [lower, upper, preserve-lower, preserve-upper]\n"));
!     fprintf(output, _("  DBNAME             the currently connected database name\n"));
!     fprintf(output, _("  ECHO               controls what input is written to standard output\n"
!                       "                     [all, errors, none, queries]\n"));
!     fprintf(output, _("  ECHO_HIDDEN        if set, display internal queries executed by backslash commands;\n"
!                       "                     if set to \"noexec\", just show without execution\n"));
!     fprintf(output, _("  ENCODING           current client character set encoding\n"));
!     fprintf(output, _("  FETCH_COUNT        the number of result rows to fetch and display at a time\n"
!                       "                     (default: 0=unlimited)\n"));
!     fprintf(output, _("  HISTCONTROL        controls command history [ignorespace, ignoredups, ignoreboth]\n"));
!     fprintf(output, _("  HISTFILE           file name used to store the command history\n"));
!     fprintf(output, _("  HISTSIZE           max number of commands to store in the command history\n"));
!     fprintf(output, _("  HOST               the currently connected database server host\n"));
!     fprintf(output, _("  IGNOREEOF          number of EOFs needed to terminate an interactive session\n"));
!     fprintf(output, _("  LASTOID            value of the last affected OID\n"));
!     fprintf(output, _("  ON_ERROR_ROLLBACK  if set, an error doesn't stop a transaction (uses implicit
savepoints)\n"));
!     fprintf(output, _("  ON_ERROR_STOP      stop batch execution after error\n"));
!     fprintf(output, _("  PORT               server port of the current connection\n"));
!     fprintf(output, _("  PROMPT1            specifies the standard psql prompt\n"));
!     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, _("  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, _("\nDisplay settings:\n"));
      fprintf(output, _("Usage:\n"));
--- 344,383 ----
      fprintf(output, _("Usage:\n"));
      fprintf(output, _("  psql --set=NAME=VALUE\n  or \\set NAME VALUE inside psql\n\n"));

!     fprintf(output, _("  AUTOCOMMIT          if set, successful SQL commands are automatically committed\n"));
!     fprintf(output, _("  COMP_KEYWORD_CASE   determines the case used to complete SQL key words\n"
!                       "                      [lower, upper, preserve-lower, preserve-upper]\n"));
!     fprintf(output, _("  DBNAME              the currently connected database name\n"));
!     fprintf(output, _("  ECHO                controls what input is written to standard output\n"
!                       "                      [all, errors, none, queries]\n"));
!     fprintf(output, _("  ECHO_HIDDEN         if set, display internal queries executed by backslash commands;\n"
!                       "                      if set to \"noexec\", just show without execution\n"));
!     fprintf(output, _("  ENCODING            current client character set encoding\n"));
!     fprintf(output, _("  FETCH_COUNT         the number of result rows to fetch and display at a time\n"
!                       "                      (default: 0=unlimited)\n"));
!     fprintf(output, _("  HISTCONTROL         controls command history [ignorespace, ignoredups, ignoreboth]\n"));
!     fprintf(output, _("  HISTFILE            file name used to store the command history\n"));
!     fprintf(output, _("  HISTSIZE            max number of commands to store in the command history\n"));
!     fprintf(output, _("  HOST                the currently connected database server host\n"));
!     fprintf(output, _("  IGNOREEOF           number of EOFs needed to terminate an interactive session\n"));
!     fprintf(output, _("  LASTOID             value of the last affected OID\n"));
!     fprintf(output, _("  ON_ERROR_ROLLBACK   if set, an error doesn't stop a transaction (uses implicit
savepoints)\n"));
!     fprintf(output, _("  ON_ERROR_STOP       stop batch execution after error\n"));
!     fprintf(output, _("  PORT                server port of the current connection\n"));
!     fprintf(output, _("  PROMPT1             specifies the standard psql prompt\n"));
!     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)\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)\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 7f76797..1e48f4a 100644
*** a/src/bin/psql/startup.c
--- b/src/bin/psql/startup.c
*************** main(int argc, char *argv[])
*** 160,166 ****
--- 160,169 ----

      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");

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

pgsql-hackers by date:

Previous
From: Greg Stark
Date:
Subject: [HACKERS] CSV Logging questions
Next
From: David Fetter
Date:
Subject: Re: [HACKERS] CSV Logging questions