diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index a55ca6a266..48b081fd58 100644
--- a/doc/src/sgml/ref/psql-ref.sgml
+++ b/doc/src/sgml/ref/psql-ref.sgml
@@ -1831,9 +1831,13 @@ testdb=>
the normal rules of psql, treating the
whole buffer as a single line. Any complete queries are immediately
executed; that is, if the query buffer contains or ends with a
- semicolon, everything up to that point is executed. Whatever remains
- will wait in the query buffer; type semicolon or \g to
- send it, or \r to cancel it by clearing the query buffer.
+ semicolon, everything up to that point is executed and removed from
+ the query buffer. Whatever remains in the query buffer is
+ redisplayed. Type semicolon or \g to send it,
+ or \r to cancel it by clearing the query buffer.
+
+
+
Treating the buffer as a single line primarily affects meta-commands:
whatever is in the buffer after a meta-command will be taken as
argument(s) to the meta-command, even if it spans multiple lines.
@@ -1893,7 +1897,8 @@ Tue Oct 26 21:40:57 CEST 1999
in the form of a CREATE OR REPLACE FUNCTION or
CREATE OR REPLACE PROCEDURE command.
Editing is done in the same way as for \edit.
- After the editor exits, the updated command waits in the query buffer;
+ After the editor exits, the updated command is executed immediately
+ if you added a semicolon to it. Otherwise it is redisplayed;
type semicolon or \g to send it, or \r
to cancel.
@@ -1969,7 +1974,8 @@ Tue Oct 26 21:40:57 CEST 1999
This command fetches and edits the definition of the named view,
in the form of a CREATE OR REPLACE VIEW command.
Editing is done in the same way as for \edit.
- After the editor exits, the updated command waits in the query buffer;
+ After the editor exits, the updated command is executed immediately
+ if you added a semicolon to it. Otherwise it is redisplayed;
type semicolon or \g to send it, or \r
to cancel.
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index b981ae81ff..7f57da8cc5 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 b3a840756a..f7b1b94599 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;