Commit f78a6059 authored by sergefp@mysql.com's avatar sergefp@mysql.com

Fix for BUG#6976:

In Item_ref::Item_ref set maybe_null (and other fields fix_fields sets) to be the 
same as in (*ref), because Item_ref::fix_fields() will not be called.  Previously 
maybe_null was 0 always and this produced a bogus state where 
maybe_null==0 && is_null() == true 
which broke evaluation for some upper-level Items, like AND and OR.
parent 13649d90
......@@ -626,3 +626,15 @@ explain SELECT i, COUNT(DISTINCT(i)) FROM t1 GROUP BY j ORDER BY NULL;
table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 6 Using filesort
DROP TABLE t1;
create table t1 (a int);
insert into t1 values(null);
select min(a) is null from t1;
min(a) is null
1
select min(a) is null or null from t1;
min(a) is null or null
1
select 1 and min(a) is null from t1;
1 and min(a) is null
1
drop table t1;
......@@ -447,3 +447,12 @@ INSERT INTO t1 VALUES (1,2),(2,3),(4,5),(3,5),(1,5),(23,5);
SELECT i, COUNT(DISTINCT(i)) FROM t1 GROUP BY j ORDER BY NULL;
explain SELECT i, COUNT(DISTINCT(i)) FROM t1 GROUP BY j ORDER BY NULL;
DROP TABLE t1;
#Test for BUG#6976: Aggregate functions have incorrect NULL-ness
create table t1 (a int);
insert into t1 values(null);
select min(a) is null from t1;
select min(a) is null or null from t1;
select 1 and min(a) is null from t1;
drop table t1;
......@@ -687,6 +687,7 @@ bool Item_null::send(THD *thd, String *packet)
/*
This is used for HAVING clause
Find field in select list having the same name
This is not always called, see also Item_ref::Item_ref
*/
bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables)
......
......@@ -401,7 +401,19 @@ public:
Item_ref(char *db_par,char *table_name_par,char *field_name_par)
:Item_ident(db_par,table_name_par,field_name_par),ref(0) {}
Item_ref(Item **item, char *table_name_par,char *field_name_par)
:Item_ident(NullS,table_name_par,field_name_par),ref(item) {}
:Item_ident(NullS,table_name_par,field_name_par),ref(item)
{
/*
This ctor is called from Item_XXX::split_sum_func, and fix_fields will
not be called for *this, so we must setup everything here. **ref is
already fixed at this point.
*/
max_length= (*ref)->max_length;
decimals= (*ref)->decimals;
binary= (*ref)->binary;
with_sum_func= (*ref)->with_sum_func;
maybe_null= (*ref)->maybe_null;
}
enum Type type() const { return REF_ITEM; }
bool eq(const Item *item, bool binary_cmp) const
{ return (*ref)->eq(item, binary_cmp); }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment