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
|
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: