Below is the list of changes that have just been committed into a local
4.1 repository of bar. When bar does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2006-11-08 22:03:08+04:00, bar@stripped +2 -0
Merge abarkov@stripped:/home/bk/mysql-4.1-rpl
into mysql.com:/usr/home/bar/mysql-4.1.b23451v2
MERGE: 1.2529.1.7
mysql-test/t/func_gconcat.test@stripped, 2006-11-08 22:03:05+04:00, bar@stripped +0 -0
Auto merged
MERGE: 1.37.1.2
sql/item_sum.cc@stripped, 2006-11-08 22:03:05+04:00, bar@stripped +0 -0
Auto merged
MERGE: 1.148.2.1
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: bar
# Host: bar.intranet.mysql.r18.ru
# Root: /usr/home/bar/mysql-4.1.b23451v2/RESYNC
--- 1.150/sql/item_sum.cc 2006-11-08 22:03:14 +04:00
+++ 1.151/sql/item_sum.cc 2006-11-08 22:03:14 +04:00
@@ -1673,6 +1673,7 @@ int dump_leaf_key(byte* key, uint32 coun
{
char buff[MAX_FIELD_WIDTH];
String tmp((char *)&buff,sizeof(buff),default_charset_info), tmp2;
+ uint old_length= item->result.length();
if (item->no_appended)
item->no_appended= FALSE;
@@ -1711,8 +1712,22 @@ int dump_leaf_key(byte* key, uint32 coun
/* stop if length of result more than group_concat_max_len */
if (item->result.length() > item->group_concat_max_len)
{
+ int well_formed_error;
+ CHARSET_INFO *cs= item->collation.collation;
+ const char *ptr= item->result.ptr();
+ uint add_length;
+ /*
+ It's ok to use item->result.length() as the fourth argument
+ as this is never used to limit the length of the data.
+ Cut is done with the third argument.
+ */
+ add_length= cs->cset->well_formed_len(cs,
+ ptr + old_length,
+ ptr + item->group_concat_max_len,
+ item->result.length(),
+ &well_formed_error);
+ item->result.length(old_length + add_length);
item->count_cut_values++;
- item->result.length(item->group_concat_max_len);
item->warning_for_row= TRUE;
return 1;
}
@@ -1902,8 +1917,7 @@ bool Item_func_group_concat::add()
we can dump the row here in case of GROUP_CONCAT(DISTINCT...)
instead of doing tree traverse later.
*/
- if (result.length() <= group_concat_max_len &&
- !warning_for_row &&
+ if (!warning_for_row &&
(!tree_mode || (el->count == 1 && distinct && !arg_count_order)))
dump_leaf_key(table->record[0], 1, this);
--- 1.39/mysql-test/t/func_gconcat.test 2006-11-08 22:03:14 +04:00
+++ 1.40/mysql-test/t/func_gconcat.test 2006-11-08 22:03:14 +04:00
@@ -391,6 +391,30 @@ select count(distinct (f1+1)) from t1 gr
drop table t1;
#
+# Bug#23451 GROUP_CONCAT truncates a multibyte utf8 character
+#
+set names utf8;
+create table t1
+(
+ x text character set utf8 not null,
+ y integer not null
+);
+insert into t1 values (repeat('a', 1022), 0), (repeat(_utf8 0xc3b7, 4), 0);
+let $1= 10;
+while ($1)
+{
+ eval set group_concat_max_len= 1022 + $1;
+ --disable_result_log
+ select @x:=group_concat(x) from t1 group by y;
+ --enable_result_log
+ select @@group_concat_max_len, length(@x), char_length(@x), right(@x,12), right(HEX(@x),12);
+ dec $1;
+}
+drop table t1;
+set group_concat_max_len=1024;
+set names latin1;
+
+#
# Bug#14169 type of group_concat() result changed to blob if tmp_table was used
#
create table t1 (f1 int unsigned, f2 varchar(255));
| Thread |
|---|
| • bk commit into 4.1 tree (bar:1.2547) | bar | 8 Nov |