summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMattias Jonsson <mattias.jonsson@sun.com>2010-05-21 14:18:14 +0200
committerMattias Jonsson <mattias.jonsson@sun.com>2010-05-21 14:18:14 +0200
commit6ef03ea37c5180621af9b5025e377141466bb2c9 (patch)
tree55f4f0b1a3c84d7bbb3afe29cbb9826e7071d863
parent37b02cd7d99278aec20e793c79ed105e99b2f7e7 (diff)
parentd72a15fcaaf55a5c5e6356524186ebd2a8705b70 (diff)
downloadmariadb-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.result8
-rw-r--r--mysql-test/t/partition_error.test9
-rw-r--r--sql/ha_partition.cc11
-rw-r--r--sql/sql_table.cc20
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););