Commit 8d93d925 authored by unknown's avatar unknown
Browse files

Merge neptunus.(none):/home/msvensson/mysql/bug16795/my50-bug16795

into  neptunus.(none):/home/msvensson/mysql/mysql-5.0


client/mysqltest.c:
  Auto merged
mysql-test/r/mysqltest.result:
  Auto merged
mysql-test/t/mysqltest.test:
  Auto merged
parents e36762ea 3e17193a
Loading
Loading
Loading
Loading
+45 −4
Original line number Diff line number Diff line
@@ -2353,12 +2353,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)
@@ -2379,8 +2408,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);
@@ -2394,14 +2431,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;
}

@@ -3037,8 +3080,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];
+3 −0
Original line number Diff line number Diff line
@@ -324,7 +324,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
+2 −5
Original line number Diff line number Diff line
@@ -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;
+30 −1
Original line number Diff line number Diff line
@@ -755,6 +755,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 }
# ----------------------------------------------------------------------------
@@ -768,7 +792,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
+19 −8
Original line number Diff line number Diff line
@@ -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;