summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <holyfoot@mysql.com>2006-03-20 19:22:56 +0400
committerunknown <holyfoot@mysql.com>2006-03-20 19:22:56 +0400
commit6315e46af2e88b694fdd15abbd4fa637fbd21bf4 (patch)
tree9e913ba8bf17fc3e0b4ed769ff19b428d5eacf45
parent851f4fb9545fd7b44f222eff294937e2f2d6871e (diff)
parent91eac0bdc3b212967f73e221463e8173686863ca (diff)
downloadmariadb-git-6315e46af2e88b694fdd15abbd4fa637fbd21bf4.tar.gz
merging
sql/sql_partition.cc: Auto merged
-rw-r--r--mysql-test/r/partition.result6
-rw-r--r--mysql-test/t/partition.test15
-rw-r--r--sql/ha_partition.cc1
-rw-r--r--sql/item.cc5
-rw-r--r--sql/sql_partition.cc3
5 files changed, 29 insertions, 1 deletions
diff --git a/mysql-test/r/partition.result b/mysql-test/r/partition.result
index 4ef61745cda..df15a5652e0 100644
--- a/mysql-test/r/partition.result
+++ b/mysql-test/r/partition.result
@@ -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;
diff --git a/mysql-test/t/partition.test b/mysql-test/t/partition.test
index fb7d6476f00..9da52b916de 100644
--- a/mysql-test/t/partition.test
+++ b/mysql-test/t/partition.test
@@ -715,6 +715,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
#
prepare stmt1 from 'create table t1 (s1 int) partition by hash (s1)';
diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc
index b5b33668ba0..b6dceb8f690 100644
--- a/sql/ha_partition.cc
+++ b/sql/ha_partition.cc
@@ -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;
diff --git a/sql/item.cc b/sql/item.cc
index cf59c0bad9e..a734984a496 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -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(),
@@ -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;
diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc
index 3cd6a87682f..608db994f66 100644
--- a/sql/sql_partition.cc
+++ b/sql/sql_partition.cc
@@ -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)
@@ -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);
@@ -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);