diff --git a/mysql-test/r/partition_error.result b/mysql-test/r/partition_error.result index b692203823d..6ebf033adb7 100644 --- a/mysql-test/r/partition_error.result +++ b/mysql-test/r/partition_error.result @@ -1,4 +1,46 @@ drop table if exists t1; +# +# Bug#50392: insert_id is not reset for partitioned tables +# auto_increment on duplicate entry +CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY); +SET INSERT_ID= 13; +INSERT INTO t1 VALUES (NULL); +SET INSERT_ID= 12; +INSERT INTO t1 VALUES (NULL), (NULL), (NULL); +ERROR 23000: Duplicate entry '13' for key 'PRIMARY' +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`a`) +) ENGINE=MyISAM AUTO_INCREMENT=14 DEFAULT CHARSET=latin1 +INSERT INTO t1 VALUES (NULL); +SELECT * FROM t1; +a +12 +13 +14 +DROP TABLE t1; +CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY) PARTITION BY KEY(a); +SET INSERT_ID= 13; +INSERT INTO t1 VALUES (NULL); +SET INSERT_ID= 12; +INSERT INTO t1 VALUES (NULL), (NULL), (NULL); +ERROR 23000: Duplicate entry '13' for key 'PRIMARY' +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`a`) +) ENGINE=MyISAM AUTO_INCREMENT=14 DEFAULT CHARSET=latin1 +/*!50100 PARTITION BY KEY (a) */ +INSERT INTO t1 VALUES (NULL); +SELECT * FROM t1; +a +12 +13 +14 +DROP TABLE t1; CREATE TABLE t1 (a INTEGER NOT NULL, PRIMARY KEY (a)); INSERT INTO t1 VALUES (1),(1); ERROR 23000: Duplicate entry '1' for key 'PRIMARY' diff --git a/mysql-test/suite/parts/inc/partition_auto_increment.inc b/mysql-test/suite/parts/inc/partition_auto_increment.inc index 2c615e58ef9..102e57d3d04 100644 --- a/mysql-test/suite/parts/inc/partition_auto_increment.inc +++ b/mysql-test/suite/parts/inc/partition_auto_increment.inc @@ -42,6 +42,15 @@ if ($mysql_errno) INSERT INTO t1 VALUES (NULL); SET INSERT_ID = 30; INSERT INTO t1 VALUES (NULL); +SET INSERT_ID = 29; +-- error 0, ER_DUP_ENTRY, ER_DUP_KEY +INSERT INTO t1 VALUES (NULL), (NULL), (NULL); +if (!$mysql_errno) +{ + echo # ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY; + echo # mysql_errno: $mysql_errno; +} +INSERT INTO t1 VALUES (NULL); if (!$skip_update) { # InnoDB Does not handle this correctly, see bug#14793, bug#21641 @@ -601,6 +610,15 @@ SET INSERT_ID = 23; SHOW CREATE TABLE t1; INSERT INTO t1 (c1) VALUES (NULL); SHOW CREATE TABLE t1; +SET INSERT_ID = 22; +-- error 0, ER_DUP_ENTRY, ER_DUP_KEY +INSERT INTO t1 VALUES (NULL), (NULL), (NULL); +if (!$mysql_errno) +{ + echo # ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY; + echo # mysql_errno: $mysql_errno; +} +INSERT INTO t1 VALUES (NULL); SELECT * FROM t1 ORDER BY c1; DROP TABLE t1; diff --git a/mysql-test/suite/parts/r/partition_auto_increment_archive.result b/mysql-test/suite/parts/r/partition_auto_increment_archive.result index beda861425c..f62e4aa005a 100644 --- a/mysql-test/suite/parts/r/partition_auto_increment_archive.result +++ b/mysql-test/suite/parts/r/partition_auto_increment_archive.result @@ -34,6 +34,9 @@ INSERT INTO t1 VALUES (NULL), (10), (NULL); INSERT INTO t1 VALUES (NULL); SET INSERT_ID = 30; INSERT INTO t1 VALUES (NULL); +SET INSERT_ID = 29; +INSERT INTO t1 VALUES (NULL), (NULL), (NULL); +INSERT INTO t1 VALUES (NULL); SELECT * FROM t1 ORDER BY c1; c1 2 @@ -46,6 +49,7 @@ c1 21 22 30 +31 DROP TABLE t1; CREATE TABLE t1 ( c1 INT NOT NULL AUTO_INCREMENT, @@ -751,10 +755,15 @@ t1 CREATE TABLE `t1` ( ) ENGINE=ARCHIVE AUTO_INCREMENT=24 DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH (c1) PARTITIONS 2 */ +SET INSERT_ID = 22; +INSERT INTO t1 VALUES (NULL), (NULL), (NULL); +INSERT INTO t1 VALUES (NULL); SELECT * FROM t1 ORDER BY c1; c1 1 +22 23 +24 DROP TABLE t1; # Testing with FLUSH TABLE CREATE TABLE t1 ( diff --git a/mysql-test/suite/parts/r/partition_auto_increment_blackhole.result b/mysql-test/suite/parts/r/partition_auto_increment_blackhole.result index 7ef5ff88499..d6ea8ba0fe4 100644 --- a/mysql-test/suite/parts/r/partition_auto_increment_blackhole.result +++ b/mysql-test/suite/parts/r/partition_auto_increment_blackhole.result @@ -35,6 +35,11 @@ INSERT INTO t1 VALUES (NULL), (10), (NULL); INSERT INTO t1 VALUES (NULL); SET INSERT_ID = 30; INSERT INTO t1 VALUES (NULL); +SET INSERT_ID = 29; +INSERT INTO t1 VALUES (NULL), (NULL), (NULL); +# ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY +# mysql_errno: 0 +INSERT INTO t1 VALUES (NULL); UPDATE t1 SET c1 = 50 WHERE c1 = 17; UPDATE t1 SET c1 = 51 WHERE c1 = 19; FLUSH TABLES; @@ -597,6 +602,11 @@ t1 CREATE TABLE `t1` ( ) ENGINE=BLACKHOLE AUTO_INCREMENT=24 DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH (c1) PARTITIONS 2 */ +SET INSERT_ID = 22; +INSERT INTO t1 VALUES (NULL), (NULL), (NULL); +# ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY +# mysql_errno: 0 +INSERT INTO t1 VALUES (NULL); SELECT * FROM t1 ORDER BY c1; c1 DROP TABLE t1; diff --git a/mysql-test/suite/parts/r/partition_auto_increment_innodb.result b/mysql-test/suite/parts/r/partition_auto_increment_innodb.result index 6295d14d98f..4cd7aa57417 100644 --- a/mysql-test/suite/parts/r/partition_auto_increment_innodb.result +++ b/mysql-test/suite/parts/r/partition_auto_increment_innodb.result @@ -33,6 +33,9 @@ INSERT INTO t1 VALUES (NULL), (10), (NULL); INSERT INTO t1 VALUES (NULL); SET INSERT_ID = 30; INSERT INTO t1 VALUES (NULL); +SET INSERT_ID = 29; +INSERT INTO t1 VALUES (NULL), (NULL), (NULL); +INSERT INTO t1 VALUES (NULL); UPDATE t1 SET c1 = 50 WHERE c1 = 17; UPDATE t1 SET c1 = 51 WHERE c1 = 19; FLUSH TABLES; @@ -40,7 +43,7 @@ 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 +32 UPDATE t1 SET c1 = NULL WHERE c1 = 4; Warnings: Warning 1048 Column 'c1' cannot be null @@ -60,6 +63,7 @@ c1 30 31 32 +33 40 51 DROP TABLE t1; @@ -771,10 +775,14 @@ t1 CREATE TABLE `t1` ( ) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH (c1) PARTITIONS 2 */ +SET INSERT_ID = 22; +INSERT INTO t1 VALUES (NULL), (NULL), (NULL); +INSERT INTO t1 VALUES (NULL); SELECT * FROM t1 ORDER BY c1; c1 1 23 +24 DROP TABLE t1; # Testing with FLUSH TABLE CREATE TABLE t1 ( diff --git a/mysql-test/suite/parts/r/partition_auto_increment_memory.result b/mysql-test/suite/parts/r/partition_auto_increment_memory.result index 6e3b990dc0f..1a27d1c2e52 100644 --- a/mysql-test/suite/parts/r/partition_auto_increment_memory.result +++ b/mysql-test/suite/parts/r/partition_auto_increment_memory.result @@ -33,6 +33,9 @@ INSERT INTO t1 VALUES (NULL), (10), (NULL); INSERT INTO t1 VALUES (NULL); SET INSERT_ID = 30; INSERT INTO t1 VALUES (NULL); +SET INSERT_ID = 29; +INSERT INTO t1 VALUES (NULL), (NULL), (NULL); +INSERT INTO t1 VALUES (NULL); UPDATE t1 SET c1 = 50 WHERE c1 = 17; UPDATE t1 SET c1 = 51 WHERE c1 = 19; FLUSH TABLES; @@ -57,7 +60,9 @@ c1 21 22 23 +29 30 +31 40 51 52 @@ -797,10 +802,15 @@ t1 CREATE TABLE `t1` ( ) ENGINE=MEMORY AUTO_INCREMENT=24 DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH (c1) PARTITIONS 2 */ +SET INSERT_ID = 22; +INSERT INTO t1 VALUES (NULL), (NULL), (NULL); +INSERT INTO t1 VALUES (NULL); SELECT * FROM t1 ORDER BY c1; c1 1 +22 23 +24 DROP TABLE t1; # Testing with FLUSH TABLE CREATE TABLE t1 ( diff --git a/mysql-test/suite/parts/r/partition_auto_increment_myisam.result b/mysql-test/suite/parts/r/partition_auto_increment_myisam.result index 047b974f0a3..9885c78a921 100644 --- a/mysql-test/suite/parts/r/partition_auto_increment_myisam.result +++ b/mysql-test/suite/parts/r/partition_auto_increment_myisam.result @@ -33,6 +33,9 @@ INSERT INTO t1 VALUES (NULL), (10), (NULL); INSERT INTO t1 VALUES (NULL); SET INSERT_ID = 30; INSERT INTO t1 VALUES (NULL); +SET INSERT_ID = 29; +INSERT INTO t1 VALUES (NULL), (NULL), (NULL); +INSERT INTO t1 VALUES (NULL); UPDATE t1 SET c1 = 50 WHERE c1 = 17; UPDATE t1 SET c1 = 51 WHERE c1 = 19; FLUSH TABLES; @@ -57,7 +60,9 @@ c1 21 22 23 +29 30 +31 40 51 52 @@ -816,10 +821,15 @@ t1 CREATE TABLE `t1` ( ) ENGINE=MyISAM AUTO_INCREMENT=24 DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH (c1) PARTITIONS 2 */ +SET INSERT_ID = 22; +INSERT INTO t1 VALUES (NULL), (NULL), (NULL); +INSERT INTO t1 VALUES (NULL); SELECT * FROM t1 ORDER BY c1; c1 1 +22 23 +24 DROP TABLE t1; # Testing with FLUSH TABLE CREATE TABLE t1 ( diff --git a/mysql-test/suite/parts/r/partition_auto_increment_ndb.result b/mysql-test/suite/parts/r/partition_auto_increment_ndb.result index 317669be7ad..40387b9777a 100644 --- a/mysql-test/suite/parts/r/partition_auto_increment_ndb.result +++ b/mysql-test/suite/parts/r/partition_auto_increment_ndb.result @@ -34,6 +34,9 @@ INSERT INTO t1 VALUES (NULL), (10), (NULL); INSERT INTO t1 VALUES (NULL); SET INSERT_ID = 30; INSERT INTO t1 VALUES (NULL); +SET INSERT_ID = 29; +INSERT INTO t1 VALUES (NULL), (NULL), (NULL); +INSERT INTO t1 VALUES (NULL); UPDATE t1 SET c1 = 50 WHERE c1 = 17; UPDATE t1 SET c1 = 51 WHERE c1 = 19; FLUSH TABLES; @@ -58,6 +61,7 @@ c1 21 22 23 +24 30 40 51 @@ -792,9 +796,13 @@ t1 CREATE TABLE `t1` ( ) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH (c1) PARTITIONS 2 */ +SET INSERT_ID = 22; +INSERT INTO t1 VALUES (NULL), (NULL), (NULL); +INSERT INTO t1 VALUES (NULL); SELECT * FROM t1 ORDER BY c1; c1 1 +2 23 DROP TABLE t1; # Testing with FLUSH TABLE diff --git a/mysql-test/t/partition_error.test b/mysql-test/t/partition_error.test index 1f011f36257..8da8f54b774 100644 --- a/mysql-test/t/partition_error.test +++ b/mysql-test/t/partition_error.test @@ -8,6 +8,30 @@ drop table if exists t1; --enable_warnings +--echo # +--echo # Bug#50392: insert_id is not reset for partitioned tables +--echo # auto_increment on duplicate entry +CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY); +SET INSERT_ID= 13; +INSERT INTO t1 VALUES (NULL); +SET INSERT_ID= 12; +--error ER_DUP_ENTRY +INSERT INTO t1 VALUES (NULL), (NULL), (NULL); +SHOW CREATE TABLE t1; +INSERT INTO t1 VALUES (NULL); +SELECT * FROM t1; +DROP TABLE t1; +CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY) PARTITION BY KEY(a); +SET INSERT_ID= 13; +INSERT INTO t1 VALUES (NULL); +SET INSERT_ID= 12; +--error ER_DUP_ENTRY +INSERT INTO t1 VALUES (NULL), (NULL), (NULL); +SHOW CREATE TABLE t1; +INSERT INTO t1 VALUES (NULL); +SELECT * FROM t1; +DROP TABLE t1; + # # Bug#38719: Partitioning returns a different error code for a # duplicate key error diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index e7f74ffa37f..4523d620821 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -6455,9 +6455,22 @@ void ha_partition::release_auto_increment() ulonglong next_auto_inc_val; lock_auto_increment(); next_auto_inc_val= ha_data->next_auto_inc_val; + /* + If the current auto_increment values is lower than the reserved + value, and the reserved value was reserved by this thread, + we can lower the reserved value. + */ if (next_insert_id < next_auto_inc_val && auto_inc_interval_for_cur_row.maximum() >= next_auto_inc_val) - ha_data->next_auto_inc_val= next_insert_id; + { + THD *thd= ha_thd(); + /* + Check that we do not lower the value because of a failed insert + with SET INSERT_ID, i.e. forced/non generated values. + */ + if (thd->auto_inc_intervals_forced.maximum() < next_insert_id) + ha_data->next_auto_inc_val= next_insert_id; + } DBUG_PRINT("info", ("ha_data->next_auto_inc_val: %lu", (ulong) ha_data->next_auto_inc_val));