diff options
author | Sergei Golubchik <serg@mariadb.org> | 2018-02-23 13:41:46 +0100 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2018-02-24 01:28:50 +0100 |
commit | 794f71cbc412d17a09eed8f003119cef03880462 (patch) | |
tree | a4f35ec3e6d2df0fc773aa80653868235d349c69 | |
parent | 17f8e0ecdf68846d6fb5e157e003794ba9a959c2 (diff) | |
download | mariadb-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.cc | 5 | ||||
-rw-r--r-- | sql/sql_delete.cc | 8 | ||||
-rw-r--r-- | sql/sql_table.cc | 12 | ||||
-rw-r--r-- | sql/table.cc | 6 | ||||
-rw-r--r-- | sql/table.h | 9 |
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); |