summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
Diffstat (limited to 'sql')
-rw-r--r--sql/handler.cc2
-rw-r--r--sql/lex_string.h2
-rw-r--r--sql/sql_table.cc13
-rw-r--r--sql/table.h2
-rw-r--r--sql/unireg.cc2
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())