Commit 87a9d60e authored by Sergei Golubchik's avatar Sergei Golubchik

revert

"
  revision-id: sanja@askmonty.org-20110511110948-4kdevwzomvk56y1w
  committer: sanja@askmonty.org
  branch nick: work-maria-5.1-CREATE-merge
  timestamp: Wed 2011-05-11 14:09:48 +0300
    Bugfix: New table creation/renaming block added if old encoded table present
"
the old behavior was less inconsistent than the new one.
In the new one the error message was sometimes different (under LOCK TABLES e.g.),
and there were race conditions (if this CREATE happened when a concurrent ALTER
has renamed the old table away but haven't put the new table in place)

The old one was like "(when using old table names) for DML #mysql50# prefix
is optional, for DDL it's required".
parent b9f42f4b
...@@ -1899,25 +1899,36 @@ create table t3 (a int) row_format=page; ...@@ -1899,25 +1899,36 @@ create table t3 (a int) row_format=page;
drop table t1,t2,t3; drop table t1,t2,t3;
# -- End of Bug#45829 # -- End of Bug#45829
# new table creation/renaming blocked if old encoded table present create table `#mysql50#t-1` (a int) engine=myisam;
create table `t-1` (a int) engine=myisam; insert into `#mysql50#t-1` values (1);
insert into `t-1` values (1);
show tables; show tables;
Tables_in_test Tables_in_test
t-1 #mysql50#t-1
flush tables; create table `t-1` (a int);
convert table files in mysql 5.0 file name encoding
show tables; show tables;
Tables_in_test Tables_in_test
#mysql50#t-1 #mysql50#t-1
create table `t-1` (a int); t-1
ERROR 42S01: Table '#mysql50#t-1' already exists select * from `t-1`;
a
select * from `#mysql50#t-1`;
a
1
drop table `t-1`;
create table t1 (a int); create table t1 (a int);
alter table t1 rename `t-1`; 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`; rename table t1 to `t-1`;
ERROR 42S01: Table '#mysql50#t-1' already exists show tables;
drop table `#mysql50#t-1`, t1; Tables_in_test
#mysql50#t-1
t-1
drop table `#mysql50#t-1`, `t-1`;
End of 5.1 tests End of 5.1 tests
......
...@@ -41,18 +41,20 @@ t-1 ...@@ -41,18 +41,20 @@ t-1
t1 t1
drop database `mysqltest1`; drop database `mysqltest1`;
drop database `mysqltest-1`; 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); create table `txu#p#p1` (s1 int);
insert into `txu#p#p1` values (1); insert into `txu#p#p1` values (1);
select * from `txu@0023p@0023p1`; select * from `txu@0023p@0023p1`;
ERROR 42S02: Table 'test.txu@0023p@0023p1' doesn't exist ERROR 42S02: Table 'test.txu@0023p@0023p1' doesn't exist
create table `txu@0023p@0023p1` (s1 int); 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`; select * from `txu#p#p1`;
s1 s1
1 1
drop table `txu#p#p1`; 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 # Bug#37631 Incorrect key file for table after upgrading from 5.0 to 5.1
# #
......
...@@ -1559,29 +1559,26 @@ drop table t1,t2,t3; ...@@ -1559,29 +1559,26 @@ drop table t1,t2,t3;
--echo # -- End of Bug#45829 --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`; let $MYSQLD_DATADIR= `select @@datadir`;
create table `t-1` (a int) engine=myisam; create table `#mysql50#t-1` (a int) engine=myisam;
insert into `t-1` values (1); insert into `#mysql50#t-1` values (1);
show tables; 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); 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); create table t1 (a int);
--error ER_TABLE_EXISTS_ERROR
alter table t1 rename `t-1`; 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`; rename table t1 to `t-1`;
drop table `#mysql50#t-1`, t1; show tables;
drop table `#mysql50#t-1`, `t-1`;
--echo --echo
--echo End of 5.1 tests --echo End of 5.1 tests
......
...@@ -33,18 +33,15 @@ drop database `mysqltest-1`; ...@@ -33,18 +33,15 @@ drop database `mysqltest-1`;
# #
# Bug#17142: Crash if create with encoded name # 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); create table `txu#p#p1` (s1 int);
insert into `txu#p#p1` values (1); insert into `txu#p#p1` values (1);
--error 1146 --error 1146
select * from `txu@0023p@0023p1`; select * from `txu@0023p@0023p1`;
--error ER_TABLE_EXISTS_ERROR
create table `txu@0023p@0023p1` (s1 int); create table `txu@0023p@0023p1` (s1 int);
show tables;
select * from `txu#p#p1`; select * from `txu#p#p1`;
drop table `txu#p#p1`; drop table `txu#p#p1`;
drop table `txu@0023p@0023p1`;
--echo # --echo #
--echo # Bug#37631 Incorrect key file for table after upgrading from 5.0 to 5.1 --echo # Bug#37631 Incorrect key file for table after upgrading from 5.0 to 5.1
......
...@@ -241,7 +241,7 @@ do_rename(THD *thd, TABLE_LIST *ren_table, char *new_db, char *new_table_name, ...@@ -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) char *new_table_alias, bool skip_error)
{ {
int rc= 1; 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; const char *new_alias, *old_alias;
frm_type_enum frm_type; frm_type_enum frm_type;
enum legacy_db_type table_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, ...@@ -260,17 +260,17 @@ do_rename(THD *thd, TABLE_LIST *ren_table, char *new_db, char *new_table_name,
} }
DBUG_ASSERT(new_alias); 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); new_db, new_alias, reg_ext, 0);
build_table_filename(old_name, sizeof(old_name) - 1, if (!access(name,F_OK))
ren_table->db, old_alias, reg_ext, 0);
if (check_table_file_presence(old_name,
new_name, new_db, new_alias, new_alias, TRUE))
{ {
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), new_alias);
DBUG_RETURN(1); // This can't be skipped 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) switch (frm_type)
{ {
case FRMTYPE_TABLE: case FRMTYPE_TABLE:
...@@ -322,7 +322,7 @@ do_rename(THD *thd, TABLE_LIST *ren_table, char *new_db, char *new_table_name, ...@@ -322,7 +322,7 @@ do_rename(THD *thd, TABLE_LIST *ren_table, char *new_db, char *new_table_name,
default: default:
DBUG_ASSERT(0); // should never happen DBUG_ASSERT(0); // should never happen
case FRMTYPE_ERROR: 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; break;
} }
if (rc && !skip_error) if (rc && !skip_error)
......
...@@ -4036,68 +4036,6 @@ static bool check_if_created_table_can_be_opened(THD *thd, ...@@ -4036,68 +4036,6 @@ static bool check_if_created_table_can_be_opened(THD *thd,
#endif #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 Create a table
...@@ -4382,12 +4320,11 @@ bool mysql_create_table_no_lock(THD *thd, ...@@ -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 (!internal_tmp_table && !(create_info->options & HA_LEX_CREATE_TMP_TABLE))
{ {
if (check_table_file_presence(NULL, path, db, table_name, table_name, if (!access(path,F_OK))
!(create_info->options &
HA_LEX_CREATE_IF_NOT_EXISTS)))
{ {
if (create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS) if (create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS)
goto warn; goto warn;
my_error(ER_TABLE_EXISTS_ERROR,MYF(0),table_name);
goto err; goto err;
} }
/* /*
...@@ -6066,7 +6003,6 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, ...@@ -6066,7 +6003,6 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
MDL_request target_mdl_request; MDL_request target_mdl_request;
int error= 0; int error= 0;
char tmp_name[80],old_name[32],new_name_buff[FN_REFLEN + 1]; 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 new_alias_buff[FN_REFLEN], *table_name, *db, *new_alias, *alias;
char index_file[FN_REFLEN], data_file[FN_REFLEN]; char index_file[FN_REFLEN], data_file[FN_REFLEN];
char path[FN_REFLEN + 1]; char path[FN_REFLEN + 1];
...@@ -6273,12 +6209,10 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, ...@@ -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, build_table_filename(new_name_buff, sizeof(new_name_buff) - 1,
new_db, new_name_buff, reg_ext, 0); new_db, new_name_buff, reg_ext, 0);
build_table_filename(old_name_buff, sizeof(old_name_buff) - 1, if (!access(new_name_buff, F_OK))
db, table_name, reg_ext, 0);
if (check_table_file_presence(old_name_buff, new_name_buff, new_db,
new_name, new_alias, TRUE))
{ {
/* Table will be closed in do_command() */ /* Table will be closed in do_command() */
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), new_alias);
goto err; goto err;
} }
} }
......
...@@ -131,9 +131,6 @@ uint build_table_filename(char *buff, size_t bufflen, const char *db, ...@@ -131,9 +131,6 @@ uint build_table_filename(char *buff, size_t bufflen, const char *db,
const char *table, const char *ext, uint flags); const char *table, const char *ext, uint flags);
uint build_table_shadow_filename(char *buff, size_t bufflen, uint build_table_shadow_filename(char *buff, size_t bufflen,
ALTER_PARTITION_PARAM_TYPE *lpt); 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, bool mysql_create_table(THD *thd, TABLE_LIST *create_table,
HA_CREATE_INFO *create_info, HA_CREATE_INFO *create_info,
Alter_info *alter_info); Alter_info *alter_info);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment