diff options
author | Sergei Golubchik <sergii@pisem.net> | 2013-12-02 12:32:43 +0100 |
---|---|---|
committer | Sergei Golubchik <sergii@pisem.net> | 2013-12-02 12:32:43 +0100 |
commit | a3b99778fc34e778a0ec6248ac1c0a145ba2b5aa (patch) | |
tree | 7ec261594fb85525097416a8354a364c61b8982f | |
parent | b97b9536c71b3ad5ef521a1f21c527057a0a01c6 (diff) | |
parent | 7e431dc3794a553c9a29865f66475d1b7f49a9bc (diff) | |
download | mariadb-git-a3b99778fc34e778a0ec6248ac1c0a145ba2b5aa.tar.gz |
5.2 merge
-rw-r--r-- | mysql-test/r/merge.result | 7 | ||||
-rw-r--r-- | mysql-test/t/merge.test | 9 | ||||
-rw-r--r-- | storage/myisammrg/ha_myisammrg.cc | 43 |
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; } |