aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Munro <tmunro@postgresql.org>2022-07-10 16:30:03 +1200
committerThomas Munro <tmunro@postgresql.org>2022-07-10 16:53:05 +1200
commit31b485f883a7db27319d4ea8a724151c21db7bb8 (patch)
treee6db8a73c90dff0b0f4316654446d4cd343e6202
parent6763b2525cdae1b1424d8df7fcf2c669325e34eb (diff)
downloadpostgresql-31b485f883a7db27319d4ea8a724151c21db7bb8.tar.gz
postgresql-31b485f883a7db27319d4ea8a724151c21db7bb8.zip
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 <pavel.stehule@gmail.com> Reported-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/3278793.1626198638%40sss.pgh.pa.us
-rw-r--r--src/bin/psql/command.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index b51d28780b1..fb1e69ec4c2 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. */