psql: Update \timing also in case of an error
The changes to show all query results (7844c9918
) broke \timing output
in case of an error; it didn't update the timing result and showed
0.000 ms.
Fix by updating the timing result also in the error case. Also, for
robustness, update the timing result any time a result is obtained,
not only for the last, so a sensible value is always available.
Reported-by: Tom Lane <tgl@sss.pgh.pa.us>
Author: Richard Guo <guofenglinux@gmail.com>
Author: Fabien COELHO <coelho@cri.ensmp.fr>
Discussion: https://www.postgresql.org/message-id/3813350.1652111765%40sss.pgh.pa.us
This commit is contained in:
parent
6e647ef0e7
commit
9520f8d92a
|
@ -1566,6 +1566,16 @@ ExecQueryAndProcessResults(const char *query, double *elapsed_msec, bool *svpt_g
|
||||||
else
|
else
|
||||||
result = PQgetResult(pset.db);
|
result = PQgetResult(pset.db);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get current timing measure in case an error occurs
|
||||||
|
*/
|
||||||
|
if (timing)
|
||||||
|
{
|
||||||
|
INSTR_TIME_SET_CURRENT(after);
|
||||||
|
INSTR_TIME_SUBTRACT(after, before);
|
||||||
|
*elapsed_msec = INSTR_TIME_GET_MILLISEC(after);
|
||||||
|
}
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (svpt_gone_p && !*svpt_gone_p)
|
else if (svpt_gone_p && !*svpt_gone_p)
|
||||||
|
@ -1619,7 +1629,7 @@ ExecQueryAndProcessResults(const char *query, double *elapsed_msec, bool *svpt_g
|
||||||
last = (next_result == NULL);
|
last = (next_result == NULL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get timing measure before printing the last result.
|
* Update current timing measure.
|
||||||
*
|
*
|
||||||
* It will include the display of previous results, if any. This
|
* It will include the display of previous results, if any. This
|
||||||
* cannot be helped because the server goes on processing further
|
* cannot be helped because the server goes on processing further
|
||||||
|
@ -1630,7 +1640,7 @@ ExecQueryAndProcessResults(const char *query, double *elapsed_msec, bool *svpt_g
|
||||||
* With combined queries, timing must be understood as an upper bound
|
* With combined queries, timing must be understood as an upper bound
|
||||||
* of the time spent processing them.
|
* of the time spent processing them.
|
||||||
*/
|
*/
|
||||||
if (last && timing)
|
if (timing)
|
||||||
{
|
{
|
||||||
INSTR_TIME_SET_CURRENT(after);
|
INSTR_TIME_SET_CURRENT(after);
|
||||||
INSTR_TIME_SUBTRACT(after, before);
|
INSTR_TIME_SUBTRACT(after, before);
|
||||||
|
|
|
@ -85,8 +85,16 @@ psql_like(
|
||||||
'\timing on
|
'\timing on
|
||||||
SELECT 1',
|
SELECT 1',
|
||||||
qr/^1$
|
qr/^1$
|
||||||
^Time: \d+.\d\d\d ms/m,
|
^Time: \d+\.\d\d\d ms/m,
|
||||||
'\timing');
|
'\timing with successful query');
|
||||||
|
|
||||||
|
# test \timing with query that fails
|
||||||
|
{
|
||||||
|
my ($ret, $stdout, $stderr) = $node->psql('postgres', "\\timing on\nSELECT error");
|
||||||
|
isnt($ret, 0, '\timing with query error: query failed');
|
||||||
|
like($stdout, qr/^Time: \d+\.\d\d\d ms/m, '\timing with query error: timing output appears');
|
||||||
|
unlike($stdout, qr/^Time: 0\.000 ms/m, '\timing with query error: timing was updated');
|
||||||
|
}
|
||||||
|
|
||||||
# test that ENCODING variable is set and that it is updated when
|
# test that ENCODING variable is set and that it is updated when
|
||||||
# client encoding is changed
|
# client encoding is changed
|
||||||
|
|
Loading…
Reference in New Issue