Commit 56479967 authored by ram@gw.mysql.r18.ru's avatar ram@gw.mysql.r18.ru

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

into gw.mysql.r18.ru:/usr/home/ram/work/4.1.b4035
parents 83e6c51c 438a7d01
...@@ -157,11 +157,8 @@ grp group_concat(c) ...@@ -157,11 +157,8 @@ grp group_concat(c)
3 D,D,E 3 D,D,E
4 4
5 NULL 5 NULL
Warnings:
Warning 1260 1 line(s) was(were) cut by group_concat()
show warnings; show warnings;
Level Code Message Level Code Message
Warning 1260 1 line(s) was(were) cut by group_concat()
set group_concat_max_len = 1024; set group_concat_max_len = 1024;
select group_concat(sum(a)) from t1 group by grp; select group_concat(sum(a)) from t1 group by grp;
ERROR HY000: Invalid use of group function ERROR HY000: Invalid use of group function
...@@ -310,3 +307,14 @@ GROUP_CONCAT(t1.a*t2.a ORDER BY t2.a) ...@@ -310,3 +307,14 @@ GROUP_CONCAT(t1.a*t2.a ORDER BY t2.a)
1,2 1,2
2,4 2,4
DROP TABLE t1, t2; 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;
...@@ -189,3 +189,15 @@ INSERT INTO t1 VALUES (1), (2); ...@@ -189,3 +189,15 @@ INSERT INTO t1 VALUES (1), (2);
INSERT INTO t2 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; SELECT GROUP_CONCAT(t1.a*t2.a ORDER BY t2.a) FROM t1, t2 GROUP BY t1.a;
DROP TABLE t1, t2; 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;
...@@ -950,17 +950,10 @@ String *Item_func_left::val_str(String *str) ...@@ -950,17 +950,10 @@ String *Item_func_left::val_str(String *str)
return 0; return 0;
if (length <= 0) if (length <= 0)
return &my_empty_string; return &my_empty_string;
length= res->charpos(length); if (res->length() <= (uint) 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);
}
return res; return res;
str_value.set(*res, 0, res->charpos(length));
return &str_value;
} }
......
...@@ -1685,6 +1685,9 @@ int dump_leaf_key(byte* key, uint32 count __attribute__((unused)), ...@@ -1685,6 +1685,9 @@ int dump_leaf_key(byte* key, uint32 count __attribute__((unused)),
String tmp((char *)&buff,sizeof(buff),default_charset_info), tmp2; String tmp((char *)&buff,sizeof(buff),default_charset_info), tmp2;
char *record= (char*) item->table->record[0]; char *record= (char*) item->table->record[0];
if (item->result.length())
item->result.append(*item->separator);
tmp.length(0); tmp.length(0);
for (uint i= 0; i < item->arg_count_field; i++) for (uint i= 0; i < item->arg_count_field; i++)
...@@ -1714,14 +1717,6 @@ int dump_leaf_key(byte* key, uint32 count __attribute__((unused)), ...@@ -1714,14 +1717,6 @@ int dump_leaf_key(byte* key, uint32 count __attribute__((unused)),
item->result.append(*res); 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 */ /* stop if length of result more than group_concat_max_len */
if (item->result.length() > item->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, ...@@ -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), tree_mode(0), distinct(is_distinct), warning_for_row(0),
separator(is_separator), tree(&tree_base), table(0), separator(is_separator), tree(&tree_base), table(0),
order(0), tables_list(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) count_cut_values(0)
{ {
Item *item_select; Item *item_select;
...@@ -1818,7 +1813,6 @@ Item_func_group_concat::Item_func_group_concat(THD *thd, ...@@ -1818,7 +1813,6 @@ Item_func_group_concat::Item_func_group_concat(THD *thd,
order(item->order), order(item->order),
tables_list(item->tables_list), tables_list(item->tables_list),
group_concat_max_len(item->group_concat_max_len), group_concat_max_len(item->group_concat_max_len),
show_elements(item->show_elements),
arg_count_order(item->arg_count_order), arg_count_order(item->arg_count_order),
arg_count_field(item->arg_count_field), arg_count_field(item->arg_count_field),
field_list_offset(item->field_list_offset), field_list_offset(item->field_list_offset),
...@@ -2126,15 +2120,9 @@ String* Item_func_group_concat::val_str(String* str) ...@@ -2126,15 +2120,9 @@ String* Item_func_group_concat::val_str(String* str)
return 0; return 0;
if (tree_mode) if (tree_mode)
{ {
show_elements= 0;
tree_walk(tree, (tree_walk_action)&dump_leaf_key, (void*)this, tree_walk(tree, (tree_walk_action)&dump_leaf_key, (void*)this,
left_root_right); left_root_right);
} }
else
{
if (!warning_for_row)
result.length(result.length()-separator->length());
}
if (count_cut_values && !warning_available) if (count_cut_values && !warning_available)
{ {
warning_available= TRUE; warning_available= TRUE;
......
...@@ -696,7 +696,6 @@ class Item_func_group_concat : public Item_sum ...@@ -696,7 +696,6 @@ class Item_func_group_concat : public Item_sum
ORDER **order; ORDER **order;
TABLE_LIST *tables_list; TABLE_LIST *tables_list;
ulong group_concat_max_len; ulong group_concat_max_len;
uint show_elements;
uint arg_count_order; uint arg_count_order;
uint arg_count_field; uint arg_count_field;
uint field_list_offset; uint field_list_offset;
......
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