From: Date: March 20 2006 2:41pm Subject: bk commit into 5.1 tree (gluh:1.2190) BUG#14367 List-Archive: http://lists.mysql.com/commits/3974 X-Bug: 14367 Message-Id: <20060320134157.EC63D300F5@eagle.intranet.mysql.r18.ru> Below is the list of changes that have just been committed into a local 5.1 repository of gluh. When gluh 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 1.2190 06/03/20 17:41:45 gluh@stripped +4 -0 Bug#14367 Partitions: crash if utf8 column use part_info->item_free_list instead of thd->free_list during partition function parsing sql/sql_partition.cc 1.51 06/03/20 17:41:38 gluh@stripped +3 -0 Bug#14367 Partitions: crash if utf8 column use part_info->item_free_list instead of thd->free_list during partition function parsing sql/item.cc 1.174 06/03/20 17:41:38 gluh@stripped +4 -1 Bug#14367 Partitions: crash if utf8 column create copy of string in current mem_root to avoid memory leak mysql-test/t/partition.test 1.28 06/03/20 17:41:38 gluh@stripped +9 -0 Bug#14367 Partitions: crash if utf8 column test case mysql-test/r/partition.result 1.25 06/03/20 17:41:38 gluh@stripped +5 -0 Bug#14367 Partitions: crash if utf8 column test case # 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: gluh # Host: eagle.intranet.mysql.r18.ru # Root: /home/gluh/MySQL/Merge/5.1-new --- 1.173/sql/item.cc Wed Mar 8 01:06:47 2006 +++ 1.174/sql/item.cc Mon Mar 20 17:41:38 2006 @@ -647,6 +647,7 @@ Item *Item_string::safe_charset_converte { Item_string *conv; uint conv_errors; + char *ptr; String tmp, cstr, *ostr= val_str(&tmp); cstr.copy(ostr->ptr(), ostr->length(), ostr->charset(), tocs, &conv_errors); if (conv_errors || !(conv= new Item_string(cstr.ptr(), cstr.length(), @@ -661,7 +662,9 @@ Item *Item_string::safe_charset_converte */ return NULL; } - conv->str_value.copy(); + if (!(ptr= current_thd->memdup(cstr.ptr(), cstr.length() + 1 ))) + return NULL; + conv->str_value.set(ptr, cstr.length(), cstr.charset()); /* Ensure that no one is going to change the result string */ conv->str_value.mark_as_const(); return conv; --- 1.24/mysql-test/r/partition.result Thu Mar 16 15:21:08 2006 +++ 1.25/mysql-test/r/partition.result Mon Mar 20 17:41:38 2006 @@ -557,4 +557,9 @@ t2 CREATE TABLE `t2` ( PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='no comment' PARTITION BY KEY (a) drop table t2; +create table t1 (s1 char(2) character set utf8) +partition by list (case when s1 > 'cz' then 1 else 2 end) +(partition p1 values in (1), +partition p2 values in (2)); +drop table t1; End of 5.1 tests --- 1.27/mysql-test/t/partition.test Thu Mar 16 15:21:08 2006 +++ 1.28/mysql-test/t/partition.test Mon Mar 20 17:41:38 2006 @@ -714,4 +714,13 @@ show create table t2; drop table t2; +# +# Bug#14367: Partitions: crash if utf8 column +# +create table t1 (s1 char(2) character set utf8) +partition by list (case when s1 > 'cz' then 1 else 2 end) +(partition p1 values in (1), + partition p2 values in (2)); +drop table t1; + --echo End of 5.1 tests --- 1.50/sql/sql_partition.cc Thu Mar 16 15:21:08 2006 +++ 1.51/sql/sql_partition.cc Mon Mar 20 17:41:38 2006 @@ -1710,6 +1710,7 @@ bool fix_partition_func(THD *thd, const char* db_name; partition_info *part_info= table->part_info; ulong save_set_query_id= thd->set_query_id; + Item *thd_free_list= thd->free_list; DBUG_ENTER("fix_partition_func"); if (part_info->fixed) @@ -1744,6 +1745,7 @@ bool fix_partition_func(THD *thd, const DBUG_RETURN(TRUE); } } + thd->free_list= part_info->item_free_list; if (part_info->is_sub_partitioned()) { DBUG_ASSERT(part_info->subpart_type == HASH_PARTITION); @@ -1853,6 +1855,7 @@ bool fix_partition_func(THD *thd, const set_up_range_analysis_info(part_info); result= FALSE; end: + thd->free_list= thd_free_list; thd->set_query_id= save_set_query_id; DBUG_PRINT("info", ("thd->set_query_id: %d", thd->set_query_id)); DBUG_RETURN(result);