row0ins.c:

  Better fix for the ON DELETE SET NULL problem
parent 609c8d9c
...@@ -323,7 +323,7 @@ row_ins_clust_index_entry_by_modify( ...@@ -323,7 +323,7 @@ row_ins_clust_index_entry_by_modify(
/************************************************************************* /*************************************************************************
Returns TRUE if in a cascaded update/delete an ancestor node of node Returns TRUE if in a cascaded update/delete an ancestor node of node
updates table. */ updates (not DELETE, but UPDATE) table. */
static static
ibool ibool
row_ins_cascade_ancestor_updates_table( row_ins_cascade_ancestor_updates_table(
...@@ -341,7 +341,7 @@ row_ins_cascade_ancestor_updates_table( ...@@ -341,7 +341,7 @@ row_ins_cascade_ancestor_updates_table(
upd_node = parent; upd_node = parent;
if (upd_node->table == table) { if (upd_node->table == table && upd_node->is_delete == FALSE) {
return(TRUE); return(TRUE);
} }
...@@ -678,17 +678,15 @@ row_ins_foreign_check_on_constraint( ...@@ -678,17 +678,15 @@ row_ins_foreign_check_on_constraint(
} }
} }
/* We do not allow cyclic cascaded updating of the same table, except /* We do not allow cyclic cascaded updating (DELETE is allowed,
in the case the update is the action of ON DELETE SET NULL, which but not UPDATE) of the same table, as this can lead to an infinite
cannot lead to an infinite cycle. Check that we are not updating the cycle. Check that we are not updating the same table which is
same table which is already being modified in this cascade chain. We already being modified in this cascade chain. We have to check
have to check this because the modification of the indexes of a this also because the modification of the indexes of a 'parent'
'parent' table may still be incomplete, and we must avoid seeing the table may still be incomplete, and we must avoid seeing the indexes
indexes of the parent table in an inconsistent state! In this way we of the parent table in an inconsistent state! */
also prevent possible infinite update loops caused by cyclic cascaded
updates. */
if (!node->is_delete if (!cascade->is_delete
&& row_ins_cascade_ancestor_updates_table(cascade, table)) { && row_ins_cascade_ancestor_updates_table(cascade, table)) {
/* We do not know if this would break foreign key /* 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