From ee4452dba4bb9dac188390b39314e0416f53e3c9 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 31 Oct 2007 16:01:29 +0400 Subject: [PATCH] Bug #31893 Partitions: crash if subpartitions and engine change. The new default database engine for altered table was reassigned to the old one. That's wrong thing by itself, and (as the engine for a subpartition gets that new value) leads to DBUG_ASSERTION in mysql_unpack_partition() mysql-test/r/partition.result: Bug #31893 Partitions: crash if subpartitions and engine change. test result mysql-test/t/partition.test: Bug #31893 Partitions: crash if subpartitions and engine change. test case sql/sql_partition.cc: Bug #31893 Partitions: crash if subpartitions and engine change. Don't change part_info->default_engine_type if it's already set --- mysql-test/r/partition.result | 14 ++++++++++++++ mysql-test/t/partition.test | 11 +++++++++++ sql/sql_partition.cc | 5 ++++- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/partition.result b/mysql-test/r/partition.result index 4e4bd0bbc0a..e39e84fdd69 100644 --- a/mysql-test/r/partition.result +++ b/mysql-test/r/partition.result @@ -1291,4 +1291,18 @@ t1 CREATE TABLE `t1` ( `b` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 /*!50100 PARTITION BY RANGE (b) (PARTITION p1 VALUES LESS THAN (10) ENGINE = MyISAM, PARTITION p2 VALUES LESS THAN (20) ENGINE = MyISAM) */ drop table t1, t2; +create table t1 (int_column int, char_column char(5)) +PARTITION BY RANGE (int_column) subpartition by key (char_column) +(PARTITION p1 VALUES LESS THAN (5) ENGINE = InnoDB); +Warnings: +Warning 1286 Unknown table engine 'InnoDB' +alter table t1 PARTITION BY RANGE (int_column) subpartition by key (char_column) +(PARTITION p1 VALUES LESS THAN (5) ENGINE = myisam); +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `int_column` int(11) DEFAULT NULL, + `char_column` char(5) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 /*!50100 PARTITION BY RANGE (int_column) SUBPARTITION BY KEY (char_column) (PARTITION p1 VALUES LESS THAN (5) ENGINE = MyISAM) */ +drop table t1; End of 5.1 tests diff --git a/mysql-test/t/partition.test b/mysql-test/t/partition.test index 2906b4640cd..82a8759e910 100644 --- a/mysql-test/t/partition.test +++ b/mysql-test/t/partition.test @@ -1528,4 +1528,15 @@ PARTITION BY RANGE (b) ( show create table t1; drop table t1, t2; +# +# Bug #31893 Partitions: crash if subpartitions and engine change +# +create table t1 (int_column int, char_column char(5)) + PARTITION BY RANGE (int_column) subpartition by key (char_column) + (PARTITION p1 VALUES LESS THAN (5) ENGINE = InnoDB); +alter table t1 PARTITION BY RANGE (int_column) subpartition by key (char_column) + (PARTITION p1 VALUES LESS THAN (5) ENGINE = myisam); +show create table t1; +drop table t1; + --echo End of 5.1 tests diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 0cc2cac2a1a..e5466599429 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -5031,7 +5031,10 @@ the generated partition syntax in a correct manner. *partition_changed= TRUE; } if (create_info->db_type == partition_hton) - part_info->default_engine_type= table->part_info->default_engine_type; + { + if (!part_info->default_engine_type) + part_info->default_engine_type= table->part_info->default_engine_type; + } else part_info->default_engine_type= create_info->db_type; if (check_native_partitioned(create_info, &is_native_partitioned,