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)
   {