mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 11:01:52 +01:00
row0ins.c:
Better fix for the ON DELETE SET NULL problem
This commit is contained in:
parent
609c8d9c62
commit
5112674d70
1 changed files with 10 additions and 12 deletions
|
@ -323,7 +323,7 @@ row_ins_clust_index_entry_by_modify(
|
|||
|
||||
/*************************************************************************
|
||||
Returns TRUE if in a cascaded update/delete an ancestor node of node
|
||||
updates table. */
|
||||
updates (not DELETE, but UPDATE) table. */
|
||||
static
|
||||
ibool
|
||||
row_ins_cascade_ancestor_updates_table(
|
||||
|
@ -341,7 +341,7 @@ row_ins_cascade_ancestor_updates_table(
|
|||
|
||||
upd_node = parent;
|
||||
|
||||
if (upd_node->table == table) {
|
||||
if (upd_node->table == table && upd_node->is_delete == FALSE) {
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
@ -678,17 +678,15 @@ row_ins_foreign_check_on_constraint(
|
|||
}
|
||||
}
|
||||
|
||||
/* We do not allow cyclic cascaded updating of the same table, except
|
||||
in the case the update is the action of ON DELETE SET NULL, which
|
||||
cannot lead to an infinite cycle. Check that we are not updating the
|
||||
same table which is already being modified in this cascade chain. We
|
||||
have to check this because the modification of the indexes of a
|
||||
'parent' table may still be incomplete, and we must avoid seeing the
|
||||
indexes of the parent table in an inconsistent state! In this way we
|
||||
also prevent possible infinite update loops caused by cyclic cascaded
|
||||
updates. */
|
||||
/* We do not allow cyclic cascaded updating (DELETE is allowed,
|
||||
but not UPDATE) of the same table, as this can lead to an infinite
|
||||
cycle. Check that we are not updating the same table which is
|
||||
already being modified in this cascade chain. We have to check
|
||||
this also because the modification of the indexes of a 'parent'
|
||||
table may still be incomplete, and we must avoid seeing the indexes
|
||||
of the parent table in an inconsistent state! */
|
||||
|
||||
if (!node->is_delete
|
||||
if (!cascade->is_delete
|
||||
&& row_ins_cascade_ancestor_updates_table(cascade, table)) {
|
||||
|
||||
/* We do not know if this would break foreign key
|
||||
|
|
Loading…
Add table
Reference in a new issue