From 8c1c10dc20c471d349ddd08e566efd63d44d825e Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 15 Feb 2006 22:43:42 +0100 Subject: [PATCH 1/2] 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 !. 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 --- client/mysqltest.c | 49 ++++++++++++++++++++++++++++++++--- mysql-test/r/mysqltest.result | 3 +++ 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 ([!]) + { + + } + + while ([!]) + { + + } + + Evaluates the and if it evaluates to + greater than zero executes the following code block. + A '!' can be used before the 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 ! */ + 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 From 3e17193aa341f3a88d98aded5f1898ca6c230911 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 15 Feb 2006 22:46:16 +0100 Subject: [PATCH 2/2] Bug#16795 ndb_cache_multi2 - remove timing dependent part of test, wait until condition occurs or sleep max 10 seconds mysql-test/r/ndb_cache_multi2.result: Update test results mysql-test/t/ndb_cache_multi2.test: Convert long sleeps to a while leep whith small sleeps and a check if condition has occured. This allows slower machines to sleep longer if needed. --- mysql-test/r/ndb_cache_multi2.result | 7 ++----- mysql-test/t/ndb_cache_multi2.test | 27 +++++++++++++++++++-------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/mysql-test/r/ndb_cache_multi2.result b/mysql-test/r/ndb_cache_multi2.result index 2863908a436..63cc4d4ceed 100644 --- a/mysql-test/r/ndb_cache_multi2.result +++ b/mysql-test/r/ndb_cache_multi2.result @@ -64,13 +64,10 @@ a 3 show status like "Qcache_queries_in_cache"; Variable_name Value -Qcache_queries_in_cache 2 +Qcache_queries_in_cache 3 show status like "Qcache_inserts"; Variable_name Value -Qcache_inserts 3 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 0 +Qcache_inserts 4 drop table t1, t2; set GLOBAL query_cache_size=0; set GLOBAL ndb_cache_check_time=0; diff --git a/mysql-test/t/ndb_cache_multi2.test b/mysql-test/t/ndb_cache_multi2.test index 9352505649c..5a78380097e 100644 --- a/mysql-test/t/ndb_cache_multi2.test +++ b/mysql-test/t/ndb_cache_multi2.test @@ -24,10 +24,6 @@ set GLOBAL ndb_cache_check_time=1; reset query cache; flush status; -# Sleep so that the query cache check thread has time to start -sleep 15; - - # Create test tables in NDB and load them into cache # on server1 connection server1; @@ -53,19 +49,34 @@ show status like "Qcache_inserts"; show status like "Qcache_hits"; update t1 set a=3 where a=2; -# Sleep so that the query cache check thread has time to run -sleep 5; - # Connect to server1 and check that cache is invalidated # and correct data is returned connection server1; show status like "Qcache_queries_in_cache"; show status like "Qcache_inserts"; show status like "Qcache_hits"; + +# Loop and wait for max 10 seconds until query cache thread +# has invalidated the cache and the column a in t1 is equal to 3 +let $retries=20; +while (`select a != 3 from t1`) +{ + dec $retries; + if (!$retries) + { + The query_cache thread failed to invalidate query_cache in 10 seconds; + } + sleep 0.5; +} + +# Select from t1 one last time for the result file +# Column a should be 3 select * from t1; + +# There should now be three queries in the cache show status like "Qcache_queries_in_cache"; +# And inserts should be four show status like "Qcache_inserts"; -show status like "Qcache_hits"; drop table t1, t2;