From a9389a8755379d4df2c52eb760d355aa5cf0ff96 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Tue, 7 Jun 2022 14:18:51 +1200 Subject: [PATCH v2] Fix \watch's interaction with libedit/libreadline. When you hit ^C, the terminal driver in Unix-like systems echos "^C" as well as sending an interrupt signal (depending on stty settings). The line editing library (libedit/libreadline) is then confused about the current cursor location, and might corrupt the display. Fix, by moving to a new line before the next prompt is displayed. Author: Pavel Stehule Reported-by: Tom Lane Discussion: https://postgr.es/m/3278793.1626198638%40sss.pgh.pa.us --- src/bin/psql/command.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index b51d28780b..7f366c80e9 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -5169,6 +5169,18 @@ do_watch(PQExpBuffer query_buf, double sleep) pclose(pagerpipe); restore_sigpipe_trap(); } + else + { + /* + * If the terminal driver echoed "^C", libedit/libreadline might be + * confused about the cursor position. Therefore, inject a newline + * before the next prompt is displayed. We only do this when not using + * a pager, because pagers are expected to restore the screen to a sane + * state on exit. + */ + fprintf(stdout, "\n"); + fflush(stdout); + } #ifdef HAVE_POSIX_DECL_SIGWAIT /* Disable the interval timer. */ -- 2.35.1