Commit b19a5e6d authored by Mattias Jonsson's avatar Mattias Jonsson

merge into mysql-5.1-bugteam

sql/ha_partition.cc:
  Bug#49477, added safety that a partitioned table cannot be
  temporary.
parents 413cf3a7 05f5fe38
drop table if exists t1; drop table if exists t1;
# #
# Bug#49477: Assertion `0' failed in ha_partition.cc:5530
# with temporary table and partitions
#
CREATE TABLE t1 (a INT) PARTITION BY HASH(a);
CREATE TEMPORARY TABLE tmp_t1 LIKE t1;
ERROR HY000: Cannot create temporary table with partitions
DROP TABLE t1;
#
# Bug#50392: insert_id is not reset for partitioned tables # Bug#50392: insert_id is not reset for partitioned tables
# auto_increment on duplicate entry # auto_increment on duplicate entry
CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY); CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY);
......
...@@ -8,6 +8,15 @@ ...@@ -8,6 +8,15 @@
drop table if exists t1; drop table if exists t1;
--enable_warnings --enable_warnings
--echo #
--echo # Bug#49477: Assertion `0' failed in ha_partition.cc:5530
--echo # with temporary table and partitions
--echo #
CREATE TABLE t1 (a INT) PARTITION BY HASH(a);
--error ER_PARTITION_NO_TEMPORARY
CREATE TEMPORARY TABLE tmp_t1 LIKE t1;
DROP TABLE t1;
--echo # --echo #
--echo # Bug#50392: insert_id is not reset for partitioned tables --echo # Bug#50392: insert_id is not reset for partitioned tables
--echo # auto_increment on duplicate entry --echo # auto_increment on duplicate entry
......
...@@ -88,7 +88,9 @@ static int partition_initialize(void *p) ...@@ -88,7 +88,9 @@ static int partition_initialize(void *p)
partition_hton->create= partition_create_handler; partition_hton->create= partition_create_handler;
partition_hton->partition_flags= partition_flags; partition_hton->partition_flags= partition_flags;
partition_hton->alter_table_flags= alter_table_flags; partition_hton->alter_table_flags= alter_table_flags;
partition_hton->flags= HTON_NOT_USER_SELECTABLE | HTON_HIDDEN; partition_hton->flags= HTON_NOT_USER_SELECTABLE |
HTON_HIDDEN |
HTON_TEMPORARY_NOT_SUPPORTED;
return 0; return 0;
} }
...@@ -1837,6 +1839,13 @@ uint ha_partition::del_ren_cre_table(const char *from, ...@@ -1837,6 +1839,13 @@ uint ha_partition::del_ren_cre_table(const char *from,
handler **file, **abort_file; handler **file, **abort_file;
DBUG_ENTER("del_ren_cre_table()"); DBUG_ENTER("del_ren_cre_table()");
/* Not allowed to create temporary partitioned tables */
if (create_info && create_info->options & HA_LEX_CREATE_TMP_TABLE)
{
my_error(ER_PARTITION_NO_TEMPORARY, MYF(0));
DBUG_RETURN(TRUE);
}
if (get_from_handler_file(from, ha_thd()->mem_root)) if (get_from_handler_file(from, ha_thd()->mem_root))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
DBUG_ASSERT(m_file_buffer); DBUG_ASSERT(m_file_buffer);
......
...@@ -5288,6 +5288,11 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, TABLE_LIST* src_table, ...@@ -5288,6 +5288,11 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, TABLE_LIST* src_table,
*/ */
if (create_info->options & HA_LEX_CREATE_TMP_TABLE) if (create_info->options & HA_LEX_CREATE_TMP_TABLE)
{ {
if (src_table->table->file->ht == partition_hton)
{
my_error(ER_PARTITION_NO_TEMPORARY, MYF(0));
goto err;
}
if (find_temporary_table(thd, db, table_name)) if (find_temporary_table(thd, db, table_name))
goto table_exists; goto table_exists;
dst_path_length= build_tmptable_filename(thd, dst_path, sizeof(dst_path)); dst_path_length= build_tmptable_filename(thd, dst_path, sizeof(dst_path));
...@@ -5352,14 +5357,15 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, TABLE_LIST* src_table, ...@@ -5352,14 +5357,15 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, TABLE_LIST* src_table,
/* /*
For partitioned tables we need to copy the .par file as well since For partitioned tables we need to copy the .par file as well since
it is used in open_table_def to even be able to create a new handler. it is used in open_table_def to even be able to create a new handler.
There is no way to find out here if the original table is a
partitioned table so we copy the file and ignore any errors.
*/ */
fn_format(tmp_path, dst_path, reg_ext, ".par", MYF(MY_REPLACE_EXT)); if (src_table->table->file->ht == partition_hton)
strmov(dst_path, tmp_path); {
fn_format(tmp_path, src_path, reg_ext, ".par", MYF(MY_REPLACE_EXT)); fn_format(tmp_path, dst_path, reg_ext, ".par", MYF(MY_REPLACE_EXT));
strmov(src_path, tmp_path); strmov(dst_path, tmp_path);
my_copy(src_path, dst_path, MYF(MY_DONT_OVERWRITE_FILE)); fn_format(tmp_path, src_path, reg_ext, ".par", MYF(MY_REPLACE_EXT));
strmov(src_path, tmp_path);
my_copy(src_path, dst_path, MYF(MY_DONT_OVERWRITE_FILE));
}
#endif #endif
DBUG_EXECUTE_IF("sleep_create_like_before_ha_create", my_sleep(6000000);); DBUG_EXECUTE_IF("sleep_create_like_before_ha_create", my_sleep(6000000););
......
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