mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
create a reusable function that tells what FK actions can write
Backport of 794f71cbc4
This commit is contained in:
@ -4883,12 +4883,11 @@ handle_table(THD *thd, Query_tables_list *prelocking_ctx,
|
|||||||
while ((fk= fk_list_it++))
|
while ((fk= fk_list_it++))
|
||||||
{
|
{
|
||||||
// FK_OPTION_RESTRICT and FK_OPTION_NO_ACTION only need read access
|
// 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;
|
uint8 op= table_list->trg_event_map;
|
||||||
thr_lock_type lock_type;
|
thr_lock_type lock_type;
|
||||||
|
|
||||||
if ((op & (1 << TRG_EVENT_DELETE) && can_write[fk->delete_method])
|
if ((op & (1 << TRG_EVENT_DELETE) && fk_modifies_child(fk->delete_method))
|
||||||
|| (op & (1 << TRG_EVENT_UPDATE) && can_write[fk->update_method]))
|
|| (op & (1 << TRG_EVENT_UPDATE) && fk_modifies_child(fk->update_method)))
|
||||||
lock_type= TL_WRITE_ALLOW_WRITE;
|
lock_type= TL_WRITE_ALLOW_WRITE;
|
||||||
else
|
else
|
||||||
lock_type= TL_READ;
|
lock_type= TL_READ;
|
||||||
|
@ -7264,3 +7264,9 @@ LEX_CSTRING *fk_option_name(enum_fk_option opt)
|
|||||||
};
|
};
|
||||||
return names + 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];
|
||||||
|
}
|
||||||
|
@ -1447,6 +1447,7 @@ typedef struct st_foreign_key_info
|
|||||||
} FOREIGN_KEY_INFO;
|
} FOREIGN_KEY_INFO;
|
||||||
|
|
||||||
LEX_CSTRING *fk_option_name(enum_fk_option opt);
|
LEX_CSTRING *fk_option_name(enum_fk_option opt);
|
||||||
|
bool fk_modifies_child(enum_fk_option opt);
|
||||||
|
|
||||||
#define MY_I_S_MAYBE_NULL 1
|
#define MY_I_S_MAYBE_NULL 1
|
||||||
#define MY_I_S_UNSIGNED 2
|
#define MY_I_S_UNSIGNED 2
|
||||||
|
Reference in New Issue
Block a user