List:Commits« Previous MessageNext Message »
From:igor Date:June 7 2007 7:59am
Subject:bk commit into 5.0 tree (igor:1.2518) BUG#28449
View as plain text  
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;

Thread
bk commit into 5.0 tree (igor:1.2518) BUG#28449igor7 Jun