Re: [GENERAL] Select works only when connected from login postgres

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: [GENERAL] Select works only when connected from login postgres
Дата
Msg-id 30580.1481076429@sss.pgh.pa.us
обсуждение исходный текст
Ответы Re: [GENERAL] Select works only when connected from login postgres  ("Daniel Verite" <daniel@manitou-mail.org>)
Список pgsql-hackers
Joseph Brenner <doomvox@gmail.com> writes:
> Well, my take would be that if you've taken the trouble to set an
> empty string as the PAGER that means something, and it probably means
> you don't want any pager to be used.

Yeah, on reflection that argument seems pretty persuasive.  So I propose
the attached patch.

BTW, I realized while testing this that there's still one gap in our
understanding of what went wrong for you: cases like "SELECT 'hello'"
should not have tried to use the pager, because that would've produced
less than a screenful of data.  But that's irrelevant here, because it
can easily be shown that psql doesn't behave nicely if PAGER is set to
empty when it does try to use the pager.

            regards, tom lane

diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index 261652a..9915731 100644
*** a/doc/src/sgml/ref/psql-ref.sgml
--- b/doc/src/sgml/ref/psql-ref.sgml
*************** $endif
*** 3801,3808 ****
        If the query results do not fit on the screen, they are piped
        through this command.  Typical values are
        <literal>more</literal> or <literal>less</literal>.  The default
!       is platform-dependent.  The use of the pager can be disabled by
!       using the <command>\pset</command> command.
       </para>
      </listitem>
     </varlistentry>
--- 3801,3809 ----
        If the query results do not fit on the screen, they are piped
        through this command.  Typical values are
        <literal>more</literal> or <literal>less</literal>.  The default
!       is platform-dependent.  Use of the pager can be disabled by setting
!       <envar>PAGER</envar> to empty, or by using pager-related options of
!       the <command>\pset</command> command.
       </para>
      </listitem>
     </varlistentry>
diff --git a/src/fe_utils/print.c b/src/fe_utils/print.c
index 1ec74f1..5c5d285 100644
*** a/src/fe_utils/print.c
--- b/src/fe_utils/print.c
*************** PageOutput(int lines, const printTableOp
*** 2874,2879 ****
--- 2874,2885 ----
              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;
+             }
              disable_sigpipe_trap();
              pagerpipe = popen(pagerprog, "w");
              if (pagerpipe)
diff --git a/src/interfaces/libpq/fe-print.c b/src/interfaces/libpq/fe-print.c
index c33dc42..e596a51 100644
*** a/src/interfaces/libpq/fe-print.c
--- b/src/interfaces/libpq/fe-print.c
*************** PQprint(FILE *fout, const PGresult *res,
*** 166,173 ****
              screen_size.ws_col = 80;
  #endif
              pagerenv = getenv("PAGER");
              if (pagerenv != NULL &&
!                 pagerenv[0] != '\0' &&
                  !po->html3 &&
                  ((po->expanded &&
                    nTups * (nFields + 1) >= screen_size.ws_row) ||
--- 166,174 ----
              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 &&
!                 strspn(pagerenv, " \t\r\n") != strlen(pagerenv) &&
                  !po->html3 &&
                  ((po->expanded &&
                    nTups * (nFields + 1) >= screen_size.ws_row) ||

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Greg Stark
Дата:
Сообщение: Re: Separate connection handling from backends
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Separate connection handling from backends