]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix \watch's interaction with libedit on ^C.
authorThomas Munro <tmunro@postgresql.org>
Sun, 10 Jul 2022 04:30:03 +0000 (16:30 +1200)
committerThomas Munro <tmunro@postgresql.org>
Sun, 10 Jul 2022 04:55:18 +0000 (16:55 +1200)
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

index 65509ee747c868a9d061e94f361514f8e060b464..9d7ce6adef8c0ee3008d39ff776b25f4841b1822 100644 (file)
@@ -4540,6 +4540,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);
 }