diff options
author | Mattias Jonsson <mattias.jonsson@sun.com> | 2010-05-21 14:18:14 +0200 |
---|---|---|
committer | Mattias Jonsson <mattias.jonsson@sun.com> | 2010-05-21 14:18:14 +0200 |
commit | 6ef03ea37c5180621af9b5025e377141466bb2c9 (patch) | |
tree | 55f4f0b1a3c84d7bbb3afe29cbb9826e7071d863 | |
parent | 37b02cd7d99278aec20e793c79ed105e99b2f7e7 (diff) | |
parent | d72a15fcaaf55a5c5e6356524186ebd2a8705b70 (diff) | |
download | mariadb-git-6ef03ea37c5180621af9b5025e377141466bb2c9.tar.gz |
merge into mysql-5.1-bugteam
sql/ha_partition.cc:
Bug#49477, added safety that a partitioned table cannot be
temporary.
-rw-r--r-- | mysql-test/r/partition_error.result | 8 | ||||
-rw-r--r-- | mysql-test/t/partition_error.test | 9 | ||||
-rw-r--r-- | sql/ha_partition.cc | 11 | ||||
-rw-r--r-- | sql/sql_table.cc | 20 |
4 files changed, 40 insertions, 8 deletions
diff --git a/mysql-test/r/partition_error.result b/mysql-test/r/partition_error.result index 6ebf033adb7..e1e284556dd 100644 --- a/mysql-test/r/partition_error.result +++ b/mysql-test/r/partition_error.result @@ -1,5 +1,13 @@ 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 # auto_increment on duplicate entry CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY); diff --git a/mysql-test/t/partition_error.test b/mysql-test/t/partition_error.test index 8da8f54b774..dbc67032a42 100644 --- a/mysql-test/t/partition_error.test +++ b/mysql-test/t/partition_error.test @@ -9,6 +9,15 @@ drop table if exists t1; --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 # Bug#50392: insert_id is not reset for partitioned tables --echo # auto_increment on duplicate entry CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY); diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index fc6c88e8732..4fc3b2c9908 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -88,7 +88,9 @@ static int partition_initialize(void *p) partition_hton->create= partition_create_handler; partition_hton->partition_flags= partition_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; } @@ -1837,6 +1839,13 @@ uint ha_partition::del_ren_cre_table(const char *from, handler **file, **abort_file; 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)) DBUG_RETURN(TRUE); DBUG_ASSERT(m_file_buffer); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 2a2daacf724..873ac4e1659 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -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 (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)) goto table_exists; 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, /* 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. - 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)); - strmov(dst_path, tmp_path); - 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)); + if (src_table->table->file->ht == partition_hton) + { + fn_format(tmp_path, dst_path, reg_ext, ".par", MYF(MY_REPLACE_EXT)); + strmov(dst_path, tmp_path); + 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 DBUG_EXECUTE_IF("sleep_create_like_before_ha_create", my_sleep(6000000);); |