diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc
index 7cbc1ea6db3149eb5911894679df56431a23e197..56636f299a7532c99215824eacab401ad3ce6036 100644
--- a/sql/sql_derived.cc
+++ b/sql/sql_derived.cc
@@ -88,6 +88,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t)
   
     if ((derived_result=new select_union(table)))
     {
+      derived_result->tmp_table_param=&tmp_table_param;
       unit->offset_limit_cnt= sl->offset_limit;
       unit->select_limit_cnt= sl->select_limit+sl->offset_limit;
       if (unit->select_limit_cnt < sl->select_limit)
@@ -128,8 +129,6 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t)
       free_tmp_table(thd,table);
 exit:
     close_thread_tables(thd);
-    if (res > 0)
-      send_error(thd, ER_UNKNOWN_COM_ERROR); // temporary only ...
   }
   DBUG_RETURN(res);
 }
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 8df74f332eb746399d0691a796230949148c8478..4d6fad171443177964e93eb08d32e1ef5f771d94 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -1344,7 +1344,7 @@ mysql_execute_command(THD *thd)
 						    cursor->derived,
 						    cursor)))
 	  {  
-	    if (res < 0)
+	    if (res < 0 || thd->net.report_error)
 	      send_error(thd,thd->killed ? ER_SERVER_SHUTDOWN : 0);
 	    DBUG_VOID_RETURN;
 	  }
diff --git a/sql/sql_union.cc b/sql/sql_union.cc
index 53f89747ce7980b8b1bbebcb4c641bd99121c2b0..0e6de306c0de9f6f833a7a43b09380e43b4b21da 100644
--- a/sql/sql_union.cc
+++ b/sql/sql_union.cc
@@ -78,7 +78,13 @@ bool select_union::send_data(List<Item> &values)
   fill_record(table->field,values);
   if ((write_record(table,&info)))
   {
-    if (create_myisam_from_heap(table, tmp_table_param, info.last_errno, 0))
+    if (thd->net.last_errno == ER_RECORD_FILE_FULL)
+    {
+      thd->clear_error(); // do not report user about table overflow
+      if (create_myisam_from_heap(table, tmp_table_param, info.last_errno, 0))
+	return 1;
+    }
+    else
       return 1;
   }
   return 0;