Improve handling of psql \watch's interval argument

A failure in parsing the interval value defined in the \watch command
was silently switched to 1s of interval between two queries, which can
be confusing.  This commit improves the error handling, and a couple of
tests are added to check after:
- An incorrect value.
- An out-of-range value.
- A negative value.

A value of zero is able to work now, meaning that there is no interval
of time between two queries in a \watch loop.  No backpatch is done, as
it could break existing applications.

Author: Andrey Borodin
Reviewed-by: Kyotaro Horiguchi, Nathan Bossart, Michael Paquier
Discussion: https://postgr.es/m/CAAhFRxiZ2-n_L1ErMm9AZjgmUK=qS6VHb+0SaMn8sqqbhF7How@mail.gmail.com
This commit is contained in:
Michael Paquier 2023-03-16 09:32:36 +09:00
parent dccb4d1c03
commit 6f9ee74d45
2 changed files with 32 additions and 3 deletions

View File

@ -2776,9 +2776,18 @@ exec_command_watch(PsqlScanState scan_state, bool active_branch,
/* Convert optional sleep-length argument */
if (opt)
{
sleep = strtod(opt, NULL);
if (sleep <= 0)
sleep = 1;
char *opt_end;
errno = 0;
sleep = strtod(opt, &opt_end);
if (sleep < 0 || *opt_end || errno == ERANGE)
{
pg_log_error("\\watch: incorrect interval value '%s'", opt);
free(opt);
resetPQExpBuffer(query_buf);
psql_scan_reset(scan_state);
return PSQL_CMD_ERROR;
}
free(opt);
}
@ -5183,6 +5192,9 @@ do_watch(PQExpBuffer query_buf, double sleep)
if (pagerpipe && ferror(pagerpipe))
break;
if (sleep == 0)
continue;
#ifdef WIN32
/*

View File

@ -350,4 +350,21 @@ psql_like(
'\copy from with DEFAULT'
);
# Check \watch errors
psql_fails_like(
$node,
'SELECT 1;\watch -10',
qr/incorrect interval value '-10'/,
'\watch, negative interval');
psql_fails_like(
$node,
'SELECT 1;\watch 10ab',
qr/incorrect interval value '10ab'/,
'\watch incorrect interval');
psql_fails_like(
$node,
'SELECT 1;\watch 10e400',
qr/incorrect interval value '10e400'/,
'\watch out-of-range interval');
done_testing();