From: V Narayanan Date: August 16 2009 10:06am Subject: bzr commit into mysql-5.1-bugteam branch (v.narayanan:3070) Bug#45823 List-Archive: http://lists.mysql.com/commits/80858 X-Bug: 45823 Message-Id: <0KOG00AHLS2TPT20@mail-apac.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_pcNCEQSfBnFSTyXQ8t1scA)" --Boundary_(ID_pcNCEQSfBnFSTyXQ8t1scA) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///home/narayanan/Work/mysql_checkouts/shared_repository_directory/mysql-5.1-bugteam-45823-02/ based on revid:ramil@stripped 3070 V Narayanan 2009-08-16 Bug#45823 Assertion failure in file row/row0mysql.c line 1386 Inserting a negative value in the autoincrement column of a partitioned innodb table was causing the value of the auto increment column to wrap around into a very large positive value. This was causing unexpected behaviour. The current patch ensures that before calculating the next auto increment value, the current value is within the positive maximum allowed limit. @ mysql-test/r/partition.result Bug#45823 Assertion failure in file row/row0mysql.c line 1386 Contains result files for the test case. @ mysql-test/t/partition.test Bug#45823 Assertion failure in file row/row0mysql.c line 1386 Add tests for inserting negative auto increment values into the partition table. @ sql/field.h Bug#45823 Assertion failure in file row/row0mysql.c line 1386 Adds a function that returns the upper limits of the mysql integral and floating point types. @ sql/ha_partition.cc Bug#45823 Assertion failure in file row/row0mysql.c line 1386 Ensure that the current value is lesser than the upper limit for the type of the field before setting the next auto increment value to be calculated. modified: mysql-test/r/partition.result mysql-test/t/partition.test sql/field.h sql/ha_partition.cc === modified file 'mysql-test/r/partition.result' --- a/mysql-test/r/partition.result 2009-08-12 10:03:05 +0000 +++ b/mysql-test/r/partition.result 2009-08-16 10:06:08 +0000 @@ -2041,4 +2041,132 @@ SELECT 1 FROM t1 JOIN t1 AS t2 USING (a 1 1 DROP TABLE t1; +############################################################################# +# Bug #45823 - Assertion failure in file row/row0mysql.c line 1386 +# Bug #43988 - AUTO_INCREMENT errors with partitioned InnoDB tables in 5.1.31 +############################################################################## +# Inserting negative autoincrement values into a partition table (partitions >= 4) +CREATE TABLE t (c1 INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(c1), +c2 INT) PARTITION BY HASH(c1) PARTITIONS 4; +INSERT INTO t(c2) VALUES (10); +INSERT INTO t(c2) VALUES (20); +INSERT INTO t VALUES (-1,-10); +INSERT INTO t(c2) VALUES (30); +INSERT INTO t(c2) VALUES (40); +SELECT * FROM t; +c1 c2 +4 40 +1 10 +-1 -10 +2 20 +3 30 +DROP TABLE t; +# Reading from a partition table (partitions >= 2 ) after inserting a negative +# value into the auto increment column +CREATE TABLE t (c1 INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(c1), +c2 INT) PARTITION BY HASH(c1) PARTITIONS 2; +INSERT INTO t VALUES (-2,-20); +INSERT INTO t(c2) VALUES (30); +SELECT * FROM t; +c1 c2 +-2 -20 +1 30 +DROP TABLE t; +# Inserting negative auto increment value into a partition table (partitions >= 2) +# auto increment value > 2. +CREATE TABLE t (c1 INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(c1), +c2 INT) PARTITION BY HASH(c1) PARTITIONS 2; +INSERT INTO t VALUES (-4,-20); +INSERT INTO t(c2) VALUES (30); +INSERT INTO t(c2) VALUES (40); +SELECT * FROM t; +c1 c2 +-4 -20 +2 40 +1 30 +DROP TABLE t; +# Inserting -1 into autoincrement column of a partition table (partition >= 4) +CREATE TABLE t (c1 INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(c1), +c2 INT) PARTITION BY HASH(c1) PARTITIONS 4; +INSERT INTO t(c2) VALUES (10); +INSERT INTO t(c2) VALUES (20); +INSERT INTO t VALUES (-1,-10); +SELECT * FROM t; +c1 c2 +1 10 +-1 -10 +2 20 +INSERT INTO t(c2) VALUES (30); +SELECT * FROM t; +c1 c2 +1 10 +-1 -10 +2 20 +3 30 +DROP TABLE t; +# Deleting from an auto increment table after inserting negative values +CREATE TABLE t (c1 INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(c1), +c2 INT) PARTITION BY HASH(c1) PARTITIONS 4; +INSERT INTO t(c2) VALUES (10); +INSERT INTO t(c2) VALUES (20); +INSERT INTO t VALUES (-1,-10); +INSERT INTO t(c2) VALUES (30); +INSERT INTO t VALUES (-3,-20); +INSERT INTO t(c2) VALUES (40); +SELECT * FROM t; +c1 c2 +4 40 +1 10 +-1 -10 +2 20 +3 30 +-3 -20 +DELETE FROM t WHERE c1 > 1; +SELECT * FROM t; +c1 c2 +1 10 +-1 -10 +-3 -20 +DROP TABLE t; +# Inserting a positive value that exceeds maximum allowed value for an +# Auto Increment column (positive maximum) +CREATE TABLE t (c1 TINYINT NOT NULL AUTO_INCREMENT, PRIMARY KEY(c1), +c2 INT) PARTITION BY HASH(c1) PARTITIONS 4; +INSERT INTO t(c2) VALUES (10); +INSERT INTO t(c2) VALUES (20); +INSERT INTO t VALUES (126,30); +INSERT INTO t VALUES (127,40); +# disable warnings that indicate that value greater than limit is being inserted +INSERT INTO t VALUES (128,50); +ERROR 23000: Duplicate entry '127' for key 'PRIMARY' +INSERT INTO t VALUES (129,60); +ERROR 23000: Duplicate entry '127' for key 'PRIMARY' +SELECT * FROM t; +c1 c2 +1 10 +2 20 +126 30 +127 40 +DROP TABLE t; +# Inserting a negative value that goes below minimum allowed value for an +# Auto Increment column (negative minimum) +CREATE TABLE t (c1 TINYINT NOT NULL AUTO_INCREMENT, PRIMARY KEY(c1), +c2 INT) PARTITION BY HASH(c1) PARTITIONS 4; +INSERT INTO t(c2) VALUES (10); +INSERT INTO t(c2) VALUES (20); +INSERT INTO t VALUES (-127,30); +INSERT INTO t VALUES (-128,40); +# disable warnings that indicate that value greater than limit is being inserted +INSERT INTO t VALUES (-129,50); +ERROR 23000: Duplicate entry '-128' for key 'PRIMARY' +INSERT INTO t VALUES (-130,60); +ERROR 23000: Duplicate entry '-128' for key 'PRIMARY' +SELECT * FROM t; +c1 c2 +-128 40 +1 10 +2 20 +-127 30 +DROP TABLE t; +############################################################################## End of 5.1 tests === modified file 'mysql-test/t/partition.test' --- a/mysql-test/t/partition.test 2009-08-12 10:03:05 +0000 +++ b/mysql-test/t/partition.test 2009-08-16 10:06:08 +0000 @@ -2023,4 +2023,138 @@ INSERT INTO t1 VALUES (6,8,10); SELECT 1 FROM t1 JOIN t1 AS t2 USING (a) FOR UPDATE; DROP TABLE t1; + +--echo ############################################################################# +--echo # Bug #45823 - Assertion failure in file row/row0mysql.c line 1386 +--echo # Bug #43988 - AUTO_INCREMENT errors with partitioned InnoDB tables in 5.1.31 +--echo ############################################################################## + +--echo # Inserting negative autoincrement values into a partition table (partitions >= 4) + +CREATE TABLE t (c1 INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(c1), + c2 INT) PARTITION BY HASH(c1) PARTITIONS 4; + +INSERT INTO t(c2) VALUES (10); +INSERT INTO t(c2) VALUES (20); +INSERT INTO t VALUES (-1,-10); +INSERT INTO t(c2) VALUES (30); +INSERT INTO t(c2) VALUES (40); + +SELECT * FROM t; + +DROP TABLE t; + +--echo # Reading from a partition table (partitions >= 2 ) after inserting a negative +--echo # value into the auto increment column + + +CREATE TABLE t (c1 INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(c1), + c2 INT) PARTITION BY HASH(c1) PARTITIONS 2; + +INSERT INTO t VALUES (-2,-20); +INSERT INTO t(c2) VALUES (30); + +SELECT * FROM t; + +DROP TABLE t; + +--echo # Inserting negative auto increment value into a partition table (partitions >= 2) +--echo # auto increment value > 2. + +CREATE TABLE t (c1 INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(c1), + c2 INT) PARTITION BY HASH(c1) PARTITIONS 2; + +INSERT INTO t VALUES (-4,-20); +INSERT INTO t(c2) VALUES (30); +INSERT INTO t(c2) VALUES (40); + +SELECT * FROM t; + +DROP TABLE t; + +--echo # Inserting -1 into autoincrement column of a partition table (partition >= 4) + +CREATE TABLE t (c1 INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(c1), + c2 INT) PARTITION BY HASH(c1) PARTITIONS 4; + +INSERT INTO t(c2) VALUES (10); +INSERT INTO t(c2) VALUES (20); +INSERT INTO t VALUES (-1,-10); + +SELECT * FROM t; + +INSERT INTO t(c2) VALUES (30); + +SELECT * FROM t; + +DROP TABLE t; + +--echo # Deleting from an auto increment table after inserting negative values + +CREATE TABLE t (c1 INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(c1), + c2 INT) PARTITION BY HASH(c1) PARTITIONS 4; + +INSERT INTO t(c2) VALUES (10); +INSERT INTO t(c2) VALUES (20); +INSERT INTO t VALUES (-1,-10); +INSERT INTO t(c2) VALUES (30); +INSERT INTO t VALUES (-3,-20); +INSERT INTO t(c2) VALUES (40); + +SELECT * FROM t; + +DELETE FROM t WHERE c1 > 1; + +SELECT * FROM t; + +DROP TABLE t; + +--echo # Inserting a positive value that exceeds maximum allowed value for an +--echo # Auto Increment column (positive maximum) + +CREATE TABLE t (c1 TINYINT NOT NULL AUTO_INCREMENT, PRIMARY KEY(c1), + c2 INT) PARTITION BY HASH(c1) PARTITIONS 4; + +INSERT INTO t(c2) VALUES (10); +INSERT INTO t(c2) VALUES (20); +INSERT INTO t VALUES (126,30); +INSERT INTO t VALUES (127,40); + +--echo # disable warnings that indicate that value greater than limit is being inserted +--disable_warnings +--error 1062 +INSERT INTO t VALUES (128,50); +--error 1062 +INSERT INTO t VALUES (129,60); +--enable_warnings + +SELECT * FROM t; + +DROP TABLE t; + +--echo # Inserting a negative value that goes below minimum allowed value for an +--echo # Auto Increment column (negative minimum) + +CREATE TABLE t (c1 TINYINT NOT NULL AUTO_INCREMENT, PRIMARY KEY(c1), + c2 INT) PARTITION BY HASH(c1) PARTITIONS 4; + +INSERT INTO t(c2) VALUES (10); +INSERT INTO t(c2) VALUES (20); +INSERT INTO t VALUES (-127,30); +INSERT INTO t VALUES (-128,40); + +--echo # disable warnings that indicate that value greater than limit is being inserted +--disable_warnings +--error 1062 +INSERT INTO t VALUES (-129,50); +--error 1062 +INSERT INTO t VALUES (-130,60); +--enable_warnings + +SELECT * FROM t; + +DROP TABLE t; + +--echo ############################################################################## + --echo End of 5.1 tests === modified file 'sql/field.h' --- a/sql/field.h 2009-06-09 16:44:26 +0000 +++ b/sql/field.h 2009-08-16 10:06:08 +0000 @@ -53,6 +53,67 @@ public: static void *operator new(size_t size) throw () { return sql_alloc(size); } static void operator delete(void *ptr_arg, size_t size) { TRASH(ptr_arg, size); } + /** + Return the upper limit of the mysql integral and floating point + type. + + @param[in] The Field object whose maximum value needs to be returned. + + @return upper limit of Field object type. + */ + static ulonglong get_int_col_max_value(const Field* field) + { + ulonglong max_value= 0; + + switch(field->key_type()) { + /* TINY */ + case HA_KEYTYPE_BINARY: + max_value= 0xFFULL; + break; + case HA_KEYTYPE_INT8: + max_value= 0x7FULL; + break; + /* SHORT */ + case HA_KEYTYPE_USHORT_INT: + max_value= 0xFFFFULL; + break; + case HA_KEYTYPE_SHORT_INT: + max_value= 0x7FFFULL; + break; + /* MEDIUM */ + case HA_KEYTYPE_UINT24: + max_value= 0xFFFFFFULL; + break; + case HA_KEYTYPE_INT24: + max_value= 0x7FFFFFULL; + break; + /* LONG */ + case HA_KEYTYPE_ULONG_INT: + max_value= 0xFFFFFFFFULL; + break; + case HA_KEYTYPE_LONG_INT: + max_value= 0x7FFFFFFFULL; + break; + /* BIG */ + case HA_KEYTYPE_ULONGLONG: + max_value= 0xFFFFFFFFFFFFFFFFULL; + break; + case HA_KEYTYPE_LONGLONG: + max_value= 0x7FFFFFFFFFFFFFFFULL; + break; + case HA_KEYTYPE_FLOAT: + /* We use the maximum as per IEEE754-2008 standard, 2^24 */ + max_value= 0x1000000ULL; + break; + case HA_KEYTYPE_DOUBLE: + /* We use the maximum as per IEEE754-2008 standard, 2^53 */ + max_value= 0x20000000000000ULL; + break; + default: + max_value= 0; + } + return(max_value); +} uchar *ptr; // Position to field in record uchar *null_ptr; // Byte where null_bit is === modified file 'sql/ha_partition.cc' --- a/sql/ha_partition.cc 2009-08-06 11:31:26 +0000 +++ b/sql/ha_partition.cc 2009-08-16 10:06:08 +0000 @@ -3024,7 +3024,26 @@ int ha_partition::write_row(uchar * buf) tmp_disable_binlog(thd); /* Do not replicate the low-level changes. */ error= m_file[part_id]->ha_write_row(buf); if (have_auto_increment && !table->s->next_number_keypart) - set_auto_increment_if_higher(table->next_number_field->val_int()); + { + /* + Stores the upper limit of the auto increment column type + */ + ulonglong col_max_value= 0; + /* + Stores the current value of the auto increment column + */ + ulonglong auto_inc= 0; + col_max_value= Field::get_int_col_max_value(table->next_number_field); + auto_inc= table->next_number_field->val_int(); + /* + If the current value is lesser than or equal to the upper limit + */ + if (auto_inc <= col_max_value) + { + set_auto_increment_if_higher(auto_inc); + } + } + reenable_binlog(thd); exit: table->timestamp_field_type= orig_timestamp_type; --Boundary_(ID_pcNCEQSfBnFSTyXQ8t1scA) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name="bzr/v.narayanan@stripped" Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/v.narayanan@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: v.narayanan@stripped # target_branch: file:///home/narayanan/Work/mysql_checkouts\ # /shared_repository_directory/mysql-5.1-bugteam-45823-02/ # testament_sha1: 381e25022d7f250e0d15f7e701b4cfb04654d5d0 # timestamp: 2009-08-16 15:36:20 +0530 # base_revision_id: ramil@stripped # # Begin bundle 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 --Boundary_(ID_pcNCEQSfBnFSTyXQ8t1scA)--