summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <ram@gw.mysql.r18.ru>2004-06-15 16:03:16 +0500
committerunknown <ram@gw.mysql.r18.ru>2004-06-15 16:03:16 +0500
commit0f83847940dfa10ba641230607e52321f27df3a8 (patch)
tree28411be61405a826e3a2858d4e85950cfdd255f8
parent125f840133735bc1031d06612aa04f07800066b2 (diff)
parent2ef5b0ed4e87c38ad031b3005cdbd05a09fef69b (diff)
downloadmariadb-git-0f83847940dfa10ba641230607e52321f27df3a8.tar.gz
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
-rw-r--r--mysql-test/r/func_gconcat.result14
-rw-r--r--mysql-test/t/func_gconcat.test12
-rw-r--r--sql/item_strfunc.cc15
-rw-r--r--sql/item_sum.cc20
-rw-r--r--sql/item_sum.h1
5 files changed, 31 insertions, 31 deletions
diff --git a/mysql-test/r/func_gconcat.result b/mysql-test/r/func_gconcat.result
index 43bcf94d6d9..0c744d1dff6 100644
--- a/mysql-test/r/func_gconcat.result
+++ b/mysql-test/r/func_gconcat.result
@@ -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;
diff --git a/mysql-test/t/func_gconcat.test b/mysql-test/t/func_gconcat.test
index 2448a1d3209..5ddc93e767b 100644
--- a/mysql-test/t/func_gconcat.test
+++ b/mysql-test/t/func_gconcat.test
@@ -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;
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index 5d8fe8c4aef..b0c685c1c46 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -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);
- }
- return res;
+ if (res->length() <= (uint) length)
+ return res;
+ str_value.set(*res, 0, res->charpos(length));
+ return &str_value;
}
diff --git a/sql/item_sum.cc b/sql/item_sum.cc
index 098ccf70861..7a8e15e0a9d 100644
--- a/sql/item_sum.cc
+++ b/sql/item_sum.cc
@@ -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;
diff --git a/sql/item_sum.h b/sql/item_sum.h
index be8bb28e16b..507a36194de 100644
--- a/sql/item_sum.h
+++ b/sql/item_sum.h
@@ -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;