Commit 675d0941 authored by unknown's avatar unknown

Fix for bug #28806: Running SHOW TABLE STATUS during high INSERT load crashes server

Problem: getting an autoincrement value for a partition table in the ::info() method we call
the get_auto_increment() for all partitions. That may cause a problem for at least MyISAM
tables that rely on some table state (in this particular case table->naxt_nuber_field is 
set to 0 in the mysql_insert() and we get a crash). 
Moreover, calling get_auto_increment() is superfluous there.

Fix: use ::info(HA_STATUS_AUTO) calls to get autoincrement values for partitions instead of
get_auto_increment() ones in the ha_partition::info().


mysql-test/r/partition.result:
  Fix for bug #28806: Running SHOW TABLE STATUS during high INSERT load crashes server
    - test result.
mysql-test/t/partition.test:
  Fix for bug #28806: Running SHOW TABLE STATUS during high INSERT load crashes server
    - test case.
sql/ha_partition.cc:
  Fix for bug #28806: Running SHOW TABLE STATUS during high INSERT load crashes server
    - use info(HA_STATUS_AUTO) calls to get autoincrement values for partitions,
      set the auto_increment_value as the biggest one.
parent 10a21ed0
......@@ -1235,4 +1235,18 @@ aaa 2
drop table t1;
create table t1 (s1 bigint) partition by list (s1) (partition p1 values in (-9223372036854775808));
drop table t1;
create table t1(a int auto_increment, b int, primary key (b, a))
partition by hash(b) partitions 2;
insert into t1 values (null, 1);
show table status;
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
t1 MyISAM 10 Fixed 1 9 9 0 0 0 1 NULL NULL NULL latin1_swedish_ci NULL partitioned
drop table t1;
create table t1(a int auto_increment primary key)
partition by key(a) partitions 2;
insert into t1 values (null), (null), (null);
show table status;
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
t1 MyISAM 10 Fixed 3 7 21 0 0 0 4 NULL NULL NULL latin1_swedish_ci NULL partitioned
drop table t1;
End of 5.1 tests
......@@ -1448,4 +1448,21 @@ drop table t1;
create table t1 (s1 bigint) partition by list (s1) (partition p1 values in (-9223372036854775808));
drop table t1;
#
# Bug #28806: Running SHOW TABLE STATUS during high INSERT load crashes server
#
create table t1(a int auto_increment, b int, primary key (b, a))
partition by hash(b) partitions 2;
insert into t1 values (null, 1);
--replace_column 9 0 12 NULL 13 NULL 14 NULL
show table status;
drop table t1;
create table t1(a int auto_increment primary key)
partition by key(a) partitions 2;
insert into t1 values (null), (null), (null);
--replace_column 9 0 12 NULL 13 NULL 14 NULL
show table status;
drop table t1;
--echo End of 5.1 tests
......@@ -4253,22 +4253,16 @@ int ha_partition::info(uint flag)
if (flag & HA_STATUS_AUTO)
{
ulonglong nb_reserved_values;
ulonglong auto_increment_value= 0;
DBUG_PRINT("info", ("HA_STATUS_AUTO"));
/* we don't want to reserve any values, it's pure information */
if (table->found_next_number_field)
file_array= m_file;
do
{
/*
Can only call get_auto_increment for tables that actually
have auto_increment columns, otherwise there will be
problems in handlers that don't expect get_auto_increment
for non-autoincrement tables.
*/
get_auto_increment(0, 0, 0, &stats.auto_increment_value,
&nb_reserved_values);
release_auto_increment();
}
file= *file_array;
file->info(HA_STATUS_AUTO);
set_if_bigger(auto_increment_value, file->stats.auto_increment_value);
} while (*(++file_array));
stats.auto_increment_value= auto_increment_value;
}
if (flag & HA_STATUS_VARIABLE)
{
......
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