summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/partition.result8
-rw-r--r--mysql-test/t/partition.test10
-rw-r--r--sql/ha_partition.cc13
3 files changed, 27 insertions, 4 deletions
diff --git a/mysql-test/r/partition.result b/mysql-test/r/partition.result
index e95489864f7..1d186f0a56a 100644
--- a/mysql-test/r/partition.result
+++ b/mysql-test/r/partition.result
@@ -1,5 +1,13 @@
drop table if exists t1;
create table t1 (a int)
+engine = innodb
+partition by key (a);
+insert into t1 values (0);
+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 InnoDB 10 Compact 2 8192 16384 0 0 0 NULL NULL NULL NULL latin1_swedish_ci NULL partitioned
+drop table t1;
+create table t1 (a int)
partition by list (a)
(partition p0 values in (1));
create procedure pz()
diff --git a/mysql-test/t/partition.test b/mysql-test/t/partition.test
index d4e930f91ec..dc1d96298d2 100644
--- a/mysql-test/t/partition.test
+++ b/mysql-test/t/partition.test
@@ -10,6 +10,16 @@ drop table if exists t1;
--enable_warnings
#
+# Bug 21173: SHOW TABLE STATUS crashes server in InnoDB
+#
+create table t1 (a int)
+engine = innodb
+partition by key (a);
+insert into t1 values (0);
+show table status;
+drop table t1;
+
+#
# Bug 19309 Partitions: Crash if double procedural alter
#
create table t1 (a int)
diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc
index 615c4bfb1bf..042b23632a6 100644
--- a/sql/ha_partition.cc
+++ b/sql/ha_partition.cc
@@ -4183,9 +4183,15 @@ void ha_partition::info(uint flag)
ulonglong nb_reserved_values;
DBUG_PRINT("info", ("HA_STATUS_AUTO"));
/* we don't want to reserve any values, it's pure information */
- get_auto_increment(0, 0, 0, &stats.auto_increment_value,
- &nb_reserved_values);
- release_auto_increment();
+
+ if (table->found_next_number_field)
+ {
+ get_auto_increment(0, 0, 0, &stats.auto_increment_value,
+ &nb_reserved_values);
+ release_auto_increment();
+ }
+ else
+ stats.auto_increment_value= ~(ulonglong)(0);
}
if (flag & HA_STATUS_VARIABLE)
{
@@ -5363,7 +5369,6 @@ void ha_partition::get_auto_increment(ulonglong offset, ulonglong increment,
if (increment) // If not check for values
*nb_reserved_values= (last_value == ULONGLONG_MAX) ?
ULONGLONG_MAX : ((last_value - *first_value) / increment);
-
DBUG_VOID_RETURN;
}