summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2018-02-23 13:41:46 +0100
committerSergei Golubchik <serg@mariadb.org>2018-02-24 01:28:50 +0100
commit794f71cbc412d17a09eed8f003119cef03880462 (patch)
treea4f35ec3e6d2df0fc773aa80653868235d349c69
parent17f8e0ecdf68846d6fb5e157e003794ba9a959c2 (diff)
downloadmariadb-git-794f71cbc412d17a09eed8f003119cef03880462.tar.gz
create a reusable function that tells what FK actions can write
and few indentation changes
-rw-r--r--sql/sql_base.cc5
-rw-r--r--sql/sql_delete.cc8
-rw-r--r--sql/sql_table.cc12
-rw-r--r--sql/table.cc6
-rw-r--r--sql/table.h9
5 files changed, 21 insertions, 19 deletions
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 3e1d5ffd63a..902933ffed8 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -4370,12 +4370,11 @@ handle_table(THD *thd, Query_tables_list *prelocking_ctx,
while ((fk= fk_list_it++))
{
// FK_OPTION_RESTRICT and FK_OPTION_NO_ACTION only need read access
- static bool can_write[]= { true, false, true, true, false, true };
uint8 op= table_list->trg_event_map;
thr_lock_type lock_type;
- if ((op & (1 << TRG_EVENT_DELETE) && can_write[fk->delete_method])
- || (op & (1 << TRG_EVENT_UPDATE) && can_write[fk->update_method]))
+ if ((op & (1 << TRG_EVENT_DELETE) && fk_modifies_child(fk->delete_method))
+ || (op & (1 << TRG_EVENT_UPDATE) && fk_modifies_child(fk->update_method)))
lock_type= TL_WRITE_ALLOW_WRITE;
else
lock_type= TL_READ;
diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc
index 55cc26d9041..b92dd4139b2 100644
--- a/sql/sql_delete.cc
+++ b/sql/sql_delete.cc
@@ -912,14 +912,14 @@ got_error:
wild_num - number of wildcards used in optional SELECT clause
field_list - list of items in optional SELECT clause
conds - conditions
-l
+
RETURN VALUE
FALSE OK
TRUE error
*/
- int mysql_prepare_delete(THD *thd, TABLE_LIST *table_list,
- uint wild_num, List<Item> &field_list, Item **conds,
- bool *delete_while_scanning)
+int mysql_prepare_delete(THD *thd, TABLE_LIST *table_list,
+ uint wild_num, List<Item> &field_list, Item **conds,
+ bool *delete_while_scanning)
{
Item *fake_conds= 0;
SELECT_LEX *select_lex= &thd->lex->select_lex;
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index e3da436aebd..d1af8d590da 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -3656,9 +3656,9 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
if (key->type == Key::FOREIGN_KEY)
{
fk_key_count++;
- if (((Foreign_key *)key)->validate(alter_info->create_list))
- DBUG_RETURN(TRUE);
Foreign_key *fk_key= (Foreign_key*) key;
+ if (fk_key->validate(alter_info->create_list))
+ DBUG_RETURN(TRUE);
if (fk_key->ref_columns.elements &&
fk_key->ref_columns.elements != fk_key->columns.elements)
{
@@ -4455,12 +4455,8 @@ bool Column_definition::sp_prepare_create_field(THD *thd, MEM_ROOT *mem_root)
}
-static bool
-vers_prepare_keys(THD *thd,
- HA_CREATE_INFO *create_info,
- Alter_info *alter_info,
- KEY **key_info,
- uint key_count)
+static bool vers_prepare_keys(THD *thd, HA_CREATE_INFO *create_info,
+ Alter_info *alter_info, KEY **key_info, uint key_count)
{
DBUG_ASSERT(create_info->versioned());
diff --git a/sql/table.cc b/sql/table.cc
index 7d3d7412ba5..b39ead6d8a8 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -8554,6 +8554,12 @@ LEX_CSTRING *fk_option_name(enum_fk_option opt)
return names + opt;
}
+bool fk_modifies_child(enum_fk_option opt)
+{
+ static bool can_write[]= { false, false, true, true, false, true };
+ return can_write[opt];
+}
+
enum TR_table::enabled TR_table::use_transaction_registry= TR_table::MAYBE;
TR_table::TR_table(THD* _thd, bool rw) :
diff --git a/sql/table.h b/sql/table.h
index b149bfc0f51..731021bcaae 100644
--- a/sql/table.h
+++ b/sql/table.h
@@ -1620,6 +1620,7 @@ typedef struct st_foreign_key_info
} FOREIGN_KEY_INFO;
LEX_CSTRING *fk_option_name(enum_fk_option opt);
+bool fk_modifies_child(enum_fk_option opt);
#define MY_I_S_MAYBE_NULL 1U
#define MY_I_S_UNSIGNED 2U
@@ -1943,10 +1944,10 @@ struct TABLE_LIST
Prepare TABLE_LIST that consists of one table instance to use in
open_and_lock_tables
*/
-inline void init_one_table(const LEX_CSTRING *db_arg,
- const LEX_CSTRING *table_name_arg,
- const LEX_CSTRING *alias_arg,
- enum thr_lock_type lock_type_arg)
+ inline void init_one_table(const LEX_CSTRING *db_arg,
+ const LEX_CSTRING *table_name_arg,
+ const LEX_CSTRING *alias_arg,
+ enum thr_lock_type lock_type_arg)
{
bzero((char*) this, sizeof(*this));
DBUG_ASSERT(!db_arg->str || strlen(db_arg->str) == db_arg->length);