Handle empty or all-blank PAGER setting more sanely in psql.
authorTom Lane
Wed, 7 Dec 2016 17:19:56 +0000 (12:19 -0500)
committerTom Lane
Wed, 7 Dec 2016 17:19:56 +0000 (12:19 -0500)
If the PAGER environment variable is set but contains an empty string,
psql would pass it to "sh" which would silently exit, causing whatever
query output we were printing to vanish entirely.  This is quite
mystifying; it took a long time for us to figure out that this was the
cause of Joseph Brenner's trouble report.  Rather than allowing that
to happen, we should treat this as another way to specify "no pager".
(We could alternatively treat it as selecting the default pager, but
it seems more likely that the former is what the user meant to achieve
by setting PAGER this way.)

Nonempty, but all-white-space, PAGER values have the same behavior, and
it's pretty easy to test for that, so let's handle that case the same way.

Most other cases of faulty PAGER values will result in the shell printing
some kind of complaint to stderr, which should be enough to diagnose the
problem, so we don't need to work harder than this.  (Note that there's
been an intentional decision not to be very chatty about apparent failure
returns from the pager process, since that may happen if, eg, the user
quits the pager with control-C or some such.  I'd just as soon not start
splitting hairs about which exit codes might merit making our own report.)

libpq's old PQprint() function was already on board with ignoring empty
PAGER values, but for consistency, make it ignore all-white-space values
as well.

It's been like this a long time, so back-patch to all supported branches.

Discussion: https://postgr.es/m/CAFfgvXWLOE2novHzYjmQK8-J6TmHz42G8f3X0SORM44+stUGmw@mail.gmail.com

doc/src/sgml/ref/psql-ref.sgml
src/bin/psql/print.c
src/interfaces/libpq/fe-print.c

index e2096572c06cd341ef92df22d60f60ba643dbc53..2e642265df8474d38ed368282f3c46dede6b737f 100644 (file)
@@ -3463,8 +3463,9 @@ $endif
       If the query results do not fit on the screen, they are piped
       through this command.  Typical values are
       more or less.  The default
-      is platform-dependent.  The use of the pager can be disabled by
-      using the \pset command.
+      is platform-dependent.  Use of the pager can be disabled by setting
+      PAGER to empty, or by using pager-related options of
+      the \pset command.
      
     
    
index 655850bb2dcceb00fe0ffb1d0edd44de0d1bdef3..63514e342ebcca2761b3f6a6c38ddcbdc7d8b6c8 100644 (file)
@@ -2208,6 +2208,12 @@ PageOutput(int lines, unsigned short int pager)
            pagerprog = getenv("PAGER");
            if (!pagerprog)
                pagerprog = DEFAULT_PAGER;
+           else
+           {
+               /* if PAGER is empty or all-white-space, don't use pager */
+               if (strspn(pagerprog, " \t\r\n") == strlen(pagerprog))
+                   return stdout;
+           }
 #ifndef WIN32
            pqsignal(SIGPIPE, SIG_IGN);
 #endif
index 770f23b1e2383b48d651ab5074a72ffded54e27a..2a85087ab6111392f49b61ea95a3fc1a8fd1317d 100644 (file)
@@ -166,8 +166,9 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po)
            screen_size.ws_col = 80;
 #endif
            pagerenv = getenv("PAGER");
+           /* if PAGER is unset, empty or all-white-space, don't use pager */
            if (pagerenv != NULL &&
-               pagerenv[0] != '\0' &&
+               strspn(pagerenv, " \t\r\n") != strlen(pagerenv) &&
                !po->html3 &&
                ((po->expanded &&
                  nTups * (nFields + 1) >= screen_size.ws_row) ||