summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authorBjorn Munch <bjorn.bunch@oracle.com>2010-08-03 16:11:23 +0200
committerBjorn Munch <bjorn.bunch@oracle.com>2010-08-03 16:11:23 +0200
commit1ba9d79b7b6679253353714307e497e6256eb77b (patch)
treeb38f90257b306555af6e691d0592cf4474bcc9f9 /client
parent01e6820115a7f886154b21710364f47e50a66c99 (diff)
downloadmariadb-git-1ba9d79b7b6679253353714307e497e6256eb77b.tar.gz
Bug #55582 mtr root detection (and if-expression execution) broken
if() treated any non-numeric string as false Fixed to treat those as true instead Added some test cases Fixed missing $ in variable name in include/mix2.inc
Diffstat (limited to 'client')
-rw-r--r--client/mysqltest.cc17
1 files changed, 16 insertions, 1 deletions
diff --git a/client/mysqltest.cc b/client/mysqltest.cc
index ba8e882f33e..4a090f5481e 100644
--- a/client/mysqltest.cc
+++ b/client/mysqltest.cc
@@ -2383,6 +2383,9 @@ void eval_expr(VAR *v, const char *p, const char **p_end)
if ((vp= var_get(p, p_end, 0, 0)))
var_copy(v, vp);
+ /* Apparently it is not safe to assume null-terminated string */
+ v->str_val[v->str_val_len]= 0;
+
/* Make sure there was just a $variable and nothing else */
const char* end= *p_end + 1;
if (end < expected_end)
@@ -5391,8 +5394,20 @@ void do_block(enum block_cmd cmd, struct st_command* command)
/* Define inner block */
cur_block++;
cur_block->cmd= cmd;
- cur_block->ok= (v.int_val ? TRUE : FALSE);
+ if (v.int_val)
+ {
+ cur_block->ok= TRUE;
+ } else
+ /* Any non-empty string which does not begin with 0 is also TRUE */
+ {
+ p= v.str_val;
+ /* First skip any leading white space or unary -+ */
+ while (*p && ((my_isspace(charset_info, *p) || *p == '-' || *p == '+')))
+ p++;
+ cur_block->ok= (*p && *p != '0') ? TRUE : FALSE;
+ }
+
if (not_expr)
cur_block->ok = !cur_block->ok;