diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bin/psql/command.c | 3 | ||||
-rw-r--r-- | src/bin/psql/mainloop.c | 20 |
2 files changed, 22 insertions, 1 deletions
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index b981ae81ffa..7f57da8cc50 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -3508,7 +3508,8 @@ do_edit(const char *filename_arg, PQExpBuffer query_buf, { unsigned int ql = query_buf->len; - if (ql == 0 || query_buf->data[ql - 1] != '\n') + /* force newline-termination of what we send to editor */ + if (ql > 0 && query_buf->data[ql - 1] != '\n') { appendPQExpBufferChar(query_buf, '\n'); ql++; diff --git a/src/bin/psql/mainloop.c b/src/bin/psql/mainloop.c index b3a840756af..f7b1b94599d 100644 --- a/src/bin/psql/mainloop.c +++ b/src/bin/psql/mainloop.c @@ -47,6 +47,7 @@ MainLoop(FILE *source) volatile int successResult = EXIT_SUCCESS; volatile backslashResult slashCmdStatus = PSQL_CMD_UNKNOWN; volatile promptStatus_t prompt_status = PROMPT_READY; + volatile bool need_redisplay = false; volatile int count_eof = 0; volatile bool die_on_error = false; FILE *prev_cmd_source; @@ -118,6 +119,7 @@ MainLoop(FILE *source) count_eof = 0; slashCmdStatus = PSQL_CMD_UNKNOWN; prompt_status = PROMPT_READY; + need_redisplay = false; pset.stmt_lineno = 1; cancel_pressed = false; @@ -152,6 +154,18 @@ MainLoop(FILE *source) /* May need to reset prompt, eg after \r command */ if (query_buf->len == 0) prompt_status = PROMPT_READY; + /* If query buffer came from \e, redisplay it with a prompt */ + if (need_redisplay) + { + if (query_buf->len > 0) + { + fputs(get_prompt(PROMPT_READY, cond_stack), stdout); + fputs(query_buf->data, stdout); + fflush(stdout); + } + need_redisplay = false; + } + /* Now we can fetch a line */ line = gets_interactive(get_prompt(prompt_status, cond_stack), query_buf); } @@ -518,6 +532,10 @@ MainLoop(FILE *source) { /* should not see this in inactive branch */ Assert(conditional_active(cond_stack)); + /* ensure what came back from editing ends in a newline */ + if (query_buf->len > 0 && + query_buf->data[query_buf->len - 1] != '\n') + appendPQExpBufferChar(query_buf, '\n'); /* rescan query_buf as new input */ psql_scan_finish(scan_state); free(line); @@ -529,6 +547,8 @@ MainLoop(FILE *source) pset.encoding, standard_strings()); line_saved_in_history = false; prompt_status = PROMPT_READY; + /* we'll want to redisplay after parsing what we have */ + need_redisplay = true; } else if (slashCmdStatus == PSQL_CMD_TERMINATE) break; |