MySQL 8.4.0
Source Code Documentation
Write_rows_log_event Class Reference

Log row insertions and updates. More...

#include <log_event.h>

Inheritance diagram for Write_rows_log_event:
[legend]

Public Types

enum  { TYPE_CODE = mysql::binlog::event::WRITE_ROWS_EVENT }
 
- Public Types inherited from Rows_log_event
enum  row_lookup_mode {
  ROW_LOOKUP_UNDEFINED = 0 , ROW_LOOKUP_NOT_NEEDED = 1 , ROW_LOOKUP_INDEX_SCAN = 2 , ROW_LOOKUP_TABLE_SCAN = 3 ,
  ROW_LOOKUP_HASH_SCAN = 4
}
 
enum  enum_error {
  ERR_OPEN_FAILURE = -1 , ERR_OK = 0 , ERR_TABLE_LIMIT_EXCEEDED = 1 , ERR_OUT_OF_MEM = 2 ,
  ERR_BAD_TABLE_DEF = 3 , ERR_RBR_TO_SBR = 4
}
 Enumeration of the errors that can be returned. More...
 
enum  { RLE_NO_FLAGS = 0U }
 
typedef uint16 flag_set
 
- Public Types inherited from mysql::binlog::event::Rows_event
enum  enum_flag {
  STMT_END_F = (1U << 0) , NO_FOREIGN_KEY_CHECKS_F = (1U << 1) , RELAXED_UNIQUE_CHECKS_F = (1U << 2) , COMPLETE_ROWS_F = (1U << 3) ,
  ALL_FLAGS
}
 These definitions allow to combine the flags into an appropriate flag set using the normal bitwise operators. More...
 
- Public Types inherited from mysql::binlog::event::Binary_log_event
enum  enum_post_header_length {
  QUERY_HEADER_MINIMAL_LEN = (4 + 4 + 1 + 2) , QUERY_HEADER_LEN = (QUERY_HEADER_MINIMAL_LEN + 2) , STOP_HEADER_LEN = 0 , START_V3_HEADER_LEN = (2 + ST_SERVER_VER_LEN + 4) ,
  ROTATE_HEADER_LEN = 8 , INTVAR_HEADER_LEN = 0 , APPEND_BLOCK_HEADER_LEN = 4 , DELETE_FILE_HEADER_LEN = 4 ,
  RAND_HEADER_LEN = 0 , USER_VAR_HEADER_LEN = 0 , FORMAT_DESCRIPTION_HEADER_LEN = (START_V3_HEADER_LEN + 1 + LOG_EVENT_TYPES) , XID_HEADER_LEN = 0 ,
  BEGIN_LOAD_QUERY_HEADER_LEN = APPEND_BLOCK_HEADER_LEN , ROWS_HEADER_LEN_V1 = 8 , TABLE_MAP_HEADER_LEN = 8 , EXECUTE_LOAD_QUERY_EXTRA_HEADER_LEN = (4 + 4 + 4 + 1) ,
  EXECUTE_LOAD_QUERY_HEADER_LEN , INCIDENT_HEADER_LEN = 2 , HEARTBEAT_HEADER_LEN = 0 , IGNORABLE_HEADER_LEN = 0 ,
  ROWS_HEADER_LEN_V2 = 10 , TRANSACTION_CONTEXT_HEADER_LEN = 18 , VIEW_CHANGE_HEADER_LEN = 52 , XA_PREPARE_HEADER_LEN = 0 ,
  TRANSACTION_PAYLOAD_HEADER_LEN = 0
}
 The lengths for the fixed data part of each event. More...
 
- Public Types inherited from Log_event
enum  enum_skip_reason { EVENT_SKIP_NOT , EVENT_SKIP_IGNORE , EVENT_SKIP_COUNT }
 Enumeration of what kinds of skipping (and non-skipping) that can occur when the slave executes an event. More...
 

Public Member Functions

 Write_rows_log_event (THD *, TABLE *, const mysql::binlog::event::Table_id &table_id, bool is_transactional, const unsigned char *extra_row_ndb_info)
 
 Write_rows_log_event (const char *buf, const mysql::binlog::event::Format_description_event *description_event)
 
bool read_write_bitmaps_cmp (const TABLE *table) const override
 Compares the table's read/write_set with the columns included in this event's before-image and/or after-image. More...
 
void claim_memory_ownership (bool claim) override
 Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed. More...
 
