Skip to content

Commit

Permalink
Sequences with negative numbers and auto_increment_increment crashes
Browse files Browse the repository at this point in the history
This also fixes MDEV-16313 Assertion `next_free_value % real_increment == offset' fails upon CREATE SEQUENCE in galera cluster

Fixed by adding llabs() to assert.
Also adjusted auto_increment_offset to mod auto_increment_increment.
  • Loading branch information
montywi committed Aug 30, 2018
1 parent ceb5597 commit 7aa80ba
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 2 deletions.
30 changes: 30 additions & 0 deletions mysql-test/suite/sql_sequence/auto_increment.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
set global auto_increment_increment= 2, auto_increment_offset= 2;
create sequence s start with -3 minvalue= -1000 increment 0;
select nextval(s);
nextval(s)
-2
select nextval(s);
nextval(s)
0
flush tables;
select nextval(s);
nextval(s)
1998
drop sequence s;
set global auto_increment_increment= 2, auto_increment_offset= 1;
create sequence s start with -3 minvalue= -1000 increment 0;
select nextval(s);
nextval(s)
-3
select nextval(s);
nextval(s)
-1
select nextval(s);
nextval(s)
1
flush tables;
select nextval(s);
nextval(s)
1997
drop sequence s;
set global auto_increment_increment= default, auto_increment_offset= default;
30 changes: 30 additions & 0 deletions mysql-test/suite/sql_sequence/auto_increment.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
--source include/have_sequence.inc

#
# tests with auto_increment_increment and auto_increment_offset
#

set global auto_increment_increment= 2, auto_increment_offset= 2;

create sequence s start with -3 minvalue= -1000 increment 0;

select nextval(s);
select nextval(s);
flush tables;
select nextval(s);
drop sequence s;

set global auto_increment_increment= 2, auto_increment_offset= 1;

create sequence s start with -3 minvalue= -1000 increment 0;

select nextval(s);
select nextval(s);
select nextval(s);
flush tables;
select nextval(s);
drop sequence s;

# Clean up

set global auto_increment_increment= default, auto_increment_offset= default;
15 changes: 15 additions & 0 deletions mysql-test/suite/sql_sequence/next.result
Original file line number Diff line number Diff line change
Expand Up @@ -519,3 +519,18 @@ create temporary table tmp (i int);
select next value for tmp;
ERROR 42S02: 'test.tmp' is not a SEQUENCE
drop table tmp;
#
# Test negative numbers
#
create sequence s start with 1 minvalue=-1000 maxvalue=1000 increment -1;
select next value for s;
next value for s
1
select next value for s;
next value for s
0
flush tables;
select next value for s;
next value for s
-999
drop sequence s;
11 changes: 11 additions & 0 deletions mysql-test/suite/sql_sequence/next.test
Original file line number Diff line number Diff line change
Expand Up @@ -269,3 +269,14 @@ create temporary table tmp (i int);
--error ER_NOT_SEQUENCE
select next value for tmp;
drop table tmp;

--echo #
--echo # Test negative numbers
--echo #

create sequence s start with 1 minvalue=-1000 maxvalue=1000 increment -1;
select next value for s;
select next value for s;
flush tables;
select next value for s;
drop sequence s;
5 changes: 3 additions & 2 deletions sql/sql_sequence.cc
Original file line number Diff line number Diff line change
Expand Up @@ -542,7 +542,8 @@ void sequence_definition::adjust_values(longlong next_value)

if ((real_increment= global_system_variables.auto_increment_increment)
!= 1)
offset= global_system_variables.auto_increment_offset;
offset= (global_system_variables.auto_increment_offset %
global_system_variables.auto_increment_increment);

/*
Ensure that next_free_value has the right offset, so that we
Expand All @@ -564,7 +565,7 @@ void sequence_definition::adjust_values(longlong next_value)
else
{
next_free_value+= to_add;
DBUG_ASSERT(next_free_value % real_increment == offset);
DBUG_ASSERT(llabs(next_free_value % real_increment) == offset);
}
}
}
Expand Down

0 comments on commit 7aa80ba

Please sign in to comment.