Commit 1f97527a authored by Bjorn Munch's avatar Bjorn Munch

Bug #50618 Please allow 'sleep $variable' in mtr

Made mtr's sleep function understand $variables
A few fixes since previous patch, added tests
parent e814ed95
...@@ -491,6 +491,8 @@ void free_replace(); ...@@ -491,6 +491,8 @@ void free_replace();
void do_get_replace_regex(struct st_command *command); void do_get_replace_regex(struct st_command *command);
void free_replace_regex(); void free_replace_regex();
/* Used by sleep */
void check_eol_junk_line(const char *eol);
void free_all_replace(){ void free_all_replace(){
free_replace(); free_replace();
...@@ -1045,7 +1047,7 @@ void check_command_args(struct st_command *command, ...@@ -1045,7 +1047,7 @@ void check_command_args(struct st_command *command,
} }
/* Check for too many arguments passed */ /* Check for too many arguments passed */
ptr= command->last_argument; ptr= command->last_argument;
while(ptr <= command->end) while(ptr <= command->end && *ptr != '#')
{ {
if (*ptr && *ptr != ' ') if (*ptr && *ptr != ' ')
die("Extra argument '%s' passed to '%.*s'", die("Extra argument '%s' passed to '%.*s'",
...@@ -4211,10 +4213,19 @@ int do_disable_rpl_parse(struct st_command *command __attribute__((unused))) ...@@ -4211,10 +4213,19 @@ int do_disable_rpl_parse(struct st_command *command __attribute__((unused)))
int do_sleep(struct st_command *command, my_bool real_sleep) int do_sleep(struct st_command *command, my_bool real_sleep)
{ {
int error= 0; int error= 0;
char *p= command->first_argument; char *sleep_start, *sleep_end;
char *sleep_start, *sleep_end= command->end;
double sleep_val; double sleep_val;
char *p;
static DYNAMIC_STRING ds_sleep;
const struct command_arg sleep_args[] = {
{ "sleep_delay", ARG_STRING, TRUE, &ds_sleep, "Number of seconds to sleep." }
};
check_command_args(command, command->first_argument, sleep_args,
sizeof(sleep_args)/sizeof(struct command_arg),
' ');
p= ds_sleep.str;
sleep_end= ds_sleep.str + ds_sleep.length;
while (my_isspace(charset_info, *p)) while (my_isspace(charset_info, *p))
p++; p++;
if (!*p) if (!*p)
...@@ -4223,11 +4234,13 @@ int do_sleep(struct st_command *command, my_bool real_sleep) ...@@ -4223,11 +4234,13 @@ int do_sleep(struct st_command *command, my_bool real_sleep)
/* Check that arg starts with a digit, not handled by my_strtod */ /* Check that arg starts with a digit, not handled by my_strtod */
if (!my_isdigit(charset_info, *sleep_start)) if (!my_isdigit(charset_info, *sleep_start))
die("Invalid argument to %.*s \"%s\"", command->first_word_len, die("Invalid argument to %.*s \"%s\"", command->first_word_len,
command->query,command->first_argument); command->query, sleep_start);
sleep_val= my_strtod(sleep_start, &sleep_end, &error); sleep_val= my_strtod(sleep_start, &sleep_end, &error);
check_eol_junk_line(sleep_end);
if (error) if (error)
die("Invalid argument to %.*s \"%s\"", command->first_word_len, die("Invalid argument to %.*s \"%s\"", command->first_word_len,
command->query, command->first_argument); command->query, command->first_argument);
dynstr_free(&ds_sleep);
/* Fixed sleep time selected by --sleep option */ /* Fixed sleep time selected by --sleep option */
if (opt_sleep >= 0 && !real_sleep) if (opt_sleep >= 0 && !real_sleep)
...@@ -4236,7 +4249,6 @@ int do_sleep(struct st_command *command, my_bool real_sleep) ...@@ -4236,7 +4249,6 @@ int do_sleep(struct st_command *command, my_bool real_sleep)
DBUG_PRINT("info", ("sleep_val: %f", sleep_val)); DBUG_PRINT("info", ("sleep_val: %f", sleep_val));
if (sleep_val) if (sleep_val)
my_sleep((ulong) (sleep_val * 1000000L)); my_sleep((ulong) (sleep_val * 1000000L));
command->last_argument= sleep_end;
return 0; return 0;
} }
......
...@@ -147,9 +147,10 @@ hello ...@@ -147,9 +147,10 @@ hello
hello hello
;;;;;;;; ;;;;;;;;
# MySQL: -- The # MySQL: -- The
mysqltest: At line 1: End of line junk detected: "6" mysqltest: At line 1: Extra argument '6' passed to 'sleep'
mysqltest: At line 1: End of line junk detected: "6" mysqltest: At line 1: Extra argument '6' passed to 'sleep'
mysqltest: At line 1: Missing delimiter mysqltest: At line 1: Extra argument 'A comment
show status' passed to 'sleep'
mysqltest: At line 1: End of line junk detected: "sleep 7 mysqltest: At line 1: End of line junk detected: "sleep 7
# Another comment # Another comment
" "
...@@ -354,8 +355,10 @@ here is the sourced script ...@@ -354,8 +355,10 @@ here is the sourced script
here is the sourced script here is the sourced script
"hello" "hello"
"hello" "hello"
mysqltest: At line 1: Missing argument to sleep mysqltest: At line 2: Invalid argument to sleep "xyz"
mysqltest: At line 1: Missing argument to real_sleep mysqltest: At line 2: Invalid argument to real_sleep "xyz"
mysqltest: At line 1: Missing required argument 'sleep_delay' to command 'sleep'
mysqltest: At line 1: Missing required argument 'sleep_delay' to command 'real_sleep'
mysqltest: At line 1: Invalid argument to sleep "abc" mysqltest: At line 1: Invalid argument to sleep "abc"
mysqltest: At line 1: Invalid argument to real_sleep "abc" mysqltest: At line 1: Invalid argument to real_sleep "abc"
1 1
......
...@@ -920,6 +920,28 @@ sleep 0.5; ...@@ -920,6 +920,28 @@ sleep 0.5;
sleep 1; sleep 1;
real_sleep 1; real_sleep 1;
# Parameter from variable, legal and illegal
let $sleep_var= 0.1;
sleep $sleep_var;
let $sleep_var= 1;
--real_sleep $sleep_var
--write_file $MYSQL_TMP_DIR/sleep.inc
let $sleep_var= xyz;
--sleep $sleep_var
EOF
--error 1
--exec $MYSQL_TEST < $MYSQL_TMP_DIR/sleep.inc 2>&1
--remove_file $MYSQL_TMP_DIR/sleep.inc
--write_file $MYSQL_TMP_DIR/sleep.inc
let $sleep_var= xyz;
real_sleep $sleep_var;
EOF
--error 1
--exec $MYSQL_TEST < $MYSQL_TMP_DIR/sleep.inc 2>&1
--remove_file $MYSQL_TMP_DIR/sleep.inc
# Missing parameter # Missing parameter
--error 1 --error 1
--exec echo "sleep ;" | $MYSQL_TEST 2>&1 --exec echo "sleep ;" | $MYSQL_TEST 2>&1
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment