Fix for bug#18753 Partitions: auto_increment fails

Current auto increment value is placed in partition in which latest
record was saved. So to get auto_increment they have to scan
all partitions and return max value.
parent d70035ca
...@@ -839,4 +839,21 @@ SHOW TABLE STATUS; ...@@ -839,4 +839,21 @@ 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 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 Dynamic 0 0 0 0 0 0 NULL NULL NULL NULL latin1_swedish_ci NULL partitioned t1 MyISAM 10 Dynamic 0 0 0 0 0 0 NULL NULL NULL NULL latin1_swedish_ci NULL partitioned
DROP TABLE t1; DROP TABLE t1;
create table t1 (s1 int auto_increment primary key)
partition by list (s1)
(partition p1 values in (1),
partition p2 values in (2),
partition p3 values in (3));
insert into t1 values (null);
insert into t1 values (null);
insert into t1 values (null);
select auto_increment from information_schema.tables where table_name='t1';
auto_increment
4
select * from t1;
s1
1
2
3
drop table t1;
End of 5.1 tests End of 5.1 tests
...@@ -956,4 +956,19 @@ PARTITION p2 VALUES LESS THAN (30) ENGINE = MyISAM); ...@@ -956,4 +956,19 @@ PARTITION p2 VALUES LESS THAN (30) ENGINE = MyISAM);
SHOW TABLE STATUS; SHOW TABLE STATUS;
DROP TABLE t1; DROP TABLE t1;
#
# Bug#18753 Partitions: auto_increment fails
#
create table t1 (s1 int auto_increment primary key)
partition by list (s1)
(partition p1 values in (1),
partition p2 values in (2),
partition p3 values in (3));
insert into t1 values (null);
insert into t1 values (null);
insert into t1 values (null);
select auto_increment from information_schema.tables where table_name='t1';
select * from t1;
drop table t1;
--echo End of 5.1 tests --echo End of 5.1 tests
...@@ -4201,11 +4201,7 @@ void ha_partition::info(uint flag) ...@@ -4201,11 +4201,7 @@ void ha_partition::info(uint flag)
if (flag & HA_STATUS_AUTO) if (flag & HA_STATUS_AUTO)
{ {
DBUG_PRINT("info", ("HA_STATUS_AUTO")); DBUG_PRINT("info", ("HA_STATUS_AUTO"));
/* auto_increment_value= get_auto_increment();
The auto increment value is only maintained by the first handler
so we will only call this.
*/
m_file[0]->info(HA_STATUS_AUTO);
} }
if (flag & HA_STATUS_VARIABLE) if (flag & HA_STATUS_VARIABLE)
{ {
...@@ -5349,9 +5345,15 @@ void ha_partition::restore_auto_increment() ...@@ -5349,9 +5345,15 @@ void ha_partition::restore_auto_increment()
ulonglong ha_partition::get_auto_increment() ulonglong ha_partition::get_auto_increment()
{ {
ulonglong auto_inc, max_auto_inc= 0;
DBUG_ENTER("ha_partition::get_auto_increment"); DBUG_ENTER("ha_partition::get_auto_increment");
DBUG_RETURN(m_file[0]->get_auto_increment()); for (uint i= 0; i < m_tot_parts; i++)
{
auto_inc= m_file[i]->get_auto_increment();
set_if_bigger(max_auto_inc, auto_inc);
}
DBUG_RETURN(max_auto_inc);
} }
......
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