- Public Member Functions inherited from Rows_log_event
 Rows_log_event (Rows_log_event &&) noexcept=delete
 
Rows_log_eventoperator= (Rows_log_event &&) noexcept=delete
 
 Rows_log_event (const Rows_log_event &)=delete
 
Rows_log_eventoperator= (const Rows_log_event &)=delete
 
 ~Rows_log_event () override
 
void set_flags (flag_set flags_arg)
 
void clear_flags (flag_set flags_arg)
 
flag_set get_flags (flag_set flags_arg) const
 
int pack_info (Protocol *protocol) override
 Stores a string representation of this event in the Protocol. More...
 
int add_row_data (uchar *data, size_t length)
 
size_t get_data_size () override
 
MY_BITMAP const * get_cols () const
 
MY_BITMAP const * get_cols_ai () const
 
const mysql::binlog::event::Table_idget_table_id () const
 
bool write_data_header (Basic_ostream *ostream) override
 
bool write_data_body (Basic_ostream *ostream) override
 
const char * get_db () override
 
- Public Member Functions inherited from mysql::binlog::event::Rows_event
 Rows_event (Log_event_type type_arg)
 Constructs an event directly. More...
 
 Rows_event (const char *buf, const Format_description_event *fde)
 The constructor is responsible for decoding the event contained in the buffer. More...
 
 ~Rows_event () override
 
unsigned long long get_table_id () const
 
enum_flag get_flags () const
 
uint32_t get_null_bits_len () const
 
unsigned long get_width () const
 
std::string get_enum_flag_string () const
 Gets the flags listed as strings. More...
 
- Public Member Functions inherited from mysql::binlog::event::Binary_log_event
virtual ~Binary_log_event ()=0
 
 Binary_log_event (const Binary_log_event &)=default
 
 Binary_log_event (Binary_log_event &&)=default
 
Binary_log_eventoperator= (const Binary_log_event &)=default
 
Binary_log_eventoperator= (Binary_log_event &&)=default
 
enum Log_event_type get_event_type () const
 Helper method. More...
 
const Log_event_headerheader () const
 Return a const pointer to the header of the log event. More...
 
Log_event_headerheader ()
 Return a non-const pointer to the header of the log event. More...
 
const Log_event_footerfooter () const
 Return a const pointer to the footer of the log event. More...
 
Log_event_footerfooter ()
 Return a non-const pointer to the footer of the log event. More...
 
Event_readerreader ()
 Returns a reference to the event Event_reader object. More...
 
- Public Member Functions inherited from Log_event
 Log_event (mysql::binlog::event::Log_event_header *header, mysql::binlog::event::Log_event_footer *footer, enum_event_cache_type cache_type_arg, enum_event_logging_type logging_type_arg)
 This minimal constructor is for when you are not even sure that there is a valid THD. More...
 
 Log_event (THD *thd_arg, uint16 flags_arg, enum_event_cache_type cache_type_arg, enum_event_logging_type logging_type_arg, mysql::binlog::event::Log_event_header *header, mysql::binlog::event::Log_event_footer *footer)
 
int net_send (Protocol *protocol, const char *log_name, my_off_t pos)
 Only called by SHOW BINLOG EVENTS. More...
 
void * operator new (size_t size)
 
bool wrapper_my_b_safe_write (Basic_ostream *ostream, const uchar *buf, size_t data_length)
 Write the given buffer to the given output stream, updating the checksum if checksums are enabled. More...
 
virtual bool write (Basic_ostream *ostream)
 
time_t get_time ()
 Prints a "session_var=value" string. More...
 
virtual mysql::binlog::event::Log_event_type get_type_code () const
 
virtual bool is_sbr_logging_format () const
 Return true if the event has to be logged using SBR for DMLs. More...
 
bool is_valid ()
 
void set_artificial_event ()
 
void set_relay_log_event ()
 
bool is_artificial_event () const
 
bool is_relay_log_event () const
 
bool is_ignorable_event () const
 
bool is_no_filter_event () const
 
bool is_using_trans_cache () const
 
bool is_using_stmt_cache () const
 
bool is_using_immediate_logging () const
 
 Log_event (mysql::binlog::event::Log_event_header *header, mysql::binlog::event::Log_event_footer *footer)
 
virtual ~Log_event ()
 
void register_temp_buf (char *buf, bool free_in_destructor=true)
 
void free_temp_buf ()
 
const char * get_type_str () const
 Returns the human readable name of this event's type. More...
 
