diff options
author | monty@hundin.mysql.fi <> | 2002-03-27 01:56:10 +0200 |
---|---|---|
committer | monty@hundin.mysql.fi <> | 2002-03-27 01:56:10 +0200 |
commit | 727e507bca7fe9342f543340f9d7ea7a02e9708e (patch) | |
tree | 6998f99b1790b678ac1558e748e2a8c992bbfa22 /innobase/row/row0mysql.c | |
parent | ce541b292a20114adc5d5bb10142a441246e0675 (diff) | |
parent | 3a571c7c135b9e9707e09ace4058d00ed6935fd1 (diff) | |
download | mariadb-git-727e507bca7fe9342f543340f9d7ea7a02e9708e.tar.gz |
merge with 3.23.50
Diffstat (limited to 'innobase/row/row0mysql.c')
-rw-r--r-- | innobase/row/row0mysql.c | 80 |
1 files changed, 69 insertions, 11 deletions
diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c index f5ed0ef65af..78b32a5642b 100644 --- a/innobase/row/row0mysql.c +++ b/innobase/row/row0mysql.c @@ -1887,6 +1887,28 @@ loop: } /************************************************************************* +Checks if a table name contains the string "/#sql" which denotes temporary +tables in MySQL. */ +static +ibool +row_is_mysql_tmp_table_name( +/*========================*/ + /* out: TRUE if temporary table */ + char* name) /* in: table name in the form 'database/tablename' */ +{ + ulint i; + + for (i = 0; i <= ut_strlen(name) - 5; i++) { + if (ut_memcmp(name + i, "/#sql", 5) == 0) { + + return(TRUE); + } + } + + return(FALSE); +} + +/************************************************************************* Renames a table for MySQL. */ int @@ -1949,16 +1971,27 @@ row_rename_table_for_mysql( str2 = (char *) "';\nold_table_name := '"; - str3 = (char *) - "';\n" - "UPDATE SYS_TABLES SET NAME = new_table_name\n" - "WHERE NAME = old_table_name;\n" - "UPDATE SYS_FOREIGN SET FOR_NAME = new_table_name\n" - "WHERE FOR_NAME = old_table_name;\n" - "UPDATE SYS_FOREIGN SET REF_NAME = new_table_name\n" - "WHERE REF_NAME = old_table_name;\n" - "COMMIT WORK;\n" - "END;\n"; + if (row_is_mysql_tmp_table_name(new_name)) { + + /* We want to preserve the original foreign key + constraint definitions despite the name change */ + + str3 = (char*) + "';\n" + "UPDATE SYS_TABLES SET NAME = new_table_name\n" + "WHERE NAME = old_table_name;\n" + "END;\n"; + } else { + str3 = (char*) + "';\n" + "UPDATE SYS_TABLES SET NAME = new_table_name\n" + "WHERE NAME = old_table_name;\n" + "UPDATE SYS_FOREIGN SET FOR_NAME = new_table_name\n" + "WHERE FOR_NAME = old_table_name;\n" + "UPDATE SYS_FOREIGN SET REF_NAME = new_table_name\n" + "WHERE REF_NAME = old_table_name;\n" + "END;\n"; + } len = ut_strlen(str1); @@ -2033,7 +2066,32 @@ row_rename_table_for_mysql( trx_general_rollback_for_mysql(trx, FALSE, NULL); trx->error_state = DB_SUCCESS; } else { - ut_a(dict_table_rename_in_cache(table, new_name)); + ut_a(dict_table_rename_in_cache(table, new_name, + !row_is_mysql_tmp_table_name(new_name))); + + if (row_is_mysql_tmp_table_name(old_name)) { + + err = dict_load_foreigns(new_name); + + if (err != DB_SUCCESS) { + + ut_print_timestamp(stderr); + + fprintf(stderr, + " InnoDB: Error: in ALTER TABLE table %s\n" + "InnoDB: has or is referenced in foreign key constraints\n" + "InnoDB: which are not compatible with the new table definition.\n", + new_name); + + 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; + } + } } funct_exit: mutex_exit(&(dict_sys->mutex)); |