Commit 75a43405 authored by unknown's avatar unknown
Browse files

Merged (will need a post-merge fix)


sql/item.h:
  Auto merged
sql/item_cmpfunc.cc:
  Auto merged
parents c9a0e4ad 6d7fe852
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -638,3 +638,15 @@ alias
1,2
1
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;
+9 −0
Original line number Diff line number Diff line
@@ -465,3 +465,12 @@ select group_concat( distinct col1 ) as alias from 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;
+2 −3
Original line number Diff line number Diff line
@@ -1488,14 +1488,13 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
		   "forward reference in item list");
	  return -1;
	}

	Item_ref *rf= (place == IN_HAVING ?
                       new Item_ref(last->ref_pointer_array + counter,
                                    (char *)table_name,
                                    (char *)field_name) :
                                    (char *)field_name, this) :
                       new Item_direct_ref(last->ref_pointer_array + counter,
                                           (char *)table_name,
                                           (char *)field_name));
                                           (char *)field_name, this));
	if (!rf)
	  return 1;
        thd->change_item_tree(ref, rf);
+21 −0
Original line number Diff line number Diff line
@@ -835,6 +835,26 @@ class Item_ref :public Item_ident
    :Item_ident(db_par, table_name_par, field_name_par), ref(0) {}
  Item_ref(Item **item, const char *table_name_par, const char *field_name_par)
    :Item_ident(NullS, table_name_par, field_name_par), ref(item) {}
  
  /*
    This constructor is used when processing GROUP BY and referred Item is 
    available. We set all properties here because fix_fields() will not be 
    called for the created Item_ref. (see BUG#6976) 
    TODO check if we could get rid of *_name_par parameters and if we need to 
         perform similar initialization for other ctors.
    TODO we probably fix a superset of problems like in BUG#6658. Check this 
         with Bar, and if we have a more broader set of problems like this.
  */
  Item_ref(Item **item, const char *table_name_par, 
           const char *field_name_par, Item *src)
    : Item_ident(NullS, table_name_par, field_name_par), ref(item)
  {
    collation.set(src->collation);
    max_length= src->max_length;
    decimals=	src->decimals;
    with_sum_func= src->with_sum_func;
    maybe_null= src->maybe_null;
  }
  /* Constructor need to process subselect with temporary tables (see Item) */
  Item_ref(THD *thd, Item_ref *item) :Item_ident(thd, item), ref(item->ref) {}
  enum Type type() const		{ return REF_ITEM; }
@@ -933,6 +953,7 @@ class Item_direct_ref :public Item_ref


class Item_in_subselect;

class Item_ref_null_helper: public Item_ref
{
protected:
+2 −1
Original line number Diff line number Diff line
@@ -2022,7 +2022,8 @@ void Item_cond::split_sum_func(THD *thd, Item **ref_pointer_array,
    {
      Item **ref= li.ref();
      uint el= fields.elements;
      Item *new_item= new Item_ref(ref_pointer_array + el, 0, item->name);
      Item *new_item= new Item_ref(ref_pointer_array + el, 0, item->name,
                                   item);
      fields.push_front(item);
      ref_pointer_array[el]= item;
      thd->change_item_tree(ref, new_item);
Loading