List:Commits« Previous MessageNext Message »
From:Mattias Jonsson Date:October 23 2008 8:14pm
Subject:bzr commit into mysql-5.1 branch (mattias.jonsson:2676) Bug#40176
View as plain text  
#At file:///Users/mattiasj/clones/bzrroot/b40176-51-bugteam/

 2676 Mattias Jonsson	2008-10-23
      Bug#40176: update as first partitioning statement
      breaks auto increment
      
      The auto_increment value was not initialized if
      the first statement after opening a table was
      an 'UPDATE'.
      
      solution was to check initialize if it was not,
      before trying to increase it in update.
modified:
  mysql-test/suite/parts/inc/partition_auto_increment.inc
  mysql-test/suite/parts/r/partition_auto_increment_archive.result
  mysql-test/suite/parts/r/partition_auto_increment_blackhole.result
  mysql-test/suite/parts/r/partition_auto_increment_innodb.result
  mysql-test/suite/parts/r/partition_auto_increment_memory.result
  mysql-test/suite/parts/r/partition_auto_increment_myisam.result
  mysql-test/suite/parts/r/partition_auto_increment_ndb.result
  sql/ha_partition.cc
  sql/ha_partition.h

per-file messages:
  mysql-test/suite/parts/inc/partition_auto_increment.inc
    Bug#40176: update as first partitioning statement
    breaks auto increment
    
    Added tests for verifying the bug and show some more
    auto_increment flaws
  mysql-test/suite/parts/r/partition_auto_increment_archive.result
    Bug#40176: update as first partitioning statement
    breaks auto increment
    
    Updated test results, due to added tests
  mysql-test/suite/parts/r/partition_auto_increment_blackhole.result
    Bug#40176: update as first partitioning statement
    breaks auto increment
    
    Updated test results, due to added tests
  mysql-test/suite/parts/r/partition_auto_increment_innodb.result
    Bug#40176: update as first partitioning statement
    breaks auto increment
    
    Updated test results, due to added tests
  mysql-test/suite/parts/r/partition_auto_increment_memory.result
    Bug#40176: update as first partitioning statement
    breaks auto increment
    
    Updated test results, due to added tests
  mysql-test/suite/parts/r/partition_auto_increment_myisam.result
    Bug#40176: update as first partitioning statement
    breaks auto increment
    
    Updated test results, due to added tests
  mysql-test/suite/parts/r/partition_auto_increment_ndb.result
    Bug#40176: update as first partitioning statement
    breaks auto increment
    
    Updated test results, due to added tests
  sql/ha_partition.cc
    Bug#40176: update as first partitioning statement
    breaks auto increment
    
    make sure that the auto_increment value is initialized
    before updating it.
    
    (missed initializing in mysql_update_row).
  sql/ha_partition.h
    Bug#40176: update as first partitioning statement
    breaks auto increment
    
    Assert that it is initialized, before updating
    the auto_increment value
