summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <sergii@pisem.net>2013-12-02 12:32:43 +0100
committerSergei Golubchik <sergii@pisem.net>2013-12-02 12:32:43 +0100
commita3b99778fc34e778a0ec6248ac1c0a145ba2b5aa (patch)
tree7ec261594fb85525097416a8354a364c61b8982f
parentb97b9536c71b3ad5ef521a1f21c527057a0a01c6 (diff)
parent7e431dc3794a553c9a29865f66475d1b7f49a9bc (diff)
downloadmariadb-git-a3b99778fc34e778a0ec6248ac1c0a145ba2b5aa.tar.gz
5.2 merge
-rw-r--r--mysql-test/r/merge.result7
-rw-r--r--mysql-test/t/merge.test9
-rw-r--r--storage/myisammrg/ha_myisammrg.cc43
3 files changed, 40 insertions, 19 deletions
diff --git a/mysql-test/r/merge.result b/mysql-test/r/merge.result
index 105a1f9f4c2..eb88a8bff69 100644
--- a/mysql-test/r/merge.result
+++ b/mysql-test/r/merge.result
@@ -2368,6 +2368,13 @@ FLUSH TABLES;
ERROR HY000: Can't reopen table: 'm1'
UNLOCK TABLES;
DROP TABLE t1, t2, t3, m1;
+create temporary table t1_temp(i int);
+create temporary table tm_temp_temp (i int) engine=merge union=(t1_temp) insert_method=last;
+alter table tm_temp_temp insert_method=first;
+check table tm_temp_temp;
+Table Op Msg_type Msg_text
+test.tm_temp_temp check status OK
+drop temporary table t1_temp, tm_temp_temp;
End of 5.1 tests
#
# MDEV-4277: Crash inside mi_killed_in_mariadb() with myisammrg
diff --git a/mysql-test/t/merge.test b/mysql-test/t/merge.test
index abb7c3c7da2..bab0f3e1cc6 100644
--- a/mysql-test/t/merge.test
+++ b/mysql-test/t/merge.test
@@ -1863,6 +1863,15 @@ FLUSH TABLES;
UNLOCK TABLES;
DROP TABLE t1, t2, t3, m1;
+#
+# MDEV-5266 MySQL:57657 - Temporary MERGE table with temporary underlying is broken by ALTER
+#
+create temporary table t1_temp(i int);
+create temporary table tm_temp_temp (i int) engine=merge union=(t1_temp) insert_method=last;
+alter table tm_temp_temp insert_method=first;
+check table tm_temp_temp;
+drop temporary table t1_temp, tm_temp_temp;
+
--echo End of 5.1 tests
--echo #
diff --git a/storage/myisammrg/ha_myisammrg.cc b/storage/myisammrg/ha_myisammrg.cc
index 61fa32f86fe..36336426b08 100644
--- a/storage/myisammrg/ha_myisammrg.cc
+++ b/storage/myisammrg/ha_myisammrg.cc
@@ -1125,31 +1125,36 @@ void ha_myisammrg::update_create_info(HA_CREATE_INFO *create_info)
if (!(create_info->used_fields & HA_CREATE_USED_UNION))
{
- MYRG_TABLE *open_table;
+ TABLE_LIST *child_table;
THD *thd=current_thd;
create_info->merge_list.next= &create_info->merge_list.first;
create_info->merge_list.elements=0;
- for (open_table=file->open_tables ;
- open_table != file->end_table ;
- open_table++)
+ if (table->child_l != NULL)
{
- TABLE_LIST *ptr;
- LEX_STRING db, name;
- LINT_INIT(db.str);
-
- if (!(ptr = (TABLE_LIST *) thd->calloc(sizeof(TABLE_LIST))))
- goto err;
- split_file_name(open_table->table->filename, &db, &name);
- if (!(ptr->table_name= thd->strmake(name.str, name.length)))
- goto err;
- if (db.length && !(ptr->db= thd->strmake(db.str, db.length)))
- goto err;
-
- create_info->merge_list.elements++;
- (*create_info->merge_list.next) = ptr;
- create_info->merge_list.next= &ptr->next_local;
+ for (child_table= table->child_l;;
+ child_table= child_table->next_global)
+ {
+ TABLE_LIST *ptr;
+
+ if (!(ptr= (TABLE_LIST *) thd->calloc(sizeof(TABLE_LIST))))
+ goto err;
+
+ if (!(ptr->table_name= thd->strmake(child_table->table_name,
+ child_table->table_name_length)))
+ goto err;
+ if (child_table->db && !(ptr->db= thd->strmake(child_table->db,
+ child_table->db_length)))
+ goto err;
+
+ create_info->merge_list.elements++;
+ (*create_info->merge_list.next)= ptr;
+ create_info->merge_list.next= &ptr->next_local;
+
+ if (&child_table->next_global == table->child_last_l)
+ break;
+ }
}
*create_info->merge_list.next=0;
}