From 5112674d7079af706e93bca7e4de4c2a82b4ad87 Mon Sep 17 00:00:00 2001
From: "heikki@hundin.mysql.fi" <>
Date: Wed, 16 Apr 2003 23:05:22 +0300
Subject: [PATCH] row0ins.c:   Better fix for the ON DELETE SET NULL problem

---
 innobase/row/row0ins.c | 22 ++++++++++------------
 1 file changed, 10 insertions(+), 12 deletions(-)

diff --git a/innobase/row/row0ins.c b/innobase/row/row0ins.c
index 611f5cd30d1..596273477aa 100644
--- a/innobase/row/row0ins.c
+++ b/innobase/row/row0ins.c
@@ -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
-- 
2.30.9