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
d9aeddf7
Commit
d9aeddf7
authored
Jan 16, 2012
by
Annamalai Gurusami
Browse files
Options
Browse Files
Download
Plain Diff
Merging from mysql-5.1 to mysql-5.5.
parents
72bdeddd
020f3914
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
97 additions
and
11 deletions
+97
-11
storage/innobase/handler/ha_innodb.cc
storage/innobase/handler/ha_innodb.cc
+97
-11
No files found.
storage/innobase/handler/ha_innodb.cc
View file @
d9aeddf7
...
...
@@ -3266,18 +3266,29 @@ ha_innobase::primary_key_is_clustered()
return
(
true
);
}
/** Always normalize table name to lower case on Windows */
#ifdef __WIN__
#define normalize_table_name(norm_name, name) \
normalize_table_name_low(norm_name, name, TRUE)
#else
#define normalize_table_name(norm_name, name) \
normalize_table_name_low(norm_name, name, FALSE)
#endif
/* __WIN__ */
/*****************************************************************//**
Normalizes a table name string. A normalized name consists of the
database name catenated to '/' and table name. An example:
test/mytable. On Windows normalization puts both the database name and the
table name always to lower case. */
table name always to lower case
if "set_lower_case" is set to TRUE
. */
static
void
normalize_table_name
(
/*=================*/
normalize_table_name
_low
(
/*=================
====
*/
char
*
norm_name
,
/*!< out: normalized name as a
null-terminated string */
const
char
*
name
)
/*!< in: table name string */
const
char
*
name
,
/*!< in: table name string */
ibool
set_lower_case
)
/*!< in: TRUE if we want to set
name to lower case */
{
char
*
name_ptr
;
char
*
db_ptr
;
...
...
@@ -3307,9 +3318,9 @@ normalize_table_name(
norm_name
[
name_ptr
-
db_ptr
-
1
]
=
'/'
;
#ifdef __WIN__
if
(
set_lower_case
)
{
innobase_casedn_str
(
norm_name
);
#endif
}
}
/********************************************************************//**
...
...
@@ -3713,6 +3724,8 @@ ha_innobase::open(
THD
*
thd
;
ulint
retries
=
0
;
char
*
is_part
=
NULL
;
ibool
par_case_name_set
=
FALSE
;
char
par_case_name
[
MAX_FULL_NAME_LEN
+
1
];
DBUG_ENTER
(
"ha_innobase::open"
);
...
...
@@ -3746,16 +3759,87 @@ ha_innobase::open(
workaround for http://bugs.mysql.com/bug.php?id=33349. Look
at support issue https://support.mysql.com/view.php?id=21080
for more details. */
#ifdef __WIN__
is_part
=
strstr
(
norm_name
,
"#p#"
);
#else
is_part
=
strstr
(
norm_name
,
"#P#"
);
#endif
/* __WIN__ */
retry:
/* Get pointer to a table object in InnoDB dictionary cache */
ib_table
=
dict_table_get
(
norm_name
,
TRUE
);
if
(
NULL
==
ib_table
)
{
if
(
is_part
&&
retries
<
10
)
{
/* MySQL partition engine hard codes the file name
separator as "#P#". The text case is fixed even if
lower_case_table_names is set to 1 or 2. This is true
for sub-partition names as well. InnoDB always
normalises file names to lower case on Windows, this
can potentially cause problems when copying/moving
tables between platforms.
1) If boot against an installation from Windows
platform, then its partition table name could
be all be in lower case in system tables. So we
will need to check lower case name when load table.
2) If we boot an installation from other case
sensitive platform in Windows, we might need to
check the existence of table name without lowering
case them in the system table. */
if
(
innobase_get_lower_case_table_names
()
==
1
)
{
if
(
!
par_case_name_set
)
{
#ifndef __WIN__
/* Check for the table using lower
case name, including the partition
separator "P" */
memcpy
(
par_case_name
,
norm_name
,
strlen
(
norm_name
));
par_case_name
[
strlen
(
norm_name
)]
=
0
;
innobase_casedn_str
(
par_case_name
);
#else
/* On Windows platfrom, check
whether there exists table name in
system table whose name is
not being normalized to lower case */
normalize_table_name_low
(
par_case_name
,
name
,
FALSE
);
#endif
par_case_name_set
=
TRUE
;
}
ib_table
=
dict_table_get
(
par_case_name
,
FALSE
);
}
if
(
!
ib_table
)
{
++
retries
;
os_thread_sleep
(
100000
);
goto
retry
;
}
else
{
#ifndef __WIN__
sql_print_warning
(
"Partition table %s opened "
"after converting to lower "
"case. The table may have "
"been moved from a case "
"in-sensitive file system. "
"Please recreate table in "
"the current file system
\n
"
,
norm_name
);
#else
sql_print_warning
(
"Partition table %s opened "
"after skipping the step to "
"lower case the table name. "
"The table may have been "
"moved from a case sensitive "
"file system. Please "
"recreate table in the "
"current file system
\n
"
,
norm_name
);
#endif
goto
table_opened
;
}
}
if
(
is_part
)
{
...
...
@@ -3785,6 +3869,8 @@ retry:
DBUG_RETURN
(
HA_ERR_NO_SUCH_TABLE
);
}
table_opened:
if
(
ib_table
->
ibd_file_missing
&&
!
thd_tablespace_op
(
thd
))
{
sql_print_error
(
"MySQL is trying to open a table handle but "
"the .ibd file for
\n
table %s does not exist.
\n
"
...
...
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