From 2dc837e6127c8b89346972ebeead122734edeef4 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 26 Sep 2007 12:45:08 +0200 Subject: [PATCH] Fixed bug #31075. The `SELECT col FROM t WHERE col NOT IN (col, ...) GROUP BY col' crashed in the range optimizer. The get_func_mm_tree function has been modified to check the Item_func_in::array field for the NULL value before using of that value. sql/opt_range.cc: Fixed bug #31075. The get_func_mm_tree function has been modified to check the Item_func_in::array field for the NULL value before using of that value. mysql-test/t/func_in.test: Added test case for bug #31075. mysql-test/r/func_in.result: Added test case for bug #31075. --- mysql-test/r/func_in.result | 5 +++++ mysql-test/t/func_in.test | 8 ++++++++ sql/opt_range.cc | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/func_in.result b/mysql-test/r/func_in.result index 4f64d39ccc0..80fa8f17a2a 100644 --- a/mysql-test/r/func_in.result +++ b/mysql-test/r/func_in.result @@ -564,4 +564,9 @@ explain select f2 from t2 where f2 in (1,'b'); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t2 index t2f2 t2f2 5 NULL 3 Using where; Using index drop table t1, t2; +create table t1 (a time, key(a)); +insert into t1 values (),(),(),(),(),(),(),(),(),(); +select a from t1 where a not in (a,a,a) group by a; +a +drop table t1; End of 5.1 tests diff --git a/mysql-test/t/func_in.test b/mysql-test/t/func_in.test index 2c5ed6a22d3..d8b0c89532e 100644 --- a/mysql-test/t/func_in.test +++ b/mysql-test/t/func_in.test @@ -408,5 +408,13 @@ select f2 from t2 where f2 in (1,'b'); explain select f2 from t2 where f2 in (1,'b'); drop table t1, t2; +# +# Bug #31075: crash in get_func_mm_tree +# + +create table t1 (a time, key(a)); +insert into t1 values (),(),(),(),(),(),(),(),(),(); +select a from t1 where a not in (a,a,a) group by a; +drop table t1; --echo End of 5.1 tests diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 5a772501e48..99c28be36b0 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -5053,7 +5053,7 @@ static SEL_TREE *get_func_mm_tree(RANGE_OPT_PARAM *param, Item_func *cond_func, if (inv) { - if (func->array->result_type() != ROW_RESULT) + if (func->array && func->array->result_type() != ROW_RESULT) { /* We get here for conditions in form "t.key NOT IN (c1, c2, ...)",