summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorigor@olga.mysql.com <>2007-06-07 00:59:08 -0700
committerigor@olga.mysql.com <>2007-06-07 00:59:08 -0700
commit569960410f108a77875e655002ccfe47688997af (patch)
treecd920b5b49d306781ff81c124fb62f2a6c7cd272 /sql
parentb90901130ec6b3c7baa34a9b614b6dba9f7a9897 (diff)
downloadmariadb-git-569960410f108a77875e655002ccfe47688997af.tar.gz
Fixed bug #28449: a crash may happen at some rare conditions when
a temporary table has grown out of heap memory reserved for it and the remaining disk space is not big enough to store the table as a MyISAM table. The crash happens because the function create_myisam_from_heap does not handle safely the mem_root structure associated with the converted table in the case when an error has occurred.
Diffstat (limited to 'sql')
-rw-r--r--sql/sql_select.cc7
1 files changed, 5 insertions, 2 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 41688794721..ece37708370 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -10147,7 +10147,9 @@ bool create_myisam_from_heap(THD *thd, TABLE *table, TMP_TABLE_PARAM *param,
/* copy all old rows */
while (!table->file->rnd_next(new_table.record[1]))
{
- if ((write_err=new_table.file->write_row(new_table.record[1])))
+ write_err=new_table.file->write_row(new_table.record[1]);
+ DBUG_EXECUTE_IF("raise_error", write_err= HA_ERR_FOUND_DUPP_KEY ;);
+ if (write_err)
goto err;
}
/* copy row that filled HEAP table */
@@ -10174,7 +10176,7 @@ bool create_myisam_from_heap(THD *thd, TABLE *table, TMP_TABLE_PARAM *param,
err:
DBUG_PRINT("error",("Got error: %d",write_err));
- table->file->print_error(error,MYF(0)); // Give table is full error
+ table->file->print_error(write_err, MYF(0)); // Give table is full error
(void) table->file->ha_rnd_end();
(void) new_table.file->close();
err1:
@@ -10182,6 +10184,7 @@ bool create_myisam_from_heap(THD *thd, TABLE *table, TMP_TABLE_PARAM *param,
delete new_table.file;
err2:
thd->proc_info=save_proc_info;
+ table->mem_root= new_table.mem_root;
DBUG_RETURN(1);
}