summaryrefslogtreecommitdiff
path: root/innobase
diff options
context:
space:
mode:
Diffstat (limited to 'innobase')
-rw-r--r--innobase/row/row0ins.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/innobase/row/row0ins.c b/innobase/row/row0ins.c
index 1a616b74756..611f5cd30d1 100644
--- a/innobase/row/row0ins.c
+++ b/innobase/row/row0ins.c
@@ -678,16 +678,17 @@ row_ins_foreign_check_on_constraint(
}
}
- /* We do not allow cyclic cascaded updating of the same
- table. 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. */
-
- if (!cascade->is_delete
+ /* 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. */
+
+ if (!node->is_delete
&& row_ins_cascade_ancestor_updates_table(cascade, table)) {
/* We do not know if this would break foreign key