mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Some small portability fixes.
Added support for lower_case_table_names=2, which is to be used on case insensitive file systems. This tells MySQL to preserve the used case of filenames and database names to make it esier to move files between cases sensitive can case insensitive file systems (like Windows and Linux)
This commit is contained in:
@ -163,7 +163,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
|
||||
bool dont_log_query)
|
||||
{
|
||||
TABLE_LIST *table;
|
||||
char path[FN_REFLEN];
|
||||
char path[FN_REFLEN], *alias;
|
||||
String wrong_tables;
|
||||
db_type table_type;
|
||||
int error;
|
||||
@ -193,15 +193,12 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
|
||||
drop_locked_tables(thd,db,table->real_name);
|
||||
if (thd->killed)
|
||||
DBUG_RETURN(-1);
|
||||
|
||||
alias= (lower_case_table_names == 2) ? table->alias : table->real_name;
|
||||
/* remove form file and isam files */
|
||||
strxmov(path, mysql_data_home, "/", db, "/", table->real_name, reg_ext,
|
||||
NullS);
|
||||
strxmov(path, mysql_data_home, "/", db, "/", alias, reg_ext, NullS);
|
||||
(void) unpack_filename(path,path);
|
||||
error=0;
|
||||
|
||||
table_type=get_table_type(path);
|
||||
|
||||
if (access(path,F_OK))
|
||||
{
|
||||
if (!if_exists)
|
||||
@ -210,7 +207,8 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
|
||||
else
|
||||
{
|
||||
char *end;
|
||||
*(end=fn_ext(path))=0; // Remove extension
|
||||
table_type= get_table_type(path);
|
||||
*(end=fn_ext(path))=0; // Remove extension for delete
|
||||
error=ha_delete_table(table_type, path);
|
||||
if (error == ENOENT && if_exists)
|
||||
error = 0;
|
||||
@ -350,7 +348,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
|
||||
List<Key> &keys,bool tmp_table,bool no_log)
|
||||
{
|
||||
char path[FN_REFLEN];
|
||||
const char *key_name;
|
||||
const char *key_name, *alias;
|
||||
create_field *sql_field,*dup_field;
|
||||
int error= -1;
|
||||
uint db_options,field,null_fields,blob_columns;
|
||||
@ -361,10 +359,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
|
||||
handler *file;
|
||||
DBUG_ENTER("mysql_create_table");
|
||||
|
||||
/*
|
||||
** Check for duplicate fields and check type of table to create
|
||||
*/
|
||||
|
||||
/* Check for duplicate fields and check type of table to create */
|
||||
if (!fields.elements)
|
||||
{
|
||||
my_error(ER_TABLE_MUST_HAVE_COLUMNS,MYF(0));
|
||||
@ -375,6 +370,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
|
||||
db_options=create_info->table_options;
|
||||
if (create_info->row_type == ROW_TYPE_DYNAMIC)
|
||||
db_options|=HA_OPTION_PACK_RECORD;
|
||||
alias= table_case_name(create_info, table_name);
|
||||
file=get_new_handler((TABLE*) 0, create_info->db_type);
|
||||
|
||||
if ((create_info->options & HA_LEX_CREATE_TMP_TABLE) &&
|
||||
@ -722,7 +718,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
|
||||
create_info->table_options|=HA_CREATE_DELAY_KEY_WRITE;
|
||||
}
|
||||
else
|
||||
(void) sprintf(path,"%s/%s/%s%s",mysql_data_home,db,table_name,reg_ext);
|
||||
(void) sprintf(path,"%s/%s/%s%s",mysql_data_home,db,alias,reg_ext);
|
||||
unpack_filename(path,path);
|
||||
/* Check if table already exists */
|
||||
if ((create_info->options & HA_LEX_CREATE_TMP_TABLE)
|
||||
@ -747,7 +743,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
|
||||
create_info->table_existed= 1; // Mark that table existed
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
my_error(ER_TABLE_EXISTS_ERROR,MYF(0),table_name);
|
||||
my_error(ER_TABLE_EXISTS_ERROR,MYF(0), alias);
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
}
|
||||
@ -873,7 +869,7 @@ TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
|
||||
DBUG_RETURN(0);
|
||||
if (!(table=open_table(thd,db,name,name,(bool*) 0)))
|
||||
{
|
||||
quick_rm_table(create_info->db_type,db,name);
|
||||
quick_rm_table(create_info->db_type,db,table_case_name(create_info,name));
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
table->reginfo.lock_type=TL_WRITE;
|
||||
@ -882,7 +878,7 @@ TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
|
||||
VOID(pthread_mutex_lock(&LOCK_open));
|
||||
hash_delete(&open_cache,(byte*) table);
|
||||
VOID(pthread_mutex_unlock(&LOCK_open));
|
||||
quick_rm_table(create_info->db_type,db,name);
|
||||
quick_rm_table(create_info->db_type,db,table_case_name(create_info, name));
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
table->file->extra(HA_EXTRA_WRITE_CACHE);
|
||||
@ -897,18 +893,32 @@ TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
|
||||
bool
|
||||
mysql_rename_table(enum db_type base,
|
||||
const char *old_db,
|
||||
const char * old_name,
|
||||
const char *old_name,
|
||||
const char *new_db,
|
||||
const char * new_name)
|
||||
const char *new_name)
|
||||
{
|
||||
char from[FN_REFLEN],to[FN_REFLEN];
|
||||
char from[FN_REFLEN], to[FN_REFLEN];
|
||||
char tmp_from[NAME_LEN+1], tmp_to[NAME_LEN+1];
|
||||
handler *file=get_new_handler((TABLE*) 0, base);
|
||||
int error=0;
|
||||
DBUG_ENTER("mysql_rename_table");
|
||||
|
||||
if (lower_case_table_names == 2 && !(file->table_flags() & HA_FILE_BASED))
|
||||
{
|
||||
/* Table handler expects to get all file names as lower case */
|
||||
strmov(tmp_from, old_name);
|
||||
casedn_str(tmp_from);
|
||||
old_name= tmp_from;
|
||||
|
||||
strmov(tmp_to, new_name);
|
||||
casedn_str(tmp_to);
|
||||
new_name= tmp_to;
|
||||
}
|
||||
(void) sprintf(from,"%s/%s/%s",mysql_data_home,old_db,old_name);
|
||||
(void) sprintf(to,"%s/%s/%s",mysql_data_home,new_db,new_name);
|
||||
fn_format(from,from,"","",4);
|
||||
fn_format(to,to, "","",4);
|
||||
|
||||
if (!(error=file->rename_table((const char*) from,(const char *) to)))
|
||||
{
|
||||
if (rename_file_ext(from,to,reg_ext))
|
||||
@ -924,6 +934,7 @@ mysql_rename_table(enum db_type base,
|
||||
DBUG_RETURN(error != 0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Force all other threads to stop using the table
|
||||
|
||||
@ -968,7 +979,7 @@ static void wait_while_table_is_used(THD *thd,TABLE *table,
|
||||
Close a cached table
|
||||
|
||||
SYNOPSIS
|
||||
clsoe_cached_table()
|
||||
close_cached_table()
|
||||
thd Thread handler
|
||||
table Table to remove from cache
|
||||
|
||||
@ -1446,8 +1457,8 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
||||
{
|
||||
TABLE *table,*new_table;
|
||||
int error;
|
||||
char tmp_name[80],old_name[32],new_name_buff[FN_REFLEN],
|
||||
*table_name,*db;
|
||||
char tmp_name[80],old_name[32],new_name_buff[FN_REFLEN];
|
||||
char new_alias_buff[FN_REFLEN], *table_name, *db, *new_alias, *alias;
|
||||
char index_file[FN_REFLEN], data_file[FN_REFLEN];
|
||||
bool use_timestamp=0;
|
||||
ha_rows copied,deleted;
|
||||
@ -1458,11 +1469,13 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
||||
|
||||
thd->proc_info="init";
|
||||
table_name=table_list->real_name;
|
||||
alias= (lower_case_table_names == 2) ? table_list->alias : table_name;
|
||||
|
||||
db=table_list->db;
|
||||
if (!new_db || !strcmp(new_db,db))
|
||||
new_db=db;
|
||||
used_fields=create_info->used_fields;
|
||||
|
||||
|
||||
mysql_ha_closeall(thd, table_list);
|
||||
if (!(table=open_ltable(thd,table_list,TL_WRITE_ALLOW_READ)))
|
||||
DBUG_RETURN(-1);
|
||||
@ -1471,21 +1484,29 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
||||
if (new_name)
|
||||
{
|
||||
strmov(new_name_buff,new_name);
|
||||
strmov(new_alias= new_alias_buff, new_name);
|
||||
fn_same(new_name_buff,table_name,3);
|
||||
if (lower_case_table_names)
|
||||
{
|
||||
if (lower_case_table_names != 2)
|
||||
{
|
||||
casedn_str(new_name_buff);
|
||||
new_alias= new_name; // Create lower case table name
|
||||
}
|
||||
casedn_str(new_name);
|
||||
}
|
||||
if ((lower_case_table_names &&
|
||||
!my_strcasecmp(new_name_buff,table_name)) ||
|
||||
(!lower_case_table_names &&
|
||||
!strcmp(new_name_buff,table_name)))
|
||||
new_name=table_name; // No. Make later check easier
|
||||
new_alias= new_name= table_name; // No change. Make later check easier
|
||||
else
|
||||
{
|
||||
if (table->tmp_table)
|
||||
{
|
||||
if (find_temporary_table(thd,new_db,new_name_buff))
|
||||
{
|
||||
my_error(ER_TABLE_EXISTS_ERROR,MYF(0),new_name);
|
||||
my_error(ER_TABLE_EXISTS_ERROR,MYF(0),new_name_buff);
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
}
|
||||
@ -1495,14 +1516,14 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
||||
F_OK))
|
||||
{
|
||||
/* Table will be closed in do_command() */
|
||||
my_error(ER_TABLE_EXISTS_ERROR,MYF(0),new_name);
|
||||
my_error(ER_TABLE_EXISTS_ERROR,MYF(0), new_alias);
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
new_name=table_name;
|
||||
new_alias= new_name= table_name;
|
||||
|
||||
old_db_type=table->db_type;
|
||||
if (create_info->db_type == DB_TYPE_DEFAULT)
|
||||
@ -1532,7 +1553,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
||||
{
|
||||
*fn_ext(new_name)=0;
|
||||
close_cached_table(thd, table);
|
||||
if (mysql_rename_table(old_db_type,db,table_name,new_db,new_name))
|
||||
if (mysql_rename_table(old_db_type,db,table_name,new_db,new_alias))
|
||||
error= -1;
|
||||
}
|
||||
VOID(pthread_mutex_unlock(&LOCK_open));
|
||||
@ -1925,7 +1946,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
||||
}
|
||||
/* Remove link to old table and rename the new one */
|
||||
close_temporary_table(thd,table->table_cache_key,table_name);
|
||||
if (rename_temporary_table(thd, new_table, new_db, new_name))
|
||||
if (rename_temporary_table(thd, new_table, new_db, new_alias))
|
||||
{ // Fatal error
|
||||
close_temporary_table(thd,new_db,tmp_name);
|
||||
my_free((gptr) new_table,MYF(0));
|
||||
@ -2001,12 +2022,12 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
||||
VOID(quick_rm_table(new_db_type,new_db,tmp_name));
|
||||
}
|
||||
else if (mysql_rename_table(new_db_type,new_db,tmp_name,new_db,
|
||||
new_name))
|
||||
new_alias))
|
||||
{ // Try to get everything back
|
||||
error=1;
|
||||
VOID(quick_rm_table(new_db_type,new_db,new_name));
|
||||
VOID(quick_rm_table(new_db_type,new_db,new_alias));
|
||||
VOID(quick_rm_table(new_db_type,new_db,tmp_name));
|
||||
VOID(mysql_rename_table(old_db_type,db,old_name,db,table_name));
|
||||
VOID(mysql_rename_table(old_db_type,db,old_name,db,alias));
|
||||
}
|
||||
if (error)
|
||||
{
|
||||
|
Reference in New Issue
Block a user