mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-22491 Support mariadb-check and CHECK TABLE with SEQUENCE
The check go through the following steps: 1. Run check on the underlying engine. If not ok, then return. 2. Check that there's only one row in the table, and 2.1 warn if more than one row 2.2 return HA_ADMIN_CORRUPT if fewer than one row (i.e. 0 rows) 3. If the sequence is not initialised (e.g. after an ALTER TABLE ... SEQUENCE=1), initialise the sequence by reading the sequence metadata from the table. This will also flush the next_free_value, i.e. set it to the next not cached value (SEQUENCE::reserved_until) 4. Check that the sequence metadata is valid, i.e. nothing out of order e.g. minvalue < maxvalue etc. If invalid it reports HA_ERR_SEQUENCE_INVALID_DATA 5. Check that the sequence has not been exhausted. It reports ER_SEQUENCE_RUN_OUT as a warning if and only if a SELECT NEXTVAL would do so Limitations: 1. The check is independent of flags, so the vanilla check is the same as CHECK ... EXTENDED or CHECK ... FOR UPGRADE etc. 2. When the check discovers invalid metadata from the table, subsequent SELECT NEXTVAL will carry on (or fail) without this piece of knowledge, independent of the CHECK. This is to ensure consistency, i.e. CHECK does not modify behaviour of SELECT, and if anything it makes more sense that SELECT reports HA_ERR_SEQUENCE_INVALID_DATA in this case, regardless of prior CHECK
This commit is contained in:
117
mysql-test/suite/sql_sequence/check.result
Normal file
117
mysql-test/suite/sql_sequence/check.result
Normal file
@ -0,0 +1,117 @@
|
||||
create sequence s;
|
||||
call mtr.add_suppression("ha_myisam");
|
||||
call mtr.add_suppression("Checking table");
|
||||
check table s;
|
||||
Table Op Msg_type Msg_text
|
||||
test.s check error Size of datafile is: 4 Should be: 58
|
||||
test.s check error Corrupt
|
||||
drop table s;
|
||||
create sequence s;
|
||||
insert into s values (3,1,9223372036854775806,1,1,1000,0,0);
|
||||
select * from s;
|
||||
next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count
|
||||
3 1 9223372036854775806 1 1 1000 0 0
|
||||
check table s;
|
||||
Table Op Msg_type Msg_text
|
||||
test.s check status OK
|
||||
select nextval(s);
|
||||
nextval(s)
|
||||
3
|
||||
drop sequence s;
|
||||
CREATE SEQUENCE s;
|
||||
ALTER TABLE s sequence=0;
|
||||
insert into s values (3,1,9223372036854775806,1,1,1000,0,0);
|
||||
FLUSH TABLES;
|
||||
CHECK TABLE s;
|
||||
Table Op Msg_type Msg_text
|
||||
test.s check Warning More than one row in the table
|
||||
test.s check status OK
|
||||
DROP SEQUENCE s;
|
||||
CREATE SEQUENCE s;
|
||||
ALTER TABLE s sequence=0;
|
||||
delete from s;
|
||||
FLUSH TABLES;
|
||||
CHECK TABLE s;
|
||||
Table Op Msg_type Msg_text
|
||||
test.s check Error Fewer than one row in the table
|
||||
test.s check error Corrupt
|
||||
DROP SEQUENCE s;
|
||||
CREATE SEQUENCE s;
|
||||
ALTER TABLE s sequence=0;
|
||||
update s set minimum_value=200, maximum_value=100;
|
||||
FLUSH TABLES;
|
||||
CHECK TABLE s;
|
||||
Table Op Msg_type Msg_text
|
||||
test.s check Error Sequence 'test.s' has out of range value for options
|
||||
test.s check error Corrupt
|
||||
DROP SEQUENCE s;
|
||||
create sequence s minvalue 13 maxvalue 15 increment by 4;
|
||||
check table s;
|
||||
Table Op Msg_type Msg_text
|
||||
test.s check status OK
|
||||
select nextval(s);
|
||||
nextval(s)
|
||||
13
|
||||
check table s;
|
||||
Table Op Msg_type Msg_text
|
||||
test.s check Warning Sequence 'test.s' has run out
|
||||
test.s check status OK
|
||||
alter sequence s cycle;
|
||||
check table s;
|
||||
Table Op Msg_type Msg_text
|
||||
test.s check status OK
|
||||
alter sequence s nocycle;
|
||||
check table s;
|
||||
Table Op Msg_type Msg_text
|
||||
test.s check Warning Sequence 'test.s' has run out
|
||||
test.s check status OK
|
||||
alter sequence s increment by 1;
|
||||
check table s;
|
||||
Table Op Msg_type Msg_text
|
||||
test.s check Warning Sequence 'test.s' has run out
|
||||
test.s check status OK
|
||||
alter sequence s increment by 4;
|
||||
select nextval(s);
|
||||
ERROR HY000: Sequence 'test.s' has run out
|
||||
alter sequence s cycle;
|
||||
check table s;
|
||||
Table Op Msg_type Msg_text
|
||||
test.s check status OK
|
||||
alter sequence s maxvalue 23 nocycle;
|
||||
check table s;
|
||||
Table Op Msg_type Msg_text
|
||||
test.s check status OK
|
||||
alter sequence s maxvalue 15;
|
||||
check table s;
|
||||
Table Op Msg_type Msg_text
|
||||
test.s check Warning Sequence 'test.s' has run out
|
||||
test.s check status OK
|
||||
drop sequence s;
|
||||
create sequence s minvalue 13 maxvalue 20 increment by 1;
|
||||
select nextval(s);
|
||||
nextval(s)
|
||||
13
|
||||
check table s;
|
||||
Table Op Msg_type Msg_text
|
||||
test.s check status OK
|
||||
select nextval(s);
|
||||
nextval(s)
|
||||
14
|
||||
drop sequence s;
|
||||
create sequence s minvalue 13 maxvalue 20 increment by 1;
|
||||
select nextval(s);
|
||||
nextval(s)
|
||||
13
|
||||
alter table s sequence=0;
|
||||
alter table s sequence=1;
|
||||
check table s;
|
||||
Table Op Msg_type Msg_text
|
||||
test.s check Warning Sequence 'test.s' has run out
|
||||
test.s check status OK
|
||||
select nextval(s);
|
||||
ERROR HY000: Sequence 'test.s' has run out
|
||||
drop sequence s;
|
||||
create sequence s;
|
||||
update s set minimum_value=500, maximum_value=200;
|
||||
ERROR HY000: Storage engine SEQUENCE of the table `test`.`s` doesn't have this option
|
||||
drop sequence s;
|
Reference in New Issue
Block a user