mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 20:07:13 +02:00
Fix BUG#12071: "Windows hang: 'Opening tables' or 'Waiting for
table' lockup". Changes from the innodb-4.1-ss11 snapshot. Do not call os_file-create_tmpfile() at runtime. Instead, create a tempfile at startup and guard access to it with a mutex. Also, fix bugs: 10511: "Wrong padding of UCS2 CHAR columns in ON UPDATE CASCADE"; 13778: "If FOREIGN_KEY_CHECKS=0, one can create inconsistent FOREIGN KEYs". When FOREIGN_KEY_CHECKS=0 we still need to check that datatypes between foreign key references are compatible. Also, added test cases (also for bug 9802). innobase/dict/dict0dict.c: Changes from the innodb-4.1-ss11 snapshot innobase/dict/dict0load.c: Changes from the innodb-4.1-ss11 snapshot innobase/include/dict0dict.h: Changes from the innodb-4.1-ss11 snapshot innobase/include/dict0load.h: Changes from the innodb-4.1-ss11 snapshot innobase/include/os0file.h: Changes from the innodb-4.1-ss11 snapshot innobase/include/rem0cmp.h: Changes from the innodb-4.1-ss11 snapshot innobase/include/srv0srv.h: Changes from the innodb-4.1-ss11 snapshot innobase/rem/rem0cmp.c: Changes from the innodb-4.1-ss11 snapshot innobase/row/row0ins.c: Changes from the innodb-4.1-ss11 snapshot innobase/row/row0mysql.c: Changes from the innodb-4.1-ss11 snapshot innobase/srv/srv0srv.c: Changes from the innodb-4.1-ss11 snapshot innobase/srv/srv0start.c: Changes from the innodb-4.1-ss11 snapshot libmysqld/ha_blackhole.cc: Changes from the innodb-4.1-ss11 snapshot mysql-test/r/innodb.result: Changes from the innodb-4.1-ss11 snapshot mysql-test/t/innodb.test: Changes from the innodb-4.1-ss11 snapshot sql/ha_innodb.cc: Changes from the innodb-4.1-ss11 snapshot
This commit is contained in:
parent
5aeb69296a
commit
8e3f95b555
15 changed files with 253 additions and 166 deletions
|
|
@ -2077,8 +2077,11 @@ dict_foreign_find_index(
|
|||
dict_table_t* table, /* in: table */
|
||||
const char** columns,/* in: array of column names */
|
||||
ulint n_cols, /* in: number of columns */
|
||||
dict_index_t* types_idx)/* in: NULL or an index to whose types the
|
||||
column types must match */
|
||||
dict_index_t* types_idx, /* in: NULL or an index to whose types the
|
||||
column types must match */
|
||||
ibool check_charsets) /* in: whether to check charsets.
|
||||
only has an effect if types_idx !=
|
||||
NULL. */
|
||||
{
|
||||
dict_index_t* index;
|
||||
const char* col_name;
|
||||
|
|
@ -2107,7 +2110,8 @@ dict_foreign_find_index(
|
|||
|
||||
if (types_idx && !cmp_types_are_equal(
|
||||
dict_index_get_nth_type(index, i),
|
||||
dict_index_get_nth_type(types_idx, i))) {
|
||||
dict_index_get_nth_type(types_idx, i),
|
||||
check_charsets)) {
|
||||
|
||||
break;
|
||||
}
|
||||
|
|
@ -2178,7 +2182,8 @@ dict_foreign_add_to_cache(
|
|||
/*======================*/
|
||||
/* out: DB_SUCCESS or error code */
|
||||
dict_foreign_t* foreign, /* in, own: foreign key constraint */
|
||||
ibool check_types) /* in: TRUE=check type compatibility */
|
||||
ibool check_charsets) /* in: TRUE=check charset
|
||||
compatibility */
|
||||
{
|
||||
dict_table_t* for_table;
|
||||
dict_table_t* ref_table;
|
||||
|
|
@ -2214,16 +2219,10 @@ dict_foreign_add_to_cache(
|
|||
}
|
||||
|
||||
if (for_in_cache->referenced_table == NULL && ref_table) {
|
||||
dict_index_t* types_idx;
|
||||
if (check_types) {
|
||||
types_idx = for_in_cache->foreign_index;
|
||||
} else {
|
||||
types_idx = NULL;
|
||||
}
|
||||
index = dict_foreign_find_index(ref_table,
|
||||
(const char**) for_in_cache->referenced_col_names,
|
||||
for_in_cache->n_fields,
|
||||
types_idx);
|
||||
for_in_cache->foreign_index, check_charsets);
|
||||
|
||||
if (index == NULL) {
|
||||
dict_foreign_error_report(ef, for_in_cache,
|
||||
|
|
@ -2247,16 +2246,10 @@ dict_foreign_add_to_cache(
|
|||
}
|
||||
|
||||
if (for_in_cache->foreign_table == NULL && for_table) {
|
||||
dict_index_t* types_idx;
|
||||
if (check_types) {
|
||||
types_idx = for_in_cache->referenced_index;
|
||||
} else {
|
||||
types_idx = NULL;
|
||||
}
|
||||
index = dict_foreign_find_index(for_table,
|
||||
(const char**) for_in_cache->foreign_col_names,
|
||||
for_in_cache->n_fields,
|
||||
types_idx);
|
||||
for_in_cache->referenced_index, check_charsets);
|
||||
|
||||
if (index == NULL) {
|
||||
dict_foreign_error_report(ef, for_in_cache,
|
||||
|
|
@ -3033,7 +3026,7 @@ col_loop1:
|
|||
/* Try to find an index which contains the columns
|
||||
as the first fields and in the right order */
|
||||
|
||||
index = dict_foreign_find_index(table, column_names, i, NULL);
|
||||
index = dict_foreign_find_index(table, column_names, i, NULL, TRUE);
|
||||
|
||||
if (!index) {
|
||||
mutex_enter(&dict_foreign_err_mutex);
|
||||
|
|
@ -3298,8 +3291,7 @@ try_find_index:
|
|||
|
||||
if (referenced_table) {
|
||||
index = dict_foreign_find_index(referenced_table,
|
||||
column_names, i,
|
||||
foreign->foreign_index);
|
||||
column_names, i, foreign->foreign_index, TRUE);
|
||||
if (!index) {
|
||||
dict_foreign_free(foreign);
|
||||
mutex_enter(&dict_foreign_err_mutex);
|
||||
|
|
|
|||
|
|
@ -1094,7 +1094,7 @@ dict_load_foreign(
|
|||
/* out: DB_SUCCESS or error code */
|
||||
const char* id, /* in: foreign constraint id as a
|
||||
null-terminated string */
|
||||
ibool check_types)/* in: TRUE=check type compatibility */
|
||||
ibool check_charsets)/* in: TRUE=check charset compatibility */
|
||||
{
|
||||
dict_foreign_t* foreign;
|
||||
dict_table_t* sys_foreign;
|
||||
|
|
@ -1205,7 +1205,7 @@ dict_load_foreign(
|
|||
a new foreign key constraint but loading one from the data
|
||||
dictionary. */
|
||||
|
||||
return(dict_foreign_add_to_cache(foreign, check_types));
|
||||
return(dict_foreign_add_to_cache(foreign, check_charsets));
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
|
|
@ -1220,7 +1220,8 @@ dict_load_foreigns(
|
|||
/*===============*/
|
||||
/* out: DB_SUCCESS or error code */
|
||||
const char* table_name, /* in: table name */
|
||||
ibool check_types) /* in: TRUE=check type compatibility */
|
||||
ibool check_charsets) /* in: TRUE=check charset
|
||||
compatibility */
|
||||
{
|
||||
btr_pcur_t pcur;
|
||||
mem_heap_t* heap;
|
||||
|
|
@ -1319,7 +1320,7 @@ loop:
|
|||
|
||||
/* Load the foreign constraint definition to the dictionary cache */
|
||||
|
||||
err = dict_load_foreign(id, check_types);
|
||||
err = dict_load_foreign(id, check_charsets);
|
||||
|
||||
if (err != DB_SUCCESS) {
|
||||
btr_pcur_close(&pcur);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue