mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 13:32:33 +01:00
Add possibility to have a negative expression in "if" and "while" in mysqltest
This commit is contained in:
parent
01ddf96930
commit
cac0931b8c
3 changed files with 78 additions and 5 deletions
|
@ -2362,12 +2362,41 @@ int do_done(struct st_query *q)
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
Process start of a "if" or "while" statement
|
||||
|
||||
SYNOPSIS
|
||||
do_block()
|
||||
cmd Type of block
|
||||
q called command
|
||||
|
||||
DESCRIPTION
|
||||
if ([!]<expr>)
|
||||
{
|
||||
<block statements>
|
||||
}
|
||||
|
||||
while ([!]<expr>)
|
||||
{
|
||||
<block statements>
|
||||
}
|
||||
|
||||
Evaluates the <expr> and if it evaluates to
|
||||
greater than zero executes the following code block.
|
||||
A '!' can be used before the <expr> to indicate it should
|
||||
be executed if it evaluates to zero.
|
||||
|
||||
*/
|
||||
|
||||
int do_block(enum block_cmd cmd, struct st_query* q)
|
||||
{
|
||||
char *p= q->first_argument;
|
||||
const char *expr_start, *expr_end;
|
||||
VAR v;
|
||||
const char *cmd_name= (cmd == cmd_while ? "while" : "if");
|
||||
my_bool not_expr= FALSE;
|
||||
DBUG_ENTER("do_block");
|
||||
DBUG_PRINT("enter", ("%s", cmd_name));
|
||||
|
||||
/* Check stack overflow */
|
||||
if (cur_block == block_stack_end)
|
||||
|
@ -2388,8 +2417,16 @@ int do_block(enum block_cmd cmd, struct st_query* q)
|
|||
|
||||
/* Parse and evaluate test expression */
|
||||
expr_start= strchr(p, '(');
|
||||
if (!expr_start)
|
||||
if (!expr_start++)
|
||||
die("missing '(' in %s", cmd_name);
|
||||
|
||||
/* Check for !<expr> */
|
||||
if (*expr_start == '!')
|
||||
{
|
||||
not_expr= TRUE;
|
||||
expr_start++; /* Step past the '!' */
|
||||
}
|
||||
/* Find ending ')' */
|
||||
expr_end= strrchr(expr_start, ')');
|
||||
if (!expr_end)
|
||||
die("missing ')' in %s", cmd_name);
|
||||
|
@ -2403,14 +2440,20 @@ int do_block(enum block_cmd cmd, struct st_query* q)
|
|||
die("Missing '{' after %s. Found \"%s\"", cmd_name, p);
|
||||
|
||||
var_init(&v,0,0,0,0);
|
||||
eval_expr(&v, ++expr_start, &expr_end);
|
||||
eval_expr(&v, expr_start, &expr_end);
|
||||
|
||||
/* Define inner block */
|
||||
cur_block++;
|
||||
cur_block->cmd= cmd;
|
||||
cur_block->ok= (v.int_val ? TRUE : FALSE);
|
||||
|
||||
if (not_expr)
|
||||
cur_block->ok = !cur_block->ok;
|
||||
|
||||
DBUG_PRINT("info", ("OK: %d", cur_block->ok));
|
||||
|
||||
var_free(&v);
|
||||
DBUG_VOID_RETURN;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3046,8 +3089,6 @@ static void replace_dynstr_append(DYNAMIC_STRING *ds, const char *val)
|
|||
static void append_field(DYNAMIC_STRING *ds, uint col_idx, MYSQL_FIELD* field,
|
||||
const char* val, ulonglong len, bool is_null)
|
||||
{
|
||||
|
||||
char buf[256];
|
||||
if (col_idx < max_replace_column && replace_column[col_idx])
|
||||
{
|
||||
val= replace_column[col_idx];
|
||||
|
|
|
@ -309,7 +309,10 @@ test
|
|||
test2
|
||||
test3
|
||||
test4
|
||||
Counter is greater than 0, (counter=10)
|
||||
Counter is not 0, (counter=0)
|
||||
1
|
||||
Testing while with not
|
||||
mysqltest: In included file "./include/mysqltest_while.inc": At line 64: Nesting too deeply
|
||||
mysqltest: At line 1: missing '(' in while
|
||||
mysqltest: At line 1: missing ')' in while
|
||||
|
|
|
@ -742,6 +742,30 @@ echo test3stop
|
|||
--delimiter ;
|
||||
echo test4;
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Test if
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
let $counter=10;
|
||||
if ($counter)
|
||||
{
|
||||
echo Counter is greater than 0, (counter=10);
|
||||
}
|
||||
if (!$counter)
|
||||
{
|
||||
echo Counter is not 0, (counter=10);
|
||||
}
|
||||
let $counter=0;
|
||||
if ($counter)
|
||||
{
|
||||
echo Counter is greater than 0, (counter=0);
|
||||
}
|
||||
if (!$counter)
|
||||
{
|
||||
echo Counter is not 0, (counter=0);
|
||||
}
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Test while, { and }
|
||||
# ----------------------------------------------------------------------------
|
||||
|
@ -755,7 +779,12 @@ while ($i)
|
|||
# One liner
|
||||
#let $i=1;while ($i){echo $i;dec $i;}
|
||||
|
||||
|
||||
let $i=0;
|
||||
while (!$i)
|
||||
{
|
||||
echo Testing while with not;
|
||||
inc $i;
|
||||
}
|
||||
|
||||
# Exceed max nesting level
|
||||
--error 1
|
||||
|
|
Loading…
Reference in a new issue