Loading mysql-test/r/partition.result +6 −0 Original line number Diff line number Diff line Loading @@ -557,6 +557,12 @@ 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; create table t1 (f1 int) partition by hash (f1) as select 1; prepare stmt1 from 'create table t1 (s1 int) partition by hash (s1)'; execute stmt1; execute stmt1; Loading mysql-test/t/partition.test +15 −0 Original line number Diff line number Diff line Loading @@ -714,6 +714,21 @@ 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; # # Bug#15336 Partitions: crash if create table as select # create table t1 (f1 int) partition by hash (f1) as select 1; drop table t1; # # bug #14350 Partitions: crash if prepared statement # Loading sql/ha_partition.cc +1 −0 Original line number Diff line number Diff line Loading @@ -4703,6 +4703,7 @@ int ha_partition::extra(enum ha_extra_function operation) break; } case HA_EXTRA_NO_CACHE: case HA_EXTRA_WRITE_CACHE: { m_extra_cache= FALSE; m_extra_cache_size= 0; Loading sql/item.cc +4 −1 Original line number Diff line number Diff line Loading @@ -647,6 +647,7 @@ Item *Item_string::safe_charset_converter(CHARSET_INFO *tocs) { 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(), Loading @@ -661,7 +662,9 @@ Item *Item_string::safe_charset_converter(CHARSET_INFO *tocs) */ 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; Loading sql/sql_partition.cc +3 −0 Original line number Diff line number Diff line Loading @@ -1710,6 +1710,7 @@ bool fix_partition_func(THD *thd, const char* name, TABLE *table, 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) Loading Loading @@ -1744,6 +1745,7 @@ bool fix_partition_func(THD *thd, const char* name, TABLE *table, 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); Loading Loading @@ -1853,6 +1855,7 @@ bool fix_partition_func(THD *thd, const char* name, TABLE *table, 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); Loading Loading
mysql-test/r/partition.result +6 −0 Original line number Diff line number Diff line Loading @@ -557,6 +557,12 @@ 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; create table t1 (f1 int) partition by hash (f1) as select 1; prepare stmt1 from 'create table t1 (s1 int) partition by hash (s1)'; execute stmt1; execute stmt1; Loading
mysql-test/t/partition.test +15 −0 Original line number Diff line number Diff line Loading @@ -714,6 +714,21 @@ 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; # # Bug#15336 Partitions: crash if create table as select # create table t1 (f1 int) partition by hash (f1) as select 1; drop table t1; # # bug #14350 Partitions: crash if prepared statement # Loading
sql/ha_partition.cc +1 −0 Original line number Diff line number Diff line Loading @@ -4703,6 +4703,7 @@ int ha_partition::extra(enum ha_extra_function operation) break; } case HA_EXTRA_NO_CACHE: case HA_EXTRA_WRITE_CACHE: { m_extra_cache= FALSE; m_extra_cache_size= 0; Loading
sql/item.cc +4 −1 Original line number Diff line number Diff line Loading @@ -647,6 +647,7 @@ Item *Item_string::safe_charset_converter(CHARSET_INFO *tocs) { 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(), Loading @@ -661,7 +662,9 @@ Item *Item_string::safe_charset_converter(CHARSET_INFO *tocs) */ 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; Loading
sql/sql_partition.cc +3 −0 Original line number Diff line number Diff line Loading @@ -1710,6 +1710,7 @@ bool fix_partition_func(THD *thd, const char* name, TABLE *table, 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) Loading Loading @@ -1744,6 +1745,7 @@ bool fix_partition_func(THD *thd, const char* name, TABLE *table, 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); Loading Loading @@ -1853,6 +1855,7 @@ bool fix_partition_func(THD *thd, const char* name, TABLE *table, 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); Loading