Loading mysql-test/r/func_group.result +2 −0 Original line number Diff line number Diff line Loading @@ -865,6 +865,7 @@ select 1, min(a) from t1m where 1=99; 1 NULL select 1, min(1) from t1m where a=99; 1 min(1) 1 NULL select 1, min(1) from t1m where 1=99; 1 min(1) 1 NULL Loading @@ -876,6 +877,7 @@ select 1, max(a) from t1m where 1=99; 1 NULL select 1, max(1) from t1m where a=99; 1 max(1) 1 NULL select 1, max(1) from t1m where 1=99; 1 max(1) 1 NULL Loading mysql-test/r/select.result +13 −0 Original line number Diff line number Diff line Loading @@ -3337,6 +3337,19 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t2 const PRIMARY PRIMARY 4 const 1 Using index 1 SIMPLE t3 const PRIMARY PRIMARY 8 const,const 1 DROP TABLE t1,t2,t3; create table t1 (f1 int unique); create table t2 (f2 int unique); create table t3 (f3 int unique); insert into t1 values(1),(2); insert into t2 values(1),(2); insert into t3 values(1),(NULL); select * from t3 where f3 is null; f3 NULL select t2.f2 from t1 left join t2 on f1=f2 join t3 on f1=f3 where f1=1; f2 1 drop table t1,t2,t3; create table t1(f1 char, f2 char not null); insert into t1 values(null,'a'); create table t2 (f2 char not null); Loading mysql-test/t/select.test +14 −0 Original line number Diff line number Diff line Loading @@ -2806,6 +2806,20 @@ EXPLAIN SELECT t2.key_a,foo DROP TABLE t1,t2,t3; # # Bug #15633 Evaluation of Item_equal for non-const table caused wrong # select result # create table t1 (f1 int unique); create table t2 (f2 int unique); create table t3 (f3 int unique); insert into t1 values(1),(2); insert into t2 values(1),(2); insert into t3 values(1),(NULL); select * from t3 where f3 is null; select t2.f2 from t1 left join t2 on f1=f2 join t3 on f1=f3 where f1=1; drop table t1,t2,t3; # # Bug#15268 Unchecked null value caused server crash # Loading sql/item_cmpfunc.cc +8 −3 Original line number Diff line number Diff line Loading @@ -3765,6 +3765,7 @@ void Item_equal::update_used_tables() longlong Item_equal::val_int() { Item_field *item_field; if (cond_false) return 0; List_iterator_fast<Item_field> it(fields); Loading @@ -3772,11 +3773,15 @@ longlong Item_equal::val_int() if ((null_value= item->null_value)) return 0; eval_item->store_value(item); while ((item= it++)) while ((item_field= it++)) { /* Skip fields of non-const tables. They haven't been read yet */ if (item_field->field->table->const_table) { if ((null_value= item->null_value) || eval_item->cmp(item)) if ((null_value= item_field->null_value) || eval_item->cmp(item_field)) return 0; } } return 1; } Loading sql/item_cmpfunc.h +5 −0 Original line number Diff line number Diff line Loading @@ -1150,6 +1150,11 @@ class Item_cond :public Item_bool_func are deleted in the end of execution. All changes made to these objects need not be registered in the list of changes of the parse tree and do not harm PS/SP re-execution. Item equal objects are employed only at the optimize phase. Usually they are not supposed to be evaluated. Yet in some cases we call the method val_int() for them. We have to take care of restricting the predicate such an object represents f1=f2= ...=fn to the projection of known fields fi1=...=fik. */ class Item_equal: public Item_bool_func Loading Loading
mysql-test/r/func_group.result +2 −0 Original line number Diff line number Diff line Loading @@ -865,6 +865,7 @@ select 1, min(a) from t1m where 1=99; 1 NULL select 1, min(1) from t1m where a=99; 1 min(1) 1 NULL select 1, min(1) from t1m where 1=99; 1 min(1) 1 NULL Loading @@ -876,6 +877,7 @@ select 1, max(a) from t1m where 1=99; 1 NULL select 1, max(1) from t1m where a=99; 1 max(1) 1 NULL select 1, max(1) from t1m where 1=99; 1 max(1) 1 NULL Loading
mysql-test/r/select.result +13 −0 Original line number Diff line number Diff line Loading @@ -3337,6 +3337,19 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t2 const PRIMARY PRIMARY 4 const 1 Using index 1 SIMPLE t3 const PRIMARY PRIMARY 8 const,const 1 DROP TABLE t1,t2,t3; create table t1 (f1 int unique); create table t2 (f2 int unique); create table t3 (f3 int unique); insert into t1 values(1),(2); insert into t2 values(1),(2); insert into t3 values(1),(NULL); select * from t3 where f3 is null; f3 NULL select t2.f2 from t1 left join t2 on f1=f2 join t3 on f1=f3 where f1=1; f2 1 drop table t1,t2,t3; create table t1(f1 char, f2 char not null); insert into t1 values(null,'a'); create table t2 (f2 char not null); Loading
mysql-test/t/select.test +14 −0 Original line number Diff line number Diff line Loading @@ -2806,6 +2806,20 @@ EXPLAIN SELECT t2.key_a,foo DROP TABLE t1,t2,t3; # # Bug #15633 Evaluation of Item_equal for non-const table caused wrong # select result # create table t1 (f1 int unique); create table t2 (f2 int unique); create table t3 (f3 int unique); insert into t1 values(1),(2); insert into t2 values(1),(2); insert into t3 values(1),(NULL); select * from t3 where f3 is null; select t2.f2 from t1 left join t2 on f1=f2 join t3 on f1=f3 where f1=1; drop table t1,t2,t3; # # Bug#15268 Unchecked null value caused server crash # Loading
sql/item_cmpfunc.cc +8 −3 Original line number Diff line number Diff line Loading @@ -3765,6 +3765,7 @@ void Item_equal::update_used_tables() longlong Item_equal::val_int() { Item_field *item_field; if (cond_false) return 0; List_iterator_fast<Item_field> it(fields); Loading @@ -3772,11 +3773,15 @@ longlong Item_equal::val_int() if ((null_value= item->null_value)) return 0; eval_item->store_value(item); while ((item= it++)) while ((item_field= it++)) { /* Skip fields of non-const tables. They haven't been read yet */ if (item_field->field->table->const_table) { if ((null_value= item->null_value) || eval_item->cmp(item)) if ((null_value= item_field->null_value) || eval_item->cmp(item_field)) return 0; } } return 1; } Loading
sql/item_cmpfunc.h +5 −0 Original line number Diff line number Diff line Loading @@ -1150,6 +1150,11 @@ class Item_cond :public Item_bool_func are deleted in the end of execution. All changes made to these objects need not be registered in the list of changes of the parse tree and do not harm PS/SP re-execution. Item equal objects are employed only at the optimize phase. Usually they are not supposed to be evaluated. Yet in some cases we call the method val_int() for them. We have to take care of restricting the predicate such an object represents f1=f2= ...=fn to the projection of known fields fi1=...=fik. */ class Item_equal: public Item_bool_func Loading