row0ins.c:

  Better fix for the ON DELETE SET NULL problem
parent 609c8d9c
......@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment