On 2021/03/17 16:40, [email protected] wrote:
Dear Fujii-san,
Thank you for updating the patch.
Thanks for the review!
I understand that you don't want to change the current specification.
```diff
+ if (usec == 0)
+ {
+ char *c = var;
+
+ /* Skip sign */
+ if (*c == '+' || *c == '-')
+ c++;
```
In my understanding the skip is not necessary, because
plus sign is already removed in the executeMetaCommand() and minus value can be
returned by atoi().
Yes, you're right. I removed that check from the patch.
Attached is the updated version of the patch.
Regards,
--
Fujii Masao
Advanced Computing Technology Center
Research and Development Headquarters
NTT DATA CORPORATION
diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c
index e69d43b26b..48ce1712cc 100644
--- a/src/bin/pgbench/pgbench.c
+++ b/src/bin/pgbench/pgbench.c
@@ -2953,7 +2953,16 @@ evaluateSleep(CState *st, int argc, char **argv, int
*usecs)
pg_log_error("%s: undefined variable \"%s\"", argv[0],
argv[1] + 1);
return false;
}
+
usec = atoi(var);
+
+ /* Raise an error if the value of a variable is not a number */
+ if (usec == 0 && !isdigit((unsigned char) *var))
+ {
+ pg_log_error("%s: invalid sleep time \"%s\" for
variable \"%s\"",
+ argv[0], var, argv[1] + 1);
+ return false;
+ }
}
else
usec = atoi(argv[1]);
@@ -4788,17 +4797,41 @@ process_backslash_command(PsqlScanState sstate, const
char *source)
* will be parsed with atoi, which ignores trailing non-digit
* characters.
*/
- if (my_command->argc == 2 && my_command->argv[1][0] != ':')
+ if (my_command->argv[1][0] != ':')
{
char *c = my_command->argv[1];
+ bool have_digit = false;
- while (isdigit((unsigned char) *c))
+ /* Skip sign */
+ if (*c == '+' || *c == '-')
c++;
+
+ /* Require at least one digit */
+ if (*c && isdigit((unsigned char) *c))
+ have_digit = true;
+
+ /* Eat all digits */
+ while (*c && isdigit((unsigned char) *c))
+ c++;
+
if (*c)
{
- my_command->argv[2] = c;
- offsets[2] = offsets[1] + (c -
my_command->argv[1]);
- my_command->argc = 3;
+ if (my_command->argc == 2 && have_digit)
+ {
+ my_command->argv[2] = c;
+ offsets[2] = offsets[1] + (c -
my_command->argv[1]);
+ my_command->argc = 3;
+ }
+ else
+ {
+ /*
+ * Raise an error if argument starts
with non-digit
+ * character (after sign).
+ */
+ syntax_error(source, lineno,
my_command->first_line, my_command->argv[0],
+ "invalid sleep
time, must be an integer",
+
my_command->argv[1], offsets[1] - start_offset);
+ }
}
}