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
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
2b2e7e45
Commit
2b2e7e45
authored
Jun 01, 2004
by
marko@hundin.mysql.fi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
InnoDB cleanup: Fix potential buffer overflows,
allow deletion of tablespaces whose names contain "'"
parent
d01c7b18
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
236 additions
and
201 deletions
+236
-201
innobase/dict/dict0load.c
innobase/dict/dict0load.c
+4
-5
innobase/fil/fil0fil.c
innobase/fil/fil0fil.c
+129
-109
innobase/os/os0file.c
innobase/os/os0file.c
+6
-15
innobase/row/row0mysql.c
innobase/row/row0mysql.c
+97
-72
No files found.
innobase/dict/dict0load.c
View file @
2b2e7e45
...
...
@@ -207,7 +207,6 @@ dict_check_tablespaces_or_store_max_id(
ulint
space_id
;
ulint
max_space_id
=
0
;
mtr_t
mtr
;
char
name
[
OS_FILE_MAX_PATH
];
mutex_enter
(
&
(
dict_sys
->
mutex
));
...
...
@@ -247,9 +246,7 @@ loop:
/* We found one */
ut_a
(
len
<
OS_FILE_MAX_PATH
-
10
);
ut_memcpy
(
name
,
field
,
len
);
name
[
len
]
=
'\0'
;
char
*
name
=
mem_strdupl
(
field
,
len
);
field
=
rec_get_nth_field
(
rec
,
9
,
&
len
);
ut_a
(
len
==
4
);
...
...
@@ -268,6 +265,8 @@ loop:
TRUE
,
TRUE
);
}
mem_free
(
name
);
if
(
space_id
>
max_space_id
)
{
max_space_id
=
space_id
;
}
...
...
innobase/fil/fil0fil.c
View file @
2b2e7e45
...
...
@@ -1749,7 +1749,7 @@ fil_delete_tablespace(
fil_space_t
*
space
;
fil_node_t
*
node
;
ulint
count
=
0
;
char
path
[
OS_FILE_MAX_PATH
]
;
char
*
path
;
ut_a
(
id
!=
0
);
stop_ibuf_merges:
...
...
@@ -1806,11 +1806,8 @@ try_again:
}
ut_a
(
space
);
ut_a
(
strlen
(
space
->
name
)
<
OS_FILE_MAX_PATH
);
ut_a
(
space
->
n_pending_ibuf_merges
==
0
);
strcpy
(
path
,
space
->
name
);
space
->
is_being_deleted
=
TRUE
;
ut_a
(
UT_LIST_GET_LEN
(
space
->
chain
)
==
1
);
...
...
@@ -1834,6 +1831,8 @@ try_again:
goto
try_again
;
}
path
=
mem_strdup
(
space
->
name
);
mutex_exit
(
&
(
system
->
mutex
));
#ifndef UNIV_HOTBACKUP
/* Invalidate in the buffer pool all pages belonging to the
...
...
@@ -1851,28 +1850,27 @@ try_again:
if
(
success
)
{
success
=
os_file_delete
(
path
);
}
mem_free
(
path
);
if
(
success
)
{
#ifndef UNIV_HOTBACKUP
/* Write a log record about the deletion of the .ibd
file, so that ibbackup can replay it in the
--apply-log phase. We use a dummy mtr and the familiar
log write mechanism. */
#ifndef UNIV_HOTBACKUP
{
mtr_t
mtr
;
/* When replaying the operation in ibbackup, do not try
to write any log record */
mtr_start
(
&
mtr
);
fil_op_write_log
(
MLOG_FILE_DELETE
,
id
,
path
,
NULL
,
&
mtr
);
fil_op_write_log
(
MLOG_FILE_DELETE
,
id
,
path
,
NULL
,
&
mtr
);
mtr_commit
(
&
mtr
);
}
#endif
return
(
TRUE
);
}
}
return
(
FALSE
);
}
...
...
@@ -1956,6 +1954,29 @@ fil_rename_tablespace_in_mem(
return
(
TRUE
);
}
/***********************************************************************
Allocates a file name for a single-table tablespace.
The string must be freed by caller with mem_free(). */
static
char
*
fil_make_ibd_name
(
/*==============*/
/* out, own: file name */
const
char
*
name
)
/* in: table name */
{
ulint
namelen
=
strlen
(
name
);
ulint
dirlen
=
strlen
(
fil_path_to_mysql_datadir
);
char
*
filename
=
mem_alloc
(
namelen
+
dirlen
+
sizeof
"/.ibd"
);
memcpy
(
filename
,
fil_path_to_mysql_datadir
,
dirlen
);
filename
[
dirlen
]
=
'/'
;
memcpy
(
filename
+
dirlen
+
1
,
name
,
namelen
);
memcpy
(
filename
+
dirlen
+
namelen
+
1
,
".ibd"
,
sizeof
".ibd"
);
srv_normalize_path_for_win
(
filename
);
return
(
filename
);
}
/***********************************************************************
Renames a single-table tablespace. The tablespace must be cached in the
tablespace memory cache. */
...
...
@@ -1978,9 +1999,9 @@ fil_rename_tablespace(
fil_space_t
*
space
;
fil_node_t
*
node
;
ulint
count
=
0
;
char
*
path
=
NULL
;
char
*
path
;
ibool
old_name_was_specified
=
TRUE
;
char
old_path
[
OS_FILE_MAX_PATH
]
;
char
*
old_path
;
ut_a
(
id
!=
0
);
...
...
@@ -2059,48 +2080,33 @@ retry:
/* Check that the old name in the space is right */
if
(
old_name_was_specified
)
{
ut_a
(
strlen
(
old_name
)
+
strlen
(
fil_path_to_mysql_datadir
)
<
OS_FILE_MAX_PATH
-
10
);
sprintf
(
old_path
,
"%s/%s.ibd"
,
fil_path_to_mysql_datadir
,
old_name
);
srv_normalize_path_for_win
(
old_path
);
old_path
=
fil_make_ibd_name
(
old_name
);
ut_a
(
strcmp
(
space
->
name
,
old_path
)
==
0
);
ut_a
(
strcmp
(
node
->
name
,
old_path
)
==
0
);
}
else
{
sprintf
(
old_path
,
"%s"
,
space
->
name
);
old_path
=
mem_strdup
(
space
->
name
);
}
/* Rename the tablespace and the node in the memory cache */
ut_a
(
strlen
(
new_name
)
+
strlen
(
fil_path_to_mysql_datadir
)
<
OS_FILE_MAX_PATH
-
10
);
path
=
mem_alloc
(
OS_FILE_MAX_PATH
);
sprintf
(
path
,
"%s/%s.ibd"
,
fil_path_to_mysql_datadir
,
new_name
);
srv_normalize_path_for_win
(
path
);
path
=
fil_make_ibd_name
(
new_name
);
success
=
fil_rename_tablespace_in_mem
(
space
,
node
,
path
);
if
(
!
success
)
{
goto
func_exit
;
}
if
(
success
)
{
success
=
os_file_rename
(
old_path
,
path
);
if
(
!
success
)
{
/* We have to revert the changes we made to the tablespac
e
memory cache */
/* We have to revert the changes we mad
e
to the tablespace
memory cache */
ut_a
(
fil_rename_tablespace_in_mem
(
space
,
node
,
old_path
));
ut_a
(
fil_rename_tablespace_in_mem
(
space
,
node
,
old_path
));
}
}
func_exit:
if
(
path
)
{
mem_free
(
path
);
}
mem_free
(
old_path
);
space
->
stop_ios
=
FALSE
;
mutex_exit
(
&
(
system
->
mutex
));
...
...
@@ -2144,15 +2150,11 @@ fil_create_new_single_table_tablespace(
ulint
err
;
byte
*
page
;
ibool
success
;
char
path
[
OS_FILE_MAX_PATH
]
;
char
*
path
;
ut_a
(
size
>=
FIL_IBD_FILE_INITIAL_SIZE
);
ut_a
(
strlen
(
tablename
)
+
strlen
(
fil_path_to_mysql_datadir
)
<
OS_FILE_MAX_PATH
-
10
);
sprintf
(
path
,
"%s/%s.ibd"
,
fil_path_to_mysql_datadir
,
tablename
);
srv_normalize_path_for_win
(
path
);
path
=
fil_make_ibd_name
(
tablename
);
file
=
os_file_create
(
path
,
OS_FILE_CREATE
,
OS_FILE_NORMAL
,
OS_DATA_FILE
,
&
ret
);
...
...
@@ -2175,14 +2177,17 @@ fil_create_new_single_table_tablespace(
"InnoDB: resolve the problem by removing the file %s
\n
"
"InnoDB: under the 'datadir' of MySQL.
\n
"
,
path
);
mem_free
(
path
);
return
(
DB_TABLESPACE_ALREADY_EXISTS
);
}
if
(
err
==
OS_FILE_DISK_FULL
)
{
mem_free
(
path
);
return
(
DB_OUT_OF_FILE_SPACE
);
}
mem_free
(
path
);
return
(
DB_ERROR
);
}
...
...
@@ -2195,6 +2200,7 @@ fil_create_new_single_table_tablespace(
os_file_close
(
file
);
os_file_delete
(
path
);
mem_free
(
path
);
return
(
DB_OUT_OF_FILE_SPACE
);
}
...
...
@@ -2206,9 +2212,11 @@ fil_create_new_single_table_tablespace(
if
(
*
space_id
==
ULINT_UNDEFINED
)
{
ut_free
(
page
);
error_exit:
os_file_close
(
file
);
os_file_delete
(
path
);
mem_free
(
path
);
return
(
DB_ERROR
);
}
...
...
@@ -2234,11 +2242,7 @@ fil_create_new_single_table_tablespace(
if
(
!
ret
)
{
fprintf
(
stderr
,
"InnoDB: Error: could not write the first page to tablespace %s
\n
"
,
path
);
os_file_close
(
file
);
os_file_delete
(
path
);
return
(
DB_ERROR
);
goto
error_exit
;
}
ret
=
os_file_flush
(
file
);
...
...
@@ -2246,27 +2250,22 @@ fil_create_new_single_table_tablespace(
if
(
!
ret
)
{
fprintf
(
stderr
,
"InnoDB: Error: file flush of tablespace %s failed
\n
"
,
path
);
os_file_close
(
file
);
os_file_delete
(
path
);
return
(
DB_ERROR
);
goto
error_exit
;
}
os_file_close
(
file
);
if
(
*
space_id
==
ULINT_UNDEFINED
)
{
os_file_delete
(
path
);
error_exit2:
mem_free
(
path
);
return
(
DB_ERROR
);
}
success
=
fil_space_create
(
path
,
*
space_id
,
FIL_TABLESPACE
);
if
(
!
success
)
{
os_file_delete
(
path
);
return
(
DB_ERROR
);
goto
error_exit2
;
}
fil_node_create
(
path
,
size
,
*
space_id
,
FALSE
);
...
...
@@ -2282,6 +2281,7 @@ fil_create_new_single_table_tablespace(
mtr_commit
(
&
mtr
);
}
#endif
mem_free
(
path
);
return
(
DB_SUCCESS
);
}
...
...
@@ -2315,13 +2315,7 @@ fil_reset_too_high_lsns(
ulint
page_no
;
ibool
success
;
filepath
=
ut_malloc
(
OS_FILE_MAX_PATH
);
ut_a
(
strlen
(
name
)
<
OS_FILE_MAX_PATH
-
10
);
sprintf
(
filepath
,
"%s/%s.ibd"
,
fil_path_to_mysql_datadir
,
name
);
srv_normalize_path_for_win
(
filepath
);
filepath
=
fil_make_ibd_name
(
name
);
file
=
os_file_create_simple_no_error_handling
(
filepath
,
OS_FILE_OPEN
,
OS_FILE_READ_WRITE
,
&
success
);
...
...
@@ -2450,13 +2444,7 @@ fil_open_single_table_tablespace(
ulint
space_id
;
ibool
ret
=
TRUE
;
filepath
=
ut_malloc
(
OS_FILE_MAX_PATH
);
ut_a
(
strlen
(
name
)
<
OS_FILE_MAX_PATH
-
10
);
sprintf
(
filepath
,
"%s/%s.ibd"
,
fil_path_to_mysql_datadir
,
name
);
srv_normalize_path_for_win
(
filepath
);
filepath
=
fil_make_ibd_name
(
name
);
file
=
os_file_create_simple_no_error_handling
(
filepath
,
OS_FILE_OPEN
,
OS_FILE_READ_ONLY
,
&
success
);
...
...
@@ -2525,6 +2513,28 @@ func_exit:
return
(
ret
);
}
#ifdef UNIV_HOTBACKUP
/***********************************************************************
Allocates a file name for an old version of a single-table tablespace.
The string must be freed by caller with mem_free(). */
static
char
*
fil_make_ibbackup_old_name
(
/*=======================*/
/* out, own: file name */
const
char
*
name
)
/* in: original file name */
{
static
const
char
suffix
[]
=
"_ibbackup_old_vers_"
;
ulint
len
=
strlen
(
name
);
char
*
path
=
ut_malloc
(
len
+
(
15
+
sizeof
suffix
));
memcpy
(
path
,
name
,
len
);
memcpy
(
path
+
len
,
suffix
,
(
sizeof
suffix
)
-
1
);
ut_sprintf_timestamp_without_extra_chars
(
path
+
len
+
sizeof
suffix
);
return
(
path
);
}
#endif
/* UNIV_HOTBACKUP */
/************************************************************************
Opens an .ibd file and adds the associated single-table tablespace to the
InnoDB fil0fil.c data structures. */
...
...
@@ -2547,10 +2557,8 @@ fil_load_single_table_tablespace(
#ifdef UNIV_HOTBACKUP
fil_space_t
*
space
;
#endif
filepath
=
ut_malloc
(
OS_FILE_MAX_PATH
);
ut_a
(
strlen
(
dbname
)
+
strlen
(
filename
)
+
strlen
(
fil_path_to_mysql_datadir
)
<
OS_FILE_MAX_PATH
-
100
);
filepath
=
ut_malloc
(
strlen
(
dbname
)
+
strlen
(
filename
)
+
strlen
(
fil_path_to_mysql_datadir
)
+
3
);
sprintf
(
filepath
,
"%s/%s/%s"
,
fil_path_to_mysql_datadir
,
dbname
,
filename
);
...
...
@@ -2639,11 +2647,7 @@ fil_load_single_table_tablespace(
filepath
,
space_id
,
filepath
,
size
);
os_file_close
(
file
);
new_path
=
ut_malloc
(
OS_FILE_MAX_PATH
);
sprintf
(
new_path
,
"%s_ibbackup_old_vers_"
,
filepath
);
ut_sprintf_timestamp_without_extra_chars
(
new_path
+
ut_strlen
(
new_path
));
new_path
=
fil_make_ibbackup_old_name
(
filepath
);
ut_a
(
os_file_rename
(
filepath
,
new_path
));
ut_free
(
page
);
...
...
@@ -2676,11 +2680,8 @@ fil_load_single_table_tablespace(
space
->
name
);
os_file_close
(
file
);
new_path
=
ut_malloc
(
OS_FILE_MAX_PATH
);
new_path
=
fil_make_ibbackup_old_name
(
filepath
);
sprintf
(
new_path
,
"%s_ibbackup_old_vers_"
,
filepath
);
ut_sprintf_timestamp_without_extra_chars
(
new_path
+
ut_strlen
(
new_path
));
mutex_exit
(
&
(
fil_system
->
mutex
));
ut_a
(
os_file_rename
(
filepath
,
new_path
));
...
...
@@ -2724,7 +2725,8 @@ fil_load_single_table_tablespaces(void)
/* out: DB_SUCCESS or error number */
{
int
ret
;
char
*
dbpath
;
char
*
dbpath
=
NULL
;
ulint
dbpath_len
=
0
;
os_file_dir_t
dir
;
os_file_dir_t
dbdir
;
os_file_stat_t
dbinfo
;
...
...
@@ -2739,7 +2741,7 @@ fil_load_single_table_tablespaces(void)
return
(
DB_ERROR
);
}
dbpath
=
ut_malloc
(
OS_FILE_MAX_PATH
);
dbpath
=
ut_malloc
(
dbpath_len
);
/* Scan all directories under the datadir. They are the database
directories of MySQL. */
...
...
@@ -2747,6 +2749,7 @@ fil_load_single_table_tablespaces(void)
ret
=
os_file_readdir_next_file
(
fil_path_to_mysql_datadir
,
dir
,
&
dbinfo
);
while
(
ret
==
0
)
{
ulint
len
;
/* printf("Looking at %s in datadir\n", dbinfo.name); */
if
(
dbinfo
.
type
==
OS_FILE_TYPE_FILE
...
...
@@ -2758,8 +2761,18 @@ fil_load_single_table_tablespaces(void)
/* We found a symlink or a directory; try opening it to see
if a symlink is a directory */
ut_a
(
strlen
(
dbinfo
.
name
)
<
OS_FILE_MAX_PATH
-
10
);
len
=
strlen
(
fil_path_to_mysql_datadir
)
+
strlen
(
dbinfo
.
name
)
+
2
;
if
(
len
>
dbpath_len
)
{
dbpath_len
=
len
;
if
(
!
dbpath
)
{
dbpath
=
mem_alloc
(
dbpath_len
);
}
else
{
dbpath
=
mem_realloc
(
dbpath
,
dbpath_len
,
__FILE__
,
__LINE__
);
}
}
sprintf
(
dbpath
,
"%s/%s"
,
fil_path_to_mysql_datadir
,
dbinfo
.
name
);
srv_normalize_path_for_win
(
dbpath
);
...
...
@@ -2809,7 +2822,9 @@ next_datadir_item:
dir
,
&
dbinfo
);
}
if
(
dbpath
)
{
ut_free
(
dbpath
);
}
/* At the end of directory we should get 1 as the return value, -1
if there was an error */
...
...
@@ -2962,14 +2977,13 @@ fil_space_for_table_exists_in_mem(
fil_system_t
*
system
=
fil_system
;
fil_space_t
*
namespace
;
fil_space_t
*
space
;
char
path
[
OS_FILE_MAX_PATH
]
;
char
*
path
;
ut_ad
(
system
);
mutex_enter
(
&
(
system
->
mutex
));
sprintf
(
path
,
"%s/%s.ibd"
,
fil_path_to_mysql_datadir
,
name
);
srv_normalize_path_for_win
(
path
);
path
=
fil_make_ibd_name
(
name
);
/* Look if there is a space with the same id */
...
...
@@ -2988,6 +3002,7 @@ fil_space_for_table_exists_in_mem(
space
->
mark
=
TRUE
;
}
mem_free
(
path
);
mutex_exit
(
&
(
system
->
mutex
));
return
(
TRUE
);
...
...
@@ -2995,6 +3010,7 @@ fil_space_for_table_exists_in_mem(
if
(
!
print_error_if_does_not_exist
)
{
mem_free
(
path
);
mutex_exit
(
&
(
system
->
mutex
));
return
(
FALSE
);
...
...
@@ -3024,6 +3040,7 @@ fil_space_for_table_exists_in_mem(
"InnoDB: You can look from section 15.1 of http://www.innodb.com/ibman.html
\n
"
"InnoDB: how to resolve the issue.
\n
"
);
mem_free
(
path
);
mutex_exit
(
&
(
system
->
mutex
));
return
(
FALSE
);
...
...
@@ -3047,11 +3064,13 @@ fil_space_for_table_exists_in_mem(
"InnoDB: You can look from section 15.1 of http://www.innodb.com/ibman.html
\n
"
"InnoDB: how to resolve the issue.
\n
"
);
mem_free
(
path
);
mutex_exit
(
&
(
system
->
mutex
));
return
(
FALSE
);
}
mem_free
(
path
);
mutex_exit
(
&
(
system
->
mutex
));
return
(
FALSE
);
...
...
@@ -3072,14 +3091,13 @@ fil_get_space_id_for_table(
fil_system_t
*
system
=
fil_system
;
fil_space_t
*
namespace
;
ulint
id
=
ULINT_UNDEFINED
;
char
path
[
OS_FILE_MAX_PATH
]
;
char
*
path
;
ut_ad
(
system
);
mutex_enter
(
&
(
system
->
mutex
));
sprintf
(
path
,
"%s/%s.ibd"
,
fil_path_to_mysql_datadir
,
name
);
srv_normalize_path_for_win
(
path
);
path
=
fil_make_ibd_name
(
name
);
/* Look if there is a space with the same name; the name is the
directory path to the file */
...
...
@@ -3091,6 +3109,8 @@ fil_get_space_id_for_table(
id
=
namespace
->
id
;
}
mem_free
(
path
);
mutex_exit
(
&
(
system
->
mutex
));
return
(
id
);
...
...
innobase/os/os0file.c
View file @
2b2e7e45
...
...
@@ -2331,31 +2331,22 @@ os_file_dirname(
pathname */
const
char
*
path
)
/* in: pathname */
{
char
*
dir
;
int
i
,
length
,
last_slash
;
/* find the offset of the last slash */
length
=
ut_strlen
(
path
);
for
(
i
=
length
-
1
;
i
>=
0
&&
path
[
i
]
!=
OS_FILE_PATH_SEPARATOR
;
i
++
);
last_slash
=
i
;
if
(
last_slash
<
0
)
{
const
char
*
last_slash
=
strrchr
(
path
,
OS_FILE_PATH_SEPARATOR
);
if
(
!
last_slash
)
{
/* no slash in the path, return "." */
return
(
mem_strdup
(
"."
));
}
/* ok, there is a slash */
if
(
last_slash
==
0
)
{
if
(
last_slash
==
path
)
{
/* last slash is the first char of the path */
return
(
mem_strdup
(
"/"
));
}
/* non-trivial directory component */
dir
=
mem_strdup
(
path
);
dir
[
last_slash
]
=
0
;
return
(
dir
);
return
(
mem_strdupl
(
path
,
last_slash
-
path
));
}
/********************************************************************
...
...
@@ -2369,12 +2360,12 @@ os_file_create_subdirs_if_needed(
const
char
*
path
)
/* in: path name */
{
char
*
subdir
;
static
char
rootdir
[
2
]
=
{
OS_FILE_PATH_SEPARATOR
,
0
};
ibool
success
,
subdir_exists
;
os_file_type_t
type
;
subdir
=
os_file_dirname
(
path
);
if
(
0
==
strcmp
(
subdir
,
rootdir
)
||
0
==
strcmp
(
subdir
,
"."
))
{
if
(
strlen
(
subdir
)
==
1
&&
(
*
subdir
==
OS_FILE_PATH_SEPARATOR
||
*
subdir
==
'.'
))
{
/* subdir is root or cwd, nothing to do */
ut_free
(
subdir
);
return
(
TRUE
);
...
...
innobase/row/row0mysql.c
View file @
2b2e7e45
...
...
@@ -1951,7 +1951,37 @@ row_discard_tablespace_for_mysql(
que_t
*
graph
=
NULL
;
ibool
success
;
ulint
err
;
char
buf
[
2
*
OS_FILE_MAX_PATH
];
char
*
buf
;
static
const
char
discard_tablespace_proc1
[]
=
"PROCEDURE DISCARD_TABLESPACE_PROC () IS
\n
"
"old_id CHAR;
\n
"
"new_id CHAR;
\n
"
"new_id_low INT;
\n
"
"new_id_high INT;
\n
"
"table_name CHAR;
\n
"
"BEGIN
\n
"
"table_name := "
;
static
const
char
discard_tablespace_proc2
[]
=
";
\n
"
"new_id_high := %lu;
\n
"
"new_id_low := %lu;
\n
"
"new_id := CONCAT(TO_BINARY(new_id_high, 4), TO_BINARY(new_id_low, 4));
\n
"
"SELECT ID INTO old_id
\n
"
"FROM SYS_TABLES
\n
"
"WHERE NAME = table_name;
\n
"
"IF (SQL %% NOTFOUND) THEN
\n
"
" COMMIT WORK;
\n
"
" RETURN;
\n
"
"END IF;
\n
"
"UPDATE SYS_TABLES SET ID = new_id
\n
"
"WHERE ID = old_id;
\n
"
"UPDATE SYS_COLUMNS SET TABLE_ID = new_id
\n
"
"WHERE TABLE_ID = old_id;
\n
"
"UPDATE SYS_INDEXES SET TABLE_ID = new_id
\n
"
"WHERE TABLE_ID = old_id;
\n
"
"COMMIT WORK;
\n
"
"END;
\n
"
;
ut_ad
(
trx
->
mysql_thread_id
==
os_thread_get_curr_id
());
...
...
@@ -1973,9 +2003,10 @@ row_discard_tablespace_for_mysql(
if
(
table
->
space
==
0
)
{
ut_print_timestamp
(
stderr
);
fprintf
(
stderr
,
" InnoDB: Error: table %s
\n
"
"InnoDB: is in the system tablespace 0 which cannot be discarded
\n
"
,
name
);
fputs
(
" InnoDB: Error: table "
,
stderr
);
ut_print_name
(
stderr
,
name
);
fputs
(
"
\n
"
"InnoDB: is in the system tablespace 0 which cannot be discarded
\n
"
,
stderr
);
err
=
DB_ERROR
;
goto
funct_exit
;
...
...
@@ -1983,36 +2014,16 @@ row_discard_tablespace_for_mysql(
new_id
=
dict_hdr_get_new_id
(
DICT_HDR_TABLE_ID
);
sprintf
(
buf
,
"PROCEDURE DISCARD_TABLESPACE_PROC () IS
\n
"
"old_id CHAR;
\n
"
"new_id CHAR;
\n
"
"new_id_low INT;
\n
"
"new_id_high INT;
\n
"
"table_name CHAR;
\n
"
"BEGIN
\n
"
"table_name :='%s';
\n
"
"new_id_high := %lu;
\n
"
"new_id_low := %lu;
\n
"
"new_id := CONCAT(TO_BINARY(new_id_high, 4), TO_BINARY(new_id_low, 4));
\n
"
"SELECT ID INTO old_id
\n
"
"FROM SYS_TABLES
\n
"
"WHERE NAME = table_name;
\n
"
"IF (SQL %% NOTFOUND) THEN
\n
"
" COMMIT WORK;
\n
"
" RETURN;
\n
"
"END IF;
\n
"
"UPDATE SYS_TABLES SET ID = new_id
\n
"
"WHERE ID = old_id;
\n
"
"UPDATE SYS_COLUMNS SET TABLE_ID = new_id
\n
"
"WHERE TABLE_ID = old_id;
\n
"
"UPDATE SYS_INDEXES SET TABLE_ID = new_id
\n
"
"WHERE TABLE_ID = old_id;
\n
"
"COMMIT WORK;
\n
"
"END;
\n
"
,
name
,
(
ulong
)
ut_dulint_get_high
(
new_id
),
(
ulong
)
ut_dulint_get_low
(
new_id
));
buf
=
mem_alloc
((
sizeof
discard_tablespace_proc1
)
+
(
sizeof
discard_tablespace_proc2
)
+
20
+
ut_strlenq
(
name
,
'\''
));
ut_a
(
strlen
(
buf
)
<
2
*
OS_FILE_MAX_PATH
);
memcpy
(
buf
,
discard_tablespace_proc1
,
sizeof
discard_tablespace_proc1
);
sprintf
(
ut_strcpyq
(
buf
+
(
sizeof
discard_tablespace_proc1
-
1
),
'\''
,
name
),
discard_tablespace_proc2
,
(
ulong
)
ut_dulint_get_high
(
new_id
),
(
ulong
)
ut_dulint_get_low
(
new_id
));
graph
=
pars_sql
(
buf
);
...
...
@@ -2126,9 +2137,10 @@ row_import_tablespace_for_mysql(
if
(
table
->
space
==
0
)
{
ut_print_timestamp
(
stderr
);
fprintf
(
stderr
,
" InnoDB: Error: table %s
\n
"
"InnoDB: is in the system tablespace 0 which cannot be imported
\n
"
,
name
);
fputs
(
" InnoDB: Error: table "
,
stderr
);
ut_print_name
(
stderr
,
name
);
fputs
(
"
\n
"
"InnoDB: is in the system tablespace 0 which cannot be imported
\n
"
,
stderr
);
err
=
DB_ERROR
;
goto
funct_exit
;
...
...
@@ -2136,10 +2148,12 @@ row_import_tablespace_for_mysql(
if
(
!
table
->
tablespace_discarded
)
{
ut_print_timestamp
(
stderr
);
fp
rintf
(
stderr
,
fp
uts
(
" InnoDB: Error: you are trying to IMPORT a tablespace
\n
"
"InnoDB: %s, though you have not called DISCARD on it yet
\n
"
"InnoDB: during the lifetime of the mysqld process!
\n
"
,
name
);
"InnoDB: "
,
stderr
);
ut_print_name
(
stderr
,
name
);
fputs
(
", though you have not called DISCARD on it yet
\n
"
"InnoDB: during the lifetime of the mysqld process!
\n
"
,
stderr
);
err
=
DB_ERROR
;
...
...
@@ -2491,8 +2505,10 @@ row_drop_table_for_mysql(
if
(
!
success
)
{
ut_print_timestamp
(
stderr
);
fprintf
(
stderr
,
" InnoDB: Error: not able to delete tablespace %lu of table %s!
\n
"
,
(
ulong
)
space_id
,
name
);
" InnoDB: Error: not able to delete tablespace %lu of table "
,
(
ulong
)
space_id
);
ut_print_name
(
stderr
,
name
);
fputs
(
"!
\n
"
,
stderr
);
err
=
DB_ERROR
;
}
}
...
...
@@ -2757,15 +2773,14 @@ row_rename_table_for_mysql(
err
=
DB_TABLE_NOT_FOUND
;
ut_print_timestamp
(
stderr
);
fprintf
(
stderr
,
" InnoDB: Error: table %s
\n
"
"InnoDB:
does not exist in the InnoDB internal
\n
"
fputs
(
" InnoDB: Error: table "
,
stderr
);
ut_print_name
(
stderr
,
old_name
);
fputs
(
"
does not exist in the InnoDB internal
\n
"
"InnoDB: data dictionary though MySQL is trying to rename the table.
\n
"
"InnoDB: Have you copied the .frm file of the table to the
\n
"
"InnoDB: MySQL database directory from another database?
\n
"
"InnoDB: You can look for further help from section 15.1 of
\n
"
"InnoDB: http://www.innodb.com/ibman.html
\n
"
,
old_name
);
"InnoDB: http://www.innodb.com/ibman.php
\n
"
,
stderr
);
goto
funct_exit
;
}
...
...
@@ -2773,12 +2788,12 @@ row_rename_table_for_mysql(
err
=
DB_TABLE_NOT_FOUND
;
ut_print_timestamp
(
stderr
);
fprintf
(
stderr
,
" InnoDB: Error: table %s
\n
"
"InnoDB: does not have an .ibd file in the database directory.
\n
"
fputs
(
" InnoDB: Error: table "
,
stderr
);
ut_print_name
(
stderr
,
old_name
);
fputs
(
" does not have an .ibd file in the database directory.
\n
"
"InnoDB: You can look for further help from section 15.1 of
\n
"
"InnoDB: http://www.innodb.com/ibman.html
\n
"
,
old_name
);
"InnoDB: http://www.innodb.com/ibman.php
\n
"
,
stderr
);
goto
funct_exit
;
}
...
...
@@ -2905,23 +2920,25 @@ row_rename_table_for_mysql(
if
(
err
!=
DB_SUCCESS
)
{
if
(
err
==
DB_DUPLICATE_KEY
)
{
ut_print_timestamp
(
stderr
);
fprintf
(
stderr
,
" InnoDB: Error: table %s exists in the InnoDB internal data
\n
"
"InnoDB: dictionary though MySQL is trying rename table %s to it.
\n
"
fputs
(
" InnoDB: Error: table "
,
stderr
);
ut_print_name
(
stderr
,
new_name
);
fputs
(
" exists in the InnoDB internal data
\n
"
"InnoDB: dictionary though MySQL is trying rename table "
,
stderr
);
ut_print_name
(
stderr
,
old_name
);
fputs
(
" to it.
\n
"
"InnoDB: Have you deleted the .frm file and not used DROP TABLE?
\n
"
"InnoDB: You can look for further help from section 15.1 of
\n
"
"InnoDB: http://www.innodb.com/ibman.html
\n
"
,
new_name
,
old_name
);
fprintf
(
stderr
,
"InnoDB: If table %s
is a temporary table #sql..., then it can be that
\n
"
"InnoDB: http://www.innodb.com/ibman.php
\n
"
"InnoDB: If table "
,
stderr
);
ut_print_name
(
stderr
,
new_name
);
fputs
(
"
is a temporary table #sql..., then it can be that
\n
"
"InnoDB: there are still queries running on the table, and it will be
\n
"
"InnoDB: dropped automatically when the queries end.
\n
"
,
new_name
);
fprintf
(
stderr
,
"InnoDB: dropped automatically when the queries end.
\n
"
"InnoDB: You can drop the orphaned table inside InnoDB by
\n
"
"InnoDB: creating an InnoDB table with the same name in another
\n
"
"InnoDB: database and moving the .frm file to the current database.
\n
"
"InnoDB: Then MySQL thinks the table exists, and DROP TABLE will
\n
"
"InnoDB: succeed.
\n
"
);
"InnoDB: succeed.
\n
"
,
stderr
);
}
trx
->
error_state
=
DB_SUCCESS
;
trx_general_rollback_for_mysql
(
trx
,
FALSE
,
NULL
);
...
...
@@ -2937,9 +2954,12 @@ row_rename_table_for_mysql(
trx_general_rollback_for_mysql
(
trx
,
FALSE
,
NULL
);
trx
->
error_state
=
DB_SUCCESS
;
ut_print_timestamp
(
stderr
);
fprintf
(
stderr
,
" InnoDB: Error in table rename, cannot rename %s to %s
\n
"
,
old_name
,
new_name
);
fputs
(
" InnoDB: Error in table rename, cannot rename "
,
stderr
);
ut_print_name
(
stderr
,
old_name
);
fputs
(
" to "
,
stderr
);
ut_print_name
(
stderr
,
new_name
);
putc
(
'\n'
,
stderr
);
err
=
DB_ERROR
;
goto
funct_exit
;
...
...
@@ -2958,11 +2978,14 @@ row_rename_table_for_mysql(
if
(
err
!=
DB_SUCCESS
)
{
ut_print_timestamp
(
stderr
);
fprintf
(
stderr
,
" InnoDB: Error: in ALTER TABLE table %s
\n
"
fputs
(
" InnoDB: Error: in ALTER TABLE "
,
stderr
);
ut_print_name
(
stderr
,
new_name
);
fputs
(
"
\n
"
"InnoDB: has or is referenced in foreign key constraints
\n
"
"InnoDB: which are not compatible with the new table definition.
\n
"
,
new_name
);
stderr
);
ut_a
(
dict_table_rename_in_cache
(
table
,
old_name
,
FALSE
));
trx
->
error_state
=
DB_SUCCESS
;
...
...
@@ -3160,9 +3183,11 @@ row_check_table_for_mysql(
ret
=
DB_ERROR
;
fputs
(
"Error: "
,
stderr
);
dict_index_name_print
(
stderr
,
index
);
fprintf
(
stderr
,
"Error: index %s
contains %lu entries, should be %lu
\n
"
,
index
->
name
,
(
ulong
)
n_rows
,
"
contains %lu entries, should be %lu
\n
"
,
(
ulong
)
n_rows
,
(
ulong
)
n_rows_in_table
);
}
}
...
...
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