mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Merge
This commit is contained in:
@ -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
|
||||
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
#
|
||||
|
@ -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);
|
||||
@ -3772,10 +3773,14 @@ 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++))
|
||||
{
|
||||
if ((null_value= item->null_value) || eval_item->cmp(item))
|
||||
return 0;
|
||||
/* Skip fields of non-const tables. They haven't been read yet */
|
||||
if (item_field->field->table->const_table)
|
||||
{
|
||||
if ((null_value= item_field->null_value) || eval_item->cmp(item_field))
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
@ -1150,6 +1150,11 @@ public:
|
||||
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
|
||||
|
Reference in New Issue
Block a user