Tighten usage of PSQL_WATCH_PAGER.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 12 May 2023 20:11:14 +0000 (16:11 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 12 May 2023 20:11:14 +0000 (16:11 -0400)
Don't use PSQL_WATCH_PAGER when stdin/stdout are not a terminal.
This corresponds to the restrictions on when other commands will
use [PSQL_]PAGER.  There isn't a lot of sense in trying to use a
pager in non-interactive cases, and doing so allows an environment
setting to break our tests.

Also, ignore PSQL_WATCH_PAGER if it is set but empty or all-blank,
for the same reasons we ignore such settings of [PSQL_]PAGER (see
commit 18f8f784c).

No documentation change is really needed, since there is nothing
suggesting that these constraints on [PSQL_]PAGER didn't already
apply to PSQL_WATCH_PAGER too.  But I rearranged the text
a little to make it read more naturally (IMHO anyway).

Per report from Pavel Stehule.  Back-patch to v15 where
PSQL_WATCH_PAGER was introduced.

Discussion: https://postgr.es/m/CAFj8pRDTwFzmEWdA-gdAcUh0ZnxUioSfTMre71WyB_wNJy-8gw@mail.gmail.com

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

index dc422373d6ff4034954db714cd13734708447689..de760f99909d958d3b7605b1bf1d9cce0ced540a 100644 (file)
@@ -3120,8 +3120,21 @@ lo_import 152801
           <listitem>
           <para>
           Controls use of a pager program for query and <application>psql</application>
-          help output.  If the environment variable <envar>PSQL_PAGER</envar>
-          or <envar>PAGER</envar> is set, the output is piped to the
+          help output.
+          When the <literal>pager</literal> option is <literal>off</literal>, the pager
+          program is not used. When the <literal>pager</literal> option is
+          <literal>on</literal>, the pager is used when appropriate, i.e., when the
+          output is to a terminal and will not fit on the screen.
+          The <literal>pager</literal> option can also be set to <literal>always</literal>,
+          which causes the pager to be used for all terminal output regardless
+          of whether it fits on the screen.  <literal>\pset pager</literal>
+          without a <replaceable class="parameter">value</replaceable>
+          toggles pager use on and off.
+          </para>
+
+          <para>
+          If the environment variable <envar>PSQL_PAGER</envar>
+          or <envar>PAGER</envar> is set, output to be paged is piped to the
           specified program.  Otherwise a platform-dependent default program
           (such as <filename>more</filename>) is used.
           </para>
@@ -3135,18 +3148,6 @@ lo_import 152801
           <application>psql</application>'s output format (such as
           <filename>pspg --stream</filename>).
           </para>
-
-          <para>
-          When the <literal>pager</literal> option is <literal>off</literal>, the pager
-          program is not used. When the <literal>pager</literal> option is
-          <literal>on</literal>, the pager is used when appropriate, i.e., when the
-          output is to a terminal and will not fit on the screen.
-          The <literal>pager</literal> option can also be set to <literal>always</literal>,
-          which causes the pager to be used for all terminal output regardless
-          of whether it fits on the screen.  <literal>\pset pager</literal>
-          without a <replaceable class="parameter">value</replaceable>
-          toggles pager use on and off.
-          </para>
           </listitem>
           </varlistentry>
 
@@ -4898,7 +4899,7 @@ PSQL_EDITOR_LINENUMBER_ARG='--line '
       pager-related options of the <command>\pset</command> command.
       These variables are examined in the order listed;
       the first that is set is used.
-      If none of them is set, the default is to use <literal>more</literal> on most
+      If neither of them is set, the default is to use <literal>more</literal> on most
       platforms, but <literal>less</literal> on Cygwin.
      </para>
 
index 97f7d972202b6033384722071be27380605bdd0c..607a57715a32ba30a166f667523cf857177cdaa8 100644 (file)
@@ -5197,14 +5197,20 @@ do_watch(PQExpBuffer query_buf, double sleep, int iter)
 
    /*
     * For \watch, we ignore the size of the result and always use the pager
-    * if PSQL_WATCH_PAGER is set.  We also ignore the regular PSQL_PAGER or
-    * PAGER environment variables, because traditional pagers probably won't
-    * be very useful for showing a stream of results.
+    * as long as we're talking to a terminal and "\pset pager" is enabled.
+    * However, we'll only use the pager identified by PSQL_WATCH_PAGER.  We
+    * ignore the regular PSQL_PAGER or PAGER environment variables, because
+    * traditional pagers probably won't be very useful for showing a stream
+    * of results.
     */
 #ifndef WIN32
    pagerprog = getenv("PSQL_WATCH_PAGER");
+   /* if variable is empty or all-white-space, don't use pager */
+   if (pagerprog && strspn(pagerprog, " \t\r\n") == strlen(pagerprog))
+       pagerprog = NULL;
 #endif
-   if (pagerprog && myopt.topt.pager)
+   if (pagerprog && myopt.topt.pager &&
+       isatty(fileno(stdin)) && isatty(fileno(stdout)))
    {
        fflush(NULL);
        disable_sigpipe_trap();