diff --git a/mysql-test/r/partition.result b/mysql-test/r/partition.result index de477310fe319e0e0c2103082b182d78f00d1619..dddd82f3a8d52879b462dc11ff5105a6fdcc8754 100644 --- a/mysql-test/r/partition.result +++ b/mysql-test/r/partition.result @@ -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 diff --git a/mysql-test/t/partition.test b/mysql-test/t/partition.test index 68c13c0792acaf4bdfc352a27b6f6eafe788a1bb..35b9cf3a0162e20a9f370ec0681e0a1384fce149 100644 --- a/mysql-test/t/partition.test +++ b/mysql-test/t/partition.test @@ -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 diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index e9f4bc4c74597cae1b5a7e581a57498eae39d301..0c4f3cf708fd8df49fcb32305ba129ea660dfb11 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -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) {