Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
491dc138
Commit
491dc138
authored
Aug 23, 2008
by
Alexey Botchkov
Browse files
Options
Browse Files
Download
Plain Diff
merging
parents
099a80d0
ec524d50
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
111 additions
and
57 deletions
+111
-57
include/my_sys.h
include/my_sys.h
+1
-0
include/myisam.h
include/myisam.h
+4
-0
mysql-test/r/partition_symlink.result
mysql-test/r/partition_symlink.result
+2
-2
mysql-test/t/partition_symlink.test
mysql-test/t/partition_symlink.test
+2
-2
mysql-test/t/symlink.test
mysql-test/t/symlink.test
+2
-2
mysys/my_symlink.c
mysys/my_symlink.c
+24
-23
sql/mysql_priv.h
sql/mysql_priv.h
+3
-1
sql/mysqld.cc
sql/mysqld.cc
+8
-3
sql/sql_parse.cc
sql/sql_parse.cc
+17
-10
storage/myisam/mi_check.c
storage/myisam/mi_check.c
+3
-3
storage/myisam/mi_open.c
storage/myisam/mi_open.c
+32
-9
storage/myisam/mi_static.c
storage/myisam/mi_static.c
+9
-0
storage/myisam/myisamchk.c
storage/myisam/myisamchk.c
+1
-1
storage/myisam/myisamdef.h
storage/myisam/myisamdef.h
+3
-1
No files found.
include/my_sys.h
View file @
491dc138
...
...
@@ -577,6 +577,7 @@ extern int my_close(File Filedes,myf MyFlags);
extern
File
my_dup
(
File
file
,
myf
MyFlags
);
extern
int
my_mkdir
(
const
char
*
dir
,
int
Flags
,
myf
MyFlags
);
extern
int
my_readlink
(
char
*
to
,
const
char
*
filename
,
myf
MyFlags
);
extern
int
my_is_symlink
(
const
char
*
filename
);
extern
int
my_realpath
(
char
*
to
,
const
char
*
filename
,
myf
MyFlags
);
extern
File
my_create_with_symlink
(
const
char
*
linkname
,
const
char
*
filename
,
int
createflags
,
int
access_flags
,
...
...
include/myisam.h
View file @
491dc138
...
...
@@ -256,6 +256,10 @@ extern my_bool myisam_flush,myisam_delay_key_write,myisam_single_user;
extern
my_off_t
myisam_max_temp_length
;
extern
ulong
myisam_bulk_insert_tree_size
,
myisam_data_pointer_size
;
/* usually used to check if a symlink points into the mysql data home */
/* which is normally forbidden */
extern
int
(
*
myisam_test_invalid_symlink
)(
const
char
*
filename
);
/* Prototypes for myisam-functions */
extern
int
mi_close
(
struct
st_myisam_info
*
file
);
...
...
mysql-test/r/partition_symlink.result
View file @
491dc138
...
...
@@ -113,9 +113,9 @@ set @@sql_mode=@org_mode;
create table t1 (a int)
partition by key (a)
(partition p0 DATA DIRECTORY 'part-data' INDEX DIRECTORY 'part-data');
ERROR
42000: Incorrect table name 'part-data'
ERROR
HY000: Incorrect arguments to DATA DIRECTORY
create table t1 (a int)
partition by key (a)
(partition p0,
partition p1 DATA DIRECTORY 'part-data' INDEX DIRECTORY 'part-data');
ERROR
42000: Incorrect table name 'part-data'
ERROR
HY000: Incorrect arguments to DATA DIRECTORY
mysql-test/t/partition_symlink.test
View file @
491dc138
...
...
@@ -154,7 +154,7 @@ set @@sql_mode=@org_mode;
#
# Bug 21350: Data Directory problems
#
--
error
ER_WRONG_
TABLE_NAME
--
error
ER_WRONG_
ARGUMENTS
create
table
t1
(
a
int
)
partition
by
key
(
a
)
(
partition
p0
DATA
DIRECTORY
'part-data'
INDEX
DIRECTORY
'part-data'
);
...
...
@@ -163,7 +163,7 @@ partition by key (a)
# Insert a test that manages to create the first partition and fails with
# the second, ensure that we clean up afterwards in a proper manner.
#
--
error
ER_WRONG_
TABLE_NAME
--
error
ER_WRONG_
ARGUMENTS
create
table
t1
(
a
int
)
partition
by
key
(
a
)
(
partition
p0
,
...
...
mysql-test/t/symlink.test
View file @
491dc138
...
...
@@ -65,7 +65,7 @@ drop table t1;
--
replace_result
$MYSQLTEST_VARDIR
MYSQLTEST_VARDIR
SHOW
CREATE
TABLE
t9
;
--
error
1103
,
1103
--
error
1103
,
1103
create
table
t1
(
a
int
not
null
auto_increment
,
b
char
(
16
)
not
null
,
primary
key
(
a
))
engine
=
myisam
data
directory
=
"tmp"
;
# Check that we cannot link over a table from another database.
...
...
@@ -75,7 +75,7 @@ create database mysqltest;
--
error
1
,
1
create
table
mysqltest
.
t9
(
a
int
not
null
auto_increment
,
b
char
(
16
)
not
null
,
primary
key
(
a
))
engine
=
myisam
index
directory
=
"/this-dir-does-not-exist"
;
--
error
1103
,
1103
--
error
1103
,
1103
create
table
mysqltest
.
t9
(
a
int
not
null
auto_increment
,
b
char
(
16
)
not
null
,
primary
key
(
a
))
engine
=
myisam
index
directory
=
"not-hard-path"
;
# Should fail becasue the file t9.MYI already exist in 'run'
...
...
mysys/my_symlink.c
View file @
491dc138
...
...
@@ -108,38 +108,39 @@ int my_symlink(const char *content, const char *linkname, myf MyFlags)
#define BUFF_LEN FN_LEN
#endif
int
my_is_symlink
(
const
char
*
filename
__attribute__
((
unused
)))
{
struct
stat
stat_buff
;
return
!
lstat
(
filename
,
&
stat_buff
)
&&
S_ISLNK
(
stat_buff
.
st_mode
);
}
int
my_realpath
(
char
*
to
,
const
char
*
filename
,
myf
MyFlags
__attribute__
((
unused
)))
{
#if defined(HAVE_REALPATH) && !defined(HAVE_purify) && !defined(HAVE_BROKEN_REALPATH)
int
result
=
0
;
char
buff
[
BUFF_LEN
];
struct
stat
stat_buff
;
char
*
ptr
;
DBUG_ENTER
(
"my_realpath"
);
if
(
!
(
MyFlags
&
MY_RESOLVE_LINK
)
||
(
!
lstat
(
filename
,
&
stat_buff
)
&&
S_ISLNK
(
stat_buff
.
st_mode
)))
{
char
*
ptr
;
DBUG_PRINT
(
"info"
,(
"executing realpath"
));
if
((
ptr
=
realpath
(
filename
,
buff
)))
{
DBUG_PRINT
(
"info"
,(
"executing realpath"
));
if
((
ptr
=
realpath
(
filename
,
buff
)))
strmake
(
to
,
ptr
,
FN_REFLEN
-
1
);
}
else
{
/*
Realpath didn't work; Use my_load_path() which is a poor substitute
original name but will at least be able to resolve paths that starts
with '.'.
*/
DBUG_PRINT
(
"error"
,(
"realpath failed with errno: %d"
,
errno
));
my_errno
=
errno
;
if
(
MyFlags
&
MY_WME
)
my_error
(
EE_REALPATH
,
MYF
(
0
),
filename
,
my_errno
);
my_load_path
(
to
,
filename
,
NullS
);
result
=
-
1
;
}
else
{
/*
Realpath didn't work; Use my_load_path() which is a poor substitute
original name but will at least be able to resolve paths that starts
with '.'.
*/
DBUG_PRINT
(
"error"
,(
"realpath failed with errno: %d"
,
errno
));
my_errno
=
errno
;
if
(
MyFlags
&
MY_WME
)
my_error
(
EE_REALPATH
,
MYF
(
0
),
filename
,
my_errno
);
my_load_path
(
to
,
filename
,
NullS
);
result
=
-
1
;
}
DBUG_RETURN
(
result
);
#else
...
...
sql/mysql_priv.h
View file @
491dc138
...
...
@@ -803,7 +803,6 @@ bool check_string_byte_length(LEX_STRING *str, const char *err_msg,
bool
check_string_char_length
(
LEX_STRING
*
str
,
const
char
*
err_msg
,
uint
max_char_length
,
CHARSET_INFO
*
cs
,
bool
no_error
);
bool
test_if_data_home_dir
(
const
char
*
dir
);
bool
parse_sql
(
THD
*
thd
,
Parser_state
*
parser_state
,
...
...
@@ -1862,6 +1861,7 @@ extern CHARSET_INFO *character_set_filesystem;
#ifdef MYSQL_SERVER
extern
char
*
opt_mysql_tmpdir
,
mysql_charsets_dir
[],
def_ft_boolean_syntax
[
sizeof
(
ft_boolean_syntax
)];
extern
int
mysql_unpacked_real_data_home_len
;
#define mysql_tmpdir (my_tmpdir(&mysql_tmpdir_list))
extern
MY_TMPDIR
mysql_tmpdir_list
;
extern
const
LEX_STRING
command_name
[];
...
...
@@ -2473,6 +2473,8 @@ bool load_collation(MEM_ROOT *mem_root,
CHARSET_INFO
**
cl
);
#endif
/* MYSQL_SERVER */
extern
"C"
int
test_if_data_home_dir
(
const
char
*
dir
);
#endif
/* MYSQL_CLIENT */
#endif
/* MYSQL_PRIV_H */
sql/mysqld.cc
View file @
491dc138
...
...
@@ -520,6 +520,7 @@ char mysql_real_data_home[FN_REFLEN],
*
opt_init_file
,
*
opt_tc_log_file
,
def_ft_boolean_syntax
[
sizeof
(
ft_boolean_syntax
)];
char
mysql_unpacked_real_data_home
[
FN_REFLEN
];
int
mysql_unpacked_real_data_home_len
;
uint
reg_ext_length
;
const
key_map
key_map_empty
(
0
);
key_map
key_map_full
(
0
);
// Will be initialized later
...
...
@@ -7408,6 +7409,7 @@ static void mysql_init_variables(void)
/* Things reset to zero */
opt_skip_slave_start
=
opt_reckless_slave
=
0
;
mysql_home
[
0
]
=
pidfile_name
[
0
]
=
log_error_file
[
0
]
=
0
;
myisam_test_invalid_symlink
=
test_if_data_home_dir
;
opt_log
=
opt_slow_log
=
0
;
opt_update_log
=
0
;
log_output_options
=
find_bit_type
(
log_output_str
,
&
log_output_typelib
);
...
...
@@ -8360,9 +8362,12 @@ static void fix_paths(void)
pos
[
1
]
=
0
;
}
convert_dirname
(
mysql_real_data_home
,
mysql_real_data_home
,
NullS
);
(
void
)
fn_format
(
buff
,
mysql_real_data_home
,
""
,
""
,
(
MY_RETURN_REAL_PATH
|
MY_RESOLVE_SYMLINKS
));
(
void
)
unpack_dirname
(
mysql_unpacked_real_data_home
,
buff
);
my_realpath
(
mysql_unpacked_real_data_home
,
mysql_real_data_home
,
MYF
(
0
));
mysql_unpacked_real_data_home_len
=
strlen
(
mysql_unpacked_real_data_home
);
if
(
mysql_unpacked_real_data_home
[
mysql_unpacked_real_data_home_len
-
1
]
==
FN_LIBCHAR
)
--
mysql_unpacked_real_data_home_len
;
convert_dirname
(
language
,
language
,
NullS
);
(
void
)
my_load_path
(
mysql_home
,
mysql_home
,
""
);
// Resolve current dir
(
void
)
my_load_path
(
mysql_real_data_home
,
mysql_real_data_home
,
mysql_home
);
...
...
sql/sql_parse.cc
View file @
491dc138
...
...
@@ -7413,11 +7413,12 @@ bool check_string_char_length(LEX_STRING *str, const char *err_msg,
0 ok
1 error
*/
C_MODE_START
bool
test_if_data_home_dir
(
const
char
*
dir
)
int
test_if_data_home_dir
(
const
char
*
dir
)
{
char
path
[
FN_REFLEN
]
,
conv_path
[
FN_REFLEN
]
;
uint
dir_len
,
home_dir_len
=
strlen
(
mysql_unpacked_real_data_home
)
;
char
path
[
FN_REFLEN
];
uint
dir_len
;
DBUG_ENTER
(
"test_if_data_home_dir"
);
if
(
!
dir
)
...
...
@@ -7425,24 +7426,30 @@ bool test_if_data_home_dir(const char *dir)
(
void
)
fn_format
(
path
,
dir
,
""
,
""
,
(
MY_RETURN_REAL_PATH
|
MY_RESOLVE_SYMLINKS
));
dir_len
=
unpack_dirname
(
conv_path
,
dir
);
if
(
home_dir_len
<
dir_len
)
dir_len
=
strlen
(
path
);
if
(
mysql_unpacked_real_data_home_len
<=
dir_len
)
{
if
(
dir_len
>
mysql_unpacked_real_data_home_len
&&
path
[
mysql_unpacked_real_data_home_len
]
!=
FN_LIBCHAR
)
DBUG_RETURN
(
0
);
if
(
lower_case_file_system
)
{
if
(
!
my_strnncoll
(
character_set_filesystem
,
(
const
uchar
*
)
conv_path
,
home_dir
_len
,
if
(
!
my_strnncoll
(
default_charset_info
,
(
const
uchar
*
)
path
,
mysql_unpacked_real_data_home
_len
,
(
const
uchar
*
)
mysql_unpacked_real_data_home
,
home_dir
_len
))
mysql_unpacked_real_data_home
_len
))
DBUG_RETURN
(
1
);
}
else
if
(
!
memcmp
(
conv_path
,
mysql_unpacked_real_data_home
,
home_dir_len
))
else
if
(
!
memcmp
(
path
,
mysql_unpacked_real_data_home
,
mysql_unpacked_real_data_home_len
))
DBUG_RETURN
(
1
);
}
DBUG_RETURN
(
0
);
}
C_MODE_END
extern
int
MYSQLparse
(
void
*
thd
);
// from sql_yacc.cc
...
...
storage/myisam/mi_check.c
View file @
491dc138
...
...
@@ -1736,7 +1736,7 @@ int mi_repair(MI_CHECK *param, register MI_INFO *info,
DATA_TMP_EXT
,
share
->
base
.
raid_chunks
,
(
param
->
testflag
&
T_BACKUP_DATA
?
MYF
(
MY_REDEL_MAKE_BACKUP
)
:
MYF
(
0
)))
||
mi_open_datafile
(
info
,
share
,
-
1
))
mi_open_datafile
(
info
,
share
,
name
,
-
1
))
got_error
=
1
;
}
}
...
...
@@ -2549,7 +2549,7 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info,
DATA_TMP_EXT
,
share
->
base
.
raid_chunks
,
(
param
->
testflag
&
T_BACKUP_DATA
?
MYF
(
MY_REDEL_MAKE_BACKUP
)
:
MYF
(
0
)))
||
mi_open_datafile
(
info
,
share
,
-
1
))
mi_open_datafile
(
info
,
share
,
name
,
-
1
))
got_error
=
1
;
}
}
...
...
@@ -3081,7 +3081,7 @@ int mi_repair_parallel(MI_CHECK *param, register MI_INFO *info,
DATA_TMP_EXT
,
share
->
base
.
raid_chunks
,
(
param
->
testflag
&
T_BACKUP_DATA
?
MYF
(
MY_REDEL_MAKE_BACKUP
)
:
MYF
(
0
)))
||
mi_open_datafile
(
info
,
share
,
-
1
))
mi_open_datafile
(
info
,
share
,
name
,
-
1
))
got_error
=
1
;
}
}
...
...
storage/myisam/mi_open.c
View file @
491dc138
...
...
@@ -74,7 +74,7 @@ MI_INFO *test_if_reopen(char *filename)
MI_INFO
*
mi_open
(
const
char
*
name
,
int
mode
,
uint
open_flags
)
{
int
lock_error
,
kfile
,
open_mode
,
save_errno
,
have_rtree
=
0
;
int
lock_error
,
kfile
,
open_mode
,
save_errno
,
have_rtree
=
0
,
realpath_err
;
uint
i
,
j
,
len
,
errpos
,
head_length
,
base_pos
,
offset
,
info_length
,
keys
,
key_parts
,
unique_key_parts
,
fulltext_keys
,
uniques
;
char
name_buff
[
FN_REFLEN
],
org_name
[
FN_REFLEN
],
index_name
[
FN_REFLEN
],
...
...
@@ -94,8 +94,15 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
head_length
=
sizeof
(
share_buff
.
state
.
header
);
bzero
((
uchar
*
)
&
info
,
sizeof
(
info
));
my_realpath
(
name_buff
,
fn_format
(
org_name
,
name
,
""
,
MI_NAME_IEXT
,
MY_UNPACK_FILENAME
),
MYF
(
0
));
realpath_err
=
my_realpath
(
name_buff
,
fn_format
(
org_name
,
name
,
""
,
MI_NAME_IEXT
,
4
),
MYF
(
0
));
if
(
my_is_symlink
(
org_name
)
&&
(
realpath_err
||
(
*
myisam_test_invalid_symlink
)(
name_buff
)))
{
my_errno
=
HA_WRONG_CREATE_OPTION
;
DBUG_RETURN
(
NULL
);
}
pthread_mutex_lock
(
&
THR_LOCK_myisam
);
if
(
!
(
old_info
=
test_if_reopen
(
name_buff
)))
{
...
...
@@ -476,7 +483,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
lock_error
=
1
;
/* Database unlocked */
}
if
(
mi_open_datafile
(
&
info
,
share
,
-
1
))
if
(
mi_open_datafile
(
&
info
,
share
,
name
,
-
1
))
goto
err
;
errpos
=
5
;
...
...
@@ -556,7 +563,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
my_errno
=
EACCES
;
/* Can't open in write mode */
goto
err
;
}
if
(
mi_open_datafile
(
&
info
,
share
,
old_info
->
dfile
))
if
(
mi_open_datafile
(
&
info
,
share
,
name
,
old_info
->
dfile
))
goto
err
;
errpos
=
5
;
have_rtree
=
old_info
->
rtree_recursion_state
!=
NULL
;
...
...
@@ -1217,13 +1224,30 @@ The argument file_to_dup is here for the future if there would on some OS
exist a dup()-like call that would give us two different file descriptors.
*************************************************************************/
int
mi_open_datafile
(
MI_INFO
*
info
,
MYISAM_SHARE
*
share
,
int
mi_open_datafile
(
MI_INFO
*
info
,
MYISAM_SHARE
*
share
,
const
char
*
org_name
,
File
file_to_dup
__attribute__
((
unused
)))
{
char
*
data_name
=
share
->
data_file_name
;
char
real_data_name
[
FN_REFLEN
];
if
(
org_name
)
{
fn_format
(
real_data_name
,
org_name
,
""
,
MI_NAME_DEXT
,
4
);
if
(
my_is_symlink
(
real_data_name
))
{
if
(
my_realpath
(
real_data_name
,
real_data_name
,
MYF
(
0
))
||
(
*
myisam_test_invalid_symlink
)(
real_data_name
))
{
my_errno
=
HA_WRONG_CREATE_OPTION
;
return
1
;
}
data_name
=
real_data_name
;
}
}
#ifdef USE_RAID
if
(
share
->
base
.
raid_type
)
{
info
->
dfile
=
my_raid_open
(
share
->
data_file
_name
,
info
->
dfile
=
my_raid_open
(
data
_name
,
share
->
mode
|
O_SHARE
,
share
->
base
.
raid_type
,
share
->
base
.
raid_chunks
,
...
...
@@ -1232,8 +1256,7 @@ int mi_open_datafile(MI_INFO *info, MYISAM_SHARE *share,
}
else
#endif
info
->
dfile
=
my_open
(
share
->
data_file_name
,
share
->
mode
|
O_SHARE
,
MYF
(
MY_WME
));
info
->
dfile
=
my_open
(
data_name
,
share
->
mode
|
O_SHARE
,
MYF
(
MY_WME
));
return
info
->
dfile
>=
0
?
0
:
1
;
}
...
...
storage/myisam/mi_static.c
View file @
491dc138
...
...
@@ -41,6 +41,15 @@ my_off_t myisam_max_temp_length= MAX_FILE_SIZE;
ulong
myisam_bulk_insert_tree_size
=
8192
*
1024
;
ulong
myisam_data_pointer_size
=
4
;
static
int
always_valid
(
const
char
*
filename
)
{
return
0
;
}
int
(
*
myisam_test_invalid_symlink
)(
const
char
*
filename
)
=
always_valid
;
/*
read_vec[] is used for converting between P_READ_KEY.. and SEARCH_
Position is , == , >= , <= , > , <
...
...
storage/myisam/myisamchk.c
View file @
491dc138
...
...
@@ -1033,7 +1033,7 @@ static int myisamchk(MI_CHECK *param, char * filename)
error
|=
change_to_newfile
(
filename
,
MI_NAME_DEXT
,
DATA_TMP_EXT
,
raid_chunks
,
MYF
(
0
));
if
(
mi_open_datafile
(
info
,
info
->
s
,
-
1
))
if
(
mi_open_datafile
(
info
,
info
->
s
,
NULL
,
-
1
))
error
=
1
;
param
->
out_flag
&=
~
O_NEW_DATA
;
/* We are using new datafile */
param
->
read_cache
.
file
=
info
->
dfile
;
...
...
storage/myisam/myisamdef.h
View file @
491dc138
...
...
@@ -756,7 +756,9 @@ void mi_disable_non_unique_index(MI_INFO *info, ha_rows rows);
extern
MI_INFO
*
test_if_reopen
(
char
*
filename
);
my_bool
check_table_is_closed
(
const
char
*
name
,
const
char
*
where
);
int
mi_open_datafile
(
MI_INFO
*
info
,
MYISAM_SHARE
*
share
,
File
file_to_dup
);
int
mi_open_datafile
(
MI_INFO
*
info
,
MYISAM_SHARE
*
share
,
const
char
*
orn_name
,
File
file_to_dup
);
int
mi_open_keyfile
(
MYISAM_SHARE
*
share
);
void
mi_setup_functions
(
register
MYISAM_SHARE
*
share
);
my_bool
mi_dynmap_file
(
MI_INFO
*
info
,
my_off_t
size
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment