From 717d6054f516baa35e14ac11f0a06c630b9e9fd9 Mon Sep 17 00:00:00 2001 From: "Tatiana A. Nurnberg" Date: Fri, 31 Jul 2009 14:38:18 +0200 Subject: Bug#40281, partitioning the general log table crashes the server We disallow the partitioning of a log table. You could however partition a table first, and then point logging to it. This is not only against the docs, it also crashes the server. We catch this case now. mysql-test/r/partition.result: results for 40281 mysql-test/t/partition.test: test for 40281: show that trying to log to partitioned table fails rather to crash the server sql/ha_partition.cc: Signal that we no longer support logging to partitioned tables, as per the docs. sql/sql_partition.cc: Some commands like "USE ..." have no select, yet we may try to parse partition info after their execution if user set a partitioned table as log target. This shouldn't lead to a NULL-deref/crash. --- mysql-test/t/partition.test | 47 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'mysql-test/t/partition.test') diff --git a/mysql-test/t/partition.test b/mysql-test/t/partition.test index 8b4af201af2..b6a95ede1b7 100644 --- a/mysql-test/t/partition.test +++ b/mysql-test/t/partition.test @@ -1987,6 +1987,53 @@ CREATE TABLE t1(id INT,KEY(id)) ENGINE=MYISAM DROP TABLE t1; SET SESSION SQL_MODE=DEFAULT; +--echo +--echo Bug#40281: partitioning the general log table crashes the server +--echo + +--echo --- set up partitioned log, and switch to it + +USE mysql; +SET GLOBAL general_log =0; +CREATE TABLE gl_partitioned LIKE general_log; +ALTER TABLE gl_partitioned ENGINE=myisam; +ALTER TABLE gl_partitioned PARTITION BY HASH (thread_id) PARTITIONS 10; +ALTER TABLE general_log RENAME TO gl_nonpartitioned; +ALTER TABLE gl_partitioned RENAME TO general_log; + +SELECT @@global.log_output INTO @old_glo; +SET GLOBAL log_output='table'; +SET GLOBAL general_log =1; + +--echo --- do some things to be logged to partitioned log, should fail +USE /* 1 */ test; + +CREATE TABLE t1 (i INT); + +connect (master,127.0.0.1,root,,test,$MASTER_MYPORT,); +connection master; +INSERT INTO t1 VALUES (1); +SELECT * FROM t1; +disconnect master; + +connection default; + +USE mysql; +SET GLOBAL general_log =0; +ALTER TABLE general_log RENAME TO gl_partitioned; +ALTER TABLE gl_nonpartitioned RENAME TO general_log; + +--echo --- show whether we actually logged anything (no) to general_log +SELECT COUNT(argument) FROM gl_partitioned; + +DROP TABLE gl_partitioned; + +SET GLOBAL log_output=@old_glo; +SET GLOBAL general_log =1; + +USE /* 2 */ test; +DROP TABLE t1; + --echo End of 5.1 tests SET @@global.general_log= @old_general_log; -- cgit v1.2.1