1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-01 03:47:19 +03:00

Add break statement in mysqltest

This commit is contained in:
Dwarf Mason
2020-06-05 20:57:28 +10:00
committed by Andrew Hutchings
parent f5aae71661
commit 9f8c5e01ae
3 changed files with 125 additions and 1 deletions

View File

@ -354,7 +354,7 @@ enum enum_commands {
Q_INC, Q_DEC,
Q_SOURCE, Q_DISCONNECT,
Q_LET, Q_ECHO,
Q_WHILE, Q_END_BLOCK,
Q_WHILE, Q_END_BLOCK, Q_BREAK,
Q_SYSTEM, Q_RESULT,
Q_REQUIRE, Q_SAVE_MASTER_POS,
Q_SYNC_WITH_MASTER,
@ -424,6 +424,7 @@ const char *command_names[]=
"echo",
"while",
"end",
"break",
"system",
"result",
"require",
@ -6306,6 +6307,33 @@ enum block_op find_operand(const char *start)
return ILLEG_OP;
}
/*
do_break
DESCRIPTION
Instruction to stop execution of the current loop
*/
void do_break(struct st_command* command)
{
int depth= 0;
cur_block->ok= false;
/* Disable every outer block until while found or block stack ends */
while (cur_block->cmd != cmd_while && cur_block > block_stack)
{
cur_block--;
cur_block->ok= false;
depth++;
}
/* Check if the top block is not 'while' */
if (cur_block->cmd != cmd_while)
{
die("Stray break was found");
}
/* Set current block back */
cur_block+= depth;
}
/*
Process start of a "if" or "while" statement
@ -10059,6 +10087,7 @@ int main(int argc, char **argv)
case Q_INC: do_modify_var(command, DO_INC); break;
case Q_DEC: do_modify_var(command, DO_DEC); break;
case Q_ECHO: do_echo(command); command_executed++; break;
case Q_BREAK: do_break(command); break;
case Q_SYSTEM: do_system(command); break;
case Q_REMOVE_FILE: do_remove_file(command); break;
case Q_REMOVE_FILES_WILDCARD: do_remove_files_wildcard(command); break;

View File

@ -0,0 +1,9 @@
3
2
OK
OK
OK
1
cnt=3
cnt=2
mysqltest: At line 1: Stray break was found

View File

@ -0,0 +1,86 @@
#
# MDEV-12130 improve mysqltest language
#
# test "break" statement
#
# Break in a single loop
let $cnt= 4;
while($cnt > 1)
{
dec $cnt;
break;
--echo $cnt
--echo Break did not stop a single loop
}
# Break stops inner loop
let $outer= 4;
while($outer > 1)
{
let $inner= 4;
while($inner > 1)
{
if($outer == 2)
{
--echo OK
}
if($inner == 2)
{
break;
}
dec $inner;
}
dec $outer;
--echo $outer
}
# Break stops outer loop
let $inner= 4;
let $outer= 4;
while($outer > 1)
{
break;
while($inner > 1)
{
dec $inner;
--echo Outer loop`s break did not stop inner loop
}
dec $outer;
--echo $outer
}
# Break stops loop in if
let $cnt= 4;
if($cnt > 1)
{
while($cnt)
{
break;
}
dec $cnt;
}
--echo cnt=$cnt
# Break in inner if
let $cnt= 4;
while($cnt > 1)
{
if($cnt == 2)
{
break;
--echo "if" is working after break
}
dec $cnt;
}
--echo cnt=$cnt
# Stray break
--error 1
--exec echo "break;" | $MYSQL_TEST 2>&1