summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <msvensson@neptunus.(none)>2006-02-15 22:43:42 +0100
committerunknown <msvensson@neptunus.(none)>2006-02-15 22:43:42 +0100
commit8c1c10dc20c471d349ddd08e566efd63d44d825e (patch)
treeb5af00602ec0b3cab0cf1b1aaed7afa1b320e705
parentfb6928cb24db155027074e06f619736e50e86015 (diff)
downloadmariadb-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.c49
-rw-r--r--mysql-test/r/mysqltest.result3
-rw-r--r--mysql-test/t/mysqltest.test31
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