diff --git a/mysql-test/r/func_gconcat.result b/mysql-test/r/func_gconcat.result index 770a98f69f9..15b406bcdda 100644 --- a/mysql-test/r/func_gconcat.result +++ b/mysql-test/r/func_gconcat.result @@ -1,6 +1,4 @@ -drop table if exists t1; -Warnings: -Note 1051 Unknown table 't1' +drop table if exists t1, t2; create table t1 (grp int, a bigint unsigned, c char(10) not null, d char(10) not null); insert into t1 values (1,1,"a","a"); insert into t1 values (2,2,"b","a"); @@ -155,25 +153,28 @@ show warnings; Level Code Message Warning 1258 1 line(s) was(were) cut by group_concat() set group_concat_max_len = 1024; -drop table if exists T_URL; -Warnings: -Note 1051 Unknown table 'T_URL' -create table T_URL ( URL_ID int(11), URL varchar(80)); -drop table if exists T_REQUEST; -Warnings: -Note 1051 Unknown table 'T_REQUEST' -create table T_REQUEST ( REQ_ID int(11), URL_ID int(11)); -insert into T_URL values (4,'www.host.com'), (5,'www.google.com'),(5,'www.help.com'); -insert into T_REQUEST values (1,4), (5,4), (5,5); -select REQ_ID, Group_Concat(URL) as URL from T_URL, T_REQUEST where -T_REQUEST.URL_ID = T_URL.URL_ID group by REQ_ID; -REQ_ID URL -1 X -5 X,X,X -drop table T_URL; -drop table T_REQUEST; select group_concat(sum(a)) from t1 group by grp; 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 ( URL_ID int(11), URL varchar(80)); +create table t2 ( REQ_ID int(11), URL_ID int(11)); +insert into t1 values (4,'www.host.com'), (5,'www.google.com'),(5,'www.help.com'); +insert into t2 values (1,4), (5,4), (5,5); +select REQ_ID, Group_Concat(URL) as URL from t1, t2 where +t2.URL_ID = t1.URL_ID group by REQ_ID; +REQ_ID URL +1 X +5 X,X,X +drop table t1; +drop table t2; +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 6409d8106c2..f426f9ca4ee 100644 --- a/mysql-test/t/func_gconcat.test +++ b/mysql-test/t/func_gconcat.test @@ -1,8 +1,10 @@ # # simple test of group_concat function # +--disable_warnings +drop table if exists t1, t2; +--enable_warnings -drop table if exists t1; create table t1 (grp int, a bigint unsigned, c char(10) not null, d char(10) not null); insert into t1 values (1,1,"a","a"); insert into t1 values (2,2,"b","a"); @@ -70,21 +72,6 @@ select grp,group_concat(c) from t1 group by grp; show warnings; set group_concat_max_len = 1024; -# Test variable length - -drop table if exists T_URL; -create table T_URL ( URL_ID int(11), URL varchar(80)); -drop table if exists T_REQUEST; -create table T_REQUEST ( REQ_ID int(11), URL_ID int(11)); -insert into T_URL values (4,'www.host.com'), (5,'www.google.com'),(5,'www.help.com'); -insert into T_REQUEST values (1,4), (5,4), (5,5); -# Make this order independent ---replace_result www.help.com X www.host.com X www.google.com X -select REQ_ID, Group_Concat(URL) as URL from T_URL, T_REQUEST where -T_REQUEST.URL_ID = T_URL.URL_ID group by REQ_ID; -drop table T_URL; -drop table T_REQUEST; - # Test errors --error 1111 @@ -93,3 +80,22 @@ 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; + +# Test variable length + +create table t1 ( URL_ID int(11), URL varchar(80)); +create table t2 ( REQ_ID int(11), URL_ID int(11)); +insert into t1 values (4,'www.host.com'), (5,'www.google.com'),(5,'www.help.com'); +insert into t2 values (1,4), (5,4), (5,5); +# Make this order independent +--replace_result www.help.com X www.host.com X www.google.com X +select REQ_ID, Group_Concat(URL) as URL from t1, t2 where +t2.URL_ID = t1.URL_ID group by REQ_ID; +drop table t1; +drop table t2; + +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 67dffb35724..8d3d0de466a 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 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; @@ -1785,11 +1788,12 @@ Item_func_group_concat::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) bool Item_func_group_concat::setup(THD *thd) { + DBUG_ENTER("Item_func_group_concat::setup"); List 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; + DBUG_RETURN(1); /* all not constant fields are push to list and create temp table */ @@ -1798,7 +1802,7 @@ bool Item_func_group_concat::setup(THD *thd) { Item *item= args[i]; if (list.push_back(item)) - return 1; + DBUG_RETURN(1); if (item->const_item()) { (void) item->val_int(); @@ -1807,7 +1811,7 @@ bool Item_func_group_concat::setup(THD *thd) } } if (always_null) - return 0; + DBUG_RETURN(0); List all_fields(list); if (arg_count_order) @@ -1818,13 +1822,18 @@ bool Item_func_group_concat::setup(THD *thd) } count_field_types(tmp_table_param,all_fields,0); + if (table) + { + free_tmp_table(thd, table); + tmp_table_param->cleanup(); + } /* We have to create a temporary table for that we get descriptions of fields (types, sizes and so on). */ if (!(table=create_tmp_table(thd, tmp_table_param, all_fields, 0, - 0, 0, 0,select_lex->options | thd->options))) - return 1; + 0, 0, 0,select_lex->options | thd->options))) + DBUG_RETURN(1); table->file->extra(HA_EXTRA_NO_ROWS); table->no_rows= 1; @@ -1873,9 +1882,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 @@ -1886,7 +1892,7 @@ bool Item_func_group_concat::setup(THD *thd) original->table= table; original->tree_mode= tree_mode; } - return 0; + DBUG_RETURN(0); } /* This is used by rollup to create a separate usable copy of the function */ diff --git a/sql/item_sum.h b/sql/item_sum.h index c4876201a7c..6f0d7a028a7 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();