Commit 37dc5f08 authored by Bjorn Munch's avatar Bjorn Munch

Bug #49878 delimiter under false 'if' makes mysqltest test fail with 'Missing end of block'

delimiter not executed so does not recognize end of block
Always execute delimiter command, revert after false if() block.
parent bdf5ace1
...@@ -132,6 +132,7 @@ struct st_block ...@@ -132,6 +132,7 @@ struct st_block
int line; /* Start line of block */ int line; /* Start line of block */
my_bool ok; /* Should block be executed */ my_bool ok; /* Should block be executed */
enum block_cmd cmd; /* Command owning the block */ enum block_cmd cmd; /* Command owning the block */
char delim[MAX_DELIMITER_LENGTH]; /* Delimiter before block */
}; };
static struct st_block block_stack[32]; static struct st_block block_stack[32];
...@@ -5142,6 +5143,12 @@ int do_done(struct st_command *command) ...@@ -5142,6 +5143,12 @@ int do_done(struct st_command *command)
} }
else else
{ {
if (*cur_block->delim)
{
/* Restore "old" delimiter after false if block */
strcpy (delimiter, cur_block->delim);
delimiter_length= strlen(delimiter);
}
/* Pop block from stack, goto next line */ /* Pop block from stack, goto next line */
cur_block--; cur_block--;
parser.current_line++; parser.current_line++;
...@@ -5200,6 +5207,7 @@ void do_block(enum block_cmd cmd, struct st_command* command) ...@@ -5200,6 +5207,7 @@ void do_block(enum block_cmd cmd, struct st_command* command)
cur_block++; cur_block++;
cur_block->cmd= cmd; cur_block->cmd= cmd;
cur_block->ok= FALSE; cur_block->ok= FALSE;
cur_block->delim[0]= '\0';
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
...@@ -5236,6 +5244,15 @@ void do_block(enum block_cmd cmd, struct st_command* command) ...@@ -5236,6 +5244,15 @@ void do_block(enum block_cmd cmd, struct st_command* command)
if (not_expr) if (not_expr)
cur_block->ok = !cur_block->ok; cur_block->ok = !cur_block->ok;
if (cur_block->ok)
{
cur_block->delim[0]= '\0';
} else
{
/* Remember "old" delimiter if entering a false if block */
strcpy (cur_block->delim, delimiter);
}
DBUG_PRINT("info", ("OK: %d", cur_block->ok)); DBUG_PRINT("info", ("OK: %d", cur_block->ok));
var_free(&v); var_free(&v);
...@@ -7798,7 +7815,8 @@ int main(int argc, char **argv) ...@@ -7798,7 +7815,8 @@ int main(int argc, char **argv)
command->type= Q_COMMENT; command->type= Q_COMMENT;
} }
my_bool ok_to_do= cur_block->ok; /* delimiter needs to be executed so we can continue to parse */
my_bool ok_to_do= cur_block->ok || command->type == Q_DELIMITER;
/* /*
Some commands need to be "done" the first time if they may get Some commands need to be "done" the first time if they may get
re-iterated over in a true context. This can only happen if there's re-iterated over in a true context. This can only happen if there's
......
...@@ -377,6 +377,10 @@ test ...@@ -377,6 +377,10 @@ test
test2 test2
test3 test3
test4 test4
outer
true-inner
true-inner again
true-outer
Counter is greater than 0, (counter=10) Counter is greater than 0, (counter=10)
Counter is not 0, (counter=0) Counter is not 0, (counter=0)
1 1
......
...@@ -1006,6 +1006,37 @@ echo test3stop ...@@ -1006,6 +1006,37 @@ echo test3stop
--delimiter ; --delimiter ;
echo test4; echo test4;
# ----------------------------------------------------------------------------
# Test that delimiter within if() works in in various combinations
# ----------------------------------------------------------------------------
if (0)
{
delimiter ||;
echo false-inner||
if (0)
{
delimiter *||
echo false-innerer*
delimiter ||*
}
echo false-inner again||
}
echo outer;
if (1)
{
delimiter /;
echo true-inner/
if (0)
{
delimiter %/
echo true-innerer%
}
echo true-inner again/
}
echo true-outer/
delimiter ;/
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
# Test if # Test if
......
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