diff options
author | Bjorn Munch <bjorn.bunch@oracle.com> | 2010-08-03 16:11:23 +0200 |
---|---|---|
committer | Bjorn Munch <bjorn.bunch@oracle.com> | 2010-08-03 16:11:23 +0200 |
commit | 5e92df6e0ee01cdea7865d3f0b6d02f840bf0402 (patch) | |
tree | b38f90257b306555af6e691d0592cf4474bcc9f9 /client | |
parent | f3d4e72cf1e98499ba189aa95747e999079d94e8 (diff) | |
download | mariadb-git-5e92df6e0ee01cdea7865d3f0b6d02f840bf0402.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.cc | 17 |
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; |