From 0b273845def50dfd22e8a3e34c4b6f82fa522539 Mon Sep 17 00:00:00 2001 From: Mattias Jonsson Date: Thu, 8 Jul 2010 14:36:55 +0200 Subject: [PATCH] Bug#46086: crash when dropping a partitioned table and the original engine is disabled Missing check that engine is available. --- mysql-test/include/not_blackhole.inc | 5 ++++ mysql-test/r/partition_not_blackhole.result | 16 +++++++++++ mysql-test/std_data/parts/t1_blackhole.frm | Bin 0 -> 8556 bytes mysql-test/std_data/parts/t1_blackhole.par | Bin 0 -> 24 bytes .../t/partition_not_blackhole-master.opt | 1 + mysql-test/t/partition_not_blackhole.test | 25 ++++++++++++++++++ sql/ha_partition.cc | 7 ++++- 7 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 mysql-test/include/not_blackhole.inc create mode 100644 mysql-test/r/partition_not_blackhole.result create mode 100644 mysql-test/std_data/parts/t1_blackhole.frm create mode 100644 mysql-test/std_data/parts/t1_blackhole.par create mode 100644 mysql-test/t/partition_not_blackhole-master.opt create mode 100644 mysql-test/t/partition_not_blackhole.test diff --git a/mysql-test/include/not_blackhole.inc b/mysql-test/include/not_blackhole.inc new file mode 100644 index 00000000000..078927ec4ca --- /dev/null +++ b/mysql-test/include/not_blackhole.inc @@ -0,0 +1,5 @@ +if (`SELECT count(*) FROM information_schema.engines WHERE + (support = 'YES' OR support = 'DEFAULT') AND + engine = 'blackhole'`){ + skip Blackhole engine enabled; +} diff --git a/mysql-test/r/partition_not_blackhole.result b/mysql-test/r/partition_not_blackhole.result new file mode 100644 index 00000000000..dc0339f8c48 --- /dev/null +++ b/mysql-test/r/partition_not_blackhole.result @@ -0,0 +1,16 @@ +DROP TABLE IF EXISTS t1; +# +# Bug#46086: crash when dropping a partitioned table and +# the original engine is disabled +# Copy a .frm and .par file which was created with: +# create table `t1` (`id` int primary key) engine=blackhole +# partition by key () partitions 1; +SHOW TABLES; +Tables_in_test +t1 +SHOW CREATE TABLE t1; +ERROR HY000: Incorrect information in file: './test/t1.frm' +DROP TABLE t1; +ERROR 42S02: Unknown table 't1' +t1.frm +t1.par diff --git a/mysql-test/std_data/parts/t1_blackhole.frm b/mysql-test/std_data/parts/t1_blackhole.frm new file mode 100644 index 0000000000000000000000000000000000000000..be77b7a041abe8aeb50ac1add88c9a5178904808 GIT binary patch literal 8556 zcmeI&KMR6D7zXg?`~#_rkhHX1TTT^3a|I0&l~{{o&~gwJ;Roou^;!BF*^5bYQy4t& za(asQ+;8*cp2~}CAXLB*Fv`WJtR7lGH6i1>jJ)@_1LNwp4Gac=t{-xs00k&O0SZun z0u-PC1t>rP3Q(Y#0!n`9eTn8kE}(7}(49Ic(=1udvb=0&>OV|XOM1BMuZ1bh`P7qL z=yaCtl3lV{>v^u1i(L0(|1-DMqd(j!BU69^6rcbFC_n)UP=Epypg;o!jtXG|WBn|W vlD@|Tfvo4gk2+Ki$U|?Vb(!xN@48#RMJ^&A(0aXA1 literal 0 HcmV?d00001 diff --git a/mysql-test/t/partition_not_blackhole-master.opt b/mysql-test/t/partition_not_blackhole-master.opt new file mode 100644 index 00000000000..1e47be930bc --- /dev/null +++ b/mysql-test/t/partition_not_blackhole-master.opt @@ -0,0 +1 @@ +--loose-skip-blackhole diff --git a/mysql-test/t/partition_not_blackhole.test b/mysql-test/t/partition_not_blackhole.test new file mode 100644 index 00000000000..222c1bb091e --- /dev/null +++ b/mysql-test/t/partition_not_blackhole.test @@ -0,0 +1,25 @@ +--source include/have_partition.inc +--source include/not_blackhole.inc + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +let $MYSQLD_DATADIR= `SELECT @@datadir`; + +--echo # +--echo # Bug#46086: crash when dropping a partitioned table and +--echo # the original engine is disabled +--echo # Copy a .frm and .par file which was created with: +--echo # create table `t1` (`id` int primary key) engine=blackhole +--echo # partition by key () partitions 1; +--copy_file std_data/parts/t1_blackhole.frm $MYSQLD_DATADIR/test/t1.frm +--copy_file std_data/parts/t1_blackhole.par $MYSQLD_DATADIR/test/t1.par +SHOW TABLES; +--error ER_NOT_FORM_FILE +SHOW CREATE TABLE t1; +--error ER_BAD_TABLE_ERROR +DROP TABLE t1; +--list_files $MYSQLD_DATADIR/test t1* +--remove_file $MYSQLD_DATADIR/test/t1.frm +--remove_file $MYSQLD_DATADIR/test/t1.par diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index 60722f0100e..07a9035f865 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -2403,9 +2403,14 @@ bool ha_partition::get_from_handler_file(const char *name, MEM_ROOT *mem_root) tot_partition_words= (m_tot_parts + 3) / 4; engine_array= (handlerton **) my_alloca(m_tot_parts * sizeof(handlerton*)); for (i= 0; i < m_tot_parts; i++) + { engine_array[i]= ha_resolve_by_legacy_type(ha_thd(), (enum legacy_db_type) - *(uchar *) ((file_buffer) + 12 + i)); + *(uchar *) ((file_buffer) + + 12 + i)); + if (!engine_array[i]) + goto err3; + } address_tot_name_len= file_buffer + 12 + 4 * tot_partition_words; tot_name_words= (uint4korr(address_tot_name_len) + 3) / 4; if (len_words != (tot_partition_words + tot_name_words + 4))