From 141805f9c814282d7c4983ac248e3edeeb4dc808 Mon Sep 17 00:00:00 2001 From: "aivanov@mysql.com" <> Date: Thu, 8 Dec 2005 15:00:18 +0300 Subject: [PATCH] The innodb-5.0-ss52 snapshot changes were erroneously auto-merged to 5.1. Undoing the merge. --- mysql-test/r/innodb.result | 83 ++++---------------------- mysql-test/t/innodb.test | 88 ++++------------------------ sql/ha_innodb.cc | 9 --- sql/ha_innodb.h | 2 +- storage/innobase/btr/btr0sea.c | 28 +++++---- storage/innobase/dict/dict0dict.c | 34 +++++++---- storage/innobase/dict/dict0load.c | 9 ++- storage/innobase/include/buf0buf.h | 10 +--- storage/innobase/include/dict0dict.h | 3 +- storage/innobase/include/dict0load.h | 3 +- storage/innobase/include/rem0cmp.h | 3 +- storage/innobase/rem/rem0cmp.c | 11 ++-- storage/innobase/row/row0mysql.c | 64 ++++++++++++-------- 13 files changed, 116 insertions(+), 231 deletions(-) diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result index dd74040753e..74f40b5ad80 100644 --- a/mysql-test/r/innodb.result +++ b/mysql-test/r/innodb.result @@ -2437,9 +2437,7 @@ a b 20 NULL drop table t1; create table t1 (v varchar(65530), key(v)); -Warnings: -Warning 1071 Specified key was too long; max key length is 767 bytes -drop table t1; +ERROR HY000: Can't create table 'test.t1' (errno: 139) create table t1 (v varchar(65536)); Warnings: Note 1246 Converting column 'v' from VARCHAR to TEXT @@ -2579,49 +2577,22 @@ create table t8 (col1 blob, index(col1(767))) character set = latin1 engine = innodb; create table t9 (col1 varchar(512), col2 varchar(512), index(col1, col2)) character set = latin1 engine = innodb; -show create table t9; -Table Create Table -t9 CREATE TABLE `t9` ( - `col1` varchar(512) default NULL, - `col2` varchar(512) default NULL, - KEY `col1` (`col1`,`col2`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 drop table t1, t2, t3, t4, t5, t6, t7, t8, t9; -create table t1 (col1 varchar(768), index(col1)) +create table t1 (col1 varchar(768), index (col1)) character set = latin1 engine = innodb; -Warnings: -Warning 1071 Specified key was too long; max key length is 767 bytes -create table t2 (col1 varbinary(768), index(col1)) +ERROR HY000: Can't create table 'test.t1' (errno: 139) +create table t2 (col1 varchar(768) primary key) character set = latin1 engine = innodb; -Warnings: -Warning 1071 Specified key was too long; max key length is 767 bytes -create table t3 (col1 text, index(col1(768))) +ERROR HY000: Can't create table 'test.t2' (errno: 139) +create table t3 (col1 varbinary(768) primary key) character set = latin1 engine = innodb; -Warnings: -Warning 1071 Specified key was too long; max key length is 767 bytes -create table t4 (col1 blob, index(col1(768))) +ERROR HY000: Can't create table 'test.t3' (errno: 139) +create table t4 (col1 text, index(col1(768))) character set = latin1 engine = innodb; -Warnings: -Warning 1071 Specified key was too long; max key length is 767 bytes -show create table t1; -Table Create Table -t1 CREATE TABLE `t1` ( - `col1` varchar(768) default NULL, - KEY `col1` (`col1`(767)) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 -drop table t1, t2, t3, t4; -create table t1 (col1 varchar(768) primary key) +ERROR HY000: Can't create table 'test.t4' (errno: 139) +create table t5 (col1 blob, index(col1(768))) character set = latin1 engine = innodb; -ERROR 42000: Specified key was too long; max key length is 767 bytes -create table t2 (col1 varbinary(768) primary key) -character set = latin1 engine = innodb; -ERROR 42000: Specified key was too long; max key length is 767 bytes -create table t3 (col1 text, primary key(col1(768))) -character set = latin1 engine = innodb; -ERROR 42000: Specified key was too long; max key length is 767 bytes -create table t4 (col1 blob, primary key(col1(768))) -character set = latin1 engine = innodb; -ERROR 42000: Specified key was too long; max key length is 767 bytes +ERROR HY000: Can't create table 'test.t5' (errno: 139) CREATE TABLE t1 ( id INT PRIMARY KEY @@ -2801,38 +2772,6 @@ insert into t2 values (4,_ucs2 0x05612020,_ucs2 0x05612020,'taken'); drop table t1; drop table t2; commit; -set foreign_key_checks=0; -create table t2 (a int primary key, b int, foreign key (b) references t1(a)) engine = innodb; -create table t1(a char(10) primary key, b varchar(20)) engine = innodb; -ERROR HY000: Can't create table 'test.t1' (errno: 150) -set foreign_key_checks=1; -drop table t2; -set foreign_key_checks=0; -create table t1(a varchar(10) primary key) engine = innodb DEFAULT CHARSET=latin1; -create table t2 (a varchar(10), foreign key (a) references t1(a)) engine = innodb DEFAULT CHARSET=utf8; -ERROR HY000: Can't create table 'test.t2' (errno: 150) -set foreign_key_checks=1; -drop table t1; -set foreign_key_checks=0; -create table t2 (a varchar(10), foreign key (a) references t1(a)) engine = innodb; -create table t1(a varchar(10) primary key) engine = innodb; -alter table t1 modify column a int; -Got one of the listed errors -set foreign_key_checks=1; -drop table t2,t1; -set foreign_key_checks=0; -create table t2 (a varchar(10), foreign key (a) references t1(a)) engine = innodb DEFAULT CHARSET=latin1; -create table t1(a varchar(10) primary key) engine = innodb DEFAULT CHARSET=latin1; -alter table t1 convert to character set utf8; -set foreign_key_checks=1; -drop table t2,t1; -set foreign_key_checks=0; -create table t2 (a varchar(10), foreign key (a) references t1(a)) engine = innodb DEFAULT CHARSET=latin1; -create table t3(a varchar(10) primary key) engine = innodb DEFAULT CHARSET=utf8; -rename table t3 to t1; -ERROR HY000: Error on rename of './test/t3' to './test/t1' (errno: 150) -set foreign_key_checks=1; -drop table t2,t3; create table t1 (a varchar(255) character set utf8, b varchar(255) character set utf8, c varchar(255) character set utf8, diff --git a/mysql-test/t/innodb.test b/mysql-test/t/innodb.test index 735deba2b05..a73ecf7c3eb 100644 --- a/mysql-test/t/innodb.test +++ b/mysql-test/t/innodb.test @@ -1356,8 +1356,8 @@ source include/varchar.inc; # Clean up filename -- embedded server reports whole path without .frm, # regular server reports relative path with .frm (argh!) --replace_result \\ / $MYSQL_TEST_DIR . /var/master-data/ / t1.frm t1 +--error 1005 create table t1 (v varchar(65530), key(v)); -drop table t1; create table t1 (v varchar(65536)); show create table t1; drop table t1; @@ -1485,7 +1485,7 @@ CREATE TEMPORARY TABLE t2 DROP TABLE t1; # -# Test that index column max sizes are honored (bug #13315) +# Test that index column max sizes are checked (bug #13315) # # prefix index @@ -1512,36 +1512,22 @@ create table t8 (col1 blob, index(col1(767))) create table t9 (col1 varchar(512), col2 varchar(512), index(col1, col2)) character set = latin1 engine = innodb; -show create table t9; - drop table t1, t2, t3, t4, t5, t6, t7, t8, t9; -# these should have their index length trimmed -create table t1 (col1 varchar(768), index(col1)) +--error 1005 +create table t1 (col1 varchar(768), index (col1)) character set = latin1 engine = innodb; -create table t2 (col1 varbinary(768), index(col1)) +--error 1005 +create table t2 (col1 varchar(768) primary key) character set = latin1 engine = innodb; -create table t3 (col1 text, index(col1(768))) +--error 1005 +create table t3 (col1 varbinary(768) primary key) character set = latin1 engine = innodb; -create table t4 (col1 blob, index(col1(768))) +--error 1005 +create table t4 (col1 text, index(col1(768))) character set = latin1 engine = innodb; - -show create table t1; - -drop table t1, t2, t3, t4; - -# these should be refused ---error 1071 -create table t1 (col1 varchar(768) primary key) - character set = latin1 engine = innodb; ---error 1071 -create table t2 (col1 varbinary(768) primary key) - character set = latin1 engine = innodb; ---error 1071 -create table t3 (col1 text, primary key(col1(768))) - character set = latin1 engine = innodb; ---error 1071 -create table t4 (col1 blob, primary key(col1(768))) +--error 1005 +create table t5 (col1 blob, index(col1(768))) character set = latin1 engine = innodb; # @@ -1766,56 +1752,6 @@ drop table t1; drop table t2; commit; -# tests for bugs #9802 and #13778 - -# test that FKs between invalid types are not accepted - -set foreign_key_checks=0; -create table t2 (a int primary key, b int, foreign key (b) references t1(a)) engine = innodb; --- error 1005 -create table t1(a char(10) primary key, b varchar(20)) engine = innodb; -set foreign_key_checks=1; -drop table t2; - -# test that FKs between different charsets are not accepted in CREATE even -# when f_k_c is 0 - -set foreign_key_checks=0; -create table t1(a varchar(10) primary key) engine = innodb DEFAULT CHARSET=latin1; --- error 1005 -create table t2 (a varchar(10), foreign key (a) references t1(a)) engine = innodb DEFAULT CHARSET=utf8; -set foreign_key_checks=1; -drop table t1; - -# test that invalid datatype conversions with ALTER are not allowed - -set foreign_key_checks=0; -create table t2 (a varchar(10), foreign key (a) references t1(a)) engine = innodb; -create table t1(a varchar(10) primary key) engine = innodb; --- error 1025,1025 -alter table t1 modify column a int; -set foreign_key_checks=1; -drop table t2,t1; - -# test that charset conversions with ALTER are allowed when f_k_c is 0 - -set foreign_key_checks=0; -create table t2 (a varchar(10), foreign key (a) references t1(a)) engine = innodb DEFAULT CHARSET=latin1; -create table t1(a varchar(10) primary key) engine = innodb DEFAULT CHARSET=latin1; -alter table t1 convert to character set utf8; -set foreign_key_checks=1; -drop table t2,t1; - -# test that RENAME does not allow invalid charsets when f_k_c is 0 - -set foreign_key_checks=0; -create table t2 (a varchar(10), foreign key (a) references t1(a)) engine = innodb DEFAULT CHARSET=latin1; -create table t3(a varchar(10) primary key) engine = innodb DEFAULT CHARSET=utf8; --- error 1025 -rename table t3 to t1; -set foreign_key_checks=1; -drop table t2,t3; - # # Test that we can create a large (>1K) key # diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index d1536f9d282..1562803aed7 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -2540,12 +2540,6 @@ ha_innobase::open( DBUG_RETURN(0); } -uint -ha_innobase::max_supported_key_part_length() const -{ - return(DICT_MAX_INDEX_COL_LEN - 1); -} - /********************************************************************** Closes a handle to an InnoDB table. */ @@ -4704,9 +4698,6 @@ create_index( 0, prefix_len); } - /* Even though we've defined max_supported_key_part_length, we - still do our own checking using field_lengths to be absolutely - sure we don't create too long indexes. */ error = row_create_index_for_mysql(index, trx, field_lengths); error = convert_error_code_to_mysql(error, NULL); diff --git a/sql/ha_innodb.h b/sql/ha_innodb.h index f9a185bd885..9e701e8826b 100644 --- a/sql/ha_innodb.h +++ b/sql/ha_innodb.h @@ -110,7 +110,7 @@ class ha_innobase: public handler but currently MySQL does not work with keys whose size is > MAX_KEY_LENGTH */ uint max_supported_key_length() const { return 3500; } - uint max_supported_key_part_length() const; + uint max_supported_key_part_length() const { return 3500; } const key_map *keys_to_use_for_scanning() { return &key_map_full; } bool has_transactions() { return 1;} diff --git a/storage/innobase/btr/btr0sea.c b/storage/innobase/btr/btr0sea.c index 9b1e93fe700..7a4e92a672a 100644 --- a/storage/innobase/btr/btr0sea.c +++ b/storage/innobase/btr/btr0sea.c @@ -904,7 +904,6 @@ btr_search_drop_page_hash_index( ulint* folds; ulint i; mem_heap_t* heap; - dict_index_t* index; ulint* offsets; #ifdef UNIV_SYNC_DEBUG @@ -933,16 +932,11 @@ btr_search_drop_page_hash_index( n_fields = block->curr_n_fields; n_bytes = block->curr_n_bytes; - index = block->index; - /* NOTE: The fields of block must not be accessed after - releasing btr_search_latch, as the index page might only - be s-latched! */ + ut_a(n_fields + n_bytes > 0); rw_lock_s_unlock(&btr_search_latch); - ut_a(n_fields + n_bytes > 0); - n_recs = page_get_n_recs(page); /* Calculate and cache fold values into an array for fast deletion @@ -955,6 +949,14 @@ btr_search_drop_page_hash_index( rec = page_get_infimum_rec(page); rec = page_rec_get_next(rec); + if (!page_rec_is_supremum(rec)) { + ut_a(n_fields <= rec_get_n_fields(rec, block->index)); + + if (n_bytes > 0) { + ut_a(n_fields < rec_get_n_fields(rec, block->index)); + } + } + tree_id = btr_page_get_index_id(page); prev_fold = 0; @@ -962,12 +964,18 @@ btr_search_drop_page_hash_index( heap = NULL; offsets = NULL; + if (block->index == NULL) { + + mem_analyze_corruption((byte*)block); + + ut_a(block->index != NULL); + } + while (!page_rec_is_supremum(rec)) { /* FIXME: in a mixed tree, not all records may have enough ordering fields: */ - offsets = rec_get_offsets(rec, index, offsets, - n_fields + (n_bytes > 0), &heap); - ut_a(rec_offs_n_fields(offsets) == n_fields + (n_bytes > 0)); + offsets = rec_get_offsets(rec, block->index, + offsets, n_fields + (n_bytes > 0), &heap); fold = rec_fold(rec, offsets, n_fields, n_bytes, tree_id); if (fold == prev_fold && prev_fold != 0) { diff --git a/storage/innobase/dict/dict0dict.c b/storage/innobase/dict/dict0dict.c index 8050eebddd8..fb95ffbd80c 100644 --- a/storage/innobase/dict/dict0dict.c +++ b/storage/innobase/dict/dict0dict.c @@ -2104,11 +2104,8 @@ dict_foreign_find_index( dict_table_t* table, /* in: table */ const char** columns,/* in: array of column names */ ulint n_cols, /* in: number of columns */ - dict_index_t* types_idx, /* in: NULL or an index to whose types the - column types must match */ - ibool check_charsets) /* in: whether to check charsets. - only has an effect if types_idx != - NULL. */ + dict_index_t* types_idx)/* in: NULL or an index to whose types the + column types must match */ { #ifndef UNIV_HOTBACKUP dict_index_t* index; @@ -2138,8 +2135,7 @@ dict_foreign_find_index( if (types_idx && !cmp_types_are_equal( dict_index_get_nth_type(index, i), - dict_index_get_nth_type(types_idx, i), - check_charsets)) { + dict_index_get_nth_type(types_idx, i))) { break; } @@ -2216,8 +2212,7 @@ dict_foreign_add_to_cache( /*======================*/ /* out: DB_SUCCESS or error code */ dict_foreign_t* foreign, /* in, own: foreign key constraint */ - ibool check_charsets) /* in: TRUE=check charset - compatibility */ + ibool check_types) /* in: TRUE=check type compatibility */ { dict_table_t* for_table; dict_table_t* ref_table; @@ -2253,10 +2248,16 @@ dict_foreign_add_to_cache( } if (for_in_cache->referenced_table == NULL && ref_table) { + dict_index_t* types_idx; + if (check_types) { + types_idx = for_in_cache->foreign_index; + } else { + types_idx = NULL; + } index = dict_foreign_find_index(ref_table, (const char**) for_in_cache->referenced_col_names, for_in_cache->n_fields, - for_in_cache->foreign_index, check_charsets); + types_idx); if (index == NULL) { dict_foreign_error_report(ef, for_in_cache, @@ -2280,10 +2281,16 @@ dict_foreign_add_to_cache( } if (for_in_cache->foreign_table == NULL && for_table) { + dict_index_t* types_idx; + if (check_types) { + types_idx = for_in_cache->referenced_index; + } else { + types_idx = NULL; + } index = dict_foreign_find_index(for_table, (const char**) for_in_cache->foreign_col_names, for_in_cache->n_fields, - for_in_cache->referenced_index, check_charsets); + types_idx); if (index == NULL) { dict_foreign_error_report(ef, for_in_cache, @@ -3090,7 +3097,7 @@ col_loop1: /* Try to find an index which contains the columns as the first fields and in the right order */ - index = dict_foreign_find_index(table, column_names, i, NULL, TRUE); + index = dict_foreign_find_index(table, column_names, i, NULL); if (!index) { mutex_enter(&dict_foreign_err_mutex); @@ -3355,7 +3362,8 @@ try_find_index: if (referenced_table) { index = dict_foreign_find_index(referenced_table, - column_names, i, foreign->foreign_index, TRUE); + column_names, i, + foreign->foreign_index); if (!index) { dict_foreign_free(foreign); mutex_enter(&dict_foreign_err_mutex); diff --git a/storage/innobase/dict/dict0load.c b/storage/innobase/dict/dict0load.c index 3281f9926f9..9bafcf33553 100644 --- a/storage/innobase/dict/dict0load.c +++ b/storage/innobase/dict/dict0load.c @@ -1091,7 +1091,7 @@ dict_load_foreign( /* out: DB_SUCCESS or error code */ const char* id, /* in: foreign constraint id as a null-terminated string */ - ibool check_charsets)/* in: TRUE=check charset compatibility */ + ibool check_types)/* in: TRUE=check type compatibility */ { dict_foreign_t* foreign; dict_table_t* sys_foreign; @@ -1204,7 +1204,7 @@ dict_load_foreign( a new foreign key constraint but loading one from the data dictionary. */ - return(dict_foreign_add_to_cache(foreign, check_charsets)); + return(dict_foreign_add_to_cache(foreign, check_types)); } /*************************************************************************** @@ -1219,8 +1219,7 @@ dict_load_foreigns( /*===============*/ /* out: DB_SUCCESS or error code */ const char* table_name, /* in: table name */ - ibool check_charsets) /* in: TRUE=check charset - compatibility */ + ibool check_types) /* in: TRUE=check type compatibility */ { btr_pcur_t pcur; mem_heap_t* heap; @@ -1320,7 +1319,7 @@ loop: /* Load the foreign constraint definition to the dictionary cache */ - err = dict_load_foreign(id, check_charsets); + err = dict_load_foreign(id, check_types); if (err != DB_SUCCESS) { btr_pcur_close(&pcur); diff --git a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h index 24e7a71c02d..ae8d0411c12 100644 --- a/storage/innobase/include/buf0buf.h +++ b/storage/innobase/include/buf0buf.h @@ -745,6 +745,8 @@ struct buf_block_struct{ buffer pool which are index pages, but this flag is not set because we do not keep track of all pages */ + dict_index_t* index; /* index for which the adaptive + hash index has been created */ /* 2. Page flushing fields */ UT_LIST_NODE_T(buf_block_t) flush_list; @@ -831,7 +833,7 @@ struct buf_block_struct{ records with the same prefix should be indexed in the hash index */ - /* The following 6 fields are protected by btr_search_latch: */ + /* The following 4 fields are protected by btr_search_latch: */ ibool is_hashed; /* TRUE if hash index has already been built on this page; note that it does @@ -848,12 +850,6 @@ struct buf_block_struct{ ulint curr_side; /* BTR_SEARCH_LEFT_SIDE or BTR_SEARCH_RIGHT_SIDE in hash indexing */ - dict_index_t* index; /* Index for which the adaptive - hash index has been created. - This field may only be modified - while holding an s-latch or x-latch - on block->lock and an x-latch on - btr_search_latch. */ /* 6. Debug fields */ #ifdef UNIV_SYNC_DEBUG rw_lock_t debug_latch; /* in the debug version, each thread diff --git a/storage/innobase/include/dict0dict.h b/storage/innobase/include/dict0dict.h index 4396611e529..5215d51cabe 100644 --- a/storage/innobase/include/dict0dict.h +++ b/storage/innobase/include/dict0dict.h @@ -197,8 +197,7 @@ dict_foreign_add_to_cache( /*======================*/ /* out: DB_SUCCESS or error code */ dict_foreign_t* foreign, /* in, own: foreign key constraint */ - ibool check_charsets);/* in: TRUE=check charset - compatibility */ + ibool check_types); /* in: TRUE=check type compatibility */ /************************************************************************* Checks if a table is referenced by foreign keys. */ diff --git a/storage/innobase/include/dict0load.h b/storage/innobase/include/dict0load.h index 741123614ab..f13620bc6e8 100644 --- a/storage/innobase/include/dict0load.h +++ b/storage/innobase/include/dict0load.h @@ -82,8 +82,7 @@ dict_load_foreigns( /*===============*/ /* out: DB_SUCCESS or error code */ const char* table_name, /* in: table name */ - ibool check_charsets);/* in: TRUE=check charsets - compatibility */ + ibool check_types); /* in: TRUE=check type compatibility */ /************************************************************************ Prints to the standard output information on all tables found in the data dictionary system table. */ diff --git a/storage/innobase/include/rem0cmp.h b/storage/innobase/include/rem0cmp.h index f6762078cbc..1b1ee26b809 100644 --- a/storage/innobase/include/rem0cmp.h +++ b/storage/innobase/include/rem0cmp.h @@ -24,8 +24,7 @@ cmp_types_are_equal( /* out: TRUE if the types are considered equal in comparisons */ dtype_t* type1, /* in: type 1 */ - dtype_t* type2, /* in: type 2 */ - ibool check_charsets); /* in: whether to check charsets */ + dtype_t* type2); /* in: type 2 */ /***************************************************************** This function is used to compare two data fields for which we know the data type. */ diff --git a/storage/innobase/rem/rem0cmp.c b/storage/innobase/rem/rem0cmp.c index 6a463b7d4cf..7c33476fb9e 100644 --- a/storage/innobase/rem/rem0cmp.c +++ b/storage/innobase/rem/rem0cmp.c @@ -99,8 +99,7 @@ cmp_types_are_equal( /* out: TRUE if the types are considered equal in comparisons */ dtype_t* type1, /* in: type 1 */ - dtype_t* type2, /* in: type 2 */ - ibool check_charsets) /* in: whether to check charsets */ + dtype_t* type2) /* in: type 2 */ { if (dtype_is_non_binary_string_type(type1->mtype, type1->prtype) && dtype_is_non_binary_string_type(type2->mtype, type2->prtype)) { @@ -108,12 +107,12 @@ cmp_types_are_equal( /* Both are non-binary string types: they can be compared if and only if the charset-collation is the same */ - if (check_charsets) { - return(dtype_get_charset_coll(type1->prtype) - == dtype_get_charset_coll(type2->prtype)); - } else { + if (dtype_get_charset_coll(type1->prtype) + == dtype_get_charset_coll(type2->prtype)) { return(TRUE); } + + return(FALSE); } if (dtype_is_binary_string_type(type1->mtype, type1->prtype) diff --git a/storage/innobase/row/row0mysql.c b/storage/innobase/row/row0mysql.c index 723e305b2ab..82f7daf2ed8 100644 --- a/storage/innobase/row/row0mysql.c +++ b/storage/innobase/row/row0mysql.c @@ -2132,7 +2132,7 @@ row_table_add_foreign_constraints( if (err == DB_SUCCESS) { /* Check that also referencing constraints are ok */ - err = dict_load_foreigns(name, TRUE); + err = dict_load_foreigns(name, trx->check_foreigns); } if (err != DB_SUCCESS) { @@ -3590,8 +3590,7 @@ row_rename_table_for_mysql( mem_heap_t* heap = NULL; const char** constraints_to_drop = NULL; ulint n_constraints_to_drop = 0; - ibool recovering_temp_table = FALSE; - ibool old_is_tmp, new_is_tmp; + ibool recovering_temp_table = FALSE; ulint len; ulint i; ibool success; @@ -3631,9 +3630,6 @@ row_rename_table_for_mysql( trx->op_info = "renaming table"; trx_start_if_not_started(trx); - old_is_tmp = row_is_mysql_tmp_table_name(old_name); - new_is_tmp = row_is_mysql_tmp_table_name(new_name); - if (row_mysql_is_recovered_tmp_table(new_name)) { recovering_temp_table = TRUE; @@ -3680,7 +3676,7 @@ row_rename_table_for_mysql( len = (sizeof str1) + (sizeof str2) + (sizeof str3) + (sizeof str5) - 4 + ut_strlenq(new_name, '\'') + ut_strlenq(old_name, '\''); - if (new_is_tmp) { + if (row_is_mysql_tmp_table_name(new_name)) { db_name_len = dict_get_db_name_len(old_name) + 1; /* MySQL is doing an ALTER TABLE command and it renames the @@ -3833,7 +3829,7 @@ row_rename_table_for_mysql( the table is stored in a single-table tablespace */ success = dict_table_rename_in_cache(table, new_name, - !new_is_tmp); + !row_is_mysql_tmp_table_name(new_name)); if (!success) { trx->error_state = DB_SUCCESS; trx_general_rollback_for_mysql(trx, FALSE, NULL); @@ -3850,16 +3846,19 @@ row_rename_table_for_mysql( goto funct_exit; } - /* We only want to switch off some of the type checking in - an ALTER, not in a RENAME. */ - - err = dict_load_foreigns(new_name, - old_is_tmp ? trx->check_foreigns : TRUE); + err = dict_load_foreigns(new_name, trx->check_foreigns); - if (err != DB_SUCCESS) { - ut_print_timestamp(stderr); + if (row_is_mysql_tmp_table_name(old_name)) { - if (old_is_tmp) { + /* MySQL is doing an ALTER TABLE command and it + renames the created temporary table to the name + of the original table. In the ALTER TABLE we maybe + created some FOREIGN KEY constraints for the temporary + table. But we want to load also the foreign key + constraint definitions for the original table name. */ + + if (err != DB_SUCCESS) { + ut_print_timestamp(stderr); fputs(" InnoDB: Error: in ALTER TABLE ", stderr); ut_print_name(stderr, trx, new_name); @@ -3867,23 +3866,36 @@ row_rename_table_for_mysql( "InnoDB: has or is referenced in foreign key constraints\n" "InnoDB: which are not compatible with the new table definition.\n", stderr); - } else { + + ut_a(dict_table_rename_in_cache(table, + old_name, FALSE)); + trx->error_state = DB_SUCCESS; + trx_general_rollback_for_mysql(trx, FALSE, + NULL); + trx->error_state = DB_SUCCESS; + } + } else { + if (err != DB_SUCCESS) { + + ut_print_timestamp(stderr); + fputs( " InnoDB: Error: in RENAME TABLE table ", stderr); ut_print_name(stderr, trx, new_name); fputs("\n" - "InnoDB: is referenced in foreign key constraints\n" - "InnoDB: which are not compatible with the new table definition.\n", + "InnoDB: is referenced in foreign key constraints\n" + "InnoDB: which are not compatible with the new table definition.\n", stderr); - } - - ut_a(dict_table_rename_in_cache(table, + + ut_a(dict_table_rename_in_cache(table, old_name, FALSE)); - trx->error_state = DB_SUCCESS; - trx_general_rollback_for_mysql(trx, FALSE, - NULL); - trx->error_state = DB_SUCCESS; + + trx->error_state = DB_SUCCESS; + trx_general_rollback_for_mysql(trx, FALSE, + NULL); + trx->error_state = DB_SUCCESS; + } } } funct_exit: