Re: fix of some issues with multi-line query editing - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: fix of some issues with multi-line query editing
Date
Msg-id 200603211338.k2LDcRF14008@candle.pha.pa.us
Whole thread Raw
In response to fix of some issues with multi-line query editing  ("Sergey E. Koposov" <math@sai.msu.ru>)
Responses Re: fix of some issues with multi-line query editing  (Alvaro Herrera <alvherre@commandprompt.com>)
List pgsql-patches
Sergey E. Koposov wrote:
> Fix of several issues:
>
> 1) Fix the problems with the \s command.
> When the saveHistory is executed by the \s command we must not do the
> conversion \n -> \x01  (per
> http://archives.postgresql.org/pgsql-hackers/2006-03/msg00317.php )
>
> 2) Fix the handling of Ctrl+C
>
> Now when you do
> wsdb=# select 'your long query here '
> wsdb-#
> and press afterwards the CtrlC the line "select 'your long query here '"
> will be in the history
>
> (partly per
> http://archives.postgresql.org/pgsql-hackers/2006-03/msg00297.php )
>
> 3) Fix the handling of commands with not closed brackets, quotes, double
> quotes. (now those commands are not splitted in parts...)
>
> 4) Fix the behaviour when SINGLELINE mode is used. (before it was almost
> broken ;(

Great.  Patch applied.  I had to adjust your patch around changes made
to put backslash commands embedded in queries to the top of the history.

Updated patch attached.

--
  Bruce Momjian   http://candle.pha.pa.us
  SRA OSS, Inc.   http://www.sraoss.com

  + If your life is a hard drive, Christ can be your backup. +
Index: src/bin/psql/command.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/psql/command.c,v
retrieving revision 1.164
diff -c -c -r1.164 command.c
*** src/bin/psql/command.c    5 Mar 2006 15:58:51 -0000    1.164
--- src/bin/psql/command.c    21 Mar 2006 12:50:34 -0000
***************
*** 753,759 ****

          expand_tilde(&fname);
          /* This scrolls off the screen when using /dev/tty */
!         success = saveHistory(fname ? fname : DEVTTY);
          if (success && !quiet && fname)
              printf(gettext("Wrote history to file \"%s/%s\".\n"),
                     pset.dirname ? pset.dirname : ".", fname);
--- 753,759 ----

          expand_tilde(&fname);
          /* This scrolls off the screen when using /dev/tty */
!         success = saveHistory(fname ? fname : DEVTTY, false);
          if (success && !quiet && fname)
              printf(gettext("Wrote history to file \"%s/%s\".\n"),
                     pset.dirname ? pset.dirname : ".", fname);
Index: src/bin/psql/input.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/psql/input.c,v
retrieving revision 1.52
diff -c -c -r1.52 input.c
*** src/bin/psql/input.c    6 Mar 2006 04:45:21 -0000    1.52
--- src/bin/psql/input.c    21 Mar 2006 12:50:34 -0000
***************
*** 148,153 ****
--- 148,157 ----
      {
          enum histcontrol HC;

+         /* Flushing of empty buffer should do nothing */
+         if  (*s == 0)
+             return;
+
          prev_hist = NULL;

          HC = GetHistControlConfig();
***************
*** 295,307 ****
  }


  bool
! saveHistory(char *fname)
  {
  #ifdef USE_READLINE
      if (useHistory && fname)
      {
!         encode_history();
          if (write_history(fname) == 0)
              return true;

--- 299,318 ----
  }


+ /* This function is designed for saving the readline history when user
+  * run \s command or when psql finishes.
+  * We have an argument named encodeFlag to handle those cases differently
+  * In that case of call via \s we don't really need to encode \n as \x01,
+  * but when we save history for Readline we must do that conversion
+  */
  bool
! saveHistory(char *fname, bool encodeFlag)
  {
  #ifdef USE_READLINE
      if (useHistory && fname)
      {
!         if (encodeFlag)
!             encode_history();
          if (write_history(fname) == 0)
              return true;

***************
*** 331,337 ****
          if (hist_size >= 0)
              stifle_history(hist_size);

!         saveHistory(psql_history);
          free(psql_history);
          psql_history = NULL;
      }
--- 342,348 ----
          if (hist_size >= 0)
              stifle_history(hist_size);

!         saveHistory(psql_history, true);
          free(psql_history);
          psql_history = NULL;
      }
Index: src/bin/psql/input.h
===================================================================
RCS file: /cvsroot/pgsql/src/bin/psql/input.h,v
retrieving revision 1.26
diff -c -c -r1.26 input.h
*** src/bin/psql/input.h    6 Mar 2006 04:45:21 -0000    1.26
--- src/bin/psql/input.h    21 Mar 2006 12:50:34 -0000
***************
*** 37,43 ****
  char       *gets_fromFile(FILE *source);

  void        initializeInput(int flags);
! bool        saveHistory(char *fname);

  void pg_append_history(char *s, PQExpBuffer history_buf);
  void pg_clear_history(PQExpBuffer history_buf);
--- 37,43 ----
  char       *gets_fromFile(FILE *source);

  void        initializeInput(int flags);
! bool        saveHistory(char *fname, bool encodeFlag);

  void pg_append_history(char *s, PQExpBuffer history_buf);
  void pg_clear_history(PQExpBuffer history_buf);
Index: src/bin/psql/mainloop.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/psql/mainloop.c,v
retrieving revision 1.73
diff -c -c -r1.73 mainloop.c
*** src/bin/psql/mainloop.c    6 Mar 2006 15:09:04 -0000    1.73
--- src/bin/psql/mainloop.c    21 Mar 2006 12:50:34 -0000
***************
*** 112,118 ****
              slashCmdStatus = PSQL_CMD_UNKNOWN;
              prompt_status = PROMPT_READY;
              if (pset.cur_cmd_interactive)
!                 pg_clear_history(history_buf);

              if (pset.cur_cmd_interactive)
                  putc('\n', stdout);
--- 112,118 ----
              slashCmdStatus = PSQL_CMD_UNKNOWN;
              prompt_status = PROMPT_READY;
              if (pset.cur_cmd_interactive)
!                 pg_write_history(history_buf->data);

              if (pset.cur_cmd_interactive)
                  putc('\n', stdout);
***************
*** 321,327 ****
                  break;
          }

!         if (pset.cur_cmd_interactive && prompt_status != PROMPT_CONTINUE)
          {
              /*
               *    Pass all the contents of history_buf to readline
--- 321,328 ----
                  break;
          }

!         if ((pset.cur_cmd_interactive && prompt_status == PROMPT_READY) ||
!             (GetVariableBool(pset.vars, "SINGLELINE") && prompt_status == PROMPT_CONTINUE))
          {
              /*
               *    Pass all the contents of history_buf to readline

pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: FW: Win32 unicode vs ICU
Next
From: Bruce Momjian
Date:
Subject: Re: Improve psql's handling of multi-line queries