merge
This commit is contained in:
commit
1779c2adbf
@ -1890,5 +1890,24 @@ 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 `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
|
||||||
|
show tables;
|
||||||
|
Tables_in_test
|
||||||
|
#mysql50#t-1
|
||||||
|
create table `t-1` (a int);
|
||||||
|
ERROR 42S01: Table '#mysql50#t-1' already exists
|
||||||
|
create table t1 (a int);
|
||||||
|
alter table t1 rename `t-1`;
|
||||||
|
ERROR 42S01: Table '#mysql50#t-1' already exists
|
||||||
|
rename table t1 to `t-1`;
|
||||||
|
ERROR 42S01: Table '#mysql50#t-1' already exists
|
||||||
|
drop table `#mysql50#t-1`, t1;
|
||||||
|
|
||||||
End of 5.1 tests
|
End of 5.1 tests
|
||||||
|
@ -48,14 +48,10 @@ 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);
|
||||||
insert into `txu@0023p@0023p1` values (2);
|
ERROR 42S01: Table '#mysql50#txu@0023p@0023p1' already exists
|
||||||
select * from `txu@0023p@0023p1`;
|
|
||||||
s1
|
|
||||||
2
|
|
||||||
select * from `txu#p#p1`;
|
select * from `txu#p#p1`;
|
||||||
s1
|
s1
|
||||||
1
|
1
|
||||||
drop table `txu@0023p@0023p1`;
|
|
||||||
drop table `txu#p#p1`;
|
drop table `txu#p#p1`;
|
||||||
#
|
#
|
||||||
# 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
|
||||||
|
@ -1534,5 +1534,30 @@ drop table t1,t2,t3;
|
|||||||
--echo
|
--echo
|
||||||
--echo # -- End of Bug#45829
|
--echo # -- End of Bug#45829
|
||||||
|
|
||||||
|
#
|
||||||
|
--echo # new table creation/renaming 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);
|
||||||
|
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 t1 (a int);
|
||||||
|
--error ER_TABLE_EXISTS_ERROR
|
||||||
|
alter table t1 rename `t-1`;
|
||||||
|
--error ER_TABLE_EXISTS_ERROR
|
||||||
|
rename table t1 to `t-1`;
|
||||||
|
drop table `#mysql50#t-1`, t1;
|
||||||
|
|
||||||
--echo
|
--echo
|
||||||
--echo End of 5.1 tests
|
--echo End of 5.1 tests
|
||||||
|
@ -41,11 +41,9 @@ 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);
|
||||||
insert into `txu@0023p@0023p1` values (2);
|
|
||||||
select * from `txu@0023p@0023p1`;
|
|
||||||
select * from `txu#p#p1`;
|
select * from `txu#p#p1`;
|
||||||
drop table `txu@0023p@0023p1`;
|
|
||||||
drop table `txu#p#p1`;
|
drop table `txu#p#p1`;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -1228,6 +1228,11 @@ bool mysql_handle_derived(LEX *lex, bool (*processor)(THD *thd,
|
|||||||
TABLE_LIST *table));
|
TABLE_LIST *table));
|
||||||
bool mysql_derived_prepare(THD *thd, LEX *lex, TABLE_LIST *t);
|
bool mysql_derived_prepare(THD *thd, LEX *lex, TABLE_LIST *t);
|
||||||
bool mysql_derived_filling(THD *thd, LEX *lex, TABLE_LIST *t);
|
bool mysql_derived_filling(THD *thd, LEX *lex, TABLE_LIST *t);
|
||||||
|
bool check_table_file_presence(char *old_path, char *path,
|
||||||
|
const char *db,
|
||||||
|
const char *table_name,
|
||||||
|
const char *alias,
|
||||||
|
bool issue_error);
|
||||||
Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
|
Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
|
||||||
Item ***copy_func, Field **from_field,
|
Item ***copy_func, Field **from_field,
|
||||||
Field **def_field,
|
Field **def_field,
|
||||||
|
@ -245,7 +245,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 name[FN_REFLEN + 1];
|
char new_name[FN_REFLEN + 1], old_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;
|
||||||
@ -264,17 +264,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(name, sizeof(name) - 1,
|
build_table_filename(new_name, sizeof(new_name) - 1,
|
||||||
new_db, new_alias, reg_ext, 0);
|
new_db, new_alias, reg_ext, 0);
|
||||||
if (!access(name,F_OK))
|
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))
|
||||||
{
|
{
|
||||||
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= mysql_frm_type(thd, name, &table_type);
|
frm_type= mysql_frm_type(thd, old_name, &table_type);
|
||||||
switch (frm_type)
|
switch (frm_type)
|
||||||
{
|
{
|
||||||
case FRMTYPE_TABLE:
|
case FRMTYPE_TABLE:
|
||||||
@ -319,7 +319,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), name, my_errno);
|
my_error(ER_FILE_NOT_FOUND, MYF(0), old_name, my_errno);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (rc && !skip_error)
|
if (rc && !skip_error)
|
||||||
|
@ -3794,9 +3794,15 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||||||
it.rewind(); /* To get access to new elements in basis list */
|
it.rewind(); /* To get access to new elements in basis list */
|
||||||
while ((db_name= it++))
|
while ((db_name= it++))
|
||||||
{
|
{
|
||||||
/* db_name can be changed in make_table_list() func */
|
LEX_STRING orig_db_name;
|
||||||
LEX_STRING orig_db_name= *db_name;
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
db_name can be changed in make_table_list() func.
|
||||||
|
We need copy of db_name because it can change case.
|
||||||
|
*/
|
||||||
|
if (!thd->make_lex_string(&orig_db_name, db_name->str,
|
||||||
|
db_name->length, FALSE))
|
||||||
|
goto err;
|
||||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||||
if (!(check_access(thd,SELECT_ACL, db_name->str,
|
if (!(check_access(thd,SELECT_ACL, db_name->str,
|
||||||
&thd->col_access, 0, 1, with_i_schema) ||
|
&thd->col_access, 0, 1, with_i_schema) ||
|
||||||
|
@ -3658,6 +3658,68 @@ static inline int write_create_table_bin_log(THD *thd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
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
|
||||||
|
|
||||||
@ -3943,11 +4005,12 @@ bool mysql_create_table_no_lock(THD *thd,
|
|||||||
VOID(pthread_mutex_lock(&LOCK_open));
|
VOID(pthread_mutex_lock(&LOCK_open));
|
||||||
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 (!access(path,F_OK))
|
if (check_table_file_presence(NULL, path, db, table_name, table_name,
|
||||||
|
!(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 unlock_and_end;
|
goto unlock_and_end;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@ -6604,6 +6667,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
|||||||
TABLE *table, *new_table= 0, *name_lock= 0;
|
TABLE *table, *new_table= 0, *name_lock= 0;
|
||||||
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];
|
||||||
@ -6833,10 +6897,12 @@ view_err:
|
|||||||
|
|
||||||
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);
|
||||||
if (!access(new_name_buff, F_OK))
|
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))
|
||||||
{
|
{
|
||||||
/* 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user