=== modified file 'mysql-test/suite/parts/inc/partition_auto_increment.inc'
--- a/mysql-test/suite/parts/inc/partition_auto_increment.inc	2008-09-08 13:30:01 +0000
+++ b/mysql-test/suite/parts/inc/partition_auto_increment.inc	2008-10-23 20:14:07 +0000
@@ -43,8 +43,13 @@ SET INSERT_ID = 30;
 INSERT INTO t1 VALUES (NULL);
 if (!$skip_update)
 {
+# InnoDB Does not handle this correctly, see bug#14793, bug#21641
   UPDATE t1 SET c1 = 50 WHERE c1 = 17;
   UPDATE t1 SET c1 = 51 WHERE c1 = 19;
+  FLUSH TABLES;
+  UPDATE t1 SET c1 = 40 WHERE c1 = 50;
+  SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
+  AND TABLE_NAME='t1';
   -- error 0, ER_BAD_NULL_ERROR
   UPDATE t1 SET c1 = NULL WHERE c1 = 4;
 if (!$mysql_errno)
@@ -83,6 +88,16 @@ TRUNCATE TABLE t1;
 INSERT INTO t1 VALUES (NULL);
 SHOW CREATE TABLE t1;
 SELECT * FROM t1 ORDER BY c1;
+INSERT INTO t1 VALUES (100);
+INSERT INTO t1 VALUES (NULL);
+if (!$skip_delete)
+{
+DELETE FROM t1 WHERE c1 >= 100;
+}
+# InnoDB does reset auto_increment on OPTIMIZE, Bug#18274
+# Archive does reset auto_increment on OPTIMIZE, Bug#40216
+OPTIMIZE TABLE t1;
+SHOW CREATE TABLE t1;
 DROP TABLE t1;
 
 -- echo # Simple test with NULL
@@ -184,6 +199,10 @@ if (!$skip_update)
 {
   UPDATE t1 SET c1 = 150 WHERE c1 = 17;
   UPDATE t1 SET c1 = 151 WHERE c1 = 19;
+  FLUSH TABLES;
+  UPDATE t1 SET c1 = 140 WHERE c1 = 150;
+  SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
+  AND TABLE_NAME='t1';
   -- error 0, ER_BAD_NULL_ERROR
   UPDATE t1 SET c1 = NULL WHERE c1 = 4;
 if (!$mysql_errno)
@@ -295,6 +314,15 @@ TRUNCATE TABLE t1;
 INSERT INTO t1 VALUES (NULL);
 SHOW CREATE TABLE t1;
 SELECT * FROM t1 ORDER BY c1;
+INSERT INTO t1 VALUES (100);
+INSERT INTO t1 VALUES (NULL);
+if (!$skip_delete)
+{
+DELETE FROM t1 WHERE c1 >= 100;
+}
+# InnoDB does reset auto_increment on OPTIMIZE, Bug#18274
+OPTIMIZE TABLE t1;
+SHOW CREATE TABLE t1;
 DROP TABLE t1;
 
 -- echo # Test with two threads

=== modified file 'mysql-test/suite/parts/r/partition_auto_increment_archive.result'
--- a/mysql-test/suite/parts/r/partition_auto_increment_archive.result	2008-09-08 13:30:01 +0000
+++ b/mysql-test/suite/parts/r/partition_auto_increment_archive.result	2008-10-23 20:14:07 +0000
@@ -105,6 +105,17 @@ c1
 5
 6
 7
+INSERT INTO t1 VALUES (100);
+INSERT INTO t1 VALUES (NULL);
+OPTIMIZE TABLE t1;
+Table	Op	Msg_type	Msg_text
+test.t1	optimize	status	OK
+SHOW CREATE TABLE t1;
+Table	Create Table
+t1	CREATE TABLE `t1` (
+  `c1` int(11) NOT NULL AUTO_INCREMENT,
+  PRIMARY KEY (`c1`)
+) ENGINE=ARCHIVE DEFAULT CHARSET=latin1
 DROP TABLE t1;
 # Simple test with NULL
 CREATE TABLE t1 (
@@ -362,6 +373,17 @@ c1
 25
 26
 27
+INSERT INTO t1 VALUES (100);
+INSERT INTO t1 VALUES (NULL);
+OPTIMIZE TABLE t1;
+Table	Op	Msg_type	Msg_text
+test.t1	optimize	status	OK
+SHOW CREATE TABLE t1;
+Table	Create Table
+t1	CREATE TABLE `t1` (
+  `c1` int(11) NOT NULL AUTO_INCREMENT,
+  PRIMARY KEY (`c1`)
+) ENGINE=ARCHIVE DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH (c1) PARTITIONS 2  */
 DROP TABLE t1;
 # Test with two threads
 # con default

=== modified file 'mysql-test/suite/parts/r/partition_auto_increment_blackhole.result'
--- a/mysql-test/suite/parts/r/partition_auto_increment_blackhole.result	2008-09-08 13:30:01 +0000
+++ b/mysql-test/suite/parts/r/partition_auto_increment_blackhole.result	2008-10-23 20:14:07 +0000
@@ -36,6 +36,12 @@ SET INSERT_ID = 30;
 INSERT INTO t1 VALUES (NULL);
 UPDATE t1 SET c1 = 50 WHERE c1 = 17;
 UPDATE t1 SET c1 = 51 WHERE c1 = 19;
+FLUSH TABLES;
+UPDATE t1 SET c1 = 40 WHERE c1 = 50;
+SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
+  AND TABLE_NAME='t1';
+AUTO_INCREMENT
+1
 UPDATE t1 SET c1 = NULL WHERE c1 = 4;
 # ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY
 INSERT INTO t1 VALUES (NULL);
@@ -96,6 +102,18 @@ t1	CREATE TABLE `t1` (
 ) ENGINE=BLACKHOLE DEFAULT CHARSET=latin1
 SELECT * FROM t1 ORDER BY c1;
 c1
+INSERT INTO t1 VALUES (100);
+INSERT INTO t1 VALUES (NULL);
+DELETE FROM t1 WHERE c1 >= 100;
+OPTIMIZE TABLE t1;
+Table	Op	Msg_type	Msg_text
+test.t1	optimize	note	The storage engine for the table doesn't support optimize
+SHOW CREATE TABLE t1;
+Table	Create Table
+t1	CREATE TABLE `t1` (
+  `c1` int(11) NOT NULL AUTO_INCREMENT,
+  PRIMARY KEY (`c1`)
+) ENGINE=BLACKHOLE DEFAULT CHARSET=latin1
 DROP TABLE t1;
 # Simple test with NULL
 CREATE TABLE t1 (
@@ -165,6 +183,12 @@ INSERT INTO t1 VALUES (NULL), (90);
 INSERT INTO t1 VALUES (NULL);
 UPDATE t1 SET c1 = 150 WHERE c1 = 17;
 UPDATE t1 SET c1 = 151 WHERE c1 = 19;
+FLUSH TABLES;
+UPDATE t1 SET c1 = 140 WHERE c1 = 150;
+SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
+  AND TABLE_NAME='t1';
+AUTO_INCREMENT
+1
 UPDATE t1 SET c1 = NULL WHERE c1 = 4;
 # ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY
 INSERT INTO t1 VALUES (NULL);
@@ -272,6 +296,18 @@ t1	CREATE TABLE `t1` (
 ) ENGINE=BLACKHOLE AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH (c1) PARTITIONS 2  */
 SELECT * FROM t1 ORDER BY c1;
 c1
+INSERT INTO t1 VALUES (100);
+INSERT INTO t1 VALUES (NULL);
+DELETE FROM t1 WHERE c1 >= 100;
+OPTIMIZE TABLE t1;
+Table	Op	Msg_type	Msg_text
+test.t1	optimize	note	The storage engine for the table doesn't support optimize
+SHOW CREATE TABLE t1;
+Table	Create Table
+t1	CREATE TABLE `t1` (
+  `c1` int(11) NOT NULL AUTO_INCREMENT,
+  PRIMARY KEY (`c1`)
+) ENGINE=BLACKHOLE DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH (c1) PARTITIONS 2  */
 DROP TABLE t1;
 # Test with two threads
 # con default

=== modified file 'mysql-test/suite/parts/r/partition_auto_increment_innodb.result'
--- a/mysql-test/suite/parts/r/partition_auto_increment_innodb.result	2008-09-08 13:30:01 +0000
+++ b/mysql-test/suite/parts/r/partition_auto_increment_innodb.result	2008-10-23 20:14:07 +0000
@@ -35,6 +35,12 @@ SET INSERT_ID = 30;
 INSERT INTO t1 VALUES (NULL);
 UPDATE t1 SET c1 = 50 WHERE c1 = 17;
 UPDATE t1 SET c1 = 51 WHERE c1 = 19;
+FLUSH TABLES;
+UPDATE t1 SET c1 = 40 WHERE c1 = 50;
+SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
+  AND TABLE_NAME='t1';
+AUTO_INCREMENT
+31
 UPDATE t1 SET c1 = NULL WHERE c1 = 4;
 INSERT INTO t1 VALUES (NULL);
 INSERT INTO t1 VALUES (NULL);
@@ -52,7 +58,7 @@ c1
 30
 31
 32
-50
+40
 51
 DROP TABLE t1;
 CREATE TABLE t1 (
@@ -110,6 +116,19 @@ t1	CREATE TABLE `t1` (
 SELECT * FROM t1 ORDER BY c1;
 c1
 1
+INSERT INTO t1 VALUES (100);
+INSERT INTO t1 VALUES (NULL);
+DELETE FROM t1 WHERE c1 >= 100;
+OPTIMIZE TABLE t1;
+Table	Op	Msg_type	Msg_text
+test.t1	optimize	note	Table does not support optimize, doing recreate + analyze instead
+test.t1	optimize	status	OK
+SHOW CREATE TABLE t1;
+Table	Create Table
+t1	CREATE TABLE `t1` (
+  `c1` int(11) NOT NULL AUTO_INCREMENT,
+  PRIMARY KEY (`c1`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
 DROP TABLE t1;
 # Simple test with NULL
 CREATE TABLE t1 (
@@ -187,6 +206,12 @@ INSERT INTO t1 VALUES (NULL), (90);
 INSERT INTO t1 VALUES (NULL);
 UPDATE t1 SET c1 = 150 WHERE c1 = 17;
 UPDATE t1 SET c1 = 151 WHERE c1 = 19;
+FLUSH TABLES;
+UPDATE t1 SET c1 = 140 WHERE c1 = 150;
+SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
+  AND TABLE_NAME='t1';
+AUTO_INCREMENT
+141
 UPDATE t1 SET c1 = NULL WHERE c1 = 4;
 INSERT INTO t1 VALUES (NULL);
 INSERT INTO t1 VALUES (NULL);
@@ -207,10 +232,10 @@ c1
 60
 90
 91
-150
+140
+141
+142
 151
-152
-153
 DROP TABLE t1;
 # Test with auto_increment_increment and auto_increment_offset.
 CREATE TABLE t1 (
@@ -353,6 +378,19 @@ t1	CREATE TABLE `t1` (
 SELECT * FROM t1 ORDER BY c1;
 c1
 1
+INSERT INTO t1 VALUES (100);
+INSERT INTO t1 VALUES (NULL);
+DELETE FROM t1 WHERE c1 >= 100;
+OPTIMIZE TABLE t1;
+Table	Op	Msg_type	Msg_text
+test.t1	optimize	note	Table does not support optimize, doing recreate + analyze instead
+test.t1	optimize	status	OK
+SHOW CREATE TABLE t1;
+Table	Create Table
+t1	CREATE TABLE `t1` (
+  `c1` int(11) NOT NULL AUTO_INCREMENT,
+  PRIMARY KEY (`c1`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH (c1) PARTITIONS 2  */
 DROP TABLE t1;
 # Test with two threads
 # con default

=== modified file 'mysql-test/suite/parts/r/partition_auto_increment_memory.result'
--- a/mysql-test/suite/parts/r/partition_auto_increment_memory.result	2008-09-08 13:30:01 +0000
+++ b/mysql-test/suite/parts/r/partition_auto_increment_memory.result	2008-10-23 20:14:07 +0000
@@ -35,6 +35,12 @@ SET INSERT_ID = 30;
 INSERT INTO t1 VALUES (NULL);
 UPDATE t1 SET c1 = 50 WHERE c1 = 17;
 UPDATE t1 SET c1 = 51 WHERE c1 = 19;
+FLUSH TABLES;
+UPDATE t1 SET c1 = 40 WHERE c1 = 50;
+SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
+  AND TABLE_NAME='t1';
+AUTO_INCREMENT
+52
 UPDATE t1 SET c1 = NULL WHERE c1 = 4;
 INSERT INTO t1 VALUES (NULL);
 INSERT INTO t1 VALUES (NULL);
@@ -50,7 +56,7 @@ c1
 22
 23
 30
-50
+40
 51
 52
 53
@@ -110,6 +116,18 @@ t1	CREATE TABLE `t1` (
 SELECT * FROM t1 ORDER BY c1;
 c1
 1
+INSERT INTO t1 VALUES (100);
+INSERT INTO t1 VALUES (NULL);
+DELETE FROM t1 WHERE c1 >= 100;
+OPTIMIZE TABLE t1;
+Table	Op	Msg_type	Msg_text
+test.t1	optimize	note	The storage engine for the table doesn't support optimize
+SHOW CREATE TABLE t1;
+Table	Create Table
+t1	CREATE TABLE `t1` (
+  `c1` int(11) NOT NULL AUTO_INCREMENT,
+  PRIMARY KEY (`c1`)
+) ENGINE=MEMORY AUTO_INCREMENT=102 DEFAULT CHARSET=latin1
 DROP TABLE t1;
 # Simple test with NULL
 CREATE TABLE t1 (
@@ -187,6 +205,12 @@ INSERT INTO t1 VALUES (NULL), (90);
 INSERT INTO t1 VALUES (NULL);
 UPDATE t1 SET c1 = 150 WHERE c1 = 17;
 UPDATE t1 SET c1 = 151 WHERE c1 = 19;
+FLUSH TABLES;
+UPDATE t1 SET c1 = 140 WHERE c1 = 150;
+SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
+  AND TABLE_NAME='t1';
+AUTO_INCREMENT
+152
 UPDATE t1 SET c1 = NULL WHERE c1 = 4;
 INSERT INTO t1 VALUES (NULL);
 INSERT INTO t1 VALUES (NULL);
@@ -207,7 +231,7 @@ c1
 60
 90
 91
-150
+140
 151
 152
 153
@@ -353,6 +377,18 @@ t1	CREATE TABLE `t1` (
 SELECT * FROM t1 ORDER BY c1;
 c1
 27
+INSERT INTO t1 VALUES (100);
+INSERT INTO t1 VALUES (NULL);
+DELETE FROM t1 WHERE c1 >= 100;
+OPTIMIZE TABLE t1;
+Table	Op	Msg_type	Msg_text
+test.t1	optimize	note	The storage engine for the table doesn't support optimize
+SHOW CREATE TABLE t1;
+Table	Create Table
+t1	CREATE TABLE `t1` (
+  `c1` int(11) NOT NULL AUTO_INCREMENT,
+  PRIMARY KEY (`c1`)
+) ENGINE=MEMORY AUTO_INCREMENT=102 DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH (c1) PARTITIONS 2  */
 DROP TABLE t1;
 # Test with two threads
 # con default

=== modified file 'mysql-test/suite/parts/r/partition_auto_increment_myisam.result'
--- a/mysql-test/suite/parts/r/partition_auto_increment_myisam.result	2008-09-08 13:30:01 +0000
+++ b/mysql-test/suite/parts/r/partition_auto_increment_myisam.result	2008-10-23 20:14:07 +0000
@@ -35,6 +35,12 @@ SET INSERT_ID = 30;
 INSERT INTO t1 VALUES (NULL);
 UPDATE t1 SET c1 = 50 WHERE c1 = 17;
 UPDATE t1 SET c1 = 51 WHERE c1 = 19;
+FLUSH TABLES;
+UPDATE t1 SET c1 = 40 WHERE c1 = 50;
+SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
+  AND TABLE_NAME='t1';
+AUTO_INCREMENT
+52
 UPDATE t1 SET c1 = NULL WHERE c1 = 4;
 INSERT INTO t1 VALUES (NULL);
 INSERT INTO t1 VALUES (NULL);
@@ -50,7 +56,7 @@ c1
 22
 23
 30
-50
+40
 51
 52
 53
@@ -110,6 +116,18 @@ t1	CREATE TABLE `t1` (
 SELECT * FROM t1 ORDER BY c1;
 c1
 1
+INSERT INTO t1 VALUES (100);
+INSERT INTO t1 VALUES (NULL);
+DELETE FROM t1 WHERE c1 >= 100;
+OPTIMIZE TABLE t1;
+Table	Op	Msg_type	Msg_text
+test.t1	optimize	status	OK
+SHOW CREATE TABLE t1;
+Table	Create Table
+t1	CREATE TABLE `t1` (
+  `c1` int(11) NOT NULL AUTO_INCREMENT,
+  PRIMARY KEY (`c1`)
+) ENGINE=MyISAM AUTO_INCREMENT=102 DEFAULT CHARSET=latin1
 DROP TABLE t1;
 # Simple test with NULL
 CREATE TABLE t1 (
@@ -187,6 +205,12 @@ INSERT INTO t1 VALUES (NULL), (90);
 INSERT INTO t1 VALUES (NULL);
 UPDATE t1 SET c1 = 150 WHERE c1 = 17;
 UPDATE t1 SET c1 = 151 WHERE c1 = 19;
+FLUSH TABLES;
+UPDATE t1 SET c1 = 140 WHERE c1 = 150;
+SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
+  AND TABLE_NAME='t1';
+AUTO_INCREMENT
+152
 UPDATE t1 SET c1 = NULL WHERE c1 = 4;
 INSERT INTO t1 VALUES (NULL);
 INSERT INTO t1 VALUES (NULL);
@@ -207,7 +231,7 @@ c1
 60
 90
 91
-150
+140
 151
 152
 153
@@ -353,6 +377,18 @@ t1	CREATE TABLE `t1` (
 SELECT * FROM t1 ORDER BY c1;
 c1
 27
+INSERT INTO t1 VALUES (100);
+INSERT INTO t1 VALUES (NULL);
+DELETE FROM t1 WHERE c1 >= 100;
+OPTIMIZE TABLE t1;
+Table	Op	Msg_type	Msg_text
+test.t1	optimize	status	OK
+SHOW CREATE TABLE t1;
+Table	Create Table
+t1	CREATE TABLE `t1` (
+  `c1` int(11) NOT NULL AUTO_INCREMENT,
+  PRIMARY KEY (`c1`)
+) ENGINE=MyISAM AUTO_INCREMENT=102 DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH (c1) PARTITIONS 2  */
 DROP TABLE t1;
 # Test with two threads
 # con default

=== modified file 'mysql-test/suite/parts/r/partition_auto_increment_ndb.result'
--- a/mysql-test/suite/parts/r/partition_auto_increment_ndb.result	2008-09-08 13:30:01 +0000
+++ b/mysql-test/suite/parts/r/partition_auto_increment_ndb.result	2008-10-23 20:14:07 +0000
@@ -36,6 +36,12 @@ SET INSERT_ID = 30;
 INSERT INTO t1 VALUES (NULL);
 UPDATE t1 SET c1 = 50 WHERE c1 = 17;
 UPDATE t1 SET c1 = 51 WHERE c1 = 19;
+FLUSH TABLES;
+UPDATE t1 SET c1 = 40 WHERE c1 = 50;
+SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
+  AND TABLE_NAME='t1';
+AUTO_INCREMENT
+52
 UPDATE t1 SET c1 = NULL WHERE c1 = 4;
 INSERT INTO t1 VALUES (NULL);
 INSERT INTO t1 VALUES (NULL);
@@ -51,7 +57,7 @@ c1
 22
 23
 30
-50
+40
 51
 52
 53
@@ -111,6 +117,18 @@ t1	CREATE TABLE `t1` (
 SELECT * FROM t1 ORDER BY c1;
 c1
 1
+INSERT INTO t1 VALUES (100);
+INSERT INTO t1 VALUES (NULL);
+DELETE FROM t1 WHERE c1 >= 100;
+OPTIMIZE TABLE t1;
+Table	Op	Msg_type	Msg_text
+test.t1	optimize	note	The storage engine for the table doesn't support optimize
+SHOW CREATE TABLE t1;
+Table	Create Table
+t1	CREATE TABLE `t1` (
+  `c1` int(11) NOT NULL AUTO_INCREMENT,
+  PRIMARY KEY (`c1`)
+) ENGINE=ndbcluster DEFAULT CHARSET=latin1
 DROP TABLE t1;
 # Simple test with NULL
 CREATE TABLE t1 (
@@ -188,6 +206,12 @@ INSERT INTO t1 VALUES (NULL), (90);
 INSERT INTO t1 VALUES (NULL);
 UPDATE t1 SET c1 = 150 WHERE c1 = 17;
 UPDATE t1 SET c1 = 151 WHERE c1 = 19;
+FLUSH TABLES;
+UPDATE t1 SET c1 = 140 WHERE c1 = 150;
+SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
+  AND TABLE_NAME='t1';
+AUTO_INCREMENT
+152
 UPDATE t1 SET c1 = NULL WHERE c1 = 4;
 INSERT INTO t1 VALUES (NULL);
 INSERT INTO t1 VALUES (NULL);
@@ -208,7 +232,7 @@ c1
 60
 90
 91
-150
+140
 151
 152
 153
@@ -354,6 +378,18 @@ t1	CREATE TABLE `t1` (
 SELECT * FROM t1 ORDER BY c1;
 c1
 1
+INSERT INTO t1 VALUES (100);
+INSERT INTO t1 VALUES (NULL);
+DELETE FROM t1 WHERE c1 >= 100;
+OPTIMIZE TABLE t1;
+Table	Op	Msg_type	Msg_text
+test.t1	optimize	note	The storage engine for the table doesn't support optimize
+SHOW CREATE TABLE t1;
+Table	Create Table
+t1	CREATE TABLE `t1` (
+  `c1` int(11) NOT NULL AUTO_INCREMENT,
+  PRIMARY KEY (`c1`)
+) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH (c1) PARTITIONS 2  */
 DROP TABLE t1;
 # Test with two threads
 # con default

=== modified file 'sql/ha_partition.cc'
--- a/sql/ha_partition.cc	2008-10-06 13:14:20 +0000
+++ b/sql/ha_partition.cc	2008-10-23 20:14:07 +0000
@@ -2996,17 +2996,6 @@ int ha_partition::update_row(const uchar
     DBUG_PRINT("info", ("Update in partition %d", new_part_id));
     tmp_disable_binlog(thd); /* Do not replicate the low-level changes. */
     error= m_file[new_part_id]->ha_update_row(old_data, new_data);
-    /*
-      if updating an auto_increment column, update
-      table_share->ha_data->next_auto_inc_val if needed.
-      (not to be used if auto_increment on secondary field in a multi-
-      column index)
-      mysql_update does not set table->next_number_field, so we use
-      table->found_next_number_field instead.
-    */
-    if (table->found_next_number_field && new_data == table->record[0] &&
-        !table->s->next_number_keypart)
-      set_auto_increment_if_higher(table->found_next_number_field->val_int());
     reenable_binlog(thd);
     goto exit;
   }
@@ -3016,9 +3005,6 @@ int ha_partition::update_row(const uchar
 			old_part_id, new_part_id));
     tmp_disable_binlog(thd); /* Do not replicate the low-level changes. */
     error= m_file[new_part_id]->ha_write_row(new_data);
-    if (table->found_next_number_field && new_data == table->record[0] &&
-        !table->s->next_number_keypart)
-      set_auto_increment_if_higher(table->found_next_number_field->val_int());
     reenable_binlog(thd);
     if (error)
       goto exit;
@@ -3036,6 +3022,22 @@ int ha_partition::update_row(const uchar
   }
 
 exit:
+  /*
+    if updating an auto_increment column, update
+    table_share->ha_data->next_auto_inc_val if needed.
+    (not to be used if auto_increment on secondary field in a multi-column
+    index)
+    mysql_update does not set table->next_number_field, so we use
+    table->found_next_number_field instead.
+  */
+  if (table->found_next_number_field && new_data == table->record[0] &&
+      !table->s->next_number_keypart)
+  {
+    HA_DATA_PARTITION *ha_data= (HA_DATA_PARTITION*) table_share->ha_data;
+    if (!ha_data->auto_inc_initialized)
+      info(HA_STATUS_AUTO);
+    set_auto_increment_if_higher(table->found_next_number_field->val_int());
+  }
   table->timestamp_field_type= orig_timestamp_type;
   DBUG_RETURN(error);
 }

=== modified file 'sql/ha_partition.h'
--- a/sql/ha_partition.h	2008-10-01 10:14:55 +0000
+++ b/sql/ha_partition.h	2008-10-23 20:14:07 +0000
@@ -878,10 +878,10 @@ private:
   {
     HA_DATA_PARTITION *ha_data= (HA_DATA_PARTITION*) table_share->ha_data;
     lock_auto_increment();
+    DBUG_ASSERT(ha_data->auto_inc_initialized == TRUE);
     /* must check when the mutex is taken */
     if (nr >= ha_data->next_auto_inc_val)
       ha_data->next_auto_inc_val= nr + 1;
-    ha_data->auto_inc_initialized= TRUE;
     unlock_auto_increment();
   }
 

Thread
bzr commit into mysql-5.1 branch (mattias.jonsson:2676) Bug#40176Mattias Jonsson23 Oct