mirror of
https://github.com/MariaDB/server.git
synced 2025-07-18 23:03:28 +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:
@ -161,16 +161,19 @@ longlong sequence_definition::truncate_value(const Longlong_hybrid& original)
|
||||
|
||||
/**
|
||||
Check whether sequence values are valid.
|
||||
|
||||
|
||||
Sets default values for fields that are not used, according to Oracle spec.
|
||||
|
||||
@param in thd The connection
|
||||
@param in set_reserved_until Whether to set reserved_until to start
|
||||
|
||||
@param in adjust_next Whether to call flush
|
||||
next_free_value. Default to true
|
||||
|
||||
@retval false valid
|
||||
true invalid
|
||||
*/
|
||||
bool sequence_definition::check_and_adjust(THD *thd, bool set_reserved_until)
|
||||
bool sequence_definition::check_and_adjust(THD *thd, bool set_reserved_until,
|
||||
bool adjust_next)
|
||||
{
|
||||
DBUG_ENTER("sequence_definition::check_and_adjust");
|
||||
|
||||
@ -241,7 +244,8 @@ bool sequence_definition::check_and_adjust(THD *thd, bool set_reserved_until)
|
||||
if (set_reserved_until)
|
||||
reserved_until= start;
|
||||
|
||||
adjust_values(reserved_until);
|
||||
if (adjust_next)
|
||||
adjust_values(reserved_until);
|
||||
|
||||
/* To ensure that cache * real_increment will never overflow */
|
||||
const longlong max_increment= (real_increment ?
|
||||
@ -758,7 +762,11 @@ int SEQUENCE::read_stored_values(TABLE *table)
|
||||
|
||||
|
||||
/*
|
||||
Adjust values after reading a the stored state
|
||||
Adjust next_free_value after reading a the stored state
|
||||
|
||||
Also assign auto_increment_increment to real_increment if increment
|
||||
is 0, though this assignment may have already happened (e.g. in
|
||||
check_and_adjust())
|
||||
*/
|
||||
|
||||
void sequence_definition::adjust_values(longlong next_value)
|
||||
|
Reference in New Issue
Block a user