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
1b26d591
Commit
1b26d591
authored
May 06, 2013
by
Annamalai Gurusami
Browse files
Options
Browse Files
Download
Plain Diff
Merge from mysql-5.1 to mysql-5.5
parents
05ca7f08
bf7325bb
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
250 additions
and
51 deletions
+250
-51
storage/innobase/dict/dict0crea.c
storage/innobase/dict/dict0crea.c
+47
-12
storage/innobase/dict/dict0dict.c
storage/innobase/dict/dict0dict.c
+90
-12
storage/innobase/handler/ha_innodb.cc
storage/innobase/handler/ha_innodb.cc
+64
-18
storage/innobase/include/dict0types.h
storage/innobase/include/dict0types.h
+4
-1
storage/innobase/include/ha_prototypes.h
storage/innobase/include/ha_prototypes.h
+21
-1
storage/innobase/row/row0mysql.c
storage/innobase/row/row0mysql.c
+24
-7
No files found.
storage/innobase/dict/dict0crea.c
View file @
1b26d591
/*****************************************************************************
Copyright (c) 1996, 201
1
, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 1996, 201
3
, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -44,6 +44,21 @@ Created 1/8/1996 Heikki Tuuri
#include "ut0vec.h"
#include "ha_prototypes.h"
/*************************************************************************
Checks if a table name contains the string TEMP_TABLE_PATH_PREFIX which
denotes temporary tables in MySQL. */
static
ibool
row_is_mysql_tmp_table_name
(
/*========================*/
/* out: TRUE if temporary table */
const
char
*
name
)
/* in: table name in the form
'database/tablename' */
{
return
(
strstr
(
name
,
TEMP_TABLE_PATH_PREFIX
)
!=
NULL
);
}
/*****************************************************************//**
Based on a table object, this function builds the entry to be inserted
in the SYS_TABLES system table.
...
...
@@ -1424,25 +1439,45 @@ dict_create_add_foreign_to_dictionary(
{
ulint
error
;
ulint
i
;
pars_info_t
*
info
=
pars_info_create
();
pars_info_t
*
info
;
if
(
foreign
->
id
==
NULL
)
{
char
*
stripped_name
;
/* Generate a new constraint id */
ulint
namelen
=
strlen
(
table
->
name
);
char
*
id
=
mem_heap_alloc
(
foreign
->
heap
,
namelen
+
20
);
/* no overflow if number < 1e13 */
sprintf
(
id
,
"%s_ibfk_%lu"
,
table
->
name
,
(
ulong
)
(
*
id_nr
)
++
);
foreign
->
id
=
id
;
stripped_name
=
strchr
(
foreign
->
id
,
'/'
)
+
1
;
if
(
innobase_check_identifier_length
(
stripped_name
))
{
fprintf
(
stderr
,
"InnoDB: Generated foreign key "
"name (%s) is too long
\n
"
,
foreign
->
id
);
if
(
row_is_mysql_tmp_table_name
(
table
->
name
))
{
sprintf
(
id
,
"%s_ibfk_%lu"
,
table
->
name
,
(
ulong
)
(
*
id_nr
)
++
);
}
else
{
char
table_name
[
MAX_TABLE_NAME_LEN
+
20
]
=
""
;
uint
errors
=
0
;
strncpy
(
table_name
,
table
->
name
,
MAX_TABLE_NAME_LEN
+
20
);
innobase_convert_to_system_charset
(
strchr
(
table_name
,
'/'
)
+
1
,
strchr
(
table
->
name
,
'/'
)
+
1
,
MAX_TABLE_NAME_LEN
,
&
errors
);
if
(
errors
)
{
strncpy
(
table_name
,
table
->
name
,
MAX_TABLE_NAME_LEN
+
20
);
}
sprintf
(
id
,
"%s_ibfk_%lu"
,
table_name
,
(
ulong
)
(
*
id_nr
)
++
);
if
(
innobase_check_identifier_length
(
strchr
(
id
,
'/'
)
+
1
))
{
return
(
DB_IDENTIFIER_TOO_LONG
);
}
}
foreign
->
id
=
id
;
}
info
=
pars_info_create
();
pars_info_add_str_literal
(
info
,
"id"
,
foreign
->
id
);
...
...
storage/innobase/dict/dict0dict.c
View file @
1b26d591
...
...
@@ -1116,22 +1116,78 @@ dict_table_rename_in_cache(
dict_mem_foreign_table_name_lookup_set
(
foreign
,
FALSE
);
}
if
(
strchr
(
foreign
->
id
,
'/'
))
{
/* This is a >= 4.0.18 format id */
ulint
db_len
;
char
*
old_id
;
char
old_name_cs_filename
[
MAX_TABLE_NAME_LEN
+
20
];
uint
errors
=
0
;
/* All table names are internally stored in charset
my_charset_filename (except the temp tables and the
partition identifier suffix in partition tables). The
foreign key constraint names are internally stored
in UTF-8 charset. The variable fkid here is used
to store foreign key constraint name in charset
my_charset_filename for comparison further below. */
char
fkid
[
MAX_TABLE_NAME_LEN
+
20
];
ibool
on_tmp
=
FALSE
;
/* The old table name in my_charset_filename is stored
in old_name_cs_filename */
strncpy
(
old_name_cs_filename
,
old_name
,
MAX_TABLE_NAME_LEN
);
if
(
strstr
(
old_name
,
TEMP_TABLE_PATH_PREFIX
)
==
NULL
)
{
innobase_convert_to_system_charset
(
strchr
(
old_name_cs_filename
,
'/'
)
+
1
,
strchr
(
old_name
,
'/'
)
+
1
,
MAX_TABLE_NAME_LEN
,
&
errors
);
if
(
errors
)
{
/* There has been an error to convert
old table into UTF-8. This probably
means that the old table name is
actually in UTF-8. */
innobase_convert_to_filename_charset
(
strchr
(
old_name_cs_filename
,
'/'
)
+
1
,
strchr
(
old_name
,
'/'
)
+
1
,
MAX_TABLE_NAME_LEN
);
}
else
{
/* Old name already in
my_charset_filename */
strncpy
(
old_name_cs_filename
,
old_name
,
MAX_TABLE_NAME_LEN
);
}
}
/* This is a >= 4.0.18 format id */
strncpy
(
fkid
,
foreign
->
id
,
MAX_TABLE_NAME_LEN
);
if
(
strstr
(
fkid
,
TEMP_TABLE_PATH_PREFIX
)
==
NULL
)
{
innobase_convert_to_filename_charset
(
strchr
(
fkid
,
'/'
)
+
1
,
strchr
(
foreign
->
id
,
'/'
)
+
1
,
MAX_TABLE_NAME_LEN
+
20
);
}
else
{
on_tmp
=
TRUE
;
}
old_id
=
mem_strdup
(
foreign
->
id
);
if
(
ut_strlen
(
f
oreign
->
id
)
>
ut_strlen
(
old_
name
)
if
(
ut_strlen
(
f
kid
)
>
ut_strlen
(
old_name_cs_file
name
)
+
((
sizeof
dict_ibfk
)
-
1
)
&&
!
memcmp
(
f
oreign
->
id
,
old_
name
,
ut_strlen
(
old_name
))
&&
!
memcmp
(
f
oreign
->
id
+
ut_strlen
(
old_
name
),
&&
!
memcmp
(
f
kid
,
old_name_cs_file
name
,
ut_strlen
(
old_name
_cs_filename
))
&&
!
memcmp
(
f
kid
+
ut_strlen
(
old_name_cs_file
name
),
dict_ibfk
,
(
sizeof
dict_ibfk
)
-
1
))
{
/* This is a generated >= 4.0.18 format id */
char
table_name
[
MAX_TABLE_NAME_LEN
]
=
""
;
uint
errors
=
0
;
if
(
strlen
(
table
->
name
)
>
strlen
(
old_name
))
{
foreign
->
id
=
mem_heap_alloc
(
foreign
->
heap
,
...
...
@@ -1139,11 +1195,36 @@ dict_table_rename_in_cache(
+
strlen
(
old_id
)
+
1
);
}
/* Convert the table name to UTF-8 */
strncpy
(
table_name
,
table
->
name
,
MAX_TABLE_NAME_LEN
);
innobase_convert_to_system_charset
(
strchr
(
table_name
,
'/'
)
+
1
,
strchr
(
table
->
name
,
'/'
)
+
1
,
MAX_TABLE_NAME_LEN
,
&
errors
);
if
(
errors
)
{
/* Table name could not be converted
from charset my_charset_filename to
UTF-8. This means that the table name
is already in UTF-8 (#mysql#50). */
strncpy
(
table_name
,
table
->
name
,
MAX_TABLE_NAME_LEN
);
}
/* Replace the prefix 'databasename/tablename'
with the new names */
strcpy
(
foreign
->
id
,
table
->
name
);
strcpy
(
foreign
->
id
,
table_name
);
if
(
on_tmp
)
{
strcat
(
foreign
->
id
,
old_id
+
ut_strlen
(
old_name
));
}
else
{
sprintf
(
strchr
(
foreign
->
id
,
'/'
)
+
1
,
"%s%s"
,
strchr
(
table_name
,
'/'
)
+
1
,
strstr
(
old_id
,
"_ibfk_"
)
);
}
}
else
{
/* This is a >= 4.0.18 format id where the user
gave the id name */
...
...
@@ -4691,7 +4772,6 @@ dict_print_info_on_foreign_key_in_create_format(
dict_foreign_t
*
foreign
,
/*!< in: foreign key constraint */
ibool
add_newline
)
/*!< in: whether to add a newline */
{
char
constraint_name
[
MAX_TABLE_NAME_LEN
];
const
char
*
stripped_id
;
ulint
i
;
...
...
@@ -4713,9 +4793,7 @@ dict_print_info_on_foreign_key_in_create_format(
}
fputs
(
" CONSTRAINT "
,
file
);
innobase_convert_from_id
(
&
my_charset_filename
,
constraint_name
,
stripped_id
,
MAX_TABLE_NAME_LEN
);
ut_print_name
(
file
,
trx
,
FALSE
,
constraint_name
);
ut_print_name
(
file
,
trx
,
FALSE
,
stripped_id
);
fputs
(
" FOREIGN KEY ("
,
file
);
for
(
i
=
0
;;)
{
...
...
storage/innobase/handler/ha_innodb.cc
View file @
1b26d591
...
...
@@ -1159,33 +1159,27 @@ innobase_convert_from_table_id(
/**********************************************************************
Check if the length of the identifier exceeds the maximum allowed.
The input to this function is an identifier in charset my_charset_filename.
return true when length of identifier is too long. */
extern
"C"
UNIV_INTERN
extern
"C"
my_bool
innobase_check_identifier_length
(
/*=============================*/
const
char
*
id
)
/* in:
identifier to check. it must belong
to charset my_charset_filename
*/
const
char
*
id
)
/* in:
FK identifier to check excluding the
database portion.
*/
{
char
tmp
[
MAX_TABLE_NAME_LEN
+
10
];
uint
errors
;
uint
len
;
int
well_formed_error
=
0
;
CHARSET_INFO
*
cs1
=
&
my_charset_filename
;
CHARSET_INFO
*
cs2
=
thd_charset
(
current_thd
);
CHARSET_INFO
*
cs
=
system_charset_info
;
DBUG_ENTER
(
"innobase_check_identifier_length"
);
len
=
strconvert
(
cs1
,
id
,
cs2
,
tmp
,
MAX_TABLE_NAME_LEN
+
10
,
&
errors
);
uint
res
=
cs2
->
cset
->
well_formed_len
(
cs2
,
tmp
,
tmp
+
len
,
uint
res
=
cs
->
cset
->
well_formed_len
(
cs
,
id
,
id
+
strlen
(
id
),
NAME_CHAR_LEN
,
&
well_formed_error
);
if
(
well_formed_error
||
res
!=
len
)
{
my_error
(
ER_TOO_LONG_IDENT
,
MYF
(
0
),
tmp
);
return
(
true
);
if
(
well_formed_error
||
res
==
NAME_CHAR_LEN
)
{
my_error
(
ER_TOO_LONG_IDENT
,
MYF
(
0
),
id
);
DBUG_RETURN
(
true
);
}
return
(
false
);
DBUG_RETURN
(
false
);
}
/******************************************************************//**
...
...
@@ -11966,3 +11960,55 @@ test_innobase_convert_name()
}
#endif
/* UNIV_COMPILE_TEST_FUNCS */
/**********************************************************************
Converts an identifier from my_charset_filename to UTF-8 charset. */
extern
"C"
uint
innobase_convert_to_filename_charset
(
/*=================================*/
char
*
to
,
/* out: converted identifier */
const
char
*
from
,
/* in: identifier to convert */
ulint
len
)
/* in: length of 'to', in bytes */
{
uint
errors
;
uint
rlen
;
CHARSET_INFO
*
cs_to
=
&
my_charset_filename
;
CHARSET_INFO
*
cs_from
=
system_charset_info
;
rlen
=
strconvert
(
cs_from
,
from
,
cs_to
,
to
,
len
,
&
errors
);
if
(
errors
)
{
fprintf
(
stderr
,
"InnoDB: There was a problem in converting"
"'%s' in charset %s to charset %s"
,
from
,
cs_from
->
name
,
cs_to
->
name
);
}
return
(
rlen
);
}
/**********************************************************************
Converts an identifier from my_charset_filename to UTF-8 charset. */
extern
"C"
uint
innobase_convert_to_system_charset
(
/*===============================*/
char
*
to
,
/* out: converted identifier */
const
char
*
from
,
/* in: identifier to convert */
ulint
len
,
/* in: length of 'to', in bytes */
uint
*
errors
)
/* out: error return */
{
uint
rlen
;
CHARSET_INFO
*
cs1
=
&
my_charset_filename
;
CHARSET_INFO
*
cs2
=
system_charset_info
;
rlen
=
strconvert
(
cs1
,
from
,
cs2
,
to
,
len
,
errors
);
if
(
*
errors
)
{
fprintf
(
stderr
,
"InnoDB: There was a problem in converting"
"'%s' in charset %s to charset %s"
,
from
,
cs1
->
name
,
cs2
->
name
);
}
return
(
rlen
);
}
storage/innobase/include/dict0types.h
View file @
1b26d591
/*****************************************************************************
Copyright (c) 1996, 20
09, Innobase Oy
. All Rights Reserved.
Copyright (c) 1996, 20
13, Oracle and/or its affiliates
. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -58,4 +58,7 @@ enum dict_err_ignore {
typedef
enum
dict_err_ignore
dict_err_ignore_t
;
#define TEMP_TABLE_PREFIX "#sql"
#define TEMP_TABLE_PATH_PREFIX "/" TEMP_TABLE_PREFIX
#endif
storage/innobase/include/ha_prototypes.h
View file @
1b26d591
/*****************************************************************************
Copyright (c) 200
6, 2010, Innobase Oy
. All Rights Reserved.
Copyright (c) 200
0, 2013, Oracle and/or its affiliates
. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -307,4 +307,24 @@ innobase_check_identifier_length(
const
char
*
id
);
/* in: identifier to check. it must belong
to charset my_charset_filename */
/**********************************************************************
Converts an identifier from my_charset_filename to UTF-8 charset. */
uint
innobase_convert_to_system_charset
(
/*===============================*/
char
*
to
,
/* out: converted identifier */
const
char
*
from
,
/* in: identifier to convert */
ulint
len
,
/* in: length of 'to', in bytes */
uint
*
errors
);
/* out: error return */
/**********************************************************************
Converts an identifier from my_charset_filename to UTF-8 charset. */
uint
innobase_convert_to_filename_charset
(
/*=================================*/
char
*
to
,
/* out: converted identifier */
const
char
*
from
,
/* in: identifier to convert */
ulint
len
);
/* in: length of 'to', in bytes */
#endif
storage/innobase/row/row0mysql.c
View file @
1b26d591
...
...
@@ -53,7 +53,7 @@ Created 9/17/2000 Heikki Tuuri
#include "ibuf0ibuf.h"
#include "m_string.h"
#include "my_sys.h"
#include "ha_prototypes.h"
/** Provide optional 4.x backwards compatibility for 5.0 and above */
UNIV_INTERN
ibool
row_rollback_on_timeout
=
FALSE
;
...
...
@@ -3956,12 +3956,29 @@ row_rename_table_for_mysql(
goto
end
;
}
else
if
(
!
new_is_tmp
)
{
/* Rename all constraints. */
char
new_table_name
[
MAX_TABLE_NAME_LEN
]
=
""
;
uint
errors
=
0
;
info
=
pars_info_create
();
pars_info_add_str_literal
(
info
,
"new_table_name"
,
new_name
);
pars_info_add_str_literal
(
info
,
"old_table_name"
,
old_name
);
strncpy
(
new_table_name
,
new_name
,
MAX_TABLE_NAME_LEN
);
innobase_convert_to_system_charset
(
strchr
(
new_table_name
,
'/'
)
+
1
,
strchr
(
new_name
,
'/'
)
+
1
,
MAX_TABLE_NAME_LEN
,
&
errors
);
if
(
errors
)
{
/* Table name could not be converted from charset
my_charset_filename to UTF-8. This means that the
table name is already in UTF-8 (#mysql#50). */
strncpy
(
new_table_name
,
new_name
,
MAX_TABLE_NAME_LEN
);
}
pars_info_add_str_literal
(
info
,
"new_table_utf8"
,
new_table_name
);
err
=
que_eval_sql
(
info
,
"PROCEDURE RENAME_CONSTRAINT_IDS () IS
\n
"
...
...
@@ -3973,6 +3990,7 @@ row_rename_table_for_mysql(
"old_t_name_len INT;
\n
"
"new_db_name_len INT;
\n
"
"id_len INT;
\n
"
"offset INT;
\n
"
"found INT;
\n
"
"BEGIN
\n
"
"found := 1;
\n
"
...
...
@@ -3981,8 +3999,6 @@ row_rename_table_for_mysql(
"new_db_name := SUBSTR(:new_table_name, 0,
\n
"
" new_db_name_len);
\n
"
"old_t_name_len := LENGTH(:old_table_name);
\n
"
"gen_constr_prefix := CONCAT(:old_table_name,
\n
"
" '_ibfk_');
\n
"
"WHILE found = 1 LOOP
\n
"
" SELECT ID INTO foreign_id
\n
"
" FROM SYS_FOREIGN
\n
"
...
...
@@ -3999,12 +4015,13 @@ row_rename_table_for_mysql(
" id_len := LENGTH(foreign_id);
\n
"
" IF (INSTR(foreign_id, '/') > 0) THEN
\n
"
" IF (INSTR(foreign_id,
\n
"
"
gen_constr_prefix
) > 0)
\n
"
"
'_ibfk_'
) > 0)
\n
"
" THEN
\n
"
" offset := INSTR(foreign_id, '_ibfk_') - 1;
\n
"
" new_foreign_id :=
\n
"
" CONCAT(:new_table_
name
,
\n
"
" SUBSTR(foreign_id, o
ld_t_name_len
,
\n
"
" id_len - o
ld_t_name_len
));
\n
"
" CONCAT(:new_table_
utf8
,
\n
"
" SUBSTR(foreign_id, o
ffset
,
\n
"
" id_len - o
ffset
));
\n
"
" ELSE
\n
"
" new_foreign_id :=
\n
"
" CONCAT(new_db_name,
\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