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.
This commit is contained in:
parent
ceb5597184
commit
7aa80ba66b
30
mysql-test/suite/sql_sequence/auto_increment.result
Normal file
30
mysql-test/suite/sql_sequence/auto_increment.result
Normal file
@ -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
mysql-test/suite/sql_sequence/auto_increment.test
Normal file
30
mysql-test/suite/sql_sequence/auto_increment.test
Normal file
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user