Commit a1e00912 authored by unknown's avatar unknown

Fixed bugs pointed by "Crash with 'big' derivated table in MySQL-4.1" bugreport

 - fixed switching from heap to MyISAM table
 - fixed error handler


sql/sql_derived.cc:
  A fix for the bug when MyISAM tmp table has to be created in order to resolve derived table.
  fixed error handler
sql/sql_parse.cc:
  fixed error handler
sql/sql_union.cc:
  fixed switching from heap to MyISAM table
parent 006429d8
...@@ -88,6 +88,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) ...@@ -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))) if ((derived_result=new select_union(table)))
{ {
derived_result->tmp_table_param=&tmp_table_param;
unit->offset_limit_cnt= sl->offset_limit; unit->offset_limit_cnt= sl->offset_limit;
unit->select_limit_cnt= sl->select_limit+sl->offset_limit; unit->select_limit_cnt= sl->select_limit+sl->offset_limit;
if (unit->select_limit_cnt < sl->select_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) ...@@ -128,8 +129,6 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t)
free_tmp_table(thd,table); free_tmp_table(thd,table);
exit: exit:
close_thread_tables(thd); close_thread_tables(thd);
if (res > 0)
send_error(thd, ER_UNKNOWN_COM_ERROR); // temporary only ...
} }
DBUG_RETURN(res); DBUG_RETURN(res);
} }
...@@ -1344,7 +1344,7 @@ mysql_execute_command(THD *thd) ...@@ -1344,7 +1344,7 @@ mysql_execute_command(THD *thd)
cursor->derived, cursor->derived,
cursor))) cursor)))
{ {
if (res < 0) if (res < 0 || thd->net.report_error)
send_error(thd,thd->killed ? ER_SERVER_SHUTDOWN : 0); send_error(thd,thd->killed ? ER_SERVER_SHUTDOWN : 0);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
......
...@@ -78,9 +78,15 @@ bool select_union::send_data(List<Item> &values) ...@@ -78,9 +78,15 @@ bool select_union::send_data(List<Item> &values)
fill_record(table->field,values); fill_record(table->field,values);
if ((write_record(table,&info))) if ((write_record(table,&info)))
{ {
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)) if (create_myisam_from_heap(table, tmp_table_param, info.last_errno, 0))
return 1; return 1;
} }
else
return 1;
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment