diff --git a/mysql-test/r/func_gconcat.result b/mysql-test/r/func_gconcat.result index 770a98f69f9ca76c26ae0ebb3d828c490d0a93fd..3b8d8abed9e78154cb0d3415875247f14a8c2869 100644 --- a/mysql-test/r/func_gconcat.result +++ b/mysql-test/r/func_gconcat.result @@ -177,3 +177,12 @@ ERROR HY000: Invalid use of group function select grp,group_concat(c order by 2) from t1 group by grp; ERROR 42S22: Unknown column '2' in 'group statement' drop table t1; +create table t1 (id int, name varchar(16)); +insert into t1 values (1,'longername'),(1,'evenlongername'); +select ifnull(group_concat(concat(t1.id, ':', t1.name)), 'shortname') as 'without distinct: how it should be' from t1; +without distinct: how it should be +1:longername,1:evenlongername +select distinct ifnull(group_concat(concat(t1.id, ':', t1.name)), 'shortname') as 'with distinct: cutoff at length of shortname' from t1; +with distinct: cutoff at length of shortname +1:longername,1:evenlongername +drop table t1; diff --git a/mysql-test/t/func_gconcat.test b/mysql-test/t/func_gconcat.test index 6409d8106c226bb86741be4be88395280c1ef7b6..7a13e396844f779e50dc518bd4b5c029f4cb2a32 100644 --- a/mysql-test/t/func_gconcat.test +++ b/mysql-test/t/func_gconcat.test @@ -93,3 +93,9 @@ select group_concat(sum(a)) from t1 group by grp; select grp,group_concat(c order by 2) from t1 group by grp; drop table t1; + +create table t1 (id int, name varchar(16)); +insert into t1 values (1,'longername'),(1,'evenlongername'); +select ifnull(group_concat(concat(t1.id, ':', t1.name)), 'shortname') as 'without distinct: how it should be' from t1; +select distinct ifnull(group_concat(concat(t1.id, ':', t1.name)), 'shortname') as 'with distinct: cutoff at length of shortname' from t1; +drop table t1; diff --git a/sql/item_sum.cc b/sql/item_sum.cc index 67dffb35724d6b45ca1e0cb9d4b24bc65b805f63..e16ff6969d347d7b034169391258492ea7c0839f 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -1114,7 +1114,7 @@ void Item_sum_count_distinct::make_unique() bool Item_sum_count_distinct::setup(THD *thd) { List<Item> list; - SELECT_LEX *select_lex= current_lex->current_select->select_lex(); + SELECT_LEX *select_lex= thd->lex.current_select->select_lex(); if (select_lex->linkage == GLOBAL_OPTIONS_TYPE) return 1; @@ -1599,7 +1599,7 @@ Item_func_group_concat::Item_func_group_concat(bool is_distinct, warning_available(0), key_length(0), rec_offset(0), tree_mode(0), distinct(is_distinct), warning_for_row(0), separator(is_separator), tree(&tree_base), table(0), - order(0), tables_list(0), group_concat_max_len(0), + order(0), tables_list(0), show_elements(0), arg_count_order(0), arg_count_field(0), arg_show_fields(0), count_cut_values(0) @@ -1607,8 +1607,11 @@ Item_func_group_concat::Item_func_group_concat(bool is_distinct, original= 0; quick_group= 0; mark_as_sum_func(); - SELECT_LEX *select_lex= current_lex->current_select->select_lex(); + item_thd= current_thd; + SELECT_LEX *select_lex= item_thd->lex.current_select->select_lex(); order= 0; + group_concat_max_len= item_thd->variables.group_concat_max_len; + arg_show_fields= arg_count_field= is_select->elements; arg_count_order= is_order ? is_order->elements : 0; @@ -1773,7 +1776,7 @@ Item_func_group_concat::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) } result_field= 0; null_value= 1; - fix_length_and_dec(); + max_length= group_concat_max_len; thd->allow_sum_func= 1; if (!(tmp_table_param= new TMP_TABLE_PARAM)) return 1; @@ -1786,7 +1789,7 @@ Item_func_group_concat::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) bool Item_func_group_concat::setup(THD *thd) { List<Item> list; - SELECT_LEX *select_lex= current_lex->current_select->select_lex(); + SELECT_LEX *select_lex= thd->lex.current_select->select_lex(); if (select_lex->linkage == GLOBAL_OPTIONS_TYPE) return 1; @@ -1873,9 +1876,6 @@ bool Item_func_group_concat::setup(THD *thd) max_elements_in_tree= ((key_length) ? thd->variables.max_heap_table_size/key_length : 1); }; - item_thd= thd; - - group_concat_max_len= thd->variables.group_concat_max_len; /* Copy table and tree_mode if they belong to this item (if item have not diff --git a/sql/item_sum.h b/sql/item_sum.h index c4876201a7c023b0cc341c1207e3d229d6c7c3fd..6f0d7a028a7ed30ed3ae50ad8cd56e5bfe542018 100644 --- a/sql/item_sum.h +++ b/sql/item_sum.h @@ -713,7 +713,6 @@ class Item_func_group_concat : public Item_sum enum Sumfunctype sum_func () const {return GROUP_CONCAT_FUNC;} const char *func_name() const { return "group_concat"; } enum Type type() const { return SUM_FUNC_ITEM; } - void fix_length_and_dec() { max_length=group_concat_max_len; } virtual Item_result result_type () const { return STRING_RESULT; } bool reset(); bool add();