Skip to content
Permalink
Browse files
Sequences with negative numbers and auto_increment_increment crashes
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.
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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
@@ -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);
}
}
}

0 comments on commit 7aa80ba

Please sign in to comment.