diff --git a/mysql-test/r/create.result b/mysql-test/r/create.result index 7c556354d2e..bb3b672858a 100644 --- a/mysql-test/r/create.result +++ b/mysql-test/r/create.result @@ -1899,25 +1899,36 @@ create table t3 (a int) row_format=page; drop table t1,t2,t3; # -- End of Bug#45829 -# new table creation/renaming blocked if old encoded table present -create table `t-1` (a int) engine=myisam; -insert into `t-1` values (1); -show tables; -Tables_in_test -t-1 -flush tables; -convert table files in mysql 5.0 file name encoding +create table `#mysql50#t-1` (a int) engine=myisam; +insert into `#mysql50#t-1` values (1); show tables; Tables_in_test #mysql50#t-1 create table `t-1` (a int); -ERROR 42S01: Table '#mysql50#t-1' already exists +show tables; +Tables_in_test +#mysql50#t-1 +t-1 +select * from `t-1`; +a +select * from `#mysql50#t-1`; +a +1 +drop table `t-1`; create table t1 (a int); alter table t1 rename `t-1`; -ERROR 42S01: Table '#mysql50#t-1' already exists +show tables; +Tables_in_test +#mysql50#t-1 +t-1 +drop table `t-1`; +create table t1 (a int); rename table t1 to `t-1`; -ERROR 42S01: Table '#mysql50#t-1' already exists -drop table `#mysql50#t-1`, t1; +show tables; +Tables_in_test +#mysql50#t-1 +t-1 +drop table `#mysql50#t-1`, `t-1`; End of 5.1 tests diff --git a/mysql-test/r/upgrade.result b/mysql-test/r/upgrade.result index 4f52fd1e246..d565bb2dbd6 100644 --- a/mysql-test/r/upgrade.result +++ b/mysql-test/r/upgrade.result @@ -41,18 +41,20 @@ t-1 t1 drop database `mysqltest1`; drop database `mysqltest-1`; -drop table if exists `txu@0023p@0023p1`; -drop table if exists `txu#p#p1`; create table `txu#p#p1` (s1 int); insert into `txu#p#p1` values (1); select * from `txu@0023p@0023p1`; ERROR 42S02: Table 'test.txu@0023p@0023p1' doesn't exist create table `txu@0023p@0023p1` (s1 int); -ERROR 42S01: Table '#mysql50#txu@0023p@0023p1' already exists +show tables; +Tables_in_test +txu#p#p1 +txu@0023p@0023p1 select * from `txu#p#p1`; s1 1 drop table `txu#p#p1`; +drop table `txu@0023p@0023p1`; # # Bug#37631 Incorrect key file for table after upgrading from 5.0 to 5.1 # diff --git a/mysql-test/t/create.test b/mysql-test/t/create.test index a61f89539cb..f82d859243a 100644 --- a/mysql-test/t/create.test +++ b/mysql-test/t/create.test @@ -1559,29 +1559,26 @@ drop table t1,t2,t3; --echo # -- End of Bug#45829 # ---echo # new table creation/renaming blocked if old encoded table present +# new table creation/renaming is NOT blocked if old encoded table present # let $MYSQLD_DATADIR= `select @@datadir`; -create table `t-1` (a int) engine=myisam; -insert into `t-1` values (1); +create table `#mysql50#t-1` (a int) engine=myisam; +insert into `#mysql50#t-1` values (1); show tables; -flush tables; ---echo convert table files in mysql 5.0 file name encoding ---copy_file $MYSQLD_DATADIR/test/t@002d1.MYD $MYSQLD_DATADIR/test/t-1.MYD ---copy_file $MYSQLD_DATADIR/test/t@002d1.MYI $MYSQLD_DATADIR/test/t-1.MYI ---copy_file $MYSQLD_DATADIR/test/t@002d1.frm $MYSQLD_DATADIR/test/t-1.frm ---remove_file $MYSQLD_DATADIR/test/t@002d1.MYD ---remove_file $MYSQLD_DATADIR/test/t@002d1.MYI ---remove_file $MYSQLD_DATADIR/test/t@002d1.frm -show tables; ---error ER_TABLE_EXISTS_ERROR create table `t-1` (a int); +show tables; +# selects can distinguish between the two tables +select * from `t-1`; +select * from `#mysql50#t-1`; +drop table `t-1`; create table t1 (a int); ---error ER_TABLE_EXISTS_ERROR alter table t1 rename `t-1`; ---error ER_TABLE_EXISTS_ERROR +show tables; +drop table `t-1`; +create table t1 (a int); rename table t1 to `t-1`; -drop table `#mysql50#t-1`, t1; +show tables; +drop table `#mysql50#t-1`, `t-1`; --echo --echo End of 5.1 tests diff --git a/mysql-test/t/upgrade.test b/mysql-test/t/upgrade.test index a8c875ef764..c6d01a16f49 100644 --- a/mysql-test/t/upgrade.test +++ b/mysql-test/t/upgrade.test @@ -33,18 +33,15 @@ drop database `mysqltest-1`; # # Bug#17142: Crash if create with encoded name # ---disable_warnings -drop table if exists `txu@0023p@0023p1`; -drop table if exists `txu#p#p1`; ---enable_warnings create table `txu#p#p1` (s1 int); insert into `txu#p#p1` values (1); --error 1146 select * from `txu@0023p@0023p1`; ---error ER_TABLE_EXISTS_ERROR create table `txu@0023p@0023p1` (s1 int); +show tables; select * from `txu#p#p1`; drop table `txu#p#p1`; +drop table `txu@0023p@0023p1`; --echo # --echo # Bug#37631 Incorrect key file for table after upgrading from 5.0 to 5.1 diff --git a/sql/sql_rename.cc b/sql/sql_rename.cc index c91623cee6e..cf9810db445 100644 --- a/sql/sql_rename.cc +++ b/sql/sql_rename.cc @@ -241,7 +241,7 @@ do_rename(THD *thd, TABLE_LIST *ren_table, char *new_db, char *new_table_name, char *new_table_alias, bool skip_error) { int rc= 1; - char new_name[FN_REFLEN + 1], old_name[FN_REFLEN + 1]; + char name[FN_REFLEN + 1]; const char *new_alias, *old_alias; frm_type_enum frm_type; enum legacy_db_type table_type; @@ -260,17 +260,17 @@ do_rename(THD *thd, TABLE_LIST *ren_table, char *new_db, char *new_table_name, } DBUG_ASSERT(new_alias); - build_table_filename(new_name, sizeof(new_name) - 1, + build_table_filename(name, sizeof(name) - 1, new_db, new_alias, reg_ext, 0); - build_table_filename(old_name, sizeof(old_name) - 1, - ren_table->db, old_alias, reg_ext, 0); - if (check_table_file_presence(old_name, - new_name, new_db, new_alias, new_alias, TRUE)) + if (!access(name,F_OK)) { + my_error(ER_TABLE_EXISTS_ERROR, MYF(0), new_alias); DBUG_RETURN(1); // This can't be skipped } + build_table_filename(name, sizeof(name) - 1, + ren_table->db, old_alias, reg_ext, 0); - frm_type= dd_frm_type(thd, old_name, &table_type); + frm_type= dd_frm_type(thd, name, &table_type); switch (frm_type) { case FRMTYPE_TABLE: @@ -322,7 +322,7 @@ do_rename(THD *thd, TABLE_LIST *ren_table, char *new_db, char *new_table_name, default: DBUG_ASSERT(0); // should never happen case FRMTYPE_ERROR: - my_error(ER_FILE_NOT_FOUND, MYF(0), old_name, my_errno); + my_error(ER_FILE_NOT_FOUND, MYF(0), name, my_errno); break; } if (rc && !skip_error) diff --git a/sql/sql_table.cc b/sql/sql_table.cc index ad30b26908a..4ab7fc28381 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -4036,68 +4036,6 @@ static bool check_if_created_table_can_be_opened(THD *thd, #endif -/** - Check that there is no frm file for given table - - @param old_path path to the old frm file - @param path path to the frm file in new encoding - @param db database name - @param table_name table name - @param alias table name for error message (for new encoding) - @param issue_error should we issue error messages - - @retval FALSE there is no frm file - @retval TRUE there is frm file -*/ - -bool check_table_file_presence(char *old_path, - char *path, - const char *db, - const char *table_name, - const char *alias, - bool issue_error) -{ - if (!access(path,F_OK)) - { - if (issue_error) - my_error(ER_TABLE_EXISTS_ERROR,MYF(0),alias); - return TRUE; - } - { - /* - Check if file of the table in 5.0 file name encoding exists. - - Except case when it is the same table. - */ - char tbl50[FN_REFLEN]; -#ifdef _WIN32 - if (check_if_legal_tablename(table_name) != 0) - { - /* - Check for reserved device names for which access() returns 0 - (CON, AUX etc). - */ - return FALSE; - } -#endif - strxmov(tbl50, mysql_data_home, "/", db, "/", table_name, NullS); - fn_format(tbl50, tbl50, "", reg_ext, MY_UNPACK_FILENAME); - if (!access(tbl50, F_OK) && - (old_path == NULL || - strcmp(old_path, tbl50) != 0)) - { - if (issue_error) - { - strxmov(tbl50, MYSQL50_TABLE_NAME_PREFIX, table_name, NullS); - my_error(ER_TABLE_EXISTS_ERROR, MYF(0), tbl50); - } - return TRUE; - } - } - return FALSE; -} - - /* Create a table @@ -4382,12 +4320,11 @@ bool mysql_create_table_no_lock(THD *thd, if (!internal_tmp_table && !(create_info->options & HA_LEX_CREATE_TMP_TABLE)) { - if (check_table_file_presence(NULL, path, db, table_name, table_name, - !(create_info->options & - HA_LEX_CREATE_IF_NOT_EXISTS))) + if (!access(path,F_OK)) { if (create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS) goto warn; + my_error(ER_TABLE_EXISTS_ERROR,MYF(0),table_name); goto err; } /* @@ -6066,7 +6003,6 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, MDL_request target_mdl_request; int error= 0; char tmp_name[80],old_name[32],new_name_buff[FN_REFLEN + 1]; - char old_name_buff[FN_REFLEN + 1]; char new_alias_buff[FN_REFLEN], *table_name, *db, *new_alias, *alias; char index_file[FN_REFLEN], data_file[FN_REFLEN]; char path[FN_REFLEN + 1]; @@ -6273,12 +6209,10 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, */ build_table_filename(new_name_buff, sizeof(new_name_buff) - 1, new_db, new_name_buff, reg_ext, 0); - build_table_filename(old_name_buff, sizeof(old_name_buff) - 1, - db, table_name, reg_ext, 0); - if (check_table_file_presence(old_name_buff, new_name_buff, new_db, - new_name, new_alias, TRUE)) + if (!access(new_name_buff, F_OK)) { /* Table will be closed in do_command() */ + my_error(ER_TABLE_EXISTS_ERROR, MYF(0), new_alias); goto err; } } diff --git a/sql/sql_table.h b/sql/sql_table.h index 7826c540487..4dc28aa4933 100644 --- a/sql/sql_table.h +++ b/sql/sql_table.h @@ -131,9 +131,6 @@ uint build_table_filename(char *buff, size_t bufflen, const char *db, const char *table, const char *ext, uint flags); uint build_table_shadow_filename(char *buff, size_t bufflen, ALTER_PARTITION_PARAM_TYPE *lpt); -bool check_table_file_presence(char *old_path, char *path, const char *db, - const char *table_name, const char *alias, - bool issue_error); bool mysql_create_table(THD *thd, TABLE_LIST *create_table, HA_CREATE_INFO *create_info, Alter_info *alter_info);