From 21267b64771925c154a767b1f261b5501d7bb26f Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Sun, 10 Jul 2022 16:30:03 +1200 Subject: [PATCH] Fix \watch's interaction with libedit on ^C. When you hit ^C, the terminal driver in Unix-like systems echoes "^C" as well as sending an interrupt signal (depending on stty settings). At least libedit (but maybe also libreadline) is then confused about the current cursor location, and corrupts the display if you try to scroll back. Fix, by moving to a new line before the next prompt is displayed. Back-patch to all supported released. 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 c562c04afe..0955142215 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -5145,6 +5145,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. */