List:Commits« Previous MessageNext Message »
From:Konstantin Osipov Date:December 12 2008 1:09am
Subject:bzr commit into mysql-6.1-fk branch (kostja:2708) WL#148
View as plain text  
#At file:///opt/local/work/mysql-6.1-fk-stage/

 2708 Konstantin Osipov	2008-12-12
      WL#148, Milestone 8, Part 1.
      Review comments.
      Split preparation of the runtime context for cascading actions
      into a separate function.
      Preparing for some code reuse.
modified:
  sql/fk.cc

=== modified file 'sql/fk.cc'
--- a/sql/fk.cc	2008-12-11 23:46:13 +0000
+++ b/sql/fk.cc	2008-12-12 00:09:36 +0000
@@ -142,6 +142,7 @@ public:
   }
 
   bool prepare(bool old_row_is_record1);
+  bool prepare_cascade();
   bool check_children_exist();
   bool has_changed_columns();
   bool do_cascading_actions();
@@ -303,8 +304,11 @@ Fk_constraint_list::prepare_for_update(T
         return TRUE;
 
       if (rctx->is_cascading() &&
-          m_fkeys_parent_cascade.push_back(rctx, thd->mem_root))
+          (rctx->prepare_cascade() ||
+           m_fkeys_parent_cascade.push_back(rctx, thd->mem_root)))
+      {
         return TRUE;
+      }
     }
   }
   return FALSE;
@@ -944,12 +948,6 @@ bool Foreign_key_parent_rcontext::prepar
                                                      (m_key->key_parts + 1))))
     return TRUE;
 
-  if (m_fk_list->action_type() == TRG_EVENT_UPDATE &&
-      m_ref_action == FK_OPTION_CASCADE &&
-      !(m_cascade_copy= (Copy_field **)m_thd->calloc(sizeof(Copy_field *) *
-                                                     (m_key->key_parts + 1))))
-    return TRUE;
-
   /*
     We can rely on key having proper number of key parts and containing
     all columns, thanks to the way in which we search for it.
@@ -1002,9 +1000,33 @@ bool Foreign_key_parent_rcontext::prepar
     key_col_pos+= m_key->key_part[i].store_length;
   }
 
+  return FALSE;
+}
+
+
+/**
+  Prepare structures to perform cascading actions on the child table.
+
+  This method can only be called after a normal prepare().
+
+  @retval FALSE  Success
+  @retval TRUE   Error, out of resources.
+*/
+
+bool Foreign_key_parent_rcontext::prepare_cascade()
+{
+  uint i;
+
+  DBUG_ASSERT(is_cascading());
+
   if (m_fk_list->action_type() == TRG_EVENT_UPDATE &&
       m_ref_action == FK_OPTION_CASCADE)
   {
+    if (!(m_cascade_copy= (Copy_field **)
+                          m_thd->calloc(sizeof(Copy_field *) *
+                                        (m_key->key_parts + 1))))
+      return TRUE;
+
     for (i= 0; i < m_key->key_parts; i++)
     {
       uint src_field_index=  m_key_copy[i]->from_field_index();
@@ -1055,7 +1077,6 @@ bool Foreign_key_parent_rcontext::prepar
                                               m_child_table->write_set))
       return TRUE;
   }
-
   return FALSE;
 }
 

Thread
bzr commit into mysql-6.1-fk branch (kostja:2708) WL#148Konstantin Osipov12 Dec