diff options
author | unknown <msvensson@neptunus.(none)> | 2006-02-15 22:43:42 +0100 |
---|---|---|
committer | unknown <msvensson@neptunus.(none)> | 2006-02-15 22:43:42 +0100 |
commit | 8c1c10dc20c471d349ddd08e566efd63d44d825e (patch) | |
tree | b5af00602ec0b3cab0cf1b1aaed7afa1b320e705 | |
parent | fb6928cb24db155027074e06f619736e50e86015 (diff) | |
download | mariadb-git-8c1c10dc20c471d349ddd08e566efd63d44d825e.tar.gz |
Add possibility to have a negative expression in "if" and "while" in mysqltest
client/mysqltest.c:
Extend 'do_block' to be able to process a !<expression>.
Making it possible to do 'if(!$i)' and 'while(!$i)'
mysql-test/r/mysqltest.result:
Update test results
mysql-test/t/mysqltest.test:
Add test for if
Add test for while with ! expr
-rw-r--r-- | client/mysqltest.c | 49 | ||||
-rw-r--r-- | mysql-test/r/mysqltest.result | 3 | ||||
-rw-r--r-- | mysql-test/t/mysqltest.test | 31 |
3 files changed, 78 insertions, 5 deletions
diff --git a/client/mysqltest.c b/client/mysqltest.c index 3179535347d..cb5325f9158 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -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]; diff --git a/mysql-test/r/mysqltest.result b/mysql-test/r/mysqltest.result index 067054510c2..a7286316b0a 100644 --- a/mysql-test/r/mysqltest.result +++ b/mysql-test/r/mysqltest.result @@ -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 diff --git a/mysql-test/t/mysqltest.test b/mysql-test/t/mysqltest.test index 5cf49185c30..7699817354f 100644 --- a/mysql-test/t/mysqltest.test +++ b/mysql-test/t/mysqltest.test @@ -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 |