bool is_mts_sequential_exec ()
 Is called from get_mts_execution_mode() to. More...
 
virtual uint8 get_mts_dbs (Mts_db_names *arg, Rpl_filter *rpl_filter)
 The method fills in pointers to event's database name c-strings to a supplied array. More...
 
bool contains_partition_info (bool)
 
virtual uint8 mts_number_dbs ()
 
bool is_mts_group_isolated ()
 
virtual bool starts_group () const
 Events of a certain type can start or end a group of events treated transactionally wrt binlog. More...
 
virtual bool ends_group () const
 
int apply_event (Relay_log_info *rli)
 Apply the event to the database. More...
 
int apply_gtid_event (Relay_log_info *rli)
 Apply the GTID event in curr_group_data to the database. More...
 
int update_pos (Relay_log_info *rli)
 Update the relay log position. More...
 
enum_skip_reason shall_skip (Relay_log_info *rli)
 Decide if the event shall be skipped, and the reason for skipping it. More...
 
virtual int do_apply_event_worker (Slave_worker *w)
 
- Public Member Functions inherited from mysql::binlog::event::Write_rows_event
 Write_rows_event (const char *buf, const Format_description_event *fde)
 
 Write_rows_event ()
 

Static Public Member Functions

static bool binlog_row_logging_function (THD *thd, TABLE *table, bool is_transactional, const uchar *before_record, const uchar *after_record)
 
- Static Public Member Functions inherited from mysql::binlog::event::Rows_event
static std::string get_flag_string (enum_flag flag)
 Gets a string describing the flags. More...
 
- Static Public Member Functions inherited from Log_event
static void init_show_field_list (mem_root_deque< Item * > *field_list)
 init_show_field_list() prepares the column names and types for the output of SHOW BINLOG EVENTS; it is used only by SHOW BINLOG EVENTS. More...
 
static void operator delete (void *ptr, size_t)
 
static void * operator new (size_t, void *ptr)
 
static void operator delete (void *, void *)
 
static const char * get_type_str (mysql::binlog::event::Log_event_type type)
 Returns the human readable name of the given event type. More...
 
static const char * get_type_str (uint type)
 Get the name of an event type, or "Unknown" if out of range. More...
 

Protected Member Functions

int write_row (const Relay_log_info *const, const bool)
 Write the current row into event's table. More...
 
- Protected Member Functions inherited from Rows_log_event
 Rows_log_event (THD *, TABLE *, const mysql::binlog::event::Table_id &table_id, MY_BITMAP const *cols, bool is_transactional, mysql::binlog::event::Log_event_type event_type, const unsigned char *extra_row_ndb_info)
 
 Rows_log_event (const char *row_data, const mysql::binlog::event::Format_description_event *description_event)
 
virtual int do_add_row_data (uchar *data, size_t length)
 
int unpack_current_row (const Relay_log_info *const rli, MY_BITMAP const *cols, bool is_after_image, bool only_seek=false)
 Unpack the current row image from the event into m_table->record[0]. More...
 
int update_generated_columns (MY_BITMAP const &fields_to_update)
 Updates the generated columns of the TABLE object referenced by m_table, that have an active bit in the parameter bitset fields_to_update. More...
 
void decide_row_lookup_algorithm_and_key () SUPPRESS_UBSAN_CLANG10
 
int row_operations_scan_and_key_setup ()
 
int row_operations_scan_and_key_teardown (int error)
 
bool is_auto_inc_in_extra_columns (const Relay_log_info *const rli)
 Helper function to check whether there is an auto increment column on the table where the event is to be applied. More...
 
bool is_rbr_logging_format () const override
 Return true if the event has to be logged using RBR for DMLs. More...
 
- Protected Member Functions inherited from mysql::binlog::event::Binary_log_event
 Binary_log_event (Log_event_type type_code)
 This constructor is used to initialize the type_code of header object m_header. More...
 
 Binary_log_event (const char **buf, const Format_description_event *fde)
 This constructor will create a new object of Log_event_header and initialize the variable m_header, which in turn will be used to initialize Log_event's member common_header. More...
 
- Protected Member Functions inherited from Log_event
uint32 write_header_to_memory (uchar *buf)
 Writes the common header of this event to the given memory buffer. More...
 
bool write_header (Basic_ostream *ostream, size_t data_length)
 Writes the common-header of this event to the given output stream and updates the checksum. More...
 
bool write_footer (Basic_ostream *ostream)
 
