mirror of
https://github.com/MariaDB/server.git
synced 2025-08-05 13:16:09 +03:00
Make SEQUENCE working with replication
- Old sequence code forced row based replication for any statements that refered to a sequence table. What is new is that row based replication is now sequence aware: - NEXT VALUE is now generating a short row based event with only next_value and round being replicated. - Short row based events are now on the slave updated as trough SET_VALUE(sequence_name) - Full row based events are on the slave updated with a full insert, which is practically same as ALTER SEQUENCE. - INSERT on a SEQUENCE table does now a EXCLUSIVE LOCK to ensure that it is logged in binary log before any following NEXT VALUE calls. - Enable all sequence tests and fixed found bugs - ALTER SEQUENCE doesn't anymore allow changes that makes the next_value outside of allowed range - SEQUENCE changes are done with TL_WRITE_ALLOW_WRITE. Because of this one can generate a statement for MyISAM with both TL_WRITE_CONCURRENT_INSERT and TL_WRITE_ALLOW_WRITE. To fix a warning I had to add an extra test in thr_lock.c for this. - Removed UPDATE of SEQUENCE (no need to support this as we have ALTER SEQUENCE, which takes the EXCLUSIVE lock properly. - Removed DBUG_ASSERT() in MDL_context::upgrade_shared_lock. This was removed upstream in MySQL 5.6 in 72f823de453. - Simplified test in decided_logging_format() by using sql_command_flags() - Fix that we log DROP SEQUENCE correctly. - Fixed that Aria works with SEQUENCE
This commit is contained in:
@@ -26,6 +26,11 @@
|
||||
#define seq_field_used_restart 64
|
||||
#define seq_field_used_restart_value 128
|
||||
|
||||
/* Field position in sequence table for some fields we refer to directly */
|
||||
#define NEXT_FIELD_NO 0
|
||||
#define MIN_VALUE_FIELD_NO 1
|
||||
#define ROUND_FIELD_NO 7
|
||||
|
||||
/**
|
||||
sequence_definition is used when defining a sequence as part of create
|
||||
*/
|
||||
@@ -48,17 +53,26 @@ public:
|
||||
uint used_fields; // Which fields where used in CREATE
|
||||
longlong restart; // alter sequence restart value
|
||||
|
||||
bool check_and_adjust();
|
||||
bool check_and_adjust(bool set_reserved_until);
|
||||
void store_fields(TABLE *table);
|
||||
void read_fields(TABLE *table);
|
||||
int write_initial_sequence(TABLE *table);
|
||||
int write(TABLE *table);
|
||||
int write(TABLE *table, bool all_fields);
|
||||
/* This must be called after sequence data has been updated */
|
||||
void adjust_values(longlong next_value);
|
||||
inline void print_dbug()
|
||||
{
|
||||
DBUG_PRINT("sequence", ("reserved: %lld start: %lld increment: %lld min_value: %lld max_value: %lld cache: %lld round: %lld",
|
||||
reserved_until, start, increment, min_value,
|
||||
max_value, cache, round));
|
||||
}
|
||||
protected:
|
||||
/*
|
||||
The following values are the values from sequence_definition
|
||||
merged with global auto_increment_offset and auto_increment_increment
|
||||
*/
|
||||
longlong real_increment;
|
||||
longlong next_free_value;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -87,8 +101,6 @@ public:
|
||||
{
|
||||
mysql_mutex_unlock(&mutex);
|
||||
}
|
||||
/* This must be called after sequence data has been updated */
|
||||
void adjust_values(longlong next_value);
|
||||
void copy(sequence_definition *seq)
|
||||
{
|
||||
sequence_definition::operator= (*seq);
|
||||
@@ -124,12 +136,6 @@ public:
|
||||
private:
|
||||
TABLE *table;
|
||||
mysql_mutex_t mutex;
|
||||
longlong next_free_value;
|
||||
/*
|
||||
The following values are the values from sequence_definition
|
||||
merged with global auto_increment_offset and auto_increment_increment
|
||||
*/
|
||||
longlong real_increment;
|
||||
};
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user