List:Commits« Previous MessageNext Message »
From:bar Date:November 8 2006 6:03pm
Subject:bk commit into 4.1 tree (bar:1.2547)
View as plain text  
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)bar8 Nov