bool need_checksum ()
 A decider of whether to trigger checksum computation or not. More...
 
enum_skip_reason continue_group (Relay_log_info *rli)
 Helper function to ignore an event w.r.t. More...
 

Private Member Functions

mysql::binlog::event::Log_event_type get_general_type_code () override
 
int do_before_row_operations (const Relay_log_info *const) override
 
int do_after_row_operations (const Relay_log_info *const, int) override
 
int do_exec_row (const Relay_log_info *const) override
 

Additional Inherited Members

- Public Attributes inherited from Rows_log_event
uint m_row_count
 
- Public Attributes inherited from mysql::binlog::event::Rows_event
Extra_row_info m_extra_row_info
 
- Public Attributes inherited from Log_event
char * temp_buf
 
bool m_free_temp_buf_in_destructor
 
ulong exec_time
 
uint32 server_id
 
ulong rbr_exec_mode
 A storage to cache the global system variable's value. More...
 
enum_event_cache_type event_cache_type
 Defines the type of the cache, if any, where the event will be stored before being flushed to disk. More...
 
enum_event_logging_type event_logging_type
 Defines when information, i.e. More...
 
ha_checksum crc
 Placeholder for event checksum while writing to binlog. More...
 
ulong mts_group_idx
 Index in rli->gaq array to indicate a group that this event is purging. More...
 
mysql::binlog::event::Log_event_headercommon_header
 The Log_event_header class contains the variable present in the common header. More...
 
mysql::binlog::event::Log_event_footercommon_footer
 The Log_event_footer class contains the variable present in the common footer. More...
 
Relay_log_infoworker
 MTS: associating the event with either an assigned Worker or Coordinator. More...
 
ulonglong future_event_relay_log_pos
 A copy of the main rli value stored into event to pass to MTS worker rli. More...
 
THDthd
 
db_worker_hash_entrymts_assigned_partitions [MAX_DBS_IN_EVENT_MTS]
 Partition info associate with event to deliver to MTS event applier. More...
 
- Static Public Attributes inherited from mysql::binlog::event::Binary_log_event
static const int LOG_EVENT_TYPES = (ENUM_END_EVENT - 1)
 
- Protected Types inherited from Log_event
enum  enum_event_cache_type {
  EVENT_INVALID_CACHE = 0 , EVENT_STMT_CACHE , EVENT_TRANSACTIONAL_CACHE , EVENT_NO_CACHE ,
  EVENT_CACHE_COUNT
}
 
enum  enum_event_logging_type { EVENT_INVALID_LOGGING = 0 , EVENT_NORMAL_LOGGING , EVENT_IMMEDIATE_LOGGING , EVENT_CACHE_LOGGING_COUNT }
 
- Static Protected Member Functions inherited from Rows_log_event
static bool is_trx_retryable_upon_engine_error (int error)
 Helper function to check whether the storage engine error allows for the transaction to be retried or not. More...
 
- Protected Attributes inherited from Rows_log_event
Rows_applier_psi_stage m_psi_progress
 
TABLEm_table
 
MY_BITMAP m_cols
 
MY_BITMAP m_local_cols
 Bitmap denoting columns available in the image as they appear in the table setup. More...
 
Hash_slave_rows m_hash
 Hash table that will hold the entries for while using HASH_SCAN algorithm to search and update/delete rows. More...
 
uint m_rows_lookup_algorithm
 The algorithm to use while searching for rows using the before image. More...
 
MY_BITMAP m_cols_ai
 Bitmap for columns available in the after image, if present. More...
 
MY_BITMAP m_local_cols_ai
 Bitmap denoting columns available in the after-image as they appear in the table setup. More...
 
uint32 m_bitbuf [128/(sizeof(uint32) *8)]
 
uint32 m_bitbuf_ai [128/(sizeof(uint32) *8)]
 
ucharm_rows_buf
 
ucharm_rows_cur
 
ucharm_rows_end
 
const ucharm_curr_row
 
const ucharm_curr_row_end
 
ucharm_key
 
uint m_key_index
 
KEYm_key_info
 
std::set< uchar *, Key_comparem_distinct_keys
 
std::set< uchar *, Key_compare >::iterator m_itr
 
ucharm_distinct_key_spare_buf
 A spare buffer which will be used when saving the distinct keys for doing an index scan with HASH_SCAN search algorithm. More...
 
- Protected Attributes inherited from mysql::binlog::event::Rows_event
Log_event_type m_type
 
