row0ins.c:

Better fix for the ON DELETE SET NULL problem
This commit is contained in:
heikki@hundin.mysql.fi 2003-04-16 23:05:22 +03:00
parent 609c8d9c62
commit 5112674d70

View file

@ -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