Commit 0f838479 authored by unknown's avatar unknown
Browse files

Merge rkalimullin@bk-internal.mysql.com:/home/bk/mysql-4.1

into gw.mysql.r18.ru:/usr/home/ram/work/4.1.b4035


sql/item_strfunc.cc:
  Auto merged
sql/item_sum.cc:
  Auto merged
sql/item_sum.h:
  Auto merged
parents 125f8401 2ef5b0ed
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -157,11 +157,8 @@ grp group_concat(c)
3	D,D,E
4	
5	NULL
Warnings:
Warning	1260	1 line(s) was(were) cut by group_concat()
show warnings;
Level	Code	Message
Warning	1260	1 line(s) was(were) cut by group_concat()
set group_concat_max_len = 1024;
select group_concat(sum(a)) from t1 group by grp;
ERROR HY000: Invalid use of group function
@@ -310,3 +307,14 @@ GROUP_CONCAT(t1.a*t2.a ORDER BY t2.a)
1,2
2,4
DROP TABLE t1, t2;
CREATE TABLE t1 (a char(4));
INSERT INTO t1 VALUES ('John'), ('Anna'), ('Bill');
SELECT GROUP_CONCAT(a SEPARATOR '||') AS names FROM t1 
HAVING names LIKE '%An%';
names
John||Anna||Bill
SELECT GROUP_CONCAT(a SEPARATOR '###') AS names FROM t1 
HAVING LEFT(names, 1) ='J';
names
John###Anna###Bill
DROP TABLE t1;
+12 −0
Original line number Diff line number Diff line
@@ -189,3 +189,15 @@ INSERT INTO t1 VALUES (1), (2);
INSERT INTO t2 VALUES (1), (2);
SELECT GROUP_CONCAT(t1.a*t2.a ORDER BY t2.a) FROM t1, t2 GROUP BY t1.a;
DROP TABLE t1, t2;

#
# Bug #4035: group_concat() and HAVING
#

CREATE TABLE t1 (a char(4));
INSERT INTO t1 VALUES ('John'), ('Anna'), ('Bill');
SELECT GROUP_CONCAT(a SEPARATOR '||') AS names FROM t1 
  HAVING names LIKE '%An%';
SELECT GROUP_CONCAT(a SEPARATOR '###') AS names FROM t1 
  HAVING LEFT(names, 1) ='J';
DROP TABLE t1;
+4 −11
Original line number Diff line number Diff line
@@ -950,17 +950,10 @@ String *Item_func_left::val_str(String *str)
    return 0;
  if (length <= 0)
    return &my_empty_string;
  length= res->charpos(length);
  if (res->length() > (ulong) length)
  {						// Safe even if const arg
    if (!res->alloced_length())
    {						// Don't change const str
      str_value= *res;				// Not malloced string
      res= &str_value;
    }
    res->length((uint) length);
  }
  if (res->length() <= (uint) length)
    return res;
  str_value.set(*res, 0, res->charpos(length));
  return &str_value;
}


+4 −16
Original line number Diff line number Diff line
@@ -1685,6 +1685,9 @@ int dump_leaf_key(byte* key, uint32 count __attribute__((unused)),
  String tmp((char *)&buff,sizeof(buff),default_charset_info), tmp2;
  char *record= (char*) item->table->record[0];

  if (item->result.length())
    item->result.append(*item->separator);

  tmp.length(0);
  
  for (uint i= 0; i < item->arg_count_field; i++)
@@ -1714,14 +1717,6 @@ int dump_leaf_key(byte* key, uint32 count __attribute__((unused)),
        item->result.append(*res);
    }
  }
  if (item->tree_mode) // Last item of tree
  {
    item->show_elements++;
    if (item->show_elements < item->tree->elements_in_tree)
      item->result.append(*item->separator);
  }
  else
    item->result.append(*item->separator); 

  /* stop if length of result more than group_concat_max_len */  
  if (item->result.length() > item->group_concat_max_len)
@@ -1752,7 +1747,7 @@ Item_func_group_concat::Item_func_group_concat(bool is_distinct,
   tree_mode(0), distinct(is_distinct), warning_for_row(0),
   separator(is_separator), tree(&tree_base), table(0),
   order(0), tables_list(0),
   show_elements(0), arg_count_order(0), arg_count_field(0),
   arg_count_order(0), arg_count_field(0),
   count_cut_values(0)
{
  Item *item_select;
@@ -1818,7 +1813,6 @@ Item_func_group_concat::Item_func_group_concat(THD *thd,
  order(item->order),
  tables_list(item->tables_list),
  group_concat_max_len(item->group_concat_max_len),
  show_elements(item->show_elements),
  arg_count_order(item->arg_count_order),
  arg_count_field(item->arg_count_field),
  field_list_offset(item->field_list_offset),
@@ -2126,15 +2120,9 @@ String* Item_func_group_concat::val_str(String* str)
    return 0;
  if (tree_mode)
  {
    show_elements= 0;
    tree_walk(tree, (tree_walk_action)&dump_leaf_key, (void*)this,
              left_root_right);
  }
  else
  {
    if (!warning_for_row)
      result.length(result.length()-separator->length());
  }
  if (count_cut_values && !warning_available)
  {
    warning_available= TRUE;
+0 −1
Original line number Diff line number Diff line
@@ -696,7 +696,6 @@ class Item_func_group_concat : public Item_sum
  ORDER **order;
  TABLE_LIST *tables_list;
  ulong group_concat_max_len;
  uint show_elements;
  uint arg_count_order;
  uint arg_count_field;
  uint field_list_offset;