Table_id m_table_id
 Actual event type. More...
 
uint16_t m_flags
 
unsigned long m_width
 Flags for row-level events. More...
 
uint32_t n_bits_len
 The width of the columns bitmap. More...
 
uint16_t var_header_len
 value determined by (m_width + 7) / 8 More...
 
std::vector< uint8_t > columns_before_image
 
std::vector< uint8_t > columns_after_image
 
std::vector< uint8_t > row
 

Detailed Description

Log row insertions and updates.

The event contain several insert/update rows for a table. Note that each event contains only rows for one table.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
Enumerator
TYPE_CODE 

Constructor & Destructor Documentation

◆ Write_rows_log_event() [1/2]

Write_rows_log_event::Write_rows_log_event ( THD thd_arg,
TABLE tbl_arg,
const mysql::binlog::event::Table_id table_id,
bool  is_transactional,
const unsigned char *  extra_row_ndb_info 
)

◆ Write_rows_log_event() [2/2]

Write_rows_log_event::Write_rows_log_event ( const char *  buf,
const mysql::binlog::event::Format_description_event description_event 
)

Member Function Documentation

◆ binlog_row_logging_function()

bool Write_rows_log_event::binlog_row_logging_function ( THD thd,
TABLE table,
bool  is_transactional,
const uchar before_record,
const uchar after_record 
)
static

◆ claim_memory_ownership()

void Write_rows_log_event::claim_memory_ownership ( bool  claim)
overridevirtual

Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.

Parameters
claimTrue - claim ownership of the memory False - disclaim ownership of the memory

Reimplemented from Log_event.

◆ do_after_row_operations()

int Write_rows_log_event::do_after_row_operations ( const Relay_log_info * const  rli,
int  error 
)
overrideprivatevirtual

Clear the write_set bit for auto_inc field that only existed on the destination table as an extra column.

Row based replication for Ndb requires resetting flags after each event. This is symmetric with do_before_row_operations.

Implements Rows_log_event.

◆ do_before_row_operations()

int Write_rows_log_event::do_before_row_operations ( const Relay_log_info * const  rli)
overrideprivatevirtual

todo: to introduce a property for the event (handler?) which forces applying the event in the replace (idempotent) fashion.

Sets it to ROW_LOOKUP_NOT_NEEDED.

Implements Rows_log_event.

◆ do_exec_row()

int Write_rows_log_event::do_exec_row ( const Relay_log_info * const  rli)
overrideprivatevirtual

Implements Rows_log_event.

◆ get_general_type_code()

mysql::binlog::event::Log_event_type Write_rows_log_event::get_general_type_code ( )
inlineoverrideprivatevirtual

Implements Rows_log_event.

◆ read_write_bitmaps_cmp()

bool Write_rows_log_event::read_write_bitmaps_cmp ( const TABLE table) const
inlineoverridevirtual

Compares the table's read/write_set with the columns included in this event's before-image and/or after-image.

Each subclass (Write/Update/Delete) implements this function by comparing on the image(s) pertinent to the subclass.

Parameters
[in]tableThe table to compare this events bitmaps against.
Return values
trueif sets match
falseotherwise (following bitmap_cmp return logic).

Implements Rows_log_event.

◆ write_row()

int Write_rows_log_event::write_row ( const Relay_log_info * const  rli,
const bool  overwrite 
)
protected

Write the current row into event's table.

The row is located in the row buffer, pointed by m_curr_row member. Number of columns of the row is stored in m_width member (it can be different from the number of columns in the table to which we insert). Bitmap m_cols indicates which columns are present in the row. It is assumed that event's table is already open and pointed by m_table.

If the same record already exists in the table it can be either overwritten or an error is reported depending on the value of overwrite flag (error reporting not yet implemented). Note that the matching record can be different from the row we insert if we use primary keys to identify records in the table.

The row to be inserted can contain values only for selected columns. The missing columns are filled with default values using prepare_record() function. If a matching record is found in the table and overwritte is true, the missing columns are taken from it.

Parameters
rliRelay log info (needed for row unpacking).
overwriteShall we overwrite if the row already exists or signal error (currently ignored).
Returns
Error code on failure, 0 on success.

This method, if successful, sets m_curr_row_end pointer to point at the next row in the rows buffer. This is done when unpacking the row to be inserted.

Note
If a matching record is found, it is either updated using ha_update_row() or first deleted and then new record written.

The documentation for this class was generated from the following files: