From 49aefe3fb75a9dbe19b2615bb922132433586c25 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 16 Nov 2002 00:01:48 +0200 Subject: [PATCH] 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 --- sql/sql_derived.cc | 3 +-- sql/sql_parse.cc | 2 +- sql/sql_union.cc | 8 +++++++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index 7cbc1ea6db3..56636f299a7 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 8df74f332eb..4d6fad17144 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 53f89747ce7..0e6de306c0d 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -78,7 +78,13 @@ bool select_union::send_data(List &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;