postgres.git / summary / log / commit / refs

commit    7c5953b7b5dc2b1c5546c5b8b8b29785d46f4e8e
Author:   Thomas Munro <tmunro@postgresql.org>
Date:     Sun Jul 10 04:30:03 2022 +0000
First released in: 16.0, 10.22, 11.17, 12.12, 13.8, 14.5, 15.0

    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


src/bin/psql/command.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 6b7d78edf76..99be3018f93 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -4660,6 +4660,14 @@ do_watch(PQExpBuffer query_buf, double sleep) sigint_interrupt_enabled = false; } + /* + * 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. + */ + fprintf(stdout, "\n"); + fflush(stdout); + pg_free(title); return (res >= 0); } [parent: 8ace122d438a]