Commit c3e4b61c authored by unknown's avatar unknown

Bug#27029 alter table ... enable keys crashes mysqld on large table

- When creating an index for the sort, the number of rows plus 1 is used 
to allocate a buffer.  In this test case, the number of rows 4294967295 
is the max value of an unsigned integer, so when 1 was added to it, a 
buffer of size 0 was allocated causing the crash.
- Create new test suite for this bug's test suite as per QA.


myisam/sort.c:
  Bug#27029 alter table ... enable keys crashes mysqld on large table
  - Check to make sure the value of records is < UINT_MAX32 to avoid a 
  false positive on the remaining condition.
mysql-test/suite/large_tests/README.TXT:
  Bug#27029 alter table ... enable keys crashes mysqld on large table
  - New testsuite for large tests.
  - Added mtr hint for potential testers.
mysql-test/suite/large_tests/r/alter_table.result:
  Bug#27029 alter table ... enable keys crashes mysqld on large table
  - New testsuite for large tests.
  - Added results for bug.
mysql-test/suite/large_tests/t/alter_table.test:
  Bug#27029 alter table ... enable keys crashes mysqld on large table
  - New testsuite for large tests.
  - Added test for bug.
parent c04d8460
...@@ -138,8 +138,9 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages, ...@@ -138,8 +138,9 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages,
while (memavl >= MIN_SORT_MEMORY) while (memavl >= MIN_SORT_MEMORY)
{ {
if ((my_off_t) (records+1)*(sort_length+sizeof(char*)) <= if ((records < UINT_MAX32) &&
(my_off_t) memavl) ((my_off_t) (records + 1) *
(sort_length + sizeof(char*)) <= (my_off_t) memavl))
keys= records+1; keys= records+1;
else else
do do
......
large_test suite
================
Iggy Galarza 07/20/07
---------------------
This test suite should include any test that requires:
1. Longer than the default timeout to complete.
2. A considerable amount of disk space.
These tests can be completed with the following command:
mysql-test-run.pl --suite=large_tests --big-test --suite-timeout=6360 --testcase-timeout=795
drop table if exists t1;
create table `t1` (`c1` tinyint unsigned not null, key `c1` (`c1`))
engine=myisam default charset=utf8;
alter table `t1` disable keys;
insert into t1 values (1),(2),(3),(4);
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1 limit 2147483647;
alter table t1 enable keys;
drop table t1;
# The test for bug#27029 requires about 8 hours and 20 minutes on my
# fastest machine. This test requires at least 60 GB of disk space.
--source include/big_test.inc
#
# Bug#27029 alter table ... enable keys crashes mysqld on large table
#
--disable_warnings
drop table if exists t1;
--enable_warnings
create table `t1` (`c1` tinyint unsigned not null, key `c1` (`c1`))
engine=myisam default charset=utf8;
alter table `t1` disable keys;
insert into t1 values (1),(2),(3),(4);
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1;
insert into t1 select * from t1 limit 2147483647; #Insert 4294967295 rows.
alter table t1 enable keys;
drop table t1;
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