On 2021/03/17 16:40, kuroda.hay...@fujitsu.com 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);
+                               }
                        }
                }
 

Reply via email to