Loading mysql-test/r/func_gconcat.result +15 −0 Original line number Diff line number Diff line Loading @@ -589,3 +589,18 @@ GROUP_CONCAT(a ORDER BY a) ,x ,z DROP TABLE t1; create table t1(f1 int); insert into t1 values(1),(2),(3); select f1, group_concat(f1+1) from t1 group by f1 with rollup; f1 group_concat(f1+1) 1 2 2 3 3 4 NULL 2,3,4 select count(distinct (f1+1)) from t1 group by f1 with rollup; count(distinct (f1+1)) 1 1 1 3 drop table t1; mysql-test/t/func_gconcat.test +8 −0 Original line number Diff line number Diff line Loading @@ -382,4 +382,12 @@ SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY id; DROP TABLE t1; # # Bug #15560: GROUP_CONCAT wasn't ready for WITH ROLLUP queries # create table t1(f1 int); insert into t1 values(1),(2),(3); select f1, group_concat(f1+1) from t1 group by f1 with rollup; select count(distinct (f1+1)) from t1 group by f1 with rollup; drop table t1; # End of 4.1 tests sql/item_sum.cc +6 −0 Original line number Diff line number Diff line Loading @@ -1185,6 +1185,7 @@ void Item_sum_count_distinct::make_unique() original= 0; use_tree= 0; // to prevent delete_tree call on uninitialized tree tree= &tree_base; force_copy_fields= 1; } Loading Loading @@ -1219,6 +1220,7 @@ bool Item_sum_count_distinct::setup(THD *thd) free_tmp_table(thd, table); tmp_table_param->cleanup(); } tmp_table_param->force_copy_fields= force_copy_fields; if (!(table= create_tmp_table(thd, tmp_table_param, list, (ORDER*) 0, 1, 0, select_lex->options | thd->options, Loading Loading @@ -1724,6 +1726,7 @@ Item_func_group_concat::Item_func_group_concat(bool is_distinct, String *is_separator) :Item_sum(), tmp_table_param(0), max_elements_in_tree(0), warning(0), key_length(0), tree_mode(0), distinct(is_distinct), warning_for_row(0), force_copy_fields(0), separator(is_separator), tree(&tree_base), table(0), order(0), tables_list(0), arg_count_order(0), arg_count_field(0), Loading Loading @@ -1785,6 +1788,7 @@ Item_func_group_concat::Item_func_group_concat(THD *thd, tree_mode(item->tree_mode), distinct(item->distinct), warning_for_row(item->warning_for_row), force_copy_fields(item->force_copy_fields), separator(item->separator), tree(item->tree), table(item->table), Loading Loading @@ -2004,6 +2008,7 @@ bool Item_func_group_concat::setup(THD *thd) free_tmp_table(thd, table); tmp_table_param->cleanup(); } tmp_table_param->force_copy_fields= force_copy_fields; /* We have to create a temporary table to get descriptions of fields (types, sizes and so on). Loading Loading @@ -2079,6 +2084,7 @@ void Item_func_group_concat::make_unique() original= 0; tree_mode= 0; // to prevent delete_tree call on uninitialized tree tree= &tree_base; force_copy_fields= 1; } Loading sql/item_sum.h +6 −3 Original line number Diff line number Diff line Loading @@ -185,6 +185,7 @@ class Item_sum_count_distinct :public Item_sum_int TMP_TABLE_PARAM *tmp_table_param; TREE tree_base; TREE *tree; bool force_copy_fields; /* Following is 0 normal object and pointer to original one for copy (to correctly free resources) Loading Loading @@ -226,15 +227,16 @@ class Item_sum_count_distinct :public Item_sum_int public: Item_sum_count_distinct(List<Item> &list) :Item_sum_int(list), table(0), used_table_cache(~(table_map) 0), tmp_table_param(0), tree(&tree_base), original(0), use_tree(0), always_null(0) tmp_table_param(0), tree(&tree_base), force_copy_fields(0), original(0), use_tree(0), always_null(0) { quick_group= 0; } Item_sum_count_distinct(THD *thd, Item_sum_count_distinct *item) :Item_sum_int(thd, item), table(item->table), used_table_cache(item->used_table_cache), field_lengths(item->field_lengths), tmp_table_param(item->tmp_table_param), tree(item->tree), original(item), key_length(item->key_length), tree(item->tree), force_copy_fields(item->force_copy_fields), original(item), key_length(item->key_length), max_elements_in_tree(item->max_elements_in_tree), rec_offset(item->rec_offset), use_tree(item->use_tree), always_null(item->always_null) Loading Loading @@ -685,6 +687,7 @@ class Item_func_group_concat : public Item_sum bool distinct; bool warning_for_row; bool always_null; bool force_copy_fields; friend int group_concat_key_cmp_with_distinct(void* arg, byte* key1, byte* key2); Loading sql/mysql_priv.h +3 −2 Original line number Diff line number Diff line Loading @@ -538,7 +538,8 @@ int mysql_union(THD *thd, LEX *lex, select_result *result, int mysql_handle_derived(LEX *lex); Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, Item ***copy_func, Field **from_field, bool group, bool modify_item, uint convert_blob_length); bool group, bool modify_item, uint convert_blob_length, bool make_copy_field); int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, List<create_field> &fields, List<Key> &keys, uint &db_options, Loading Loading
mysql-test/r/func_gconcat.result +15 −0 Original line number Diff line number Diff line Loading @@ -589,3 +589,18 @@ GROUP_CONCAT(a ORDER BY a) ,x ,z DROP TABLE t1; create table t1(f1 int); insert into t1 values(1),(2),(3); select f1, group_concat(f1+1) from t1 group by f1 with rollup; f1 group_concat(f1+1) 1 2 2 3 3 4 NULL 2,3,4 select count(distinct (f1+1)) from t1 group by f1 with rollup; count(distinct (f1+1)) 1 1 1 3 drop table t1;
mysql-test/t/func_gconcat.test +8 −0 Original line number Diff line number Diff line Loading @@ -382,4 +382,12 @@ SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY id; DROP TABLE t1; # # Bug #15560: GROUP_CONCAT wasn't ready for WITH ROLLUP queries # create table t1(f1 int); insert into t1 values(1),(2),(3); select f1, group_concat(f1+1) from t1 group by f1 with rollup; select count(distinct (f1+1)) from t1 group by f1 with rollup; drop table t1; # End of 4.1 tests
sql/item_sum.cc +6 −0 Original line number Diff line number Diff line Loading @@ -1185,6 +1185,7 @@ void Item_sum_count_distinct::make_unique() original= 0; use_tree= 0; // to prevent delete_tree call on uninitialized tree tree= &tree_base; force_copy_fields= 1; } Loading Loading @@ -1219,6 +1220,7 @@ bool Item_sum_count_distinct::setup(THD *thd) free_tmp_table(thd, table); tmp_table_param->cleanup(); } tmp_table_param->force_copy_fields= force_copy_fields; if (!(table= create_tmp_table(thd, tmp_table_param, list, (ORDER*) 0, 1, 0, select_lex->options | thd->options, Loading Loading @@ -1724,6 +1726,7 @@ Item_func_group_concat::Item_func_group_concat(bool is_distinct, String *is_separator) :Item_sum(), tmp_table_param(0), max_elements_in_tree(0), warning(0), key_length(0), tree_mode(0), distinct(is_distinct), warning_for_row(0), force_copy_fields(0), separator(is_separator), tree(&tree_base), table(0), order(0), tables_list(0), arg_count_order(0), arg_count_field(0), Loading Loading @@ -1785,6 +1788,7 @@ Item_func_group_concat::Item_func_group_concat(THD *thd, tree_mode(item->tree_mode), distinct(item->distinct), warning_for_row(item->warning_for_row), force_copy_fields(item->force_copy_fields), separator(item->separator), tree(item->tree), table(item->table), Loading Loading @@ -2004,6 +2008,7 @@ bool Item_func_group_concat::setup(THD *thd) free_tmp_table(thd, table); tmp_table_param->cleanup(); } tmp_table_param->force_copy_fields= force_copy_fields; /* We have to create a temporary table to get descriptions of fields (types, sizes and so on). Loading Loading @@ -2079,6 +2084,7 @@ void Item_func_group_concat::make_unique() original= 0; tree_mode= 0; // to prevent delete_tree call on uninitialized tree tree= &tree_base; force_copy_fields= 1; } Loading
sql/item_sum.h +6 −3 Original line number Diff line number Diff line Loading @@ -185,6 +185,7 @@ class Item_sum_count_distinct :public Item_sum_int TMP_TABLE_PARAM *tmp_table_param; TREE tree_base; TREE *tree; bool force_copy_fields; /* Following is 0 normal object and pointer to original one for copy (to correctly free resources) Loading Loading @@ -226,15 +227,16 @@ class Item_sum_count_distinct :public Item_sum_int public: Item_sum_count_distinct(List<Item> &list) :Item_sum_int(list), table(0), used_table_cache(~(table_map) 0), tmp_table_param(0), tree(&tree_base), original(0), use_tree(0), always_null(0) tmp_table_param(0), tree(&tree_base), force_copy_fields(0), original(0), use_tree(0), always_null(0) { quick_group= 0; } Item_sum_count_distinct(THD *thd, Item_sum_count_distinct *item) :Item_sum_int(thd, item), table(item->table), used_table_cache(item->used_table_cache), field_lengths(item->field_lengths), tmp_table_param(item->tmp_table_param), tree(item->tree), original(item), key_length(item->key_length), tree(item->tree), force_copy_fields(item->force_copy_fields), original(item), key_length(item->key_length), max_elements_in_tree(item->max_elements_in_tree), rec_offset(item->rec_offset), use_tree(item->use_tree), always_null(item->always_null) Loading Loading @@ -685,6 +687,7 @@ class Item_func_group_concat : public Item_sum bool distinct; bool warning_for_row; bool always_null; bool force_copy_fields; friend int group_concat_key_cmp_with_distinct(void* arg, byte* key1, byte* key2); Loading
sql/mysql_priv.h +3 −2 Original line number Diff line number Diff line Loading @@ -538,7 +538,8 @@ int mysql_union(THD *thd, LEX *lex, select_result *result, int mysql_handle_derived(LEX *lex); Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, Item ***copy_func, Field **from_field, bool group, bool modify_item, uint convert_blob_length); bool group, bool modify_item, uint convert_blob_length, bool make_copy_field); int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, List<create_field> &fields, List<Key> &keys, uint &db_options, Loading