Browse Source
Bug#39893: Crash if select on a partitioned table, when partitioning is disabled
Bug#39893: Crash if select on a partitioned table, when partitioning is disabled
Problem was that it tried to run partitioning function calls when opening a partitioned table, when it was explicitly disabled. Solution is to check if the partitioning plugin is ready to use before using any partitioning specific calls. mysql-test/r/disabled_partition.require: Bug#39893: Crash if select on a partitioned table, when partitioning is disabled New require file to use when partitioning is disabled (but compiled in) mysql-test/r/not_partition.result: Bug#39893: Crash if select on a partitioned table, when partitioning is disabled Updated testcase mysql-test/r/partition_disabled.result: Bug#39893: Crash if select on a partitioned table, when partitioning is disabled New result file mysql-test/std_data/parts/t1.frm: Bug#39893: Crash if select on a partitioned table, when partitioning is disabled frm file for 'create table t1 (a int) partition by hash (a)' mysql-test/t/not_partition.test: Bug#39893: Crash if select on a partitioned table, when partitioning is disabled Updated test cases mysql-test/t/partition_disabled-master.opt: Bug#39893: Crash if select on a partitioned table, when partitioning is disabled New opt file mysql-test/t/partition_disabled.test: Bug#39893: Crash if select on a partitioned table, when partitioning is disabled New test file (looks like not_partition.test, but with different errors) sql/sql_yacc.yy: Bug#39893: Crash if select on a partitioned table, when partitioning is disabled Better error message (it is already built with partitioning, but is explicitly disabled). sql/table.cc: Bug#39893: Crash if select on a partitioned table, when partitioning is disabled If the partitioning plugin is not ready, fail to open the table.pull/374/head
9 changed files with 261 additions and 3 deletions
-
2mysql-test/r/disabled_partition.require
-
45mysql-test/r/not_partition.result
-
93mysql-test/r/partition_disabled.result
-
BINmysql-test/std_data/parts/t1.frm
-
25mysql-test/t/not_partition.test
-
1mysql-test/t/partition_disabled-master.opt
-
85mysql-test/t/partition_disabled.test
-
4sql/sql_yacc.yy
-
9sql/table.cc
@ -0,0 +1,2 @@ |
|||
Variable_name Value |
|||
have_partitioning DISABLED |
|||
@ -0,0 +1,93 @@ |
|||
DROP TABLE IF EXISTS t1; |
|||
FLUSH TABLES; |
|||
SELECT * FROM t1; |
|||
ERROR HY000: The MySQL server is running with the --skip-partition option so it cannot execute this statement |
|||
TRUNCATE TABLE t1; |
|||
ERROR HY000: The MySQL server is running with the --skip-partition option so it cannot execute this statement |
|||
ANALYZE TABLE t1; |
|||
Table Op Msg_type Msg_text |
|||
test.t1 analyze Error The MySQL server is running with the --skip-partition option so it cannot execute this statement |
|||
test.t1 analyze error Corrupt |
|||
CHECK TABLE t1; |
|||
Table Op Msg_type Msg_text |
|||
test.t1 check Error The MySQL server is running with the --skip-partition option so it cannot execute this statement |
|||
test.t1 check error Corrupt |
|||
OPTIMIZE TABLE t1; |
|||
Table Op Msg_type Msg_text |
|||
test.t1 optimize Error The MySQL server is running with the --skip-partition option so it cannot execute this statement |
|||
test.t1 optimize error Corrupt |
|||
REPAIR TABLE t1; |
|||
Table Op Msg_type Msg_text |
|||
test.t1 repair Error The MySQL server is running with the --skip-partition option so it cannot execute this statement |
|||
test.t1 repair error Corrupt |
|||
ALTER TABLE t1 REPAIR PARTITION ALL; |
|||
Table Op Msg_type Msg_text |
|||
test.t1 repair Error The MySQL server is running with the --skip-partition option so it cannot execute this statement |
|||
test.t1 repair error Corrupt |
|||
ALTER TABLE t1 CHECK PARTITION ALL; |
|||
Table Op Msg_type Msg_text |
|||
test.t1 check Error The MySQL server is running with the --skip-partition option so it cannot execute this statement |
|||
test.t1 check error Corrupt |
|||
ALTER TABLE t1 OPTIMIZE PARTITION ALL; |
|||
Table Op Msg_type Msg_text |
|||
test.t1 optimize Error The MySQL server is running with the --skip-partition option so it cannot execute this statement |
|||
test.t1 optimize error Corrupt |
|||
ALTER TABLE t1 ANALYZE PARTITION ALL; |
|||
Table Op Msg_type Msg_text |
|||
test.t1 analyze Error The MySQL server is running with the --skip-partition option so it cannot execute this statement |
|||
test.t1 analyze error Corrupt |
|||
ALTER TABLE t1 REBUILD PARTITION ALL; |
|||
ERROR HY000: The MySQL server is running with the --skip-partition option so it cannot execute this statement |
|||
ALTER TABLE t1 ENGINE Memory; |
|||
ERROR HY000: The MySQL server is running with the --skip-partition option so it cannot execute this statement |
|||
ALTER TABLE t1 ADD (new INT); |
|||
ERROR HY000: The MySQL server is running with the --skip-partition option so it cannot execute this statement |
|||
DROP TABLE t1; |
|||
CREATE TABLE t1 ( |
|||
firstname VARCHAR(25) NOT NULL, |
|||
lastname VARCHAR(25) NOT NULL, |
|||
username VARCHAR(16) NOT NULL, |
|||
email VARCHAR(35), |
|||
joined DATE NOT NULL |
|||
) |
|||
PARTITION BY KEY(joined) |
|||
PARTITIONS 6; |
|||
ERROR HY000: The MySQL server is running with the --skip-partition option so it cannot execute this statement |
|||
ALTER TABLE t1 PARTITION BY KEY(joined) PARTITIONS 2; |
|||
ERROR HY000: The MySQL server is running with the --skip-partition option so it cannot execute this statement |
|||
drop table t1; |
|||
ERROR 42S02: Unknown table 't1' |
|||
CREATE TABLE t1 ( |
|||
firstname VARCHAR(25) NOT NULL, |
|||
lastname VARCHAR(25) NOT NULL, |
|||
username VARCHAR(16) NOT NULL, |
|||
email VARCHAR(35), |
|||
joined DATE NOT NULL |
|||
) |
|||
PARTITION BY RANGE( YEAR(joined) ) ( |
|||
PARTITION p0 VALUES LESS THAN (1960), |
|||
PARTITION p1 VALUES LESS THAN (1970), |
|||
PARTITION p2 VALUES LESS THAN (1980), |
|||
PARTITION p3 VALUES LESS THAN (1990), |
|||
PARTITION p4 VALUES LESS THAN MAXVALUE |
|||
); |
|||
ERROR HY000: The MySQL server is running with the --skip-partition option so it cannot execute this statement |
|||
drop table t1; |
|||
ERROR 42S02: Unknown table 't1' |
|||
CREATE TABLE t1 (id INT, purchased DATE) |
|||
PARTITION BY RANGE( YEAR(purchased) ) |
|||
SUBPARTITION BY HASH( TO_DAYS(purchased) ) |
|||
SUBPARTITIONS 2 ( |
|||
PARTITION p0 VALUES LESS THAN (1990), |
|||
PARTITION p1 VALUES LESS THAN (2000), |
|||
PARTITION p2 VALUES LESS THAN MAXVALUE |
|||
); |
|||
ERROR HY000: The MySQL server is running with the --skip-partition option so it cannot execute this statement |
|||
drop table t1; |
|||
ERROR 42S02: Unknown table 't1' |
|||
create table t1 (a varchar(10) charset latin1 collate latin1_bin); |
|||
insert into t1 values (''),(' '),('a'),('a '),('a '); |
|||
explain partitions select * from t1 where a='a ' OR a='a'; |
|||
id select_type table partitions type possible_keys key key_len ref rows Extra |
|||
1 SIMPLE t1 NULL ALL NULL NULL NULL NULL 5 Using where |
|||
drop table t1; |
|||
@ -0,0 +1 @@ |
|||
--loose-skip-partition |
|||
@ -0,0 +1,85 @@ |
|||
--disable_abort_on_error |
|||
# Run this test only when mysqld has partitioning, but it is disabled. |
|||
# The statements are not expected to work, just check that we |
|||
# can't crash the server. |
|||
--require r/disabled_partition.require |
|||
--disable_query_log |
|||
show variables like "have_partitioning"; |
|||
--enable_query_log |
|||
--disable_warnings |
|||
DROP TABLE IF EXISTS t1; |
|||
--enable_warnings |
|||
let $MYSQLD_DATADIR= `SELECT @@datadir`; |
|||
|
|||
# |
|||
# Bug#39893: Crash if select on a partitioned table, |
|||
# when partitioning is disabled |
|||
FLUSH TABLES; |
|||
--copy_file $MYSQLTEST_VARDIR/std_data_ln/parts/t1.frm $MYSQLD_DATADIR/test/t1.frm |
|||
SELECT * FROM t1; |
|||
TRUNCATE TABLE t1; |
|||
ANALYZE TABLE t1; |
|||
CHECK TABLE t1; |
|||
OPTIMIZE TABLE t1; |
|||
REPAIR TABLE t1; |
|||
ALTER TABLE t1 REPAIR PARTITION ALL; |
|||
ALTER TABLE t1 CHECK PARTITION ALL; |
|||
ALTER TABLE t1 OPTIMIZE PARTITION ALL; |
|||
ALTER TABLE t1 ANALYZE PARTITION ALL; |
|||
ALTER TABLE t1 REBUILD PARTITION ALL; |
|||
ALTER TABLE t1 ENGINE Memory; |
|||
ALTER TABLE t1 ADD (new INT); |
|||
DROP TABLE t1; |
|||
|
|||
--error ER_OPTION_PREVENTS_STATEMENT |
|||
CREATE TABLE t1 ( |
|||
firstname VARCHAR(25) NOT NULL, |
|||
lastname VARCHAR(25) NOT NULL, |
|||
username VARCHAR(16) NOT NULL, |
|||
email VARCHAR(35), |
|||
joined DATE NOT NULL |
|||
) |
|||
PARTITION BY KEY(joined) |
|||
PARTITIONS 6; |
|||
|
|||
--error ER_OPTION_PREVENTS_STATEMENT |
|||
ALTER TABLE t1 PARTITION BY KEY(joined) PARTITIONS 2; |
|||
|
|||
--error ER_BAD_TABLE_ERROR |
|||
drop table t1; |
|||
|
|||
--error ER_OPTION_PREVENTS_STATEMENT |
|||
CREATE TABLE t1 ( |
|||
firstname VARCHAR(25) NOT NULL, |
|||
lastname VARCHAR(25) NOT NULL, |
|||
username VARCHAR(16) NOT NULL, |
|||
email VARCHAR(35), |
|||
joined DATE NOT NULL |
|||
) |
|||
PARTITION BY RANGE( YEAR(joined) ) ( |
|||
PARTITION p0 VALUES LESS THAN (1960), |
|||
PARTITION p1 VALUES LESS THAN (1970), |
|||
PARTITION p2 VALUES LESS THAN (1980), |
|||
PARTITION p3 VALUES LESS THAN (1990), |
|||
PARTITION p4 VALUES LESS THAN MAXVALUE |
|||
); |
|||
--error ER_BAD_TABLE_ERROR |
|||
drop table t1; |
|||
|
|||
--error ER_OPTION_PREVENTS_STATEMENT |
|||
CREATE TABLE t1 (id INT, purchased DATE) |
|||
PARTITION BY RANGE( YEAR(purchased) ) |
|||
SUBPARTITION BY HASH( TO_DAYS(purchased) ) |
|||
SUBPARTITIONS 2 ( |
|||
PARTITION p0 VALUES LESS THAN (1990), |
|||
PARTITION p1 VALUES LESS THAN (2000), |
|||
PARTITION p2 VALUES LESS THAN MAXVALUE |
|||
); |
|||
--error ER_BAD_TABLE_ERROR |
|||
drop table t1; |
|||
|
|||
# Create a table without partitions to test "EXPLAIN PARTITIONS" |
|||
create table t1 (a varchar(10) charset latin1 collate latin1_bin); |
|||
insert into t1 values (''),(' '),('a'),('a '),('a '); |
|||
explain partitions select * from t1 where a='a ' OR a='a'; |
|||
drop table t1; |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue