diff --git a/sql/sp_head.cc b/sql/sp_head.cc
index d075c86f8cd11937e572b52d0dbf08048b6d9678..e4dc64c993de98c6adec50ca6829a1a0d87648c6 100644
--- a/sql/sp_head.cc
+++ b/sql/sp_head.cc
@@ -735,11 +735,10 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount, Item **resp)
 
   init_alloc_root(&call_mem_root, MEM_ROOT_BLOCK_SIZE, 0);
 
-  thd->set_n_backup_item_arena(&call_arena, &backup_arena);
 
   // QQ Should have some error checking here? (types, etc...)
   nctx= new sp_rcontext(csize, hmax, cmax);
-  nctx->callers_mem_root= backup_arena.mem_root;
+  nctx->callers_mem_root= thd->mem_root;
   for (i= 0 ; i < argcount ; i++)
   {
     sp_pvar_t *pvar = m_pcont->find_pvar(i);
@@ -765,6 +764,9 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount, Item **resp)
     }
   }
   thd->spcont= nctx;
+  thd->set_n_backup_item_arena(&call_arena, &backup_arena);
+  /* mem_root was moved to backup_arena */
+  DBUG_ASSERT(nctx->callers_mem_root == backup_arena.mem_root);
 
   ret= execute(thd);
 
@@ -834,7 +836,6 @@ sp_head::execute_procedure(THD *thd, List<Item> *args)
   }
 
   init_alloc_root(&call_mem_root, MEM_ROOT_BLOCK_SIZE, 0);
-  thd->set_n_backup_item_arena(&call_arena, &backup_arena);
 
   if (csize > 0 || hmax > 0 || cmax > 0)
   {
@@ -899,12 +900,11 @@ sp_head::execute_procedure(THD *thd, List<Item> *args)
   }
 
   if (! ret)
+  {
+    thd->set_n_backup_item_arena(&call_arena, &backup_arena);
     ret= execute(thd);
-
-  // Partially restore context now.
-  // We still need the call mem root and free list for processing
-  // of out parameters.
-  thd->restore_backup_item_arena(&call_arena, &backup_arena);
+    thd->restore_backup_item_arena(&call_arena, &backup_arena);
+  }
 
   if (!ret && csize > 0)
   {
diff --git a/sql/sql_union.cc b/sql/sql_union.cc
index 87b67a5127a27cb6ca9fd1f60b3bfa4b786c7ddb..6e307dda5be13037c4b3ac30069e081c5cbf436e 100644
--- a/sql/sql_union.cc
+++ b/sql/sql_union.cc
@@ -646,6 +646,7 @@ bool st_select_lex::cleanup()
 
   if (join)
   {
+    DBUG_ASSERT((st_select_lex*)join->select_lex == this);
     error|= join->destroy();
     delete join;
     join= 0;