summaryrefslogtreecommitdiff
path: root/sql/sql_lex.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_lex.cc')
-rw-r--r--sql/sql_lex.cc35
1 files changed, 35 insertions, 0 deletions
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index 4081a4e0c3c..2415e0287e5 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -11447,6 +11447,41 @@ bool LEX::add_column_foreign_key(const LEX_CSTRING &field_name,
return false;
}
+bool LEX::init_last_foreign_key(Table_ident *ref_table_name)
+{
+ if (ref_table_name->db.str == NULL)
+ ref_table_name->db= query_tables->db;
+
+ Table_ident lookup_ref_name(ref_table_name->db, ref_table_name->table);
+ if (lower_case_table_names)
+ lookup_ref_name.lowercase(thd->mem_root);
+
+ if (ref_table_name->db.str == NULL)
+ copy_db_to(&ref_table_name->db);
+ TABLE_LIST *ref_table= find_table_in_list(query_tables,
+ &TABLE_LIST::next_global,
+ &lookup_ref_name.db,
+ &lookup_ref_name.table);
+
+ if (ref_table == NULL &&
+ !(thd->variables.option_bits & OPTION_NO_FOREIGN_KEY_CHECKS))
+ {
+ ref_table= (TABLE_LIST *) thd->alloc(sizeof(TABLE_LIST));
+ if (unlikely(ref_table == NULL))
+ return true;
+ ref_table->init_one_table_for_prelocking(&lookup_ref_name.db,
+ &lookup_ref_name.table,
+ NULL, TL_READ,
+ TABLE_LIST::PRELOCK_NONE,
+ 0, 0,
+ &query_tables_last,
+ false);
+ }
+ last_foreign_key->init(ref_table_name->db, ref_table_name->table, ref_table,
+ fk_options);
+ return false;
+}
+
bool LEX::stmt_grant_table(THD *thd,
Grant_privilege *grant,