Hello,
Thanks for the catch and the proposed fix! Indeed, on errors the timing is not updated appropriately.
ISTM that the best course is to update the elapsed time whenever a result is obtained, so that a sensible value is always available.
See attached patch which is a variant of Richard's version. fabien=# SELECT 1 as one \; SELECT 1/0 \; SELECT 2 as two; ┌─────┐ │ one │ ├─────┤ │ 1 │ └─────┘ (1 row) ERROR: division by zero Time: 0,352 msProbably it would be appropriate to add a test case. I'll propose something later.
-- Fabien.
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index feb1d547d4..773673cc62 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1560,6 +1560,16 @@ ExecQueryAndProcessResults(const char *query, double *elapsed_msec, bool *svpt_g else 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; } else if (svpt_gone_p && !*svpt_gone_p) @@ -1612,7 +1622,7 @@ ExecQueryAndProcessResults(const char *query, double *elapsed_msec, bool *svpt_g 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 cannot be helped because the server goes on processing @@ -1623,7 +1633,7 @@ ExecQueryAndProcessResults(const char *query, double *elapsed_msec, bool *svpt_g * With combined queries, timing must be understood as an upper bound * of the time spent processing them. */ - if (last && timing) + if (timing) { INSTR_TIME_SET_CURRENT(after); INSTR_TIME_SUBTRACT(after, before);