From: igor Date: June 7 2007 7:59am Subject: bk commit into 5.0 tree (igor:1.2518) BUG#28449 List-Archive: http://lists.mysql.com/commits/28265 X-Bug: 28449 Message-Id: <20070607075913.A2615369B03@olga.mysql.com> Below is the list of changes that have just been committed into a local 5.0 repository of igor. When igor does a push these changes will be propagated to the main repository and, within 24 hours after the push, to the public repository. For information on how to access the public repository see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html ChangeSet@stripped, 2007-06-07 00:59:08-07:00, igor@stripped +4 -0 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. mysql-test/r/error_simulation.result@stripped, 2007-06-07 00:59:06-07:00, igor@stripped +19 -0 New BitKeeper file ``mysql-test/r/error_simulation.result'' Added a test case for bug #28449. mysql-test/r/error_simulation.result@stripped, 2007-06-07 00:59:06-07:00, igor@stripped +0 -0 mysql-test/t/error_simulation-master.opt@stripped, 2007-06-07 00:59:06-07:00, igor@stripped +1 -0 New BitKeeper file ``mysql-test/t/error_simulation-master.opt'' mysql-test/t/error_simulation-master.opt@stripped, 2007-06-07 00:59:06-07:00, igor@stripped +0 -0 mysql-test/t/error_simulation.test@stripped, 2007-06-07 00:59:06-07:00, igor@stripped +29 -0 New BitKeeper file ``mysql-test/t/error_simulation.test'' Added a test case for bug #28449. mysql-test/t/error_simulation.test@stripped, 2007-06-07 00:59:06-07:00, igor@stripped +0 -0 sql/sql_select.cc@stripped, 2007-06-07 00:59:06-07:00, igor@stripped +5 -2 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. As it's hard to create a sitiation that would throw an error a special code has been added that raises an error for a newly created test called error_simulation. # This is a BitKeeper patch. What follows are the unified diffs for the # set of deltas contained in the patch. The rest of the patch, the part # that BitKeeper cares about, is below these diffs. # User: igor # Host: olga.mysql.com # Root: /home/igor/dev-opt/mysql-5.0-opt-bug28449 --- 1.529/sql/sql_select.cc 2007-06-07 00:59:13 -07:00 +++ 1.530/sql/sql_select.cc 2007-06-07 00:59:13 -07:00 @@ -10147,7 +10147,9 @@ /* 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 @@ 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 @@ delete new_table.file; err2: thd->proc_info=save_proc_info; + table->mem_root= new_table.mem_root; DBUG_RETURN(1); } --- New file --- +++ mysql-test/r/error_simulation.result 07/06/07 00:59:06 DROP TABLE IF EXISTS t1; Warnings: Note 1051 Unknown table 't1' CREATE TABLE t1 ( a varchar(32) character set utf8 collate utf8_bin NOT NULL, b varchar(32) character set utf8 collate utf8_bin NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO t1 VALUES ('AAAAAAAAAA','AAAAAAAAAA'), ('AAAAAAAAAB','AAAAAAAAAB '), ('AAAAAAAAAB','AAAAAAAAAB'), ('AAAAAAAAAC','AAAAAAAAAC'), ('AAAAAAAAAD','AAAAAAAAAD'), ('AAAAAAAAAE','AAAAAAAAAE'), ('AAAAAAAAAF','AAAAAAAAAF'), ('AAAAAAAAAG','AAAAAAAAAG'), ('AAAAAAAAAH','AAAAAAAAAH'), ('AAAAAAAAAI','AAAAAAAAAI'), ('AAAAAAAAAJ','AAAAAAAAAJ'), ('AAAAAAAAAK','AAAAAAAAAK'); set tmp_table_size=1024; SELECT MAX(a) FROM t1 GROUP BY a,b; ERROR 23000: Can't write; duplicate key in table '' set tmp_table_size=default; DROP TABLE t1; --- New file --- +++ mysql-test/t/error_simulation-master.opt 07/06/07 00:59:06 --loose-debug=d,raise_error --- New file --- +++ mysql-test/t/error_simulation.test 07/06/07 00:59:06 -- source include/have_debug.inc # # Bug #28499: crash for grouping query when tmp_table_size is too small # DROP TABLE IF EXISTS t1; CREATE TABLE t1 ( a varchar(32) character set utf8 collate utf8_bin NOT NULL, b varchar(32) character set utf8 collate utf8_bin NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO t1 VALUES ('AAAAAAAAAA','AAAAAAAAAA'), ('AAAAAAAAAB','AAAAAAAAAB '), ('AAAAAAAAAB','AAAAAAAAAB'), ('AAAAAAAAAC','AAAAAAAAAC'), ('AAAAAAAAAD','AAAAAAAAAD'), ('AAAAAAAAAE','AAAAAAAAAE'), ('AAAAAAAAAF','AAAAAAAAAF'), ('AAAAAAAAAG','AAAAAAAAAG'), ('AAAAAAAAAH','AAAAAAAAAH'), ('AAAAAAAAAI','AAAAAAAAAI'), ('AAAAAAAAAJ','AAAAAAAAAJ'), ('AAAAAAAAAK','AAAAAAAAAK'); set tmp_table_size=1024; --error ER_DUP_KEY SELECT MAX(a) FROM t1 GROUP BY a,b; set tmp_table_size=default; DROP TABLE t1;