summaryrefslogtreecommitdiff
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
commit5e92df6e0ee01cdea7865d3f0b6d02f840bf0402 (patch)
treeb38f90257b306555af6e691d0592cf4474bcc9f9
parentf3d4e72cf1e98499ba189aa95747e999079d94e8 (diff)
downloadmariadb-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
-rw-r--r--client/mysqltest.cc17
-rw-r--r--mysql-test/include/mix2.inc4
-rw-r--r--mysql-test/r/mysqltest.result2
-rw-r--r--mysql-test/t/mysqltest.test19
4 files changed, 39 insertions, 3 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;
diff --git a/mysql-test/include/mix2.inc b/mysql-test/include/mix2.inc
index b4c4a9b8836..123d049855a 100644
--- a/mysql-test/include/mix2.inc
+++ b/mysql-test/include/mix2.inc
@@ -1910,7 +1910,7 @@ select hex(s1) from t4;
drop table t1,t2,t3,t4;
}
-if (test_foreign_keys)
+if ($test_foreign_keys)
{
eval create table t1 (a int primary key,s1 varbinary(3) not null unique) engine=$engine_type;
eval create table t2 (s1 binary(2) not null, constraint c foreign key(s1) references t1(s1) on update cascade) engine=$engine_type;
@@ -2405,7 +2405,7 @@ drop table t1, t2, t3, t5, t6, t8, t9;
}
# End transactional tests
-if (test_foreign_keys)
+if ($test_foreign_keys)
{
# bug 18934, "InnoDB crashes when table uses column names like DB_ROW_ID"
--error 1005
diff --git a/mysql-test/r/mysqltest.result b/mysql-test/r/mysqltest.result
index 84412d2f387..721050bae19 100644
--- a/mysql-test/r/mysqltest.result
+++ b/mysql-test/r/mysqltest.result
@@ -393,6 +393,8 @@ true-inner again
true-outer
Counter is greater than 0, (counter=10)
Counter is not 0, (counter=0)
+Counter is true, (counter=alpha)
+Beta is true
1
Testing while with not
mysqltest: In included file "MYSQLTEST_VARDIR/tmp/mysqltest_while.inc": At line 64: Nesting too deeply
diff --git a/mysql-test/t/mysqltest.test b/mysql-test/t/mysqltest.test
index 09916f4f8cf..b88cde8c8f0 100644
--- a/mysql-test/t/mysqltest.test
+++ b/mysql-test/t/mysqltest.test
@@ -1106,6 +1106,25 @@ if (!$counter)
}
# ----------------------------------------------------------------------------
+# Test if with some non-numerics
+# ----------------------------------------------------------------------------
+
+let $counter=alpha;
+if ($counter)
+{
+ echo Counter is true, (counter=alpha);
+}
+let $counter= ;
+if ($counter)
+{
+ echo oops, space is true;
+}
+if (beta)
+{
+ echo Beta is true;
+}
+
+# ----------------------------------------------------------------------------
# Test while, { and }
# ----------------------------------------------------------------------------