Commit b5c119e7 authored by unknown's avatar unknown

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.


mysql-test/r/group_by.result:
  Test for BUG#6976
mysql-test/t/group_by.test:
  Test for BUG#6976
sql/item.cc:
  Comment added
sql/item.h:
  Fix for BUG#6976:
    in Item_ref::Item_ref(Item**...) fix all fields because fix_fields() will not be called.
parent 9286d1c1
...@@ -626,3 +626,15 @@ explain SELECT i, COUNT(DISTINCT(i)) FROM t1 GROUP BY j ORDER BY NULL; ...@@ -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 table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 6 Using filesort t1 ALL NULL NULL NULL NULL 6 Using filesort
DROP TABLE t1; 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); ...@@ -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; 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; explain SELECT i, COUNT(DISTINCT(i)) FROM t1 GROUP BY j ORDER BY NULL;
DROP TABLE t1; 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) ...@@ -687,6 +687,7 @@ bool Item_null::send(THD *thd, String *packet)
/* /*
This is used for HAVING clause This is used for HAVING clause
Find field in select list having the same name 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) bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables)
......
...@@ -401,7 +401,19 @@ public: ...@@ -401,7 +401,19 @@ public:
Item_ref(char *db_par,char *table_name_par,char *field_name_par) 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_ident(db_par,table_name_par,field_name_par),ref(0) {}
Item_ref(Item **item, char *table_name_par,char *field_name_par) 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; } enum Type type() const { return REF_ITEM; }
bool eq(const Item *item, bool binary_cmp) const bool eq(const Item *item, bool binary_cmp) const
{ return (*ref)->eq(item, binary_cmp); } { 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