Commit a9ce1388 authored by unknown's avatar unknown

Bug #27816: Log tables ran with partitions crashes the server

 when logging is enabled.
Currently the partition engine doesn't allow log tables to
be partitioned. But this was not checked and the server crashed.
Fixed by adding a check in ALTER TABLE to disable partitioning the
log tables.
While working on the cause of the problem improved the way the log
thread structures are initialized before opening the log tables.


mysql-test/r/partition.result:
  Bug #27816: test case
mysql-test/t/partition.test:
  Bug #27816: test case
sql/log.cc:
  Bug #27816: optional
   Improved initialization of the log threads before opening 
   the log table.
   Remedies problems that arise from open_table() et. al. 
   depending on a correctly initialized thd.
   Prerequisite for handling partitioned log tables :
   they call the parser while reading the .frm file.
sql/sql_table.cc:
  Bug #27816: throw an error when paritioning the log tables : 
   not supported by the partition engine.
parent 62e88b77
...@@ -1245,4 +1245,12 @@ INSERT INTO t1 SELECT a + 8, b FROM t1; ...@@ -1245,4 +1245,12 @@ INSERT INTO t1 SELECT a + 8, b FROM t1;
ALTER TABLE t1 ADD PARTITION (PARTITION p1 VALUES LESS THAN (64)); ALTER TABLE t1 ADD PARTITION (PARTITION p1 VALUES LESS THAN (64));
ALTER TABLE t1 DROP PARTITION p1; ALTER TABLE t1 DROP PARTITION p1;
DROP TABLE t1; DROP TABLE t1;
USE mysql;
SET GLOBAL general_log = 0;
ALTER TABLE general_log ENGINE = MyISAM;
ALTER TABLE general_log PARTITION BY RANGE (TO_DAYS(event_time))
(PARTITION p0 VALUES LESS THAN (733144), PARTITION p1 VALUES LESS THAN (3000000));
ERROR HY000: Incorrect usage of PARTITION and log table
ALTER TABLE general_log ENGINE = CSV;
SET GLOBAL general_log = default;
End of 5.1 tests End of 5.1 tests
...@@ -1465,4 +1465,18 @@ ALTER TABLE t1 DROP PARTITION p1; ...@@ -1465,4 +1465,18 @@ ALTER TABLE t1 DROP PARTITION p1;
DROP TABLE t1; DROP TABLE t1;
#
# Bug #27816: Log tables ran with partitions crashes the server when logging
# is enabled.
#
USE mysql;
SET GLOBAL general_log = 0;
ALTER TABLE general_log ENGINE = MyISAM;
--error ER_WRONG_USAGE
ALTER TABLE general_log PARTITION BY RANGE (TO_DAYS(event_time))
(PARTITION p0 VALUES LESS THAN (733144), PARTITION p1 VALUES LESS THAN (3000000));
ALTER TABLE general_log ENGINE = CSV;
SET GLOBAL general_log = default;
--echo End of 5.1 tests --echo End of 5.1 tests
...@@ -296,6 +296,8 @@ bool Log_to_csv_event_handler::open_log_table(uint log_table_type) ...@@ -296,6 +296,8 @@ bool Log_to_csv_event_handler::open_log_table(uint log_table_type)
table->db= log_thd->db; table->db= log_thd->db;
table->db_length= log_thd->db_length; table->db_length= log_thd->db_length;
lex_start(log_thd);
log_thd->clear_error();
if (simple_open_n_lock_tables(log_thd, table) || if (simple_open_n_lock_tables(log_thd, table) ||
table->table->file->extra(HA_EXTRA_MARK_AS_LOG_TABLE) || table->table->file->extra(HA_EXTRA_MARK_AS_LOG_TABLE) ||
table->table->file->ha_rnd_init(0)) table->table->file->ha_rnd_init(0))
......
...@@ -5747,22 +5747,32 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, ...@@ -5747,22 +5747,32 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
table_list->table_name_length, table_list->table_name_length,
table_list->table_name, 0); table_list->table_name, 0);
if (table_kind)
{
/* Disable alter of enabled log tables */ /* Disable alter of enabled log tables */
if (table_kind && logger.is_log_table_enabled(table_kind)) if (logger.is_log_table_enabled(table_kind))
{ {
my_error(ER_BAD_LOG_STATEMENT, MYF(0), "ALTER"); my_error(ER_BAD_LOG_STATEMENT, MYF(0), "ALTER");
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
/* Disable alter of log tables to unsupported engine */ /* Disable alter of log tables to unsupported engine */
if (table_kind && if ((create_info->used_fields & HA_CREATE_USED_ENGINE) &&
(create_info->used_fields & HA_CREATE_USED_ENGINE) &&
(!create_info->db_type || /* unknown engine */ (!create_info->db_type || /* unknown engine */
!(create_info->db_type->flags & HTON_SUPPORT_LOG_TABLES))) !(create_info->db_type->flags & HTON_SUPPORT_LOG_TABLES)))
{ {
my_error(ER_UNSUPORTED_LOG_ENGINE, MYF(0)); my_error(ER_UNSUPORTED_LOG_ENGINE, MYF(0));
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
#ifdef WITH_PARTITION_STORAGE_ENGINE
if (alter_info->flags & ALTER_PARTITION)
{
my_error(ER_WRONG_USAGE, MYF(0), "PARTITION", "log table");
DBUG_RETURN(TRUE);
}
#endif
}
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment