Commit 7aa80ba6 authored by Monty's avatar Monty

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.
parent ceb55971
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;
--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); ...@@ -519,3 +519,18 @@ create temporary table tmp (i int);
select next value for tmp; select next value for tmp;
ERROR 42S02: 'test.tmp' is not a SEQUENCE ERROR 42S02: 'test.tmp' is not a SEQUENCE
drop table tmp; 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); ...@@ -269,3 +269,14 @@ create temporary table tmp (i int);
--error ER_NOT_SEQUENCE --error ER_NOT_SEQUENCE
select next value for tmp; select next value for tmp;
drop table 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) ...@@ -542,7 +542,8 @@ void sequence_definition::adjust_values(longlong next_value)
if ((real_increment= global_system_variables.auto_increment_increment) if ((real_increment= global_system_variables.auto_increment_increment)
!= 1) != 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 Ensure that next_free_value has the right offset, so that we
...@@ -564,7 +565,7 @@ void sequence_definition::adjust_values(longlong next_value) ...@@ -564,7 +565,7 @@ void sequence_definition::adjust_values(longlong next_value)
else else
{ {
next_free_value+= to_add; next_free_value+= to_add;
DBUG_ASSERT(next_free_value % real_increment == offset); DBUG_ASSERT(llabs(next_free_value % real_increment) == offset);
} }
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment