Re: Re [HACKERS]: Still not happy with psql's multiline history behavior - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: Re [HACKERS]: Still not happy with psql's multiline history behavior
Date
Msg-id 200606050355.k553tTW19099@candle.pha.pa.us
Whole thread Raw
In response to Re: Re [HACKERS]: Still not happy with psql's multiline history  ("Sergey E. Koposov" <math@sai.msu.ru>)
List pgsql-patches
Sergey E. Koposov wrote:
> On Sun, 4 Jun 2006, Bruce Momjian wrote:
>
> > Sergey E. Koposov wrote:
> >> Hello,
> >>
> >> I'm sending the patch fixing the \r bug:
> >
> > Funny, I just applied a simpler fix for the \r bug.  Please review it.
> > Thanks.
> >
>
> It is simpler, because it behaves differently.
> Your patch for the case:
> wsdb=# select
> wsdb-# \r
> Query buffer reset (cleared).
>
> puts in the history two elements ("\r" and "select")
>
> Mine puts only "\r", just because
> <quote>  \r             reset (clear) the query buffer</quote>
> and I think that's reasonable, but I don't insist...

I think I like the fact there two separate entries, so we are OK.

> > I am confused by the \e bug.  I just tried 8.1.X and it seems to behave
> > the same as CVS HEAD.  What exactly should it do?
> >
>
> It is not actually a bug, I think it's a Tom's habit.
> In 8.1.x if  you type for example  in the editor "select 1+" and exit from
> it, the "select 1+" string will be already in the history. But in CVS HEAD
> it will be saved internally, but it won't be shown in the history until the
> user finishes the command with ';'. And there is really no need for
> correcting that, I think.

Thanks, that was clear.  The attached patch fixes it.  It is a little
larger than usual because I changed the name of the boolean and reversed
its usage.  It now works like it did in 8.1.X.

--
  Bruce Momjian   http://candle.pha.pa.us
  EnterpriseDB    http://www.enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +
Index: src/bin/psql/mainloop.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/psql/mainloop.c,v
retrieving revision 1.75
diff -c -c -r1.75 mainloop.c
*** src/bin/psql/mainloop.c    4 Jun 2006 04:35:55 -0000    1.75
--- src/bin/psql/mainloop.c    5 Jun 2006 03:50:11 -0000
***************
*** 41,47 ****
      char       *line;            /* current line of input */
      int            added_nl_pos;
      bool        success;
!     bool        first_query_scan;

      volatile int successResult = EXIT_SUCCESS;
      volatile backslashResult slashCmdStatus = PSQL_CMD_UNKNOWN;
--- 41,47 ----
      char       *line;            /* current line of input */
      int            added_nl_pos;
      bool        success;
!     bool        line_saved_in_history;

      volatile int successResult = EXIT_SUCCESS;
      volatile backslashResult slashCmdStatus = PSQL_CMD_UNKNOWN;
***************
*** 80,85 ****
--- 80,87 ----
      /* main loop to get queries and execute them */
      while (successResult == EXIT_SUCCESS)
      {
+         line_saved_in_history = false;
+
          /*
           * Welcome code for Control-C
           */
***************
*** 154,159 ****
--- 156,163 ----
                   */
                  pg_write_history(history_buf->data);
                  pg_clear_history(history_buf);
+                 pg_write_history(line);
+                 line_saved_in_history = true;
              }
          }
          /* otherwise, get another line */
***************
*** 226,232 ****
           */
          psql_scan_setup(scan_state, line, strlen(line));
          success = true;
-         first_query_scan = true;

          while (success || !die_on_error)
          {
--- 230,235 ----
***************
*** 303,319 ****
               *    down here so we can check for \g and other 'execute'
               *    backslash commands, which should be appended.
               */
!             if (first_query_scan && pset.cur_cmd_interactive)
              {
                  /* Sending a command (PSQL_CMD_SEND) zeros the length */
                  if (scan_result == PSCAN_BACKSLASH && history_buf->len != 0)
                      pg_write_history(line);
                  else
                      pg_append_history(line, history_buf);
              }

-             first_query_scan = false;
-
              /* fall out of loop on \q or if lexer reached EOL */
              if (slashCmdStatus == PSQL_CMD_TERMINATE ||
                  scan_result == PSCAN_INCOMPLETE ||
--- 306,321 ----
               *    down here so we can check for \g and other 'execute'
               *    backslash commands, which should be appended.
               */
!             if (!line_saved_in_history && pset.cur_cmd_interactive)
              {
                  /* Sending a command (PSQL_CMD_SEND) zeros the length */
                  if (scan_result == PSCAN_BACKSLASH && history_buf->len != 0)
                      pg_write_history(line);
                  else
                      pg_append_history(line, history_buf);
+                 line_saved_in_history = true;
              }

              /* fall out of loop on \q or if lexer reached EOL */
              if (slashCmdStatus == PSQL_CMD_TERMINATE ||
                  scan_result == PSCAN_INCOMPLETE ||

pgsql-patches by date:

Previous
From: "Sergey E. Koposov"
Date:
Subject: Re [HACKERS]: Still not happy with psql's multiline history behavior
Next
From: Bruce Momjian
Date:
Subject: Re: Re [HACKERS]: Still not happy with psql's multiline history behavior