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;
|
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);
|
|||||||
--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)
|
|||||||
|
|
||||||
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)
|
|||||||
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user