Merge mysql.com:/home/mydev/mysql-4.1-bug5964
into mysql.com:/home/mydev/mysql-4.1-4100
This commit is contained in:
commit
8ccbea47e8
@ -609,6 +609,7 @@ extern uint dirname_part(my_string to,const char *name);
|
||||
extern uint dirname_length(const char *name);
|
||||
#define base_name(A) (A+dirname_length(A))
|
||||
extern int test_if_hard_path(const char *dir_name);
|
||||
extern my_bool has_path(const char *name);
|
||||
extern char *convert_dirname(char *to, const char *from, const char *from_end);
|
||||
extern void to_unix_path(my_string name);
|
||||
extern my_string fn_ext(const char *name);
|
||||
|
@ -80,7 +80,7 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
|
||||
continue; /* Skip comments */
|
||||
}
|
||||
|
||||
if (!test_if_hard_path(buff))
|
||||
if (!has_path(buff))
|
||||
{
|
||||
VOID(strmake(name_buff+dir_length,buff,
|
||||
sizeof(name_buff)-1-dir_length));
|
||||
|
@ -192,3 +192,25 @@ int test_if_hard_path(register const char *dir_name)
|
||||
return FALSE;
|
||||
#endif
|
||||
} /* test_if_hard_path */
|
||||
|
||||
|
||||
/*
|
||||
Test if a name contains an (absolute or relative) path.
|
||||
|
||||
SYNOPSIS
|
||||
has_path()
|
||||
name The name to test.
|
||||
|
||||
RETURN
|
||||
TRUE name contains a path.
|
||||
FALSE name does not contain a path.
|
||||
*/
|
||||
|
||||
my_bool has_path(const char *name)
|
||||
{
|
||||
return test(strchr(name, FN_LIBCHAR))
|
||||
#ifdef FN_DEVCHAR
|
||||
|| test(strchr(name, FN_DEVCHAR))
|
||||
#endif
|
||||
;
|
||||
}
|
||||
|
@ -381,6 +381,7 @@ int ha_myisammrg::create(const char *name, register TABLE *form,
|
||||
char buff[FN_REFLEN],**table_names,**pos;
|
||||
TABLE_LIST *tables= (TABLE_LIST*) create_info->merge_list.first;
|
||||
THD *thd= current_thd;
|
||||
uint dirlgt= dirname_length(name);
|
||||
DBUG_ENTER("ha_myisammrg::create");
|
||||
|
||||
if (!(table_names= (char**) thd->alloc((create_info->merge_list.elements+1)*
|
||||
@ -394,10 +395,29 @@ int ha_myisammrg::create(const char *name, register TABLE *form,
|
||||
tbl= find_temporary_table(thd, tables->db, tables->real_name);
|
||||
if (!tbl)
|
||||
{
|
||||
uint length= my_snprintf(buff,FN_REFLEN,"%s%s/%s",
|
||||
mysql_real_data_home,
|
||||
/*
|
||||
Construct the path to the MyISAM table. Try to meet two conditions:
|
||||
1.) Allow to include MyISAM tables from different databases, and
|
||||
2.) allow for moving DATADIR around in the file system.
|
||||
The first means that we need paths in the .MRG file. The second
|
||||
means that we should not have absolute paths in the .MRG file.
|
||||
The best, we can do, is to use 'mysql_data_home', which is '.'
|
||||
in mysqld and may be an absolute path in an embedded server.
|
||||
This means that it might not be possible to move the DATADIR of
|
||||
an embedded server without changing the paths in the .MRG file.
|
||||
*/
|
||||
uint length= my_snprintf(buff, FN_REFLEN, "%s/%s/%s", mysql_data_home,
|
||||
tables->db, tables->real_name);
|
||||
if (!(table_name= thd->strmake(buff, length)))
|
||||
/*
|
||||
If a MyISAM table is in the same directory as the MERGE table,
|
||||
we use the table name without a path. This means that the
|
||||
DATADIR can easily be moved even for an embedded server as long
|
||||
as the MyISAM tables are from the same database as the MERGE table.
|
||||
*/
|
||||
if ((dirname_length(buff) == dirlgt) && ! memcmp(buff, name, dirlgt))
|
||||
table_name= tables->real_name;
|
||||
else
|
||||
if (! (table_name= thd->strmake(buff, length)))
|
||||
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
|
||||
}
|
||||
else
|
||||
|
Loading…
x
Reference in New Issue
Block a user