diff options
Diffstat (limited to 'sql')
-rw-r--r-- | sql/handler.cc | 2 | ||||
-rw-r--r-- | sql/lex_string.h | 2 | ||||
-rw-r--r-- | sql/sql_table.cc | 13 | ||||
-rw-r--r-- | sql/table.h | 2 | ||||
-rw-r--r-- | sql/unireg.cc | 2 |
5 files changed, 13 insertions, 8 deletions
diff --git a/sql/handler.cc b/sql/handler.cc index d71788fdb23..f6706e78ae9 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -4152,6 +4152,8 @@ void handler::print_error(int error, myf errflag) my_error(ER_DROP_INDEX_FK, errflag, ptr); DBUG_VOID_RETURN; } + case HA_ERR_FK_UPGRADE: + /* fall through */ case HA_ERR_TABLE_NEEDS_UPGRADE: textno= ER_TABLE_NEEDS_UPGRADE; my_error(ER_TABLE_NEEDS_UPGRADE, errflag, diff --git a/sql/lex_string.h b/sql/lex_string.h index d3d99074450..ff014c6fac3 100644 --- a/sql/lex_string.h +++ b/sql/lex_string.h @@ -75,7 +75,7 @@ class Lex_cstring : public LEX_CSTRING, public Sql_alloc } return strdup(mem_root, _str, strlen(_str)); } - bool strdup(MEM_ROOT *mem_root, const Lex_cstring &_str) + bool strdup(MEM_ROOT *mem_root, const Lex_cstring _str) { if (!_str.str) { diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 16b39f2f95b..26ad5233e32 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -12383,15 +12383,16 @@ wsrep_error_label: } -// Used in CREATE TABLE -bool TABLE_SHARE::fk_handle_create(THD *thd, FK_create_vector &shares) +// Used in CREATE TABLE and in FK upgrade (fk_add != NULL) +bool TABLE_SHARE::fk_handle_create(THD *thd, FK_create_vector &shares, FK_list *fk_add) { - if (foreign_keys.is_empty()) + FK_list &fkeys= fk_add ? *fk_add : foreign_keys; + if (fkeys.is_empty()) return false; Table_name_set tables; - for (FK_info &fk: foreign_keys) + for (FK_info &fk: fkeys) { if (!cmp_table(fk.ref_db(), db) && !cmp_table(fk.referenced_table, table_name)) continue; // subject table name is already prelocked by caller DDL @@ -12448,7 +12449,7 @@ bool TABLE_SHARE::fk_handle_create(THD *thd, FK_create_vector &shares) for (FK_ddl_backup &ref: shares) { TABLE_SHARE *ref_share= ref.sa.share; - for (const FK_info &fk: foreign_keys) + for (const FK_info &fk: fkeys) { // Find keys referencing the acquired share and add them to referenced_keys if (cmp_table(fk.ref_db(), ref_share->db) || @@ -12474,7 +12475,7 @@ bool TABLE_SHARE::fk_handle_create(THD *thd, FK_create_vector &shares) my_error(ER_OUT_OF_RESOURCES, MYF(0)); return true; } - } // for (const FK_info &fk: foreign_keys) + } // for (const FK_info &fk: fkeys) if (ref_share->fk_write_shadow_frm()) return true; diff --git a/sql/table.h b/sql/table.h index c74bc3b53e3..8252203cd2f 100644 --- a/sql/table.h +++ b/sql/table.h @@ -734,7 +734,7 @@ struct TABLE_SHARE KEY *key_info; /* data of keys in database */ FK_list foreign_keys; FK_list referenced_keys; - bool fk_handle_create(THD *thd, FK_create_vector &shares); + bool fk_handle_create(THD *thd, FK_create_vector &shares, FK_list *fk_add= NULL); void fk_revert_create(THD *thd, Table_name_set &ref_tables); #ifndef DBUG_OFF bool dbug_check_foreign_keys(THD *thd); diff --git a/sql/unireg.cc b/sql/unireg.cc index 25ff0f233f3..1e33b2a74e6 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -1285,6 +1285,8 @@ void Foreign_key_io::store_hint(FK_info &rk, uchar *&pos) bool Foreign_key_io::store(FK_list &foreign_keys, FK_list &referenced_keys) { + DBUG_EXECUTE_IF("fk_skip_store", return false;); + ulonglong fk_count= 0, rk_count= 0; if (foreign_keys.is_empty() && referenced_keys.is_empty()) |