From: Jon Olav Hauglid Date: November 10 2010 3:05pm Subject: bzr commit into mysql-5.5-runtime branch (jon.hauglid:3179) Bug#50619 List-Archive: http://lists.mysql.com/commits/123436 X-Bug: 50619 Message-Id: <201011101505.oAAEsi37019978@rcsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1434180869265325833==" --===============1434180869265325833== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/x/mysql-5.5-runtime-bug50619/ based on revid:jon.hauglid@stripped 3179 Jon Olav Hauglid 2010-11-10 Bug #50619 assert in handler::update_auto_increment This assert could happen during subsequent inserts if -1 had already been inserted into an auto increment column. The root cause of the problem is that auto increment values are internally stored unsigned while auto increment column types can be signed values. When an explict value is set for the auto increment column, the internal auto increment value is reset to the explicit value + 1. However, if the explicit value is -1, converting this value to unsigned and adding 1 will yield 0 as a result (due to overflow). Since 0 would be outside the reserved auto increment interval for the insert (auto increment values should start at 1), the assert would be triggered. This patch fixes the problem by checking if the explicit value is negative. If this is the case, auto increment values are not reset. Test case added to auto_increment.test. modified: mysql-test/r/auto_increment.result mysql-test/t/auto_increment.test sql/handler.cc sql/handler.h === modified file 'mysql-test/r/auto_increment.result' --- a/mysql-test/r/auto_increment.result 2010-08-18 09:35:41 +0000 +++ b/mysql-test/r/auto_increment.result 2010-11-10 15:05:22 +0000 @@ -476,3 +476,16 @@ SELECT a FROM t2; a 2 DROP TABLE t1, t2; +# +# Bug#50619 assert in handler::update_auto_increment +# +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (pk INT AUTO_INCREMENT, PRIMARY KEY (pk)); +INSERT INTO t1 VALUES (-1); +CREATE TRIGGER tr1 BEFORE DELETE ON t1 FOR EACH ROW SET @aux = 1 ; +REPLACE INTO t1 (pk) VALUES (NULL), (-1); +SELECT * FROM t1; +pk +-1 +1 +DROP TABLE t1; === modified file 'mysql-test/t/auto_increment.test' --- a/mysql-test/t/auto_increment.test 2010-08-18 09:35:41 +0000 +++ b/mysql-test/t/auto_increment.test 2010-11-10 15:05:22 +0000 @@ -342,3 +342,20 @@ SELECT a FROM t2; DROP TABLE t1, t2; + +--echo # +--echo # Bug#50619 assert in handler::update_auto_increment +--echo # + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +CREATE TABLE t1 (pk INT AUTO_INCREMENT, PRIMARY KEY (pk)); +INSERT INTO t1 VALUES (-1); +CREATE TRIGGER tr1 BEFORE DELETE ON t1 FOR EACH ROW SET @aux = 1 ; +# This caused an assert +REPLACE INTO t1 (pk) VALUES (NULL), (-1); +SELECT * FROM t1; + +DROP TABLE t1; === modified file 'sql/handler.cc' --- a/sql/handler.cc 2010-10-18 11:27:52 +0000 +++ b/sql/handler.cc 2010-11-10 15:05:22 +0000 @@ -2204,14 +2204,14 @@ compute_next_insert_id(ulonglong nr,stru } -void handler::adjust_next_insert_id_after_explicit_value(ulonglong nr) +void handler::adjust_next_insert_id_after_explicit_value(longlong nr) { /* If we have set THD::next_insert_id previously and plan to insert an explicitely-specified value larger than this, we need to increase THD::next_insert_id to be greater than the explicit value. */ - if ((next_insert_id > 0) && (nr >= next_insert_id)) + if ((next_insert_id > 0) && (nr >=0) && ((ulonglong)nr >= next_insert_id)) set_next_insert_id(compute_next_insert_id(nr, &table->in_use->variables)); } @@ -2348,7 +2348,7 @@ int handler::update_auto_increment() */ DBUG_ASSERT(next_insert_id >= auto_inc_interval_for_cur_row.minimum()); - if ((nr= table->next_number_field->val_int()) != 0 || + if ((table->next_number_field->val_int() != 0) || (table->auto_increment_field_not_null && thd->variables.sql_mode & MODE_NO_AUTO_VALUE_ON_ZERO)) { @@ -2358,7 +2358,8 @@ int handler::update_auto_increment() the last NULL needs to insert 3764, not the value of the first NULL plus 1). */ - adjust_next_insert_id_after_explicit_value(nr); + adjust_next_insert_id_after_explicit_value( + table->next_number_field->val_int()); insert_id_for_cur_row= 0; // didn't generate anything DBUG_RETURN(0); } === modified file 'sql/handler.h' --- a/sql/handler.h 2010-10-06 14:34:28 +0000 +++ b/sql/handler.h 2010-11-10 15:05:22 +0000 @@ -1358,7 +1358,7 @@ public: int ha_drop_partitions(const char *path); int ha_rename_partitions(const char *path); - void adjust_next_insert_id_after_explicit_value(ulonglong nr); + void adjust_next_insert_id_after_explicit_value(longlong nr); int update_auto_increment(); void print_keydup_error(uint key_nr, const char *msg); virtual void print_error(int error, myf errflag); --===============1434180869265325833== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/jon.hauglid@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jon.hauglid@stripped # target_branch: file:///export/home/x/mysql-5.5-runtime-bug50619/ # testament_sha1: 7aeeada42203e80ac6718dcb55665293df2d137b # timestamp: 2010-11-10 16:05:34 +0100 # source_branch: file:///export/home/x/mysql-5.5-bugfixing/ # base_revision_id: jon.hauglid@stripped\ # oc90p0fl571p5dod # # Begin bundle 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 --===============1434180869265325833==--