Commit dfc328e1 authored by unknown's avatar unknown
Browse files

Manual merge

parents 7c69d4a3 792221e3
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -2151,6 +2151,15 @@ select * from v1;
strcmp(f1,'a')
drop view v1;
drop table t1;
create table t1 (f1 int, f2 int,f3 int);
insert into t1 values (1,10,20),(2,0,0);
create view v1 as select * from t1;
select if(sum(f1)>1,f2,f3) from v1 group by f1;
if(sum(f1)>1,f2,f3)
20
0
drop view v1;
drop table t1;
create table t1 (
r_object_id char(16) NOT NULL,
group_name varchar(32) NOT NULL
+8 −0
Original line number Diff line number Diff line
@@ -2020,6 +2020,14 @@ drop view v1;
drop table t1;

#
# Bug #12922 if(sum(),...) with group from view returns wrong results 
#
create table t1 (f1 int, f2 int,f3 int);
insert into t1 values (1,10,20),(2,0,0);
create view v1 as select * from t1;
select if(sum(f1)>1,f2,f3) from v1 group by f1;
drop view v1;
drop table t1;
# BUG#12941
#
create table t1 (
+9 −7
Original line number Diff line number Diff line
@@ -1022,9 +1022,9 @@ void Item::split_sum_func2(THD *thd, Item **ref_pointer_array,
    /* Will split complicated items and ignore simple ones */
    split_sum_func(thd, ref_pointer_array, fields);
  }
  else if ((type() == SUM_FUNC_ITEM ||
            (used_tables() & ~PARAM_TABLE_BIT)) &&
           type() != REF_ITEM)
  else if ((type() == SUM_FUNC_ITEM || (used_tables() & ~PARAM_TABLE_BIT)) &&
           (type() != REF_ITEM ||
           ((Item_ref*)this)->ref_type() == Item_ref::VIEW_REF))
  {
    /*
      Replace item with a reference so that we can easily calculate
@@ -1033,15 +1033,17 @@ void Item::split_sum_func2(THD *thd, Item **ref_pointer_array,
      The test above is to ensure we don't do a reference for things
      that are constants (PARAM_TABLE_BIT is in effect a constant)
      or already referenced (for example an item in HAVING)
      Exception is Item_direct_view_ref which we need to convert to
      Item_ref to allow fields from view being stored in tmp table.
    */
    uint el= fields.elements;
    Item *new_item;    
    ref_pointer_array[el]= this;
    Item *new_item, *real_item= real_item();

    ref_pointer_array[el]= real_item;
    if (!(new_item= new Item_ref(&thd->lex->current_select->context,
                                 ref_pointer_array + el, 0, name)))
      return;                                   // fatal_error is set
    fields.push_front(this);
    ref_pointer_array[el]= this;
    fields.push_front(real_item);
    thd->change_item_tree(ref, new_item);
  }
}
+4 −0
Original line number Diff line number Diff line
@@ -1537,6 +1537,7 @@ class Item_ref :public Item_ident
protected:
  void set_properties();
public:
  enum Ref_Type { REF, DIRECT_REF, VIEW_REF };
  Field *result_field;			 /* Save result here */
  Item **ref;
  Item_ref(Name_resolution_context *context_arg,
@@ -1617,6 +1618,7 @@ class Item_ref :public Item_ident
  void cleanup();
  Item_field *filed_for_view_update()
    { return (*ref)->filed_for_view_update(); }
  virtual Ref_Type ref_type() { return REF; }
};


@@ -1641,6 +1643,7 @@ class Item_direct_ref :public Item_ref
  bool val_bool();
  bool is_null();
  bool get_date(TIME *ltime,uint fuzzydate);
  virtual Ref_Type ref_type() { return DIRECT_REF; }
};

/*
@@ -1660,6 +1663,7 @@ class Item_direct_view_ref :public Item_direct_ref

  bool fix_fields(THD *, Item **);
  bool eq(const Item *item, bool binary_cmp) const;
  virtual Ref_Type ref_type() { return VIEW_REF; }
};