MySQL 9.7.0
Source Code Documentation
log_event.h
Go to the documentation of this file.
1/* Copyright (c) 2000, 2026, Oracle and/or its affiliates.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is designed to work with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have either included with
13 the program or referenced in the documentation.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License, version 2.0, for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
23
24/**
25 @file sql/log_event.h
26
27 @brief Binary log event definitions. This includes generic code
28 common to all types of log events, as well as specific code for each
29 type of log event.
30
31 @addtogroup Replication
32 @{
33*/
34
35#ifndef _log_event_h
36#define _log_event_h
37
38#include <atomic>
39#include <cstdint>
40#include <functional>
41#include <list>
42#include <map>
43#include <set>
44#include <string>
45#include <string_view>
46
47#include "m_string.h" // native_strncasecmp
48#include "my_bitmap.h" // MY_BITMAP
49#include "my_checksum.h" // ha_checksum
50#include "my_dbug.h"
51#include "my_inttypes.h"
52#include "my_psi_config.h"
53#include "my_sharedlib.h"
54#include "my_sys.h"
55#include "my_thread_local.h"
62#include "mysql/gtid/uuid.h"
65#include "mysql_com.h" // SERVER_VERSION_LENGTH
66#include "partition_info.h"
67#include "sql/query_options.h" // OPTION_AUTO_IS_NULL
68#include "sql/rpl_gtid.h" // enum_gtid_type
69#include "sql/rpl_utility.h" // Hash_slave_rows
70#include "sql/sql_const.h"
71#include "sql/thr_malloc.h"
72#include "sql_string.h"
73#include "string_with_len.h"
74#include "strmake.h"
75#include "typelib.h" // TYPELIB
76
77namespace mysql::binlog::event {
78class Table_id;
79} // namespace mysql::binlog::event
80
81class THD;
82struct CHARSET_INFO;
83
84enum class enum_row_image_type;
85class Basic_ostream;
86
87#ifdef MYSQL_SERVER
88#include <stdio.h>
89
90#include "my_compiler.h"
91#include "sql/changestreams/misc/replicated_columns_view.h" // ReplicatedColumnsView
92#include "sql/key.h"
93#include "sql/rpl_filter.h" // rpl_filter
94#include "sql/table.h"
95#include "sql/xa.h"
96#endif
97
98#ifndef MYSQL_SERVER
99#include "sql/rpl_tblmap.h" // table_mapping
100#endif
101
102#include <limits.h>
103#include <stdint.h>
104#include <string.h>
105#include <sys/types.h>
106#include <time.h>
107
108#ifdef HAVE_PSI_STAGE_INTERFACE
110#endif
111
112#ifndef MYSQL_SERVER
114#endif
115
119
120#if defined(MYSQL_SERVER)
121using ColumnViewPtr = std::unique_ptr<cs::util::ReplicatedColumnsView>;
122#endif
123
124using sql_mode_t = uint64_t;
125struct db_worker_hash_entry;
126
128#if defined(MYSQL_SERVER)
129int ignored_error_code(int err_code);
130#endif
131#define PREFIX_SQL_LOAD "SQL_LOAD-"
132
133/**
134 Maximum length of the name of a temporary file
135 PREFIX LENGTH - 9
136 UUID - UUID_LENGTH
137 SEPARATORS - 2
138 SERVER ID - 10 (range of server ID 1 to (2^32)-1 = 4,294,967,295)
139 FILE ID - 10 (uint)
140 EXTENSION - 7 (Assuming that the extension is always less than 7
141 characters)
142*/
143#define TEMP_FILE_MAX_LEN UUID_LENGTH + 38
144
145/**
146 Either assert or return an error.
147
148 In debug build, the condition will be checked, but in non-debug
149 builds, the error code given will be returned instead.
150
151 @param COND Condition to check
152 @param ERRNO Error number to return in non-debug builds
153*/
154#ifdef NDEBUG
155#define ASSERT_OR_RETURN_ERROR(COND, ERRNO) \
156 do { \
157 if (!(COND)) return ERRNO; \
158 } while (0)
159#else
160#define ASSERT_OR_RETURN_ERROR(COND, ERRNO) assert(COND)
161#endif
162
163#define LOG_EVENT_OFFSET 4
164
165#define NUM_LOAD_DELIM_STRS 5
166
167/*****************************************************************************
168
169 MySQL Binary Log
170
171 This log consists of events. Each event has a fixed-length header,
172 possibly followed by a variable length data body.
173
174 The data body consists of an optional fixed length segment (post-header)
175 and an optional variable length segment.
176
177 See the #defines below for the format specifics.
178
179 The events which really update data are Query_log_event,
180 Execute_load_query_log_event and old Load_log_event and
181 Execute_load_log_event events (Execute_load_query is used together with
182 Begin_load_query and Append_block events to replicate LOAD DATA INFILE.
183 Create_file/Append_block/Execute_load (which includes Load_log_event)
184 were used to replicate LOAD DATA before the 5.0.3).
185
186 ****************************************************************************/
187
188#define MAX_LOG_EVENT_HEADER \
189 ( /* in order of Query_log_event::write */ \
190 (LOG_EVENT_HEADER_LEN + /* write_header */ \
191 mysql::binlog::event::Binary_log_event::QUERY_HEADER_LEN + /* write_data \
192 */ \
193 mysql::binlog::event::Binary_log_event:: \
194 EXECUTE_LOAD_QUERY_EXTRA_HEADER_LEN) + /*write_post_header_for_derived \
195 */ \
196 MAX_SIZE_LOG_EVENT_STATUS + /* status */ \
197 NAME_LEN + \
198 1)
199
200/* slave event post-header (this event is never written) */
202#define SL_MASTER_PORT_OFFSET 8
203#define SL_MASTER_POS_OFFSET 0
204#define SL_MASTER_HOST_OFFSET 10
205
206/* Intvar event post-header */
208/* Intvar event data */
209#define I_TYPE_OFFSET 0
210#define I_VAL_OFFSET 1
212/* 4 bytes which all binlogs should begin with */
213#define BINLOG_MAGIC "\xfe\x62\x69\x6e"
214#define BINLOG_MAGIC_SIZE 4
215
216/**
217 @addtogroup group_cs_binglog_event_header_flags Binlog Event Header Flags
218 @ingroup group_cs
219 @{
220*/
221
222/*
223 The 2 flags below were useless :
224 - the first one was never set
225 - the second one was set in all Rotate events on the master, but not used for
226 anything useful.
227 So they are now removed and their place may later be reused for other
228 flags. Then one must remember that Rotate events in 4.x have
229 LOG_EVENT_FORCED_ROTATE_F set, so one should not rely on the value of the
230 replacing flag when reading a Rotate event.
231 I keep the defines here just to remember what they were.
232
233 #define LOG_EVENT_TIME_F 0x1
234 #define LOG_EVENT_FORCED_ROTATE_F 0x2
235*/
236
237/**
238 @def LOG_EVENT_THREAD_SPECIFIC_F
239
240 If the query depends on the thread (for example: TEMPORARY TABLE).
241 Currently this is used by mysqlbinlog to know it must print
242 SET @@PSEUDO_THREAD_ID=xx; before the query (it would not hurt to print it
243 for every query but this would be slow).
244*/
245#define LOG_EVENT_THREAD_SPECIFIC_F 0x4
246
247/**
248 @def LOG_EVENT_SUPPRESS_USE_F
249
250 Suppress the generation of 'USE' statements before the actual
251 statement. This flag should be set for any events that does not need
252 the current database set to function correctly. Most notable cases
253 are 'CREATE DATABASE' and 'DROP DATABASE'.
254
255 This flags should only be used in exceptional circumstances, since
256 it introduce a significant change in behaviour regarding the
257 replication logic together with the flags --binlog-do-db and
258 --replicated-do-db.
259 */
260#define LOG_EVENT_SUPPRESS_USE_F 0x8
261
262/*
263 Note: this is a place holder for the flag
264 LOG_EVENT_UPDATE_TABLE_MAP_VERSION_F (0x10), which is not used any
265 more, please do not reused this value for other flags.
266 */
267
268/**
269 @def LOG_EVENT_ARTIFICIAL_F
270
271 Artificial events are created arbitrarily and not written to binary
272 log
273
274 These events should not update the master log position when slave
275 SQL thread executes them.
276*/
277#define LOG_EVENT_ARTIFICIAL_F 0x20
278
279/**
280 @def LOG_EVENT_RELAY_LOG_F
281
282 Events with this flag set are created by slave IO thread and written
283 to relay log
284*/
285#define LOG_EVENT_RELAY_LOG_F 0x40
286
287/**
288 @def LOG_EVENT_IGNORABLE_F
289
290 For an event, 'e', carrying a type code, that a slave,
291 's', does not recognize, 's' will check 'e' for
292 LOG_EVENT_IGNORABLE_F, and if the flag is set, then 'e'
293 is ignored. Otherwise, 's' acknowledges that it has
294 found an unknown event in the relay log.
295*/
296#define LOG_EVENT_IGNORABLE_F 0x80
297
298/**
299 @def LOG_EVENT_NO_FILTER_F
300
301 Events with this flag are not filtered (e.g. on the current
302 database) and are always written to the binary log regardless of
303 filters.
304*/
305#define LOG_EVENT_NO_FILTER_F 0x100
306
307/**
308 MTS: group of events can be marked to force its execution
309 in isolation from any other Workers.
310 So it's a marker for Coordinator to memorize and perform necessary
311 operations in order to guarantee no interference from other Workers.
312 The flag can be set ON only for an event that terminates its group.
313 Typically that is done for a transaction that contains
314 a query accessing more than OVER_MAX_DBS_IN_EVENT_MTS databases.
315*/
316#define LOG_EVENT_MTS_ISOLATE_F 0x200
317
318/** @}*/
319
320/**
321 @def OPTIONS_WRITTEN_TO_BIN_LOG
322
323 OPTIONS_WRITTEN_TO_BIN_LOG are the bits of thd->options which must
324 be written to the binlog. OPTIONS_WRITTEN_TO_BIN_LOG could be
325 written into the Format_description_log_event, so that if later we
326 don't want to replicate a variable we did replicate, or the
327 contrary, it's doable. But it should not be too hard to decide once
328 for all of what we replicate and what we don't, among the fixed 32
329 bits of thd->options.
330
331 I (Guilhem) have read through every option's usage, and it looks
332 like OPTION_AUTO_IS_NULL and OPTION_NO_FOREIGN_KEYS are the only
333 ones which alter how the query modifies the table. It's good to
334 replicate OPTION_RELAXED_UNIQUE_CHECKS too because otherwise, the
335 slave may insert data slower than the master, in InnoDB.
336 OPTION_BIG_SELECTS is not needed (the slave thread runs with
337 max_join_size=HA_POS_ERROR) and OPTION_BIG_TABLES is not needed
338 either, as the manual says (because a too big in-memory temp table
339 is automatically written to disk).
340*/
341#define OPTIONS_WRITTEN_TO_BIN_LOG \
342 (OPTION_AUTO_IS_NULL | OPTION_NO_FOREIGN_KEY_CHECKS | \
343 OPTION_RELAXED_UNIQUE_CHECKS | OPTION_NOT_AUTOCOMMIT)
345/* Shouldn't be defined before */
346#define EXPECTED_OPTIONS \
347 ((1ULL << 14) | (1ULL << 26) | (1ULL << 27) | (1ULL << 19))
348
349#if OPTIONS_WRITTEN_TO_BIN_LOG != EXPECTED_OPTIONS
350#error OPTIONS_WRITTEN_TO_BIN_LOG must NOT change their values!
351#endif
352#undef EXPECTED_OPTIONS /* You shouldn't use this one */
353
354/**
355 Maximum value of binlog logical timestamp.
356*/
357const int64 SEQ_MAX_TIMESTAMP = LLONG_MAX;
358
359/**
360 This method is used to extract the partition_id
361 from a partitioned table.
362
363 @param part_info an object of class partition_info it will be used
364 to call the methods responsible for returning the
365 value of partition_id
366
367 @retval The return value is the partition_id.
368
369*/
370int get_rpl_part_id(partition_info *part_info);
371
372#ifdef MYSQL_SERVER
373class Item;
374class Protocol;
376class Slave_worker;
377class sql_exchange;
378template <class T>
379class List;
380#endif
381
382class Relay_log_info;
383class Gtid_log_event;
384
385#ifndef MYSQL_SERVER
386enum enum_base64_output_mode {
387 BASE64_OUTPUT_NEVER = 0,
388 BASE64_OUTPUT_AUTO = 1,
389 BASE64_OUTPUT_UNSPEC = 2,
390 BASE64_OUTPUT_DECODE_ROWS = 3,
391 /* insert new output modes here */
392 BASE64_OUTPUT_MODE_COUNT
393};
394
395/*
396 A structure for mysqlbinlog to know how to print events
397
398 This structure is passed to the event's print() methods,
399
400 There are two types of settings stored here:
401 1. Last db, flags2, sql_mode etc comes from the last printed event.
402 They are stored so that only the necessary USE and SET commands
403 are printed.
404 2. Other information on how to print the events, e.g. short_form,
405 hexdump_from. These are not dependent on the last event.
406*/
407struct PRINT_EVENT_INFO {
408 /*
409 Settings for database, sql_mode etc that comes from the last event
410 that was printed. We cache these so that we don't have to print
411 them if they are unchanged.
412 */
413 // TODO: have the last catalog here ??
414 char db[FN_REFLEN + 1]; // TODO: make this a LEX_STRING when thd->db is
415 bool flags2_inited;
416 uint32 flags2;
417 bool sql_mode_inited;
418 sql_mode_t sql_mode; /* must be same as THD.variables.sql_mode */
419 ulong auto_increment_increment, auto_increment_offset;
420 bool charset_inited;
421 char charset[6]; // 3 variables, each of them storable in 2 bytes
422 char time_zone_str[MAX_TIME_ZONE_NAME_LENGTH];
423 uint lc_time_names_number;
424 uint charset_database_number;
425 uint default_collation_for_utf8mb4_number;
426 uint8_t sql_require_primary_key;
428 bool thread_id_printed;
429 uint8_t default_table_encryption;
430 uint8_t enable_cascade_triggers;
431
432 PRINT_EVENT_INFO();
433
434 ~PRINT_EVENT_INFO() {
435 close_cached_file(&head_cache);
436 close_cached_file(&body_cache);
437 close_cached_file(&footer_cache);
438 }
439 bool init_ok() /* tells if construction was successful */
440 {
441 return my_b_inited(&head_cache) && my_b_inited(&body_cache) &&
442 my_b_inited(&footer_cache);
443 }
444
445 /* Settings on how to print the events */
446 // True if the --short-form flag was specified
447 bool short_form;
448 // The X in --base64-output=X
449 enum_base64_output_mode base64_output_mode;
450 // True if the --skip-gtids flag was specified.
451 bool skip_gtids;
452
453 /*
454 This is set whenever a Format_description_event is printed.
455 Later, when an event is printed in base64, this flag is tested: if
456 no Format_description_event has been seen, it is unsafe to print
457 the base64 event, so an error message is generated.
458 */
459 bool printed_fd_event;
460 my_off_t hexdump_from;
461 uint8 common_header_len;
462 char delimiter[16];
463
464 uint verbose;
465 table_mapping m_table_map;
466 table_mapping m_table_map_ignored;
467
468 /*
469 These three caches are used by the row-based replication events to
470 collect the header information and the main body of the events
471 making up a statement and in footer section any verbose related details
472 or comments related to the statement.
473 */
474 IO_CACHE head_cache;
475 IO_CACHE body_cache;
476 IO_CACHE footer_cache;
477 /* Indicate if the body cache has unflushed events */
478 bool have_unflushed_events;
479
480 /*
481 True if an event was skipped while printing the events of
482 a transaction and no COMMIT statement or XID event was ever
483 output (ie, was filtered out as well). This can be triggered
484 by the --database option of mysqlbinlog.
485
486 False, otherwise.
487 */
488 bool skipped_event_in_transaction;
489
490 bool print_table_metadata;
491
492 /**
493 True if --require_row_format is passed.
494 If true
495 It prints at start SET @@session.require_row_format = 1
496 It omits the SET @@session.pseudo_thread_id printed on Query events
497 */
498 bool require_row_format;
499
500 /**
501 The version of the last server that sent the transaction
502 */
503 uint32_t immediate_server_version;
504};
505#endif
506
507/*
508 A specific to the database-scheduled MTS type.
511 const char *name[MAX_DBS_IN_EVENT_MTS]{nullptr};
512 int num{0};
513
514 Mts_db_names() = default;
515
516 void reset_and_dispose() {
517 for (int i = 0; i < MAX_DBS_IN_EVENT_MTS; i++) {
518 free(const_cast<char *>(name[i]));
519 name[i] = nullptr;
520 }
521 num = 0;
522 }
523};
524
525/**
526 @class Log_event
527
528 This is the abstract base class for binary log events.
529
530 @section Log_event_binary_format Binary Format
531
532 The format of the event is described @ref Binary_log_event_format "here".
533
534 @subsection Log_event_format_of_atomic_primitives Format of Atomic Primitives
535
536 - All numbers, whether they are 16-, 24-, 32-, or 64-bit numbers,
537 are stored in little endian, i.e., the least significant byte first,
538 unless otherwise specified.
540*/
541class Log_event {
542 public:
543 /**
544 Enumeration of what kinds of skipping (and non-skipping) that can
545 occur when the slave executes an event.
546
547 @see shall_skip
548 @see do_shall_skip
549 */
550 enum enum_skip_reason {
551 /**
552 Don't skip event.
553 */
555
556 /**
557 Skip event by ignoring it.
558
559 This means that the slave skip counter will not be changed.
560 */
562
563 /**
564 Skip event and decrease skip counter.
565 */
567 };
569 protected:
572 /*
573 If possible the event should use a non-transactional cache before
574 being flushed to the binary log. This means that it must be flushed
575 right after its correspondent statement is completed.
576 */
578 /*
579 The event should use a transactional cache before being flushed to
580 the binary log. This means that it must be flushed upon commit or
581 rollback.
582 */
584 /*
585 The event must be written directly to the binary log without going
586 through any cache.
587 */
589 /*
590 If there is a need for different types, introduce them before this.
591 */
593 };
597 /*
598 The event must be written to a cache and upon commit or rollback
599 written to the binary log.
600 */
602 /*
603 The event must be written to an empty cache and immediately written
604 to the binary log without waiting for any other event.
605 */
607 /*
608 If there is a need for different types, introduce them before this.
609 */
611 };
612
613 /**
614 Writes the common header of this event to the given memory buffer.
615
616 This does not update the checksum.
617
618 @note This has the following form:
619
620 +---------+---------+---------+------------+-----------+-------+
621 |timestamp|type code|server_id|event_length|end_log_pos|flags |
622 |4 bytes |1 byte |4 bytes |4 bytes |4 bytes |2 bytes|
623 +---------+---------+---------+------------+-----------+-------+
624
625 @param buf Memory buffer to write to. This must be at least
626 LOG_EVENT_HEADER_LEN bytes long.
627
628 @return The number of bytes written, i.e., always
629 LOG_EVENT_HEADER_LEN.
630 */
632 /**
633 Writes the common-header of this event to the given output stream and
634 updates the checksum.
635
636 @param ostream The event will be written to this output stream.
637
638 @param data_length The length of the post-header section plus the
639 length of the data section; i.e., the length of the event minus
640 the common-header and the checksum.
641 */
642 bool write_header(Basic_ostream *ostream, size_t data_length);
643 bool write_footer(Basic_ostream *ostream);
644 bool need_checksum();
645
646 public:
647 /*
648 A temp buffer for read_log_event; it is later analysed according to the
649 event's type, and its content is distributed in the event-specific fields.
650 */
651 char *temp_buf;
652
653 /*
654 This variable determines whether the event is responsible for deallocating
655 the memory pointed by temp_buf. When set to true temp_buf is deallocated
656 and when it is set to false just make temp_buf point to NULL.
657 */
660 /* The number of seconds the query took to run on the master. */
661 ulong exec_time;
662
663 /*
664 The master's server id (is preserved in the relay log; used to
665 prevent from infinite loops in circular replication).
666 */
668
669 /**
670 A storage to cache the global system variable's value.
671 Handling of a separate event will be governed its member.
672 */
673 ulong rbr_exec_mode;
674
675 /**
676 Defines the type of the cache, if any, where the event will be
677 stored before being flushed to disk.
678 */
680
681 /**
682 Defines when information, i.e. event or cache, will be flushed
683 to disk.
684 */
686 /**
687 Placeholder for event checksum while writing to binlog.
688 */
690 /**
691 Index in @c rli->gaq array to indicate a group that this event is
692 purging. The index is set by Coordinator to a group terminator
693 event is checked by Worker at the event execution. The indexed
694 data represent the Worker progress status.
695 */
696 ulong mts_group_idx;
697
698 /**
699 The Log_event_header class contains the variable present
700 in the common header
701 */
703
704 /**
705 The Log_event_footer class contains the variable present
706 in the common footer. Currently, footer contains only the checksum_alg.
707 */
709 /**
710 MTS: associating the event with either an assigned Worker or Coordinator.
711 Additionally the member serves to tag deferred (IRU) events to avoid
712 the event regular time destruction.
713 */
715
716 /**
717 A copy of the main rli value stored into event to pass to MTS worker rli
718 */
721#ifdef MYSQL_SERVER
722 THD *thd;
723 /**
724 Partition info associate with event to deliver to MTS event applier
725 */
726 db_worker_hash_entry *mts_assigned_partitions[MAX_DBS_IN_EVENT_MTS];
727
730 enum_event_cache_type cache_type_arg,
731 enum_event_logging_type logging_type_arg);
732 Log_event(THD *thd_arg, uint16 flags_arg,
733 enum_event_cache_type cache_type_arg,
734 enum_event_logging_type logging_type_arg,
737 /*
738 init_show_field_list() prepares the column names and types for the
739 output of SHOW BINLOG EVENTS; it is used only by SHOW BINLOG
740 EVENTS.
741 */
742 static void init_show_field_list(mem_root_deque<Item *> *field_list);
743
744 int net_send(Protocol *protocol, const char *log_name, my_off_t pos);
745
746 /**
747 Stores a string representation of this event in the Protocol.
748 This is used by SHOW BINLOG EVENTS.
749
750 @retval 0 success
751 @retval nonzero error
752 */
753 virtual int pack_info(Protocol *protocol);
754
755 virtual const char *get_db();
756#else // ifdef MYSQL_SERVER
757 /* print*() functions are used by mysqlbinlog */
758 virtual void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const = 0;
759 void print_timestamp(IO_CACHE *file, time_t *ts) const;
760 void print_header(IO_CACHE *file, PRINT_EVENT_INFO *print_event_info,
761 bool is_more) const;
762 void print_base64(IO_CACHE *file, PRINT_EVENT_INFO *print_event_info,
763 bool is_more) const;
764#endif // ifdef MYSQL_SERVER ... else
765
766 void *operator new(size_t size);
767
768 static void operator delete(void *ptr, size_t) { my_free(ptr); }
770 /* Placement version of the above operators */
771 static void *operator new(size_t, void *ptr) { return ptr; }
772 static void operator delete(void *, void *) {}
773 /**
774 Write the given buffer to the given output stream, updating the
775 checksum if checksums are enabled.
776
777 @param ostream The output stream to write to.
778 @param buf The buffer to write.
779 @param data_length The number of bytes to write.
780
781 @retval false Success.
782 @retval true Error.
783 */
784 bool wrapper_my_b_safe_write(Basic_ostream *ostream, const uchar *buf,
785 size_t data_length);
787#ifdef MYSQL_SERVER
788 virtual bool write(Basic_ostream *ostream) {
789 return (write_header(ostream, get_data_size()) ||
790 write_data_header(ostream) || write_data_body(ostream) ||
791 write_footer(ostream));
792 }
793
794 time_t get_time();
796 virtual bool write_data_header(Basic_ostream *) { return false; }
797 virtual bool write_data_body(Basic_ostream *) { return false; }
798#endif
799
801 return common_header->type_code;
802 }
803
804 /**
805 Return true if the event has to be logged using SBR for DMLs.
806 */
807 virtual bool is_sbr_logging_format() const { return false; }
808 /**
809 Return true if the event has to be logged using RBR for DMLs.
810 */
811 virtual bool is_rbr_logging_format() const { return false; }
812
813 /*
814 is_valid is event specific sanity checks to determine that the
815 object is correctly initialized.
816 */
817 bool is_valid();
818 void set_artificial_event() {
820 /*
821 Artificial events are automatically generated and do not exist
822 in master's binary log, so log_pos should be set to 0.
823 */
827 bool is_artificial_event() const {
829 }
830 bool is_relay_log_event() const {
832 }
833 bool is_ignorable_event() const {
835 }
836 bool is_no_filter_event() const {
838 }
839 inline bool is_using_trans_cache() const {
841 }
842 inline bool is_using_stmt_cache() const {
844 }
845 inline bool is_using_immediate_logging() const {
847 }
848
849 /*
850 For the events being decoded in BAPI, common_header should
851 point to the header object which is contained within the class
852 Binary_log_event.
853 */
856
857 /**
858 Allow thread to CLAIM or DISCLAIM the ownership of this object
859 depends on the parameter value passed
860
861 @param claim
862 True - claim ownership of the memory
863 False - disclaim ownership of the memory
864 */
865 virtual void claim_memory_ownership([[maybe_unused]] bool claim) {}
867 virtual ~Log_event() { free_temp_buf(); }
868 void register_temp_buf(char *buf, bool free_in_destructor = true) {
869 m_free_temp_buf_in_destructor = free_in_destructor;
871 }
872 void free_temp_buf() {
873 if (temp_buf) {
875 temp_buf = nullptr;
876 }
877 }
878 /*
879 Get event length for simple events. For complicated events the length
880 is calculated during write()
881 */
882 virtual size_t get_data_size() { return 0; }
883 /**
884 Returns the human readable name of the given event type.
885 */
887 /// Get the name of an event type, or "Unknown" if out of range.
888 /// @param type The type as an int
889 /// @retval name of an event type, if it is one
890 /// @retval "Unknown" if the value is out of range
891 static const char *get_type_str(uint type);
892 /**
893 Returns the human readable name of this event's type.
894 */
895 const char *get_type_str() const;
896 /* Return start of query time or current time */
897
898#if defined(MYSQL_SERVER)
899 /**
900 Is called from get_mts_execution_mode() to
901
902 @return true if the event needs applying with synchronization
903 against Workers, otherwise
904 false
905
906 @note There are incompatile combinations such as referred further events
907 are wrapped with BEGIN/COMMIT. Such cases should be identified
908 by the caller and treats correspondingly.
909
910 todo: to mts-support Old master Load-data related events
911 */
912 bool is_mts_sequential_exec() const {
915
916 static bool is_mts_sequential_exec(
918 switch (type_code) {
924 return true;
925 default:
926 return false;
927 }
928 }
929
930 /*
931 possible decisions by get_mts_execution_mode().
932 The execution mode can be PARALLEL or not (thereby sequential
933 unless impossible at all). When it's sequential it further breaks into
934 ASYNChronous and SYNChronous.
935 */
937 /*
938 Event is run by a Worker.
939 */
941 /*
942 Event is run by Coordinator.
943 */
945 /*
946 Event is run by Coordinator and requires synchronization with Workers.
947 */
949 /*
950 Event can't be executed neither by Workers nor Coordinator.
951 */
953 };
954
956 bool mts_in_group, mysql::binlog::event::Log_event_type type_code,
957 uint32 server_id, uint32 log_pos) {
958 /*
959 Slave workers are unable to handle Format_description_log_event,
960 Rotate_log_event and Previous_gtids_log_event correctly.
961 However, when a transaction spans multiple relay logs, these
962 events occur in the middle of a transaction. The way we handle
963 this is by marking the events as 'ASYNC', meaning that the
964 coordinator thread will handle the events without stopping the
965 worker threads.
966
967 @todo Refactor this: make Log_event::get_slave_worker handle
968 transaction boundaries in a more robust way, so that it is able
969 to process Format_description_log_event, Rotate_log_event, and
970 Previous_gtids_log_event. Then, when these events occur in the
971 middle of a transaction, make them part of the transaction so
972 that the worker that handles the transaction handles these
973 events too. /Sven
974 */
975 if (
976 /*
977 When a Format_description_log_event occurs in the middle of
978 a transaction, it either has the slave's server_id, or has
979 end_log_pos==0.
980
981 @todo This does not work when master and slave have the same
982 server_id and replicate-same-server-id is enabled, since
983 events that are not in the middle of a transaction will be
984 executed in ASYNC mode in that case.
985 */
987 ((server_id == (uint32)::server_id) || (log_pos == 0))) ||
988 /*
989 All Previous_gtids_log_events in the relay log are generated
990 by the slave. They don't have any meaning to the applier, so
991 they can always be ignored by the applier. So we can process
992 them asynchronously by the coordinator. It is also important
993 to not feed them to workers because that confuses
994 get_slave_worker.
995 */
997 /*
998 Rotate_log_event can occur in the middle of a transaction.
999 When this happens, either it is a Rotate event generated on
1000 the slave which has the slave's server_id, or it is a Rotate
1001 event that originates from a master but has end_log_pos==0.
1002 */
1003 (type_code == mysql::binlog::event::ROTATE_EVENT &&
1004 ((server_id == (uint32)::server_id) ||
1005 (log_pos == 0 && mts_in_group))))
1006 return EVENT_EXEC_ASYNC;
1007 else if (is_mts_sequential_exec(type_code))
1008 return EVENT_EXEC_SYNC;
1009 else
1010 return EVENT_EXEC_PARALLEL;
1011 }
1012
1013 private:
1014 /**
1015 MTS Coordinator finds out a way how to execute the current event.
1016
1017 Besides the parallelizable case, some events have to be applied by
1018 Coordinator concurrently with Workers and some to require synchronization
1019 with Workers (@c see wait_for_workers_to_finish) before to apply them.
1020
1021 @param mts_in_group the being group parsing status, true
1022 means inside the group
1023
1024 @retval EVENT_EXEC_PARALLEL if event is executed by a Worker
1025 @retval EVENT_EXEC_ASYNC if event is executed by Coordinator
1026 @retval EVENT_EXEC_SYNC if event is executed by Coordinator
1027 with synchronization against the Workers
1028 */
1029 enum enum_mts_event_exec_mode get_mts_execution_mode(bool mts_in_group) {
1030 return get_mts_execution_mode(mts_in_group, get_type_code(), server_id,
1032 }
1033
1034 /**
1035 @return index in [0, M] range to indicate
1036 to be assigned worker;
1037 M is the max index of the worker pool.
1038 */
1040
1041 /*
1042 Group of events can be marked to force its execution
1043 in isolation from any other Workers.
1044 Typically that is done for a transaction that contains
1045 a query accessing more than OVER_MAX_DBS_IN_EVENT_MTS databases.
1046 Factually that's a sequential mode where a Worker remains to
1047 be the applier.
1048 */
1049 virtual void set_mts_isolate_group() {
1050 assert(ends_group() ||
1054 }
1055
1056 public:
1057 /**
1058 The method fills in pointers to event's database name c-strings
1059 to a supplied array.
1060 In other than Query-log-event case the returned array contains
1061 just one item.
1062 @param[out] arg pointer to a struct containing char* array
1063 pointers to be filled in and the number
1064 of filled instances.
1065 @param rpl_filter pointer to a replication filter.
1066
1067 @return number of the filled instances indicating how many
1068 databases the event accesses.
1069 */
1070 virtual uint8 get_mts_dbs(Mts_db_names *arg,
1071 Rpl_filter *rpl_filter [[maybe_unused]]) {
1072 arg->name[0] = get_db();
1073
1074 return arg->num = mts_number_dbs();
1075 }
1076
1077 /*
1078 @return the number of updated by the event databases.
1079
1080 @note In other than Query-log-event case that's one.
1081 */
1082 virtual uint8 mts_number_dbs() { return 1; }
1083
1084 /**
1085 @return true if the terminal event of a group is marked to
1086 execute in isolation from other Workers,
1087 false otherwise
1088 */
1089 bool is_mts_group_isolated() {
1091 }
1092
1093 /**
1094 Events of a certain type can start or end a group of events treated
1095 transactionally wrt binlog.
1096
1097 Public access is required by implementation of recovery + skip.
1098
1099 @return true if the event starts a group (transaction)
1100 false otherwise
1102#endif
1103 virtual bool starts_group() const { return false; }
1104 /**
1105 @return true if the event ends a group (transaction)
1106 false otherwise
1107 */
1108 virtual bool ends_group() const { return false; }
1109#ifdef MYSQL_SERVER
1110 /**
1111 Apply the event to the database.
1112
1113 This function represents the public interface for applying an
1114 event.
1115
1116 @see do_apply_event
1117 */
1118 int apply_event(Relay_log_info *rli);
1119
1120 /**
1121 Apply the GTID event in curr_group_data to the database.
1122
1123 @param rli Pointer to coordinato's relay log info.
1124
1125 @retval 0 success
1126 @retval 1 error
1127 */
1128 inline int apply_gtid_event(Relay_log_info *rli);
1129
1130 /**
1131 Update the relay log position.
1132
1133 This function represents the public interface for "stepping over"
1134 the event and will update the relay log information.
1135
1136 @see do_update_pos
1137 */
1138 int update_pos(Relay_log_info *rli) { return do_update_pos(rli); }
1139
1140 /**
1141 Decide if the event shall be skipped, and the reason for skipping
1142 it.
1143
1144 @see do_shall_skip
1145 */
1147 DBUG_TRACE;
1149 DBUG_PRINT("info", ("skip reason=%d=%s", ret,
1150 ret == EVENT_SKIP_NOT ? "NOT"
1151 : ret == EVENT_SKIP_IGNORE ? "IGNORE"
1152 : "COUNT"));
1153 return ret;
1154 }
1155
1156 /**
1157 Primitive to apply an event to the database.
1158
1159 This is where the change to the database is made.
1160
1161 @note The primitive is protected instead of private, since there
1162 is a hierarchy of actions to be performed in some cases.
1163
1164 @see Format_description_log_event::do_apply_event()
1165
1166 @param rli Pointer to relay log info structure
1167
1168 @retval 0 Event applied successfully
1169 @retval errno Error code if event application failed
1170 */
1171 virtual int do_apply_event(Relay_log_info const *rli [[maybe_unused]]) {
1172 return 0; /* Default implementation does nothing */
1173 }
1174
1175 virtual int do_apply_event_worker(Slave_worker *w);
1176
1177 protected:
1178 /**
1179 Helper function to ignore an event w.r.t. the slave skip counter.
1180
1181 This function can be used inside do_shall_skip() for functions
1182 that cannot end a group. If the slave skip counter is 1 when
1183 seeing such an event, the event shall be ignored, the counter
1184 left intact, and processing continue with the next event.
1185
1186 A typical usage is:
1187 @code
1188 enum_skip_reason do_shall_skip(Relay_log_info *rli) {
1189 return continue_group(rli);
1190 }
1191 @endcode
1192
1193 @return Skip reason
1194 */
1196
1197 /**
1198 Advance relay log coordinates.
1199
1200 This function is called to advance the relay log coordinates to
1201 just after the event. It is essential that both the relay log
1202 coordinate and the group log position is updated correctly, since
1203 this function is used also for skipping events.
1204
1205 Normally, each implementation of do_update_pos() shall:
1206
1207 - Update the event position to refer to the position just after
1208 the event.
1209
1210 - Update the group log position to refer to the position just
1211 after the event <em>if the event is last in a group</em>
1212
1213 @param rli Pointer to relay log info structure
1214
1215 @retval 0 Coordinates changed successfully
1216 @retval errno Error code if advancing failed (usually just
1217 1). Observe that handler errors are returned by the
1218 do_apply_event() function, and not by this one.
1219 */
1220 virtual int do_update_pos(Relay_log_info *rli);
1221
1222 /**
1223 Decide if this event shall be skipped or not and the reason for
1224 skipping it.
1225
1226 The default implementation decide that the event shall be skipped
1227 if either:
1228
1229 - the server id of the event is the same as the server id of the
1230 server and <code>rli->replicate_same_server_id</code> is true,
1231 or
1232
1233 - if <code>rli->slave_skip_counter</code> is greater than zero.
1234
1235 @see do_apply_event
1236 @see do_update_pos
1237
1238 @retval Log_event::EVENT_SKIP_NOT
1239 The event shall not be skipped and should be applied.
1240
1241 @retval Log_event::EVENT_SKIP_IGNORE
1242 The event shall be skipped by just ignoring it, i.e., the slave
1243 skip counter shall not be changed. This happends if, for example,
1244 the originating server id of the event is the same as the server
1245 id of the slave.
1246
1247 @retval Log_event::EVENT_SKIP_COUNT
1248 The event shall be skipped because the slave skip counter was
1249 non-zero. The caller shall decrease the counter by one.
1250 */
1252#endif
1253};
1254
1255/*
1256 One class for each type of event.
1257 Two constructors for each class:
1258 - one to create the event for logging (when the server acts as a master),
1259 called after an update to the database is done,
1260 which accepts parameters like the query, the database, the options for LOAD
1261 DATA INFILE...
1262 - one to create the event from a packet (when the server acts as a slave),
1263 called before reproducing the update, which accepts parameters (like a
1264 buffer). Used to read from the master, from the relay log, and in
1265 mysqlbinlog. This constructor must be format-tolerant.
1266*/
1267
1268/**
1269 A Query event is written to the binary log whenever the database is
1270 modified on the master, unless row based logging is used.
1271
1272 Query_log_event is created for logging, and is called after an update to the
1273 database is done. It is used when the server acts as the master.
1274
1275 Virtual inheritance is required here to handle the diamond problem in
1276 the class @c Execute_load_query_log_event.
1277 The diamond structure is explained in @c Excecute_load_query_log_event
1278
1279 @internal
1280 The inheritance structure is as follows:
1281
1282 Binary_log_event
1283 ^
1284 |
1285 |
1286 Query_event Log_event
1287 \ /
1288 <<virtual>>\ /
1289 \ /
1290 Query_log_event
1291 @endinternal
1292*/
1294 public Log_event {
1295 protected:
1297
1298 public:
1299 // disable copy-move semantics
1302 Query_log_event(const Query_log_event &) = delete;
1303 Query_log_event &operator=(const Query_log_event &) = delete;
1304
1305 /*
1306 For events created by Query_log_event::do_apply_event (and
1307 Load_log_event::do_apply_event()) we need the *original* thread
1308 id, to be able to log the event with the original (=master's)
1309 thread id (fix for BUG#1686).
1310 */
1312
1313 /**
1314 True if this is a ROLLBACK event injected by the mts coordinator to finish a
1315 group corresponding to a partial transaction in the relay log.
1316 False otherwise and by default, as it must be explicitly set to true by the
1317 coordinator.
1318 */
1319 bool rollback_injected_by_coord = false;
1320
1321 /**
1322 The flag indicates whether the DDL query has been (already)
1323 committed or not. It's initialized as OFF at the event instantiation,
1324 flips ON when the DDL transaction has been committed with
1325 all its possible extra statement due to replication or GTID.
1326
1327 The flag status is also checked in few places to catch uncommitted
1328 transactions which can normally happen due to filtering out. In
1329 such a case the commit is deferred to @c Log_event::do_update_pos().
1330 */
1331 bool has_ddl_committed;
1332
1333#ifdef MYSQL_SERVER
1334
1335 /**
1336 Instructs the applier to skip temporary tables handling.
1337 */
1339
1343
1346 }
1347
1348 Query_log_event(THD *thd_arg, const char *query_arg, size_t query_length,
1349 bool using_trans, bool immediate, bool suppress_use,
1350 int error, bool ignore_command = false);
1351 const char *get_db() override { return db; }
1352
1353 /**
1354 @param[out] arg pointer to a struct containing char* array
1355 pointers be filled in and the number of
1356 filled instances.
1357 In case the number exceeds MAX_DBS_IN_EVENT_MTS,
1358 the overfill is indicated with assigning the number to
1359 OVER_MAX_DBS_IN_EVENT_MTS.
1360 @param rpl_filter pointer to a replication filter.
1361
1362 @return number of databases in the array or OVER_MAX_DBS_IN_EVENT_MTS.
1363 */
1366 // the empty string db name is special to indicate sequential applying
1367 mts_accessed_db_names[0][0] = 0;
1368 } else {
1369 for (uchar i = 0; i < mts_accessed_dbs; i++) {
1370 const char *db_name = mts_accessed_db_names[i];
1371
1372 // Only default database is rewritten.
1373 if (!rpl_filter->is_rewrite_empty() && !strcmp(get_db(), db_name)) {
1374 size_t dummy_len;
1375 const char *db_filtered =
1376 rpl_filter->get_rewrite_db(db_name, &dummy_len);
1377 // db_name != db_filtered means that db_name is rewritten.
1378 if (strcmp(db_name, db_filtered)) db_name = db_filtered;
1379 }
1380 arg->name[i] = db_name;
1381 }
1382 }
1383 return arg->num = mts_accessed_dbs;
1384 }
1385
1388
1389 uchar mts_number_dbs() override { return mts_accessed_dbs; }
1390
1391 int pack_info(Protocol *protocol) override;
1392#else
1393 void print_query_header(IO_CACHE *file,
1394 PRINT_EVENT_INFO *print_event_info) const;
1395 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
1396 static bool rewrite_db_in_buffer(
1397 char **buf, ulong *event_len,
1399#endif
1400
1402
1404 const char *buf,
1407 ~Query_log_event() override {
1409 }
1410
1411 void claim_memory_ownership(bool claim) override;
1412
1413#ifdef MYSQL_SERVER
1414 bool write(Basic_ostream *ostream) override;
1415 virtual bool write_post_header_for_derived(Basic_ostream *) { return false; }
1416#endif
1417
1418 /*
1419 Returns number of bytes additionally written to post header by derived
1420 events (so far it is only Execute_load_query event).
1421 */
1422 virtual ulong get_post_header_size_for_derived() { return 0; }
1423 /* Writes derived event-specific part of post header. */
1424
1425 public: /* !!! Public in this patch to allow old usage */
1426#if defined(MYSQL_SERVER)
1428 int do_apply_event(Relay_log_info const *rli) override;
1429 int do_update_pos(Relay_log_info *rli) override;
1430
1431 int do_apply_event(Relay_log_info const *rli, const char *query_arg,
1432 size_t q_len_arg);
1433#endif /* MYSQL_SERVER */
1434 /*
1435 If true, the event always be applied by slave SQL thread or be printed by
1436 mysqlbinlog
1437 */
1438 bool is_trans_keyword() const {
1439 /*
1440 Before the patch for bug#50407, The 'SAVEPOINT and ROLLBACK TO'
1441 queries input by user was written into log events directly.
1442 So the keywords can be written in both upper case and lower case
1443 together, strncasecmp is used to check both cases. they also could be
1444 binlogged with comments in the front of these keywords. for examples:
1445 / * bla bla * / SAVEPOINT a;
1446 / * bla bla * / ROLLBACK TO a;
1447 but we don't handle these cases and after the patch, both quiries are
1448 binlogged in upper case with no comments.
1449 */
1450 return !strncmp(query, "BEGIN", q_len) ||
1451 !strncmp(query, "COMMIT", q_len) ||
1452 !native_strncasecmp(query, "SAVEPOINT", 9) ||
1453 !native_strncasecmp(query, "ROLLBACK", 8) ||
1454 !native_strncasecmp(query, STRING_WITH_LEN("XA START")) ||
1456 !native_strncasecmp(query, STRING_WITH_LEN("XA PREPARE")) ||
1457 !native_strncasecmp(query, STRING_WITH_LEN("XA COMMIT")) ||
1458 !native_strncasecmp(query, STRING_WITH_LEN("XA ROLLBACK"));
1459 }
1460
1461 /**
1462 When a query log event contains a non-transaction control statement, we
1463 assume that it is changing database content (DML) and was logged using
1464 binlog_format=statement.
1465
1466 @return True the event represents a statement that was logged using SBR
1467 that can change database content.
1468 False for transaction control statements.
1469 */
1470 bool is_sbr_logging_format() const override { return !is_trans_keyword(); }
1471
1472 /**
1473 Notice, DDL queries are logged without BEGIN/COMMIT parentheses
1474 and identification of such single-query group
1475 occurs within logics of @c get_slave_worker().
1477
1478 bool starts_group() const override {
1479 return !strncmp(query, "BEGIN", q_len) ||
1480 !strncmp(query, STRING_WITH_LEN("XA START"));
1482
1483 bool ends_group() const override {
1484 return !strncmp(query, "COMMIT", q_len) ||
1485 (!native_strncasecmp(query, STRING_WITH_LEN("ROLLBACK")) &&
1486 native_strncasecmp(query, STRING_WITH_LEN("ROLLBACK TO "))) ||
1487 !strncmp(query, STRING_WITH_LEN("XA ROLLBACK"));
1488 }
1489 static size_t get_query(
1490 const char *buf, size_t length,
1492 const char **query_arg);
1493
1494 bool is_query_prefix_match(const char *pattern, uint p_len) {
1495 return !strncmp(query, pattern, p_len);
1496 }
1497
1498 /** Whether or not the statement represented by this event requires
1499 `Q_SQL_REQUIRE_PRIMARY_KEY` to be logged along aside. */
1500 bool need_sql_require_primary_key{false};
1501
1502 /** Whether or not the statement represented by this event requires
1503 `Q_DEFAULT_TABLE_ENCRYPTION` to be logged along aside. */
1505
1506 /** Whether or not the statement represented by this event requires
1507 `Q_ENABLE_CASCADE_TRIGGERS` to be logged along aside. */
1508 bool need_enable_cascade_triggers{false};
1509};
1510
1511/**
1512 @class Format_description_log_event
1513
1514 For binlog version 4.
1515 This event is saved by threads which read it, as they need it for future
1516 use (to decode the ordinary events).
1517 This is the subclass of Format_description_event
1518
1519 @internal
1520 The inheritance structure in the current design for the classes is
1521 as follows:
1522
1523 Binary_log_event
1524 ^
1525 |
1526 |
1527 Format_description_event Log_event
1528 \ /
1529 \ /
1530 \ /
1531 Format_description_log_event
1532 @endinternal
1533 @section Format_description_log_event_binary_format Binary Format
1535
1538 public Log_event {
1539 public:
1540 /*
1541 MTS Workers and Coordinator share the event and that affects its
1542 destruction. Instantiation is always done by Coordinator/SQL thread.
1543 Workers are allowed to destroy only "obsolete" instances, those
1544 that are not actual for Coordinator anymore but needed to Workers
1545 that are processing queued events depending on the old instance.
1546 The counter of a new FD is incremented by Coordinator or Worker at
1547 time of {Relay_log_info,Slave_worker}::set_rli_description_event()
1548 execution.
1549 In the same methods the counter of the "old" FD event is decremented
1550 and when it drops to zero the old FD is deleted.
1551 The latest read from relay-log event is to be
1552 destroyed by Coordinator/SQL thread at its thread exit.
1553 Notice the counter is processed even in the single-thread mode where
1554 decrement and increment are done by the single SQL thread.
1555 */
1556 std::atomic<int32> atomic_usage_counter{0};
1557
1560 const char *buf,
1561 const mysql::binlog::event::Format_description_event *description_event);
1562#ifdef MYSQL_SERVER
1563 bool write(Basic_ostream *ostream) override;
1564 int pack_info(Protocol *protocol) override;
1565#else
1566 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
1567#endif
1568
1569 size_t get_data_size() override {
1570 /*
1571 The vector of post-header lengths is considered as part of the
1572 post-header, because in a given version it never changes (contrary to the
1573 query in a Query_log_event).
1574 */
1577 }
1578
1579 void claim_memory_ownership(bool claim) override;
1580
1581 protected:
1582#if defined(MYSQL_SERVER)
1583 int do_apply_event(Relay_log_info const *rli) override;
1584 int do_update_pos(Relay_log_info *rli) override;
1586#endif
1587};
1588
1589/**
1590 @class Intvar_log_event
1591
1592 The class derives from the class Intvar_event in Binlog API,
1593 defined in the header binlog_event.h. An Intvar_log_event is
1594 created just before a Query_log_event, if the query uses one
1595 of the variables LAST_INSERT_ID or INSERT_ID. This class is used
1596 by the slave for applying the event.
1597
1598 @internal
1599 The inheritance structure in the current design for the classes is
1600 as follows:
1601
1602 Binary_log_event
1603 ^
1604 |
1605 |
1606 Intvar_event Log_event
1607 \ /
1608 \ /
1609 \ /
1610 Intvar_log_event
1611 @endinternal
1612*/
1614 public Log_event {
1615 public:
1616 // disable copy-move semantics
1619 Intvar_log_event(const Intvar_log_event &) = delete;
1620 Intvar_log_event &operator=(const Intvar_log_event &) = delete;
1622#ifdef MYSQL_SERVER
1623 Intvar_log_event(THD *thd_arg, uchar type_arg, ulonglong val_arg,
1624 enum_event_cache_type cache_type_arg,
1625 enum_event_logging_type logging_type_arg)
1626 : mysql::binlog::event::Intvar_event(type_arg, val_arg),
1627 Log_event(thd_arg, 0, cache_type_arg, logging_type_arg, header(),
1628 footer()) {
1630 }
1631 int pack_info(Protocol *protocol) override;
1632#else
1633 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
1634#endif
1635
1637 const char *buf,
1638 const mysql::binlog::event::Format_description_event *description_event);
1639 ~Intvar_log_event() override = default;
1640
1641 void claim_memory_ownership(bool claim) override;
1642
1643 size_t get_data_size() override {
1644 return 9; /* sizeof(type) + sizeof(val) */
1645 ;
1646 }
1647#ifdef MYSQL_SERVER
1648 bool write(Basic_ostream *ostream) override;
1649#endif
1650
1651 bool is_sbr_logging_format() const override { return true; }
1652
1653 private:
1654#if defined(MYSQL_SERVER)
1655 int do_apply_event(Relay_log_info const *rli) override;
1656 int do_update_pos(Relay_log_info *rli) override;
1658#endif
1659};
1660
1661/**
1662 @class Rand_log_event
1663
1664 Logs random seed used by the next RAND(), and by PASSWORD() in 4.1.0.
1665 4.1.1 does not need it (it's repeatable again) so this event needn't be
1666 written in 4.1.1 for PASSWORD() (but the fact that it is written is just a
1667 waste, it does not cause bugs).
1668
1669 The state of the random number generation consists of 128 bits,
1670 which are stored internally as two 64-bit numbers.
1671
1672 @internal
1673 The inheritance structure in the current design for the classes is
1674 as follows:
1675 Binary_log_event
1676 ^
1677 |
1678 |
1679 Rand_event Log_event
1680 \ /
1681 \ /
1682 \ /
1683 Rand_log_event
1684 @endinternal
1685*/
1687 public Log_event {
1688 public:
1689 // disable copy-move semantics
1691 Rand_log_event &operator=(Rand_log_event &&) noexcept = delete;
1692 Rand_log_event(const Rand_log_event &) = delete;
1693 Rand_log_event &operator=(const Rand_log_event &) = delete;
1695#ifdef MYSQL_SERVER
1696 Rand_log_event(THD *thd_arg, ulonglong seed1_arg, ulonglong seed2_arg,
1697 enum_event_cache_type cache_type_arg,
1698 enum_event_logging_type logging_type_arg)
1699 : mysql::binlog::event::Rand_event(seed1_arg, seed2_arg),
1700 Log_event(thd_arg, 0, cache_type_arg, logging_type_arg, header(),
1701 footer()) {
1703 }
1704 int pack_info(Protocol *protocol) override;
1705#else
1706 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
1707#endif
1708
1710 const char *buf,
1711 const mysql::binlog::event::Format_description_event *description_event);
1712 ~Rand_log_event() override = default;
1713
1714 void claim_memory_ownership(bool claim) override;
1715
1716 size_t get_data_size() override { return 16; /* sizeof(ulonglong) * 2*/ }
1717#ifdef MYSQL_SERVER
1718 bool write(Basic_ostream *ostream) override;
1719#endif
1720
1721 bool is_sbr_logging_format() const override { return true; }
1722
1723 private:
1724#if defined(MYSQL_SERVER)
1725 int do_apply_event(Relay_log_info const *rli) override;
1726 int do_update_pos(Relay_log_info *rli) override;
1728#endif
1729};
1730
1731/**
1732 @class Xid_log_event
1733
1734 This is the subclass of Xid_event defined in libbinlogevent,
1735 An XID event is generated for a commit of a transaction that modifies one or
1736 more tables of an XA-capable storage engine
1737 Logs xid of the transaction-to-be-committed in the 2pc protocol.
1738 Has no meaning in replication, slaves ignore it
1739 The inheritance structure in the current design for the classes is
1740 as follows
1741
1742 @internal
1743 The inheritance structure in the current design for the classes is
1744 as follows:
1745 Binary_log_event
1746 ^
1747 |
1748 |
1749 Xid_event Log_event
1750 \ /
1751 \ /
1752 \ /
1753 Xid_log_event
1754 @endinternal
1755*/
1756#ifndef MYSQL_SERVER
1757typedef ulonglong my_xid; // this line is the same as in handler.h
1758#endif
1759
1760class Xid_apply_log_event : public Log_event {
1761 protected:
1762#ifdef MYSQL_SERVER
1763 Xid_apply_log_event(THD *thd_arg,
1767 Log_event::EVENT_NORMAL_LOGGING, header_arg, footer_arg) {}
1768#endif
1771 : Log_event(header_arg, footer_arg) {}
1772 ~Xid_apply_log_event() override = default;
1773 bool ends_group() const override { return true; }
1774#if defined(MYSQL_SERVER)
1776 int do_apply_event(Relay_log_info const *rli) override;
1777 int do_apply_event_worker(Slave_worker *rli) override;
1778 virtual bool do_commit(THD *thd_arg) = 0;
1779#endif
1781
1783 public Xid_apply_log_event {
1784 public:
1785 // disable copy-move semantics
1787 Xid_log_event &operator=(Xid_log_event &&) noexcept = delete;
1788 Xid_log_event(const Xid_log_event &) = delete;
1789 Xid_log_event &operator=(const Xid_log_event &) = delete;
1791#ifdef MYSQL_SERVER
1792 Xid_log_event(THD *thd_arg, my_xid x)
1793 : mysql::binlog::event::Xid_event(x),
1794 Xid_apply_log_event(thd_arg, header(), footer()) {
1796 }
1797 int pack_info(Protocol *protocol) override;
1798#else
1799 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
1800#endif
1801
1803 const char *buf,
1804 const mysql::binlog::event::Format_description_event *description_event);
1805 ~Xid_log_event() override = default;
1806
1807 void claim_memory_ownership(bool claim) override;
1808
1809 size_t get_data_size() override { return sizeof(xid); }
1810#ifdef MYSQL_SERVER
1811 bool write(Basic_ostream *ostream) override;
1812#endif
1813 private:
1814#if defined(MYSQL_SERVER)
1815 bool do_commit(THD *thd_arg) override;
1816#endif
1817};
1818
1819/**
1820 @class XA_prepare_log_event
1821
1822 Similar to Xid_log_event except that
1823 - it is specific to XA transaction
1824 - it carries out the prepare logics rather than the final committing
1825 when @c one_phase member is off.
1826 From the groupping perspective the event finalizes the current "prepare" group
1827 started with XA START Query-log-event.
1828 When @c one_phase is false Commit of Rollback for XA transaction are
1829 logged separately to the prepare-group events so being a groups of
1830 their own.
1832
1834 public Xid_apply_log_event {
1835 private:
1836 /* Total size of buffers to hold serialized members of XID struct */
1837 static const int xid_bufs_size = 12;
1838
1839 public:
1840#ifdef MYSQL_SERVER
1841 XA_prepare_log_event(THD *thd_arg, XID *xid_arg, bool one_phase_arg = false)
1842 : mysql::binlog::event::XA_prepare_event((void *)xid_arg, one_phase_arg),
1844#endif
1846 const char *buf,
1847 const mysql::binlog::event::Format_description_event *description_event)
1848 : mysql::binlog::event::XA_prepare_event(buf, description_event),
1850 DBUG_TRACE;
1851 xid = nullptr;
1852 return;
1853 }
1856 }
1857 size_t get_data_size() override {
1858 return xid_bufs_size + my_xid.gtrid_length + my_xid.bqual_length;
1859 }
1860
1861 void claim_memory_ownership(bool claim) override;
1862
1863#ifdef MYSQL_SERVER
1864 bool write(Basic_ostream *ostream) override;
1865#else
1866 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
1867#endif
1868#if defined(MYSQL_SERVER)
1869 int pack_info(Protocol *protocol) override;
1870 bool do_commit(THD *thd) override;
1871#endif
1872};
1873
1874/**
1875 @class User_var_log_event
1876
1877 Every time a query uses the value of a user variable, a User_var_log_event is
1878 written before the Query_log_event, to set the user variable.
1879
1880 @internal
1881 The inheritance structure in the current design for the classes is
1882 as follows:
1883 Binary_log_event
1884 ^
1885 |
1886 |
1887 User_var_event Log_event
1888 \ /
1889 \ /
1890 \ /
1891 User_var_log_event
1892 @endinternal
1893*/
1895 public Log_event {
1896 public:
1897 // disable copy-move semantics
1900 User_var_log_event(const User_var_log_event &) = delete;
1901 User_var_log_event &operator=(const User_var_log_event &) = delete;
1903#ifdef MYSQL_SERVER
1906 User_var_log_event(THD *thd_arg, const char *name_arg, uint name_len_arg,
1907 char *val_arg, ulong val_len_arg, Item_result type_arg,
1908 uint charset_number_arg, uchar flags_arg,
1909 enum_event_cache_type cache_type_arg,
1910 enum_event_logging_type logging_type_arg)
1911 : mysql::binlog::event::User_var_event(name_arg, name_len_arg, val_arg,
1912 val_len_arg, type_arg,
1913 charset_number_arg, flags_arg),
1914 Log_event(thd_arg, 0, cache_type_arg, logging_type_arg, header(),
1915 footer()),
1916 deferred(false) {
1917 common_header->set_is_valid(name != nullptr);
1918 }
1919 int pack_info(Protocol *protocol) override;
1920#else
1921 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
1922#endif
1923
1925 const char *buf,
1926 const mysql::binlog::event::Format_description_event *description_event);
1927 ~User_var_log_event() override = default;
1928
1929 void claim_memory_ownership(bool claim) override;
1930
1931#ifdef MYSQL_SERVER
1932 bool write(Basic_ostream *ostream) override;
1933 /*
1934 Getter and setter for deferred User-event.
1935 Returns true if the event is not applied directly
1936 and which case the applier adjusts execution path.
1937 */
1938 bool is_deferred() { return deferred; }
1939 /*
1940 In case of the deferred applying the variable instance is flagged
1941 and the parsing time query id is stored to be used at applying time.
1942 */
1943 void set_deferred(query_id_t qid) {
1944 deferred = true;
1945 query_id = qid;
1946 }
1947#endif
1948
1949 bool is_sbr_logging_format() const override { return true; }
1950
1951 private:
1952#if defined(MYSQL_SERVER)
1953 int do_apply_event(Relay_log_info const *rli) override;
1954 int do_update_pos(Relay_log_info *rli) override;
1956#endif
1957};
1958
1959/**
1960 @class Stop_log_event
1962*/
1964 public Log_event {
1965 public:
1966 // disable copy-move semantics
1968 Stop_log_event &operator=(Stop_log_event &&) noexcept = delete;
1969 Stop_log_event(const Stop_log_event &) = delete;
1970 Stop_log_event &operator=(const Stop_log_event &) = delete;
1972#ifdef MYSQL_SERVER
1977 }
1978
1979#else
1980 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
1981#endif
1982
1984 const char *buf,
1985 const mysql::binlog::event::Format_description_event *description_event)
1986 : mysql::binlog::event::Stop_event(buf, description_event),
1987 Log_event(header(), footer()) {
1988 DBUG_TRACE;
1989 return;
1992 ~Stop_log_event() override = default;
1995 }
1996
1997 void claim_memory_ownership(bool claim) override;
1998
1999 private:
2000#if defined(MYSQL_SERVER)
2001 int do_update_pos(Relay_log_info *rli) override;
2003 /*
2004 Events from ourself should be skipped, but they should not
2005 decrease the slave skip counter.
2006 */
2007 if (this->server_id == ::server_id)
2009 else
2011 }
2012#endif
2013};
2014
2015/**
2016 @class Rotate_log_event
2017
2018 This will be deprecated when we move to using sequence ids.
2019 This class is a subclass of Rotate_event, defined in binlogevent, and is used
2020 by the slave for updating the position in the relay log.
2021
2022 It is used by the master inorder to write the rotate event in the binary log.
2023
2024 @internal
2025 The inheritance structure in the current design for the classes is
2026 as follows:
2027
2028 Binary_log_event
2029 ^
2030 |
2031 |
2032 Rotate_event Log_event
2033 \ /
2034 \ /
2035 \ /
2036 Rotate_log_event
2037 @endinternal
2038*/
2040 public Log_event {
2041 public:
2042 // disable copy-move semantics
2045 Rotate_log_event(const Rotate_log_event &) = delete;
2046 Rotate_log_event &operator=(const Rotate_log_event &) = delete;
2047
2048#ifdef MYSQL_SERVER
2049 Rotate_log_event(const char *new_log_ident_arg, size_t ident_len_arg,
2050 ulonglong pos_arg, uint flags);
2051 int pack_info(Protocol *protocol) override;
2052#else
2053 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
2054#endif
2055
2057 const char *buf,
2059 ~Rotate_log_event() override = default;
2060 size_t get_data_size() override {
2061 return ident_len +
2063 }
2064
2065 void claim_memory_ownership(bool claim) override;
2066
2067#ifdef MYSQL_SERVER
2068 bool write(Basic_ostream *ostream) override;
2069#endif
2070
2071 private:
2072#if defined(MYSQL_SERVER)
2073 int do_update_pos(Relay_log_info *rli) override;
2075#endif
2076};
2077
2078/**
2079 @class Append_block_log_event
2080
2081 This event is created to contain the file data. One LOAD_DATA_INFILE
2082 can have 0 or more instances of this event written to the binary log
2083 depending on the size of the file.
2084
2085 @internal
2086 The inheritance structure is as follows
2087
2088 Binary_log_event
2089 ^
2090 |
2091 |
2092 B_l:A_B_E Log_event
2093 \ /
2094 \ /
2095 <<vir>>\ /
2096 \ /
2097 Append_block_log_event
2098 B_l: Namespace Binary_log
2099 A_B_E: class Append_block_event
2100 @endinternal
2102*/
2105 public Log_event {
2106 public:
2107 // disable copy-move semantics
2110 delete;
2112 Append_block_log_event &operator=(const Append_block_log_event &) = delete;
2113
2114#ifdef MYSQL_SERVER
2115 Append_block_log_event(THD *thd, const char *db_arg, uchar *block_arg,
2116 uint block_len_arg, bool using_trans);
2117 int pack_info(Protocol *protocol) override;
2118 virtual int get_create_or_append() const;
2119#else
2120 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
2121#endif
2122
2124 const char *buf,
2125 const mysql::binlog::event::Format_description_event *description_event);
2126 ~Append_block_log_event() override = default;
2127
2128 void claim_memory_ownership(bool claim) override;
2129
2130 size_t get_data_size() override {
2131 return block_len +
2133 }
2134#ifdef MYSQL_SERVER
2135 bool write(Basic_ostream *ostream) override;
2136 const char *get_db() override { return db; }
2137#endif
2138
2139 bool is_sbr_logging_format() const override { return true; }
2140
2141 private:
2142#if defined(MYSQL_SERVER)
2143 int do_apply_event(Relay_log_info const *rli) override;
2144#endif
2145};
2146
2147/**
2148 @class Delete_file_log_event
2149
2150 Delete_file_log_event is created when the LOAD_DATA query fails on the
2151 master for some reason, and the slave should be notified to abort the
2152 load. The event is required since the master starts writing the loaded
2153 block into the binary log before the statement ends. In case of error,
2154 the slave should abort, and delete any temporary file created while
2155 applying the (NEW_)LOAD_EVENT.
2156
2157 @internal
2158 The inheritance structure is as follows
2159
2160 Binary_log_event
2161 ^
2162 |
2163 |
2164 B_l:D_F_E Log_event
2165 \ /
2166 \ /
2167 \ /
2168 \ /
2169 Delete_file_log_event
2170
2171 B_l: Namespace Binary_log
2172 D_F_E: class Delete_file_event
2173 @endinternal
2175*/
2177 public Log_event {
2178 public:
2179 // disable copy-move semantics
2183 Delete_file_log_event &operator=(const Delete_file_log_event &) = delete;
2184
2185#ifdef MYSQL_SERVER
2186 Delete_file_log_event(THD *thd, const char *db_arg, bool using_trans);
2187 int pack_info(Protocol *protocol) override;
2188#else
2189 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
2190 void print(FILE *file, PRINT_EVENT_INFO *print_event_info, bool enable_local);
2191#endif
2192
2194 const char *buf,
2195 const mysql::binlog::event::Format_description_event *description_event);
2196 ~Delete_file_log_event() override = default;
2197
2198 void claim_memory_ownership(bool claim) override;
2199
2200 size_t get_data_size() override {
2202 }
2203#ifdef MYSQL_SERVER
2204 bool write(Basic_ostream *ostream) override;
2205 const char *get_db() override { return db; }
2206#endif
2207
2208 bool is_sbr_logging_format() const override { return true; }
2209
2210 private:
2211#if defined(MYSQL_SERVER)
2212 int do_apply_event(Relay_log_info const *rli) override;
2213#endif
2214};
2215
2216/**
2217 @class Begin_load_query_log_event
2218
2219 Event for the first block of file to be loaded, its only difference from
2220 Append_block event is that this event creates or truncates existing file
2221 before writing data.
2222
2223 @internal
2224 The inheritance structure is as follows
2225
2226 Binary_log_event
2227 ^
2228 |
2229 |
2230 |
2231 Log_event B_l:A_B_E
2232 ^ /\
2233 | / \
2234 | <<vir>>/ \ <<vir>>
2235 | / \
2236 | / \
2237 | / \
2238 Append_block_log_event B_l:B_L_Q_E
2239 \ /
2240 \ /
2241 \ /
2242 \ /
2243 \ /
2244 Begin_load_query_log_event
2245
2246 B_l: Namespace Binary_log
2247 A_B_E: class Append_block_event
2248 B_L_Q_E: Begin_load_query_event
2249 @endinternal
2250
2251 @section Begin_load_query_log_event_binary_format Binary Format
2252*/
2254 : public Append_block_log_event,
2256 public:
2257 // disable copy-move semantics
2263 delete;
2264
2265#ifdef MYSQL_SERVER
2266 Begin_load_query_log_event(THD *thd_arg, const char *db_arg, uchar *block_arg,
2267 uint block_len_arg, bool using_trans);
2269 int get_create_or_append() const override;
2270#endif
2272 const char *buf,
2273 const mysql::binlog::event::Format_description_event *description_event);
2274 ~Begin_load_query_log_event() override = default;
2275
2276 void claim_memory_ownership(bool claim) override;
2277
2278 private:
2279#if defined(MYSQL_SERVER)
2281#endif
2282};
2283
2284/**
2285 @class Execute_load_query_log_event
2286
2287 Event responsible for LOAD DATA execution, it similar to Query_log_event
2288 but before executing the query it substitutes original filename in LOAD DATA
2289 query with name of temporary file.
2290
2291 @internal
2292 The inheritance structure is as follows:
2293
2294 Binary_log_event
2295 ^
2296 |
2297 |
2298 |
2299 Log_event B_l:Query_event
2300 ^ /\
2301 | / \
2302 | <<vir>>/ \ <<vir>>
2303 | / \
2304 | / \
2305 | / \
2306 Query_log_event B_l:E_L_Q_E
2307 \ /
2308 \ /
2309 \ /
2310 \ /
2311 \ /
2312 Execute_load_query_log_event
2313
2314 B_l: Namespace Binary_log
2315 E_L_Q_E: class Execute_load_query
2316 @endinternal
2317
2318 @section Execute_load_query_log_event_binary_format Binary Format
2319*/
2321 : public Query_log_event,
2323 public:
2324#ifdef MYSQL_SERVER
2326 THD *thd, const char *query_arg, ulong query_length,
2327 uint fn_pos_start_arg, uint fn_pos_end_arg,
2329 bool using_trans, bool immediate, bool suppress_use, int errcode);
2330 int pack_info(Protocol *protocol) override;
2331#else
2332 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
2333 /* Prints the query as LOAD DATA LOCAL and with rewritten filename */
2334 void print(FILE *file, PRINT_EVENT_INFO *print_event_info,
2335 const char *local_fname) const;
2336#endif
2338 const char *buf,
2339 const mysql::binlog::event::Format_description_event *description_event);
2340 ~Execute_load_query_log_event() override = default;
2341
2342 ulong get_post_header_size_for_derived() override;
2343#ifdef MYSQL_SERVER
2344 bool write_post_header_for_derived(Basic_ostream *ostream) override;
2345#endif
2346
2347 bool is_sbr_logging_format() const override { return true; }
2348
2349 void claim_memory_ownership(bool claim) override;
2350
2351 private:
2352#if defined(MYSQL_SERVER)
2353 int do_apply_event(Relay_log_info const *rli) override;
2354#endif
2355};
2357#if defined MYSQL_SERVER
2359 public:
2360 Load_query_generator(THD *thd_arg, const sql_exchange *ex, const char *db_arg,
2361 const char *table_name_arg, bool is_concurrent_arg,
2362 bool replace, bool ignore);
2363
2364 const String *generate(size_t *fn_start, size_t *fn_end);
2366 private:
2367 const size_t BUF_SIZE = 2048;
2368 String str;
2369 char *buf[2048];
2373 const char *db;
2374 const char *table_name;
2375 const char *fname;
2378 bool has_replace;
2379 bool has_ignore;
2380};
2381#endif
2382#ifndef MYSQL_SERVER
2383/**
2384 @class Unknown_log_event
2385
2386*/
2387class Unknown_log_event : public mysql::binlog::event::Unknown_event,
2388 public Log_event {
2389 public:
2390 // disable copy-move semantics
2391 Unknown_log_event(Unknown_log_event &&) noexcept = delete;
2392 Unknown_log_event &operator=(Unknown_log_event &&) noexcept = delete;
2393 Unknown_log_event(const Unknown_log_event &) = delete;
2394 Unknown_log_event &operator=(const Unknown_log_event &) = delete;
2395
2396 /**
2397 Even if this is an unknown event, we still pass description_event to
2398 Log_event's ctor, this way we can extract maximum information from the
2399 event's header (the unique ID for example).
2400 */
2401 Unknown_log_event(
2402 const char *buf,
2403 const mysql::binlog::event::Format_description_event *description_event)
2404 : mysql::binlog::event::Unknown_event(buf, description_event),
2405 Log_event(header(), footer()) {
2406 DBUG_TRACE;
2407 if (!is_valid()) return;
2408 common_header->set_is_valid(true);
2409 return;
2410 }
2411
2412 ~Unknown_log_event() override = default;
2413 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
2416 }
2417};
2418#endif
2419char *str_to_hex(char *to, const char *from, size_t len);
2420
2421/**
2422 @class Table_map_log_event
2423
2424 Table_map_log_event which maps a table definition to a number.
2425
2426 @internal
2427 The inheritance structure in the current design for the classes is
2428 as follows:
2429
2430 Binary_log_event
2431 ^
2432 |
2433 |
2434 Table_map_event Log_event
2435 \ /
2436 \ /
2437 \ /
2438 Table_map_log_event
2439 @endinternal
2440*/
2442 public Log_event {
2443 public:
2444 // disable copy-move semantics
2447 Table_map_log_event(const Table_map_log_event &) = delete;
2448 Table_map_log_event &operator=(const Table_map_log_event &) = delete;
2450 /** Constants */
2452
2453 /**
2454 Enumeration of the errors that can be returned.
2457 ERR_OPEN_FAILURE = -1, /**< Failure to open table */
2458 ERR_OK = 0, /**< No error */
2459 ERR_TABLE_LIMIT_EXCEEDED = 1, /**< No more room for tables */
2460 ERR_OUT_OF_MEM = 2, /**< Out of memory */
2461 ERR_BAD_TABLE_DEF = 3, /**< Table definition does not match */
2462 ERR_RBR_TO_SBR = 4 /**< daisy-chanining RBR to SBR not allowed */
2464
2465 enum enum_flag {
2466 /**
2467 Nothing here right now, but the flags support is there in
2468 preparation for changes that are coming. Need to add a
2469 constant to make it compile under HP-UX: aCC does not like
2470 empty enumerations.
2473 };
2474
2475 /** Special constants representing sets of flags */
2476 enum {
2478 TM_BIT_LEN_EXACT_F = (1U << 0),
2479 TM_REFERRED_FK_DB_F = (1U << 1),
2480 /**
2481 Table has generated invisible primary key. MySQL generates primary key
2482 while creating a table if sql_generate_invisible_primary_key is "ON" and
2483 table is PK-less.
2485 TM_GENERATED_INVISIBLE_PK_F = (1U << 2)
2487
2488 flag_set get_flags(flag_set flag) const { return m_flags & flag; }
2489
2490#ifdef MYSQL_SERVER
2491 Table_map_log_event(THD *thd_arg, TABLE *tbl,
2493 bool using_trans);
2494#endif
2496 const char *buf,
2497 const mysql::binlog::event::Format_description_event *description_event);
2498
2499 void claim_memory_ownership(bool claim) override;
2500
2501 ~Table_map_log_event() override;
2502
2503#ifndef MYSQL_SERVER
2504 table_def *create_table_def() {
2505 assert(m_colcnt > 0);
2506 uint vector_column_count =
2508 std::vector<unsigned int> vector_dimensionality;
2509 if (vector_column_count > 0) {
2512 vector_dimensionality = fields.m_vector_dimensionality;
2513 }
2516 vector_dimensionality);
2517 }
2518 static bool rewrite_db_in_buffer(
2519 char **buf, ulong *event_len,
2521#endif
2525 const char *get_table_name() const { return m_tblnam.c_str(); }
2526 const char *get_db_name() const { return m_dbnam.c_str(); }
2527
2528 size_t get_data_size() override { return m_data_size; }
2529#ifdef MYSQL_SERVER
2530 virtual int save_field_metadata();
2531 bool write_data_header(Basic_ostream *ostream) override;
2532 bool write_data_body(Basic_ostream *ostream) override;
2533 const char *get_db() override { return m_dbnam.c_str(); }
2534 uint8 mts_number_dbs() override {
2536 }
2537 /**
2538 @param[out] arg pointer to a struct containing char* array
2539 pointers be filled in and the number of filled instances.
2540 @param rpl_filter pointer to a replication filter.
2541
2542 @return number of databases in the array: either one or
2543 OVER_MAX_DBS_IN_EVENT_MTS, when the Table map event reports
2544 foreign keys constraint.
2545 */
2547 const char *db_name = get_db();
2548
2550 size_t dummy_len;
2551 const char *db_filtered = rpl_filter->get_rewrite_db(db_name, &dummy_len);
2552 // db_name != db_filtered means that db_name is rewritten.
2553 if (strcmp(db_name, db_filtered)) db_name = db_filtered;
2554 }
2555
2556 if (!get_flags(TM_REFERRED_FK_DB_F)) arg->name[0] = db_name;
2557
2558 return arg->num = mts_number_dbs();
2559 }
2560
2561#endif
2562
2563#if defined(MYSQL_SERVER)
2564 int pack_info(Protocol *protocol) override;
2565#endif
2566
2567#ifndef MYSQL_SERVER
2568 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
2569
2570 /**
2571 Print column metadata. Its format looks like:
2572 # Columns(colume_name type, colume_name type, ...)
2573 if colume_name field is not logged into table_map_log_event, then
2574 only type is printed.
2575
2576 @param[out] file the place where colume metadata is printed
2577 @param[in] fields The metadata extracted from optional metadata fields
2578 */
2579 void print_columns(IO_CACHE *file,
2580 const Optional_metadata_fields &fields) const;
2581 /**
2582 Print primary information. Its format looks like:
2583 # Primary Key(colume_name, column_name(prifix), ...)
2584 if colume_name field is not logged into table_map_log_event, then
2585 colume index is printed.
2586
2587 @param[out] file the place where primary key is printed
2588 @param[in] fields The metadata extracted from optional metadata fields
2589 */
2590 void print_primary_key(IO_CACHE *file,
2591 const Optional_metadata_fields &fields) const;
2592#endif
2593
2595
2596 bool is_rbr_logging_format() const override { return true; }
2597
2598 private:
2599#if defined(MYSQL_SERVER)
2600 int do_apply_event(Relay_log_info const *rli) override;
2601 int do_update_pos(Relay_log_info *rli) override;
2603#endif
2605#ifdef MYSQL_SERVER
2606 TABLE *m_table;
2608 // Metadata fields buffer
2610
2611 /**
2612 Wrapper around `TABLE *m_table` that abstracts the table field set iteration
2613 logic, since it is not mandatory that all table fields are to be
2614 replicated. For details, @see ReplicatedColumnsView class documentation.
2615
2616 A smart pointer is used here as the developer might want to instantiate the
2617 view using different classes in runtime depending on the given context.
2618 As of now the column view is only used on outbound scenarios
2619 */
2621
2622 /**
2623 Capture the optional metadata fields which should be logged into
2624 table_map_log_event and serialize them into m_metadata_buf.
2625 */
2626 void init_metadata_fields();
2627 bool init_signedness_field();
2628 /**
2629 Capture and serialize character sets. Character sets for
2630 character columns (TEXT etc) and character sets for ENUM and SET
2631 columns are stored in different metadata fields. The reason is
2632 that TEXT character sets are included even when
2633 binlog_row_metadata=MINIMAL, whereas ENUM and SET character sets
2634 are included only when binlog_row_metadata=FULL.
2635
2636 @param include_type Predicate to determine if a given Field object
2637 is to be included in the metadata field.
2638
2639 @param default_charset_type Type code when storing in "default
2640 charset" format. (See comment above Table_maps_log_event in
2641 mysql/binlog/event/rows_event.h)
2642
2643 @param column_charset_type Type code when storing in "column
2644 charset" format. (See comment above Table_maps_log_event in
2645 mysql/binlog/event/rows_event.h)
2646 */
2647 bool init_charset_field(std::function<bool(const Field *)> include_type,
2648 Optional_metadata_field_type default_charset_type,
2649 Optional_metadata_field_type column_charset_type);
2657#endif
2658
2659#ifndef MYSQL_SERVER
2660 class Charset_iterator;
2661 class Default_charset_iterator;
2662 class Column_charset_iterator;
2663#endif
2664};
2665
2666#ifdef HAVE_PSI_STAGE_INTERFACE
2667/*
2668 Helper class for PSI context while applying a Rows_log_event.
2669 */
2671 private:
2674
2675 /**
2676 A cached pointer to this stage PSI_stage_progress.
2677 */
2679
2680 /**
2681 Counter that is unconditionally incremented on each row that is processed.
2682 This is helpful in case estimation is needed after started processing
2683 a Rows_log_event.
2684 */
2687 public:
2689
2690 void set_progress(PSI_stage_progress *progress) { m_progress = progress; }
2691
2692 /**
2693 If instrumentation is enabled this member function SHALL return true.
2694 @return true if instrumentation is enabled for the given stage, false
2695 otherwise.
2696 */
2697 bool is_enabled() { return m_progress != nullptr; }
2698
2699 /**
2700 This member function shall update the progress and reestimate the remaining
2701 work needed. This MUST be called after setting n_rows_applied correctly
2702 by calling inc_n_rows_applied beforehand.
2703
2704 Cursor, begin and end are used in case estimation is needed.
2705
2706 @param cursor Pointer to where we are in the buffer of rows to be processed.
2707 @param begin Pointer to the beginning of the rows buffer.
2708 @param end Pointer to the end of the rows buffer.
2709 */
2710 void update_work_estimated_and_completed(const uchar *cursor,
2711 const uchar *begin,
2712 const uchar *end) {
2713 if (!is_enabled()) return;
2714
2716
2717 /* Estimate if need be. */
2718 if (estimated == 0) {
2719 assert(cursor > begin);
2720 const ulonglong avg_row_change_size = (cursor - begin) / m_n_rows_applied;
2721 estimated = (end - begin) / avg_row_change_size;
2723 }
2724
2725 /* reset estimated if done more work than estimated */
2726 if (m_n_rows_applied > estimated)
2729 }
2730
2731 /**
2732 Resets this object.
2733 */
2734 void end_work() {
2735 m_progress = nullptr;
2736 m_n_rows_applied = 0;
2737 }
2738
2739 /**
2740 Updates the counter of processed rows.
2741 @param delta the amount of increment to be done.
2742 */
2743 void inc_n_rows_applied(ulonglong delta) { m_n_rows_applied += delta; }
2744
2745 /**
2746 Gets the value of the counter of rows that have been processed.
2747 @return the value of the counter of rows processed so far.
2748 */
2750};
2751#endif
2752
2753/**
2754 @class Rows_log_event
2755
2756 Common base class for all row-containing log events.
2757
2758 RESPONSIBILITIES
2759
2760 Encode the common parts of all events containing rows, which are:
2761 - Write data header and data body to an IO_CACHE.
2762
2763 Virtual inheritance is required here to handle the diamond problem in
2764 the class Write_rows_log_event, Update_rows_log_event and
2765 Delete_rows_log_event.
2766 The diamond structure is explained in @c Write_rows_log_event,
2767 @c Update_rows_log_event,
2768 @c Delete_rows_log_event
2769
2770 @internal
2771 The inheritance structure in the current design for the classes is
2772 as follows:
2773
2774 Binary_log_event
2775 ^
2776 |
2777 |
2778 Rows_event Log_event
2779 \ /
2780 <<vir>>\ /
2781 \ /
2782 Rows_log_event
2783 @endinternal
2785*/
2787 public Log_event {
2788#ifdef HAVE_PSI_STAGE_INTERFACE
2789 protected:
2791#endif
2792
2793 public:
2794 // disable copy-move semantics
2796 Rows_log_event &operator=(Rows_log_event &&) noexcept = delete;
2797 Rows_log_event(const Rows_log_event &) = delete;
2798 Rows_log_event &operator=(const Rows_log_event &) = delete;
2799
2808 };
2809
2810 /**
2811 Enumeration of the errors that can be returned.
2814 ERR_OPEN_FAILURE = -1, /**< Failure to open table */
2815 ERR_OK = 0, /**< No error */
2816 ERR_TABLE_LIMIT_EXCEEDED = 1, /**< No more room for tables */
2817 ERR_OUT_OF_MEM = 2, /**< Out of memory */
2818 ERR_BAD_TABLE_DEF = 3, /**< Table definition does not match */
2819 ERR_RBR_TO_SBR = 4 /**< daisy-chanining RBR to SBR not allowed */
2820 };
2822 /* Special constants representing sets of flags */
2823 enum { RLE_NO_FLAGS = 0U };
2824
2827 void set_flags(flag_set flags_arg) { m_flags |= flags_arg; }
2828 void clear_flags(flag_set flags_arg) { m_flags &= ~flags_arg; }
2829 flag_set get_flags(flag_set flags_arg) const { return m_flags & flags_arg; }
2832 get_general_type_code() = 0; /* General rows op type, no version */
2833
2834#if defined(MYSQL_SERVER)
2835 int pack_info(Protocol *protocol) override;
2836#endif
2837
2838#ifndef MYSQL_SERVER
2839 void print_verbose(IO_CACHE *file, PRINT_EVENT_INFO *print_event_info);
2840 size_t print_verbose_one_row(IO_CACHE *file, table_def *td,
2841 PRINT_EVENT_INFO *print_event_info,
2842 MY_BITMAP *cols_bitmap, const uchar *ptr,
2843 const uchar *prefix,
2844 enum_row_image_type row_image_type);
2845#endif
2847#ifdef MYSQL_SERVER
2848 int add_row_data(uchar *data, size_t length) {
2849 return do_add_row_data(data, length);
2850 }
2851#endif
2852
2853 /* Member functions to implement superclass interface */
2854 size_t get_data_size() override;
2856 MY_BITMAP const *get_cols() const { return &m_cols; }
2857 MY_BITMAP const *get_cols_ai() const { return &m_cols_ai; }
2859 return m_table_id;
2860 }
2861
2862#if defined(MYSQL_SERVER)
2863 /**
2864 Compares the table's read/write_set with the columns included in
2865 this event's before-image and/or after-image. Each subclass
2866 (Write/Update/Delete) implements this function by comparing on the
2867 image(s) pertinent to the subclass.
2868
2869 @param[in] table The table to compare this events bitmaps
2870 against.
2871
2872 @retval true if sets match
2873 @retval false otherwise (following bitmap_cmp return logic).
2874 */
2875 virtual bool read_write_bitmaps_cmp(const TABLE *table) const = 0;
2876#endif
2877
2878#ifdef MYSQL_SERVER
2879 bool write_data_header(Basic_ostream *ostream) override;
2880 bool write_data_body(Basic_ostream *ostream) override;
2881 const char *get_db() override { return m_table->s->db.str; }
2882#endif
2883
2884 uint m_row_count; /* The number of rows added to the event */
2885
2886 protected:
2887 /*
2888 The constructors are protected since you're supposed to inherit
2889 this class, not create instances of this class.
2890 */
2891#ifdef MYSQL_SERVER
2893 MY_BITMAP const *cols, bool is_transactional,
2895 const unsigned char *extra_row_ndb_info);
2896#endif
2898 const char *row_data,
2899 const mysql::binlog::event::Format_description_event *description_event);
2900
2901#ifndef MYSQL_SERVER
2902 void print_helper(FILE *, PRINT_EVENT_INFO *) const;
2903#endif
2904
2905#ifdef MYSQL_SERVER
2906 virtual int do_add_row_data(uchar *data, size_t length);
2907#endif
2909#ifdef MYSQL_SERVER
2910 TABLE *m_table; /* The table the rows belong to */
2911#endif
2912 MY_BITMAP m_cols; /* Bitmap denoting columns available */
2913 /**
2914 Bitmap denoting columns available in the image as they appear in the table
2915 setup. On some setups, the number and order of columns may differ from
2916 master to slave so, a bitmap for local available columns is computed using
2917 `ReplicatedColumnsView` utility class.
2918 */
2920#ifdef MYSQL_SERVER
2921 /**
2922 Hash table that will hold the entries for while using HASH_SCAN
2923 algorithm to search and update/delete rows.
2924 */
2926
2927 /**
2928 The algorithm to use while searching for rows using the before
2929 image.
2930 */
2932#endif
2933 /**
2934 Bitmap for columns available in the after image, if present. These
2935 fields are only available for Update_rows events. Observe that the
2936 width of both the before image COLS vector and the after image
2937 COLS vector is the same: the number of columns of the table on the
2938 master.
2939 */
2941 /**
2942 Bitmap denoting columns available in the after-image as they appear in the
2943 table setup. On some setups, the number and order of columns may differ from
2944 master to slave so, a bitmap for local available columns is computed using
2945 `ReplicatedColumnsView` utility class.
2946 */
2949 /* Bit buffers in the same memory as the class */
2950 uint32 m_bitbuf[128 / (sizeof(uint32) * 8)];
2951 uint32 m_bitbuf_ai[128 / (sizeof(uint32) * 8)];
2952
2953 /*
2954 is_valid depends on the value of m_rows_buf, so while changing the value
2955 of m_rows_buf check if is_valid also needs to be modified
2957 uchar *m_rows_buf; /* The rows in packed format */
2958 uchar *m_rows_cur; /* One-after the end of the data */
2959 uchar *m_rows_end; /* One-after the end of the allocated space */
2960
2961 /* helper functions */
2963#if defined(MYSQL_SERVER)
2964 const uchar *m_curr_row; /* Start of the row being processed */
2965 const uchar *m_curr_row_end; /* One-after the end of the current row */
2966 uchar *m_key; /* Buffer to keep key value during searches */
2968 KEY *m_key_info; /* Points to description of index #m_key_index */
2969 class Key_compare {
2970 public:
2971 /**
2972 @param ki Where to find KEY description
2973 @note m_distinct_keys is instantiated when Rows_log_event is constructed;
2974 it stores a Key_compare object internally. However at that moment, the
2975 index (KEY*) to use for comparisons, is not yet known. So, at
2976 instantiation, we indicate the Key_compare the place where it can
2977 find the KEY* when needed (this place is Rows_log_event::m_key_info),
2978 Key_compare remembers the place in member m_key_info.
2979 Before we need to do comparisons - i.e. before we need to insert
2980 elements, we update Rows_log_event::m_key_info once for all.
2982 Key_compare(KEY **ki = nullptr) : m_key_info(ki) {}
2983 bool operator()(uchar *k1, uchar *k2) const {
2984 return key_cmp2((*m_key_info)->key_part, k1, (*m_key_info)->key_length,
2985 k2, (*m_key_info)->key_length) < 0;
2986 }
2988 private:
2991 std::set<uchar *, Key_compare> m_distinct_keys;
2992 std::set<uchar *, Key_compare>::iterator m_itr;
2993 /**
2994 A spare buffer which will be used when saving the distinct keys
2995 for doing an index scan with HASH_SCAN search algorithm.
2996 */
2998
2999 /**
3000 Unpack the current row image from the event into m_table->record[0].
3001
3002 @param rli The applier context.
3003
3004 @param cols The bitmap of columns included in the update.
3005
3006 @param is_after_image Should be true if this is an after-image,
3007 false if it is a before-image.
3008
3009 @param only_seek unpack_row()
3010
3011 @retval 0 Success
3012
3013 @retval ER_* On error, it is guaranteed that the error has been
3014 reported through my_error, and the corresponding ER_* code is
3015 returned. Currently the error codes are: EE_OUTOFMEMORY,
3016 ER_REPLICA_CORRUPT_EVENT, or various JSON errors when applying JSON
3017 diffs (ER_COULD_NOT_APPLY_JSON_DIFF, ER_INVALID_JSON_BINARY_DATA,
3018 and maybe others).
3019 */
3020 int unpack_current_row(const Relay_log_info *const rli, MY_BITMAP const *cols,
3021 bool is_after_image, bool only_seek = false);
3022 /**
3023 Updates the generated columns of the `TABLE` object referenced by
3024 `m_table`, that have an active bit in the parameter bitset
3025 `fields_to_update`.
3026
3027 @param fields_to_update A bitset where the bit at the index of
3028 generated columns to update must be set to `1`
3029
3030 @return 0 if the operation terminated successfully, 1 otherwise.
3031 */
3032 int update_generated_columns(MY_BITMAP const &fields_to_update);
3033 /*
3034 This member function is called when deciding the algorithm to be used to
3035 find the rows to be updated on the slave during row based replication.
3036 This this functions sets the m_rows_lookup_algorithm and also the
3037 m_key_index with the key index to be used if the algorithm is dependent on
3038 an index.
3039 */
3041
3042 /*
3043 Encapsulates the operations to be done before applying
3044 row event for update and delete.
3045 */
3047
3048 /*
3049 Encapsulates the operations to be done after applying
3050 row event for update and delete.
3051 */
3053
3054 /**
3055 Helper function to check whether there is an auto increment
3056 column on the table where the event is to be applied.
3057 GIPKs when not present in the source table are also considered a
3058 auto inc column in a extra column.
3059
3060 @param rli the relay log object associated to the replicated table
3061
3062 @return true if there is an autoincrement field on the extra
3063 columns, false otherwise.
3064 */
3065 bool is_auto_inc_in_extra_columns(const Relay_log_info *const rli);
3066
3067 /**
3068 Helper function to check whether the storage engine error
3069 allows for the transaction to be retried or not.
3070
3071 @param error Storage engine error
3072 @retval true if the error is retryable.
3073 @retval false if the error is non-retryable.
3074 */
3076#endif
3077
3078 bool is_rbr_logging_format() const override { return true; }
3079
3080 private:
3081#if defined(MYSQL_SERVER)
3082
3083 /**
3084 Wrapper around `TABLE *m_table` that abstracts the table field set iteration
3085 logic, since it is not mandatory that all table fields are to be
3086 replicated. For details, @see ReplicatedColumnsView class documentation.
3087
3088 A smart pointer is used here as the developer might want to instantiate the
3089 view using different classes in runtime depending on the given context.
3090 */
3092
3093 int do_apply_event(Relay_log_info const *rli) override;
3094 int do_update_pos(Relay_log_info *rli) override;
3096
3097 /*
3098 Primitive to prepare for a sequence of row executions.
3099
3100 DESCRIPTION
3101
3102 Before doing a sequence of do_prepare_row() and do_exec_row()
3103 calls, this member function should be called to prepare for the
3104 entire sequence. Typically, this member function will allocate
3105 space for any buffers that are needed for the two member
3106 functions mentioned above.
3107
3108 RETURN VALUE
3109
3110 The member function will return 0 if all went OK, or a non-zero
3111 error code otherwise.
3112 */
3113 virtual int do_before_row_operations(const Relay_log_info *const log) = 0;
3114
3115 /*
3116 Primitive to clean up after a sequence of row executions.
3117
3118 DESCRIPTION
3119
3120 After doing a sequence of do_prepare_row() and do_exec_row(),
3121 this member function should be called to clean up and release
3122 any allocated buffers.
3123
3124 The error argument, if non-zero, indicates an error which happened during
3125 row processing before this function was called. In this case, even if
3126 function is successful, it should return the error code given in the
3127 argument.
3128 */
3129 virtual int do_after_row_operations(const Relay_log_info *const log,
3130 int error) = 0;
3131
3132 /*
3133 Primitive to do the actual execution necessary for a row.
3134
3135 DESCRIPTION
3136 The member function will do the actual execution needed to handle a row.
3137 The row is located at m_curr_row. When the function returns,
3138 m_curr_row_end should point at the next row (one byte after the end
3139 of the current row).
3140
3141 RETURN VALUE
3142 0 if execution succeeded, 1 if execution failed.
3144 */
3145 virtual int do_exec_row(const Relay_log_info *const rli) = 0;
3146
3147 /**
3148 Private member function called while handling idempotent errors.
3149
3150 @param rli Pointer to relay log info structure.
3151 @param [in,out] err the error to handle. If it is listed as
3152 idempotent/ignored related error, then it is cleared.
3153 @returns true if the slave should stop executing rows.
3154 */
3156
3157 /**
3158 Private member function called after updating/deleting a row. It
3159 performs some assertions and more importantly, it updates
3160 m_curr_row so that the next row is processed during the row
3161 execution main loop (@c Rows_log_event::do_apply_event()).
3162
3163 @param rli Pointer to relay log info structure.
3164 @param err the current error code.
3165 */
3166 void do_post_row_operations(Relay_log_info const *rli, int err);
3167
3168 /**
3169 Commodity wrapper around do_exec_row(), that deals with resetting
3170 the thd reference in the table.
3171 */
3172 int do_apply_row(Relay_log_info const *rli);
3173
3174 /**
3175 Implementation of the index scan and update algorithm. It uses
3176 PK, UK or regular Key to search for the record to update. When
3177 found it updates it.
3178 */
3180
3181 /**
3182 Implementation of the hash_scan and update algorithm. It collects
3183 rows positions in a hashtable until the last row is
3184 unpacked. Then it scans the table to update and when a record in
3185 the table matches the one in the hashtable, the update/delete is
3186 performed.
3187 */
3189
3190 /**
3191 Implementation of the legacy table_scan and update algorithm. For
3192 each unpacked row it scans the storage engine table for a
3193 match. When a match is found, the update/delete operations are
3194 performed.
3195 */
3197
3198 /**
3199 Seek past the after-image of an update event, in case a row was processed
3200 without reading the after-image.
3201
3202 An update event may process a row without reading the after-image,
3203 e.g. in case of ignored or idempotent errors. To ensure that the
3204 read position for the next row is correct, we need to seek past
3205 the after-image.
3206
3207 @param rli The applier context
3208
3209 @param curr_bi_start The read position of the beginning of the
3210 before-image. (The function compares this with m_curr_row to know
3211 if the after-image has been read or not.)
3212
3213 @retval 0 Success
3214 @retval ER_* Error code returned by unpack_current_row
3215 */
3217 [[maybe_unused]],
3218 const uchar *curr_bi_start
3219 [[maybe_unused]]) {
3220 return 0;
3221 }
3222
3223 /**
3224 Initializes scanning of rows. Opens an index and initializes an iterator
3225 over a list of distinct keys (m_distinct_keys) if it is a HASH_SCAN
3226 over an index or the table if its a HASH_SCAN over the table.
3227 */
3228 int open_record_scan();
3229
3230 /**
3231 Does the cleanup
3232 - closes the index if opened by open_record_scan
3233 - closes the table if opened for scanning.
3234 */
3235 int close_record_scan();
3236
3237 /**
3238 Fetches next row. If it is a HASH_SCAN over an index, it populates
3239 table->record[0] with the next row corresponding to the index. If
3240 the indexes are in non-contigous ranges it fetches record corresponding
3241 to the key value in the next range.
3242
3243 @param first_read signifying if this is the first time we are reading a row
3244 over an index.
3245 @return error code when there are no more records to be fetched or some
3246 other error occurred,
3247 - 0 otherwise.
3248 */
3249 int next_record_scan(bool first_read);
3250
3251 /**
3252 Populates the m_distinct_keys with unique keys to be modified
3253 during HASH_SCAN over keys.
3254 @returns 0 success, or the error code.
3255 */
3257
3258 /**
3259 Populates the m_hash when using HASH_SCAN. Thence, it:
3260 - unpacks the before image (BI)
3261 - saves the positions
3262 - saves the positions into the hash map, using the
3263 BI checksum as key
3264 - unpacks the after image (AI) if needed, so that
3265 m_curr_row_end gets updated correctly.
3266
3267 @param rli The reference to the relay log info object.
3268 @returns 0 on success. Otherwise, the error code.
3269 */
3270 int do_hash_row(Relay_log_info const *rli);
3271
3272 /**
3273 This member function scans the table and applies the changes
3274 that had been previously hashed. As such, m_hash MUST be filled
3275 by do_hash_row before calling this member function.
3276
3277 @param rli The reference to the relay log info object.
3278 @returns 0 on success. Otherwise, the error code.
3279 */
3280 int do_scan_and_update(Relay_log_info const *rli);
3281#endif /* defined(MYSQL_SERVER) */
3282
3283 friend class Old_rows_log_event;
3284
3285 /**
3286 This bitmap is used as a backup for the write set while we calculate
3287 the values for any hidden generated columns (functional indexes). In order
3288 to calculate the values, the columns must be marked in the write set. After
3289 the values are calculated, we set the write set back to its original value.
3290 */
3292};
3293
3294/**
3295 @class Write_rows_log_event
3296
3297 Log row insertions and updates. The event contain several
3298 insert/update rows for a table. Note that each event contains only
3299 rows for one table.
3300
3301 @internal
3302 The inheritance structure is as follows
3303
3304 Binary_log_event
3305 ^
3306 |
3307 |
3308 |
3309 Log_event B_l:Rows_event
3310 ^ /\
3311 | / \
3312 | <<vir>>/ \ <<vir>>
3313 | / \
3314 | / \
3315 | / \
3316 Rows_log_event B_l:W_R_E
3317 \ /
3318 \ /
3319 \ /
3320 \ /
3321 \ /
3322 \/
3323 Write_rows_log_event
3324
3325 B_l: Namespace Binary_log
3326 W_R_E: class Write_rows_event
3327 @endinternal
3329*/
3332 public:
3333 enum {
3334 /* Support interface to THD::binlog_prepare_pending_rows_event */
3336 };
3337
3338#if defined(MYSQL_SERVER)
3340 const mysql::binlog::event::Table_id &table_id,
3341 bool is_transactional,
3342 const unsigned char *extra_row_ndb_info);
3343#endif
3345 const char *buf,
3346 const mysql::binlog::event::Format_description_event *description_event);
3347#if defined(MYSQL_SERVER)
3349 bool is_transactional,
3350 const uchar *before_record
3351 [[maybe_unused]],
3352 const uchar *after_record);
3353 bool read_write_bitmaps_cmp(const TABLE *table) const override {
3354 return bitmap_cmp(get_cols(), table->write_set);
3355 }
3356#endif
3357
3358 void claim_memory_ownership(bool claim) override;
3359
3360 protected:
3361 int write_row(const Relay_log_info *const, const bool);
3363 private:
3366 }
3367
3368#ifndef MYSQL_SERVER
3369 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
3370#endif
3371
3372#if defined(MYSQL_SERVER)
3373 int do_before_row_operations(const Relay_log_info *const) override;
3374 int do_after_row_operations(const Relay_log_info *const, int) override;
3375 int do_exec_row(const Relay_log_info *const) override;
3376#endif
3377};
3378
3379/**
3380 @class Update_rows_log_event
3381
3382 Log row updates with a before image. The event contain several
3383 update rows for a table. Note that each event contains only rows for
3384 one table.
3385
3386 Also note that the row data consists of pairs of row data: one row
3387 for the old data and one row for the new data.
3388
3389 @internal
3390 The inheritance structure is as follows
3391
3392 Binary_log_event
3393 ^
3394 |
3395 |
3396 |
3397 Log_event B_l:Rows_event
3398 ^ /\
3399 | / \
3400 | <<vir>>/ \ <<vir>>
3401 | / \
3402 | / \
3403 | / \
3404 Rows_log_event B_l:U_R_E
3405 \ /
3406 \ /
3407 \ /
3408 \ /
3409 \ /
3410 \/
3411 Update_rows_log_event
3412
3413
3414 B_l: Namespace Binary_log
3415 U_R_E: class Update_rows_event
3416 @eninternal
3418*/
3421 public:
3422 enum {
3423 /* Support interface to THD::binlog_prepare_pending_rows_event */
3425 };
3427#ifdef MYSQL_SERVER
3429 const mysql::binlog::event::Table_id &table_id,
3430 MY_BITMAP const *cols_bi, MY_BITMAP const *cols_ai,
3431 bool is_transactional,
3432 const unsigned char *extra_row_ndb_info);
3433
3435 const mysql::binlog::event::Table_id &table_id,
3436 bool is_transactional,
3437 const unsigned char *extra_row_ndb_info);
3438
3439 void init(MY_BITMAP const *cols);
3440#endif
3441
3442 ~Update_rows_log_event() override;
3443
3445 const char *buf,
3446 const mysql::binlog::event::Format_description_event *description_event);
3447
3448#ifdef MYSQL_SERVER
3450 bool is_transactional,
3451 const uchar *before_record,
3452 const uchar *after_record);
3453 bool read_write_bitmaps_cmp(const TABLE *table) const override {
3454 return (bitmap_cmp(get_cols(), table->read_set) &&
3455 bitmap_cmp(get_cols_ai(), table->write_set));
3456 }
3457#endif
3458
3459 void claim_memory_ownership(bool claim) override;
3461 protected:
3464 }
3465
3466#ifndef MYSQL_SERVER
3467 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
3468#endif
3469
3470#if defined(MYSQL_SERVER)
3471 int do_before_row_operations(const Relay_log_info *const) override;
3472 int do_after_row_operations(const Relay_log_info *const, int) override;
3473 int do_exec_row(const Relay_log_info *const) override;
3474
3476 const uchar *curr_bi_start) override;
3477
3478 private:
3479 /**
3480 Auxiliary function used in the (THD*, ...) constructor to
3481 determine the type code based on configuration options.
3482
3483 @param thd_arg The THD object for the session.
3484
3485 @return One of PARTIAL_UPDATE_ROWS_EVENT, or UPDATE_ROWS_EVENT.
3486 */
3488 const THD *thd_arg);
3489#endif /* defined(MYSQL_SERVER) */
3490};
3491
3492/**
3493 @class Delete_rows_log_event
3494
3495 Log row deletions. The event contain several delete rows for a
3496 table. Note that each event contains only rows for one table.
3497
3498 RESPONSIBILITIES
3499
3500 - Act as a container for rows that has been deleted on the master
3501 and should be deleted on the slave.
3502
3503 COLLABORATION
3504
3505 Row_writer
3506 Create the event and add rows to the event.
3507 Row_reader
3508 Extract the rows from the event.
3509
3510 @internal
3511 The inheritance structure is as follows
3512
3513 Binary_log_event
3514 ^
3515 |
3516 |
3517 |
3518 Log_event B_l:Rows_event
3519 ^ /\
3520 | / \
3521 | <<vir>>/ \ <<vir>>
3522 | / \
3523 | / \
3524 | / \
3525 Rows_log_event B_l:D_R_E
3526 \ /
3527 \ /
3528 \ /
3529 \ /
3530 \ /
3531 \/
3532 Delete_rows_log_event
3533
3534 B_l: Namespace Binary_log
3535 D_R_E: class Delete_rows_event
3536 @endinternal
3538*/
3541 public:
3542 enum {
3543 /* Support interface to THD::binlog_prepare_pending_rows_event */
3545 };
3546
3547#ifdef MYSQL_SERVER
3549 bool is_transactional,
3550 const unsigned char *extra_row_ndb_info);
3551#endif
3553 const char *buf,
3554 const mysql::binlog::event::Format_description_event *description_event);
3555#ifdef MYSQL_SERVER
3557 bool is_transactional,
3558 const uchar *before_record,
3559 const uchar *after_record
3560 [[maybe_unused]]);
3561 bool read_write_bitmaps_cmp(const TABLE *table) const override {
3562 return bitmap_cmp(get_cols(), table->read_set);
3563 }
3564#endif
3565
3566 void claim_memory_ownership(bool claim) override;
3568 protected:
3571 }
3572
3573#ifndef MYSQL_SERVER
3574 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
3575#endif
3576
3577#if defined(MYSQL_SERVER)
3578 int do_before_row_operations(const Relay_log_info *const) override;
3579 int do_after_row_operations(const Relay_log_info *const, int) override;
3580 int do_exec_row(const Relay_log_info *const) override;
3581#endif
3582};
3583
3584/**
3585 @class Incident_log_event
3586
3587 Class representing an incident, an occurrence out of the ordinary,
3588 that happened on the master.
3589
3590 The event is used to inform the slave that something out of the
3591 ordinary happened on the master that might cause the database to be
3592 in an inconsistent state.
3593
3594 It's the derived class of Incident_event
3595
3596 @internal
3597 The inheritance structure is as follows
3598
3599 Binary_log_event
3600 ^
3601 |
3602 |
3603 B_l:Incident_event Log_event
3604 \ /
3605 \ /
3606 \ /
3607 \ /
3608 Incident_log_event
3609
3610 B_l: Namespace Binary_log
3611 @endinternal
3613*/
3615 public Log_event {
3616 public:
3617 // disable copy-move semantics
3620 Incident_log_event(const Incident_log_event &) = delete;
3621 Incident_log_event &operator=(const Incident_log_event &) = delete;
3623#ifdef MYSQL_SERVER
3624 Incident_log_event(THD *thd_arg, enum_incident incident_arg,
3625 std::string_view msg)
3626 : mysql::binlog::event::Incident_event(incident_arg),
3629 DBUG_TRACE;
3630 DBUG_PRINT("enter", ("incident: %d", incident_arg));
3631 common_header->set_is_valid(incident_arg > INCIDENT_NONE &&
3632 incident_arg < INCIDENT_COUNT);
3633 assert(message == nullptr && message_length == 0);
3635 msg.length() + 1, MYF(MY_WME)))) {
3636 // The allocation failed. Mark this binlog event as invalid.
3638 return;
3639 }
3640 strmake(message, msg.data(), msg.length());
3641 message_length = msg.length();
3642 return;
3643 }
3644#endif
3645
3646#ifdef MYSQL_SERVER
3647 int pack_info(Protocol *) override;
3648#endif
3649
3651 const char *buf,
3652 const mysql::binlog::event::Format_description_event *description_event);
3653
3654 ~Incident_log_event() override;
3655
3656 void claim_memory_ownership(bool claim) override;
3657
3658#ifndef MYSQL_SERVER
3659 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
3660#endif
3661
3662#if defined(MYSQL_SERVER)
3663 int do_apply_event(Relay_log_info const *rli) override;
3664 bool write_data_header(Basic_ostream *ostream) override;
3665 bool write_data_body(Basic_ostream *ostream) override;
3666#endif
3667
3668 size_t get_data_size() override {
3672
3673 bool ends_group() const override { return true; }
3674
3675 private:
3676 const char *description() const;
3677};
3678
3679/**
3680 @class Ignorable_log_event
3681
3682 Base class for ignorable log events is Ignorable_event.
3683 Events deriving from this class can be safely ignored
3684 by slaves that cannot recognize them.
3685
3686 Its the derived class of Ignorable_event
3687
3688 @internal
3689 The inheritance structure is as follows
3690
3691 Binary_log_event
3692 ^
3693 |
3694 |
3695 B_l:Ignorable_event Log_event
3696 \ /
3697 <<virtual>>\ /
3698 \ /
3699 Ignorable_log_event
3700
3701 B_l: Namespace Binary_log
3702 @endinternal
3703*/
3706 public Log_event {
3707 public:
3708 // disable copy-move semantics
3711 Ignorable_log_event(const Ignorable_log_event &) = delete;
3712 Ignorable_log_event &operator=(const Ignorable_log_event &) = delete;
3714#ifdef MYSQL_SERVER
3715 Ignorable_log_event(THD *thd_arg)
3718 DBUG_TRACE;
3720 return;
3721 }
3722#endif
3723
3725 const char *buf,
3727 ~Ignorable_log_event() override;
3728
3729 void claim_memory_ownership(bool claim) override;
3730
3731#ifdef MYSQL_SERVER
3732 int pack_info(Protocol *) override;
3733#endif
3734
3735#ifndef MYSQL_SERVER
3736 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
3737#endif
3738
3739 size_t get_data_size() override {
3741 }
3742};
3743
3744/**
3745 @class Rows_query_log_event
3746 It is used to record the original query for the rows
3747 events in RBR.
3748 It is the subclass of Ignorable_log_event and Rows_query_event
3749
3750 @internal
3751 The inheritance structure in the current design for the classes is
3752 as follows:
3753 Binary_log_event
3754 ^
3755 |
3756 |
3757 |
3758 Log_event B_l:Ignorable_event
3759 ^ /\
3760 | / \
3761 | <<vir>>/ \ <<vir>>
3762 | / \
3763 | / \
3764 | / \
3765 Ignorable_log_event B_l:Rows_query_event
3766 \ /
3767 \ /
3768 \ /
3769 \ /
3770 \ /
3771 \/
3772 Rows_query_log_event
3773
3774 B_l : namespace namespace mysql::binlog::event
3775 @endinternal
3776*/
3779 public:
3780#ifdef MYSQL_SERVER
3781 Rows_query_log_event(THD *thd_arg, const char *query, size_t query_len)
3782 : Ignorable_log_event(thd_arg) {
3783 DBUG_TRACE;
3785 m_rows_query_length = query_len;
3786 if (!(m_rows_query =
3789 return;
3792 "rows_query_alter", size_t i = 0; while (i < m_rows_query_length) {
3793 if (m_rows_query[i] == '\\') {
3794 m_rows_query[i] = '\0';
3795 i++;
3796 for (auto j = i; j < m_rows_query_length - 1; j++) {
3797 m_rows_query[j] = m_rows_query[j + 1];
3798 }
3800 } else
3801 i++;
3802 });
3803 DBUG_PRINT("enter", ("%s", m_rows_query));
3804 return;
3805 }
3806#endif
3807
3808#ifdef MYSQL_SERVER
3809 int pack_info(Protocol *) override;
3810 int do_apply_event(Relay_log_info const *rli) override;
3811 bool write_data_body(Basic_ostream *ostream) override;
3812#endif
3813
3815 const char *buf,
3817
3818 void claim_memory_ownership(bool claim) override;
3819
3820 ~Rows_query_log_event() override {
3822 m_rows_query = nullptr;
3823 }
3824#ifndef MYSQL_SERVER
3825 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
3826#endif
3827 size_t get_data_size() override {
3830 }
3832
3833static inline bool copy_event_cache_to_file_and_reinit(IO_CACHE *cache,
3834 FILE *file,
3835 bool flush_stream) {
3836 return my_b_copy_to_file(cache, file) ||
3837 (flush_stream ? (fflush(file) || ferror(file)) : 0) ||
3838 reinit_io_cache(cache, WRITE_CACHE, 0, false, true);
3839}
3840
3841#ifdef MYSQL_SERVER
3842/*****************************************************************************
3843
3844 Heartbeat Log Event class
3845
3846 The class is not logged to a binary log, and is not applied on to the slave.
3847 The decoding of the event on the slave side is done by its superclass,
3848 mysql::binlog::event::Heartbeat_event.
3850 ****************************************************************************/
3852 public Log_event {
3853 public:
3855 const char *buf,
3856 const mysql::binlog::event::Format_description_event *description_event);
3858
3860 public Log_event {
3861 public:
3863 const char *buf,
3864 const mysql::binlog::event::Format_description_event *description_event);
3865};
3866/**
3867 The function is called by slave applier in case there are
3868 active table filtering rules to force gathering events associated
3869 with Query-log-event into an array to execute
3870 them once the fate of the Query is determined for execution.
3871*/
3873#endif
3874
3875int append_query_string(const THD *thd, const CHARSET_INFO *csinfo,
3876 String const *from, String *to);
3878
3881 public Log_event {
3882 public:
3883#ifdef MYSQL_SERVER
3884
3885 Transaction_payload_log_event(THD *thd_arg, const char *payload,
3886 uint64_t payload_size,
3887 uint16_t compression_type,
3888 uint64_t uncompressed_size)
3889 : Transaction_payload_event(payload, payload_size, compression_type,
3890 uncompressed_size),
3891 Log_event(thd_arg, 0 /* flags */, Log_event::EVENT_TRANSACTIONAL_CACHE,
3893
3894 Transaction_payload_log_event(THD *thd_arg, const char *payload,
3895 uint64_t payload_size)
3897 thd_arg, payload, payload_size,
3898 mysql::binlog::event::compression::type::NONE, payload_size) {}
3899
3901 : Transaction_payload_log_event(thd_arg, nullptr, (uint64_t)0) {}
3902#endif
3903
3905 const char *buf,
3908
3909 ~Transaction_payload_log_event() override = default;
3910
3911 void claim_memory_ownership(bool claim) override;
3912
3913#ifndef MYSQL_SERVER
3914 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
3915#endif
3916
3917 size_t get_event_length() { return LOG_EVENT_HEADER_LEN + get_data_size(); }
3918 size_t get_data_size() override;
3919
3920#if defined(MYSQL_SERVER)
3921
3922 public:
3923 int do_apply_event(Relay_log_info const *rli) override;
3924 bool apply_payload_event(Relay_log_info const *rli, const uchar *event_buf);
3926 int pack_info(Protocol *protocol) override;
3927 bool ends_group() const override;
3928 bool write(Basic_ostream *ostream) override;
3929#endif
3930};
3931
3932/**
3933 @class Gtid_log_event
3934
3935 This is a subclass if Gtid_event and Log_event. It contains
3936 per-transaction fields, including the GTID and logical timestamps
3937 used by MTS.
3938
3939 @internal
3940 The inheritance structure is as follows
3941
3942 Binary_log_event
3943 ^
3944 |
3945 |
3946 B_l:Gtid_event Log_event
3947 \ /
3948 \ /
3949 \ /
3950 \ /
3951 Gtid_log_event
3952
3953 B_l: Namespace Binary_log
3954 @endinternal
3955*/
3957 public Log_event {
3958 public:
3959 // disable copy-move semantics
3961 Gtid_log_event &operator=(Gtid_log_event &&) noexcept = delete;
3962 Gtid_log_event(const Gtid_log_event &) = delete;
3963 Gtid_log_event &operator=(const Gtid_log_event &) = delete;
3964
3965#ifdef MYSQL_SERVER
3966 /**
3967 Create a new event using the GTID owned by the given thread.
3968 */
3969 Gtid_log_event(THD *thd_arg, bool using_trans, int64 last_committed_arg,
3970 int64 sequence_number_arg, bool may_have_sbr_stmts_arg,
3971 ulonglong original_commit_timestamp_arg,
3972 ulonglong immediate_commit_timestamp_arg,
3973 uint32_t original_server_version_arg,
3974 uint32_t immediate_server_version_arg);
3975
3976 /**
3977 Create a new event using the GTID from the given Gtid_specification
3978 without a THD object.
3979 */
3980 Gtid_log_event(uint32 server_id_arg, bool using_trans,
3981 int64 last_committed_arg, int64 sequence_number_arg,
3982 bool may_have_sbr_stmts_arg,
3983 ulonglong original_commit_timestamp_arg,
3984 ulonglong immediate_commit_timestamp_arg,
3985 const Gtid_specification spec_arg,
3986 uint32_t original_server_version_arg,
3987 uint32_t immediate_server_version_arg);
3988#endif
3989
3990#ifdef MYSQL_SERVER
3991 int pack_info(Protocol *) override;
3992#endif
3994 const char *buffer,
3996
3997 ~Gtid_log_event() override = default;
3998
3999 void claim_memory_ownership(bool claim) override;
4000
4002
4003 size_t get_data_size() override {
4004 if (is_tagged()) {
4005 auto size_calculated = Encoder_type::get_size(*this);
4006 DBUG_EXECUTE_IF("add_unknown_ignorable_fields_to_gtid_log_event",
4007 { size_calculated += 2; });
4008 return size_calculated;
4009 }
4010 DBUG_EXECUTE_IF("do_not_write_rpl_timestamps", return POST_HEADER_LENGTH;);
4014 }
4015
4016 /// @brief Clears tsid and spec
4017 void clear_gtid_and_spec();
4018
4019 /// @brief Updates parent tsid and gtid info structure
4021
4022 size_t get_event_length() { return LOG_EVENT_HEADER_LEN + get_data_size(); }
4023
4024 /// Used internally by both print() and pack_info().
4025 size_t to_string(char *buf) const;
4026
4027 private:
4028#ifdef MYSQL_SERVER
4029 /**
4030 Writes the post-header to the given output stream.
4031
4032 This is an auxiliary function typically used by the write() member
4033 function.
4034
4035 @param ostream The output stream to write to.
4036
4037 @retval true Error.
4038 @retval false Success.
4039 */
4040 bool write_data_header(Basic_ostream *ostream) override;
4041 bool write_data_body(Basic_ostream *ostream) override;
4042 /**
4043 Writes the post-header to the given memory buffer.
4044
4045 This is an auxiliary function used by write_to_memory.
4046
4047 @param[in,out] buffer Buffer to which the post-header will be written.
4048
4049 @return The number of bytes written, i.e., always
4050 Gtid_log_event::POST_HEADER_LENGTH.
4051 */
4053
4054 /**
4055 Writes the body to the given memory buffer.
4056
4057 This is an auxiliary function used by write_to_memory.
4058
4059 @param [in,out] buff Buffer to which the data will be written.
4060
4061 @return The number of bytes written, i.e.,
4062 If the transaction did not originated on this server
4063 Gtid_event::IMMEDIATE_COMMIT_TIMESTAMP_LENGTH.
4064 else
4065 FULL_COMMIT_TIMESTAMP_LENGTH.
4066 */
4068
4069 /// @copydoc write_body_to_memory
4070 /// @details Version for tagged Gtid log event
4072
4073#endif
4074
4075 public:
4076#ifndef MYSQL_SERVER
4077 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
4078#endif
4079
4080#if defined(MYSQL_SERVER)
4081 int do_apply_event(Relay_log_info const *rli) override;
4082 int do_update_pos(Relay_log_info *rli) override;
4084#endif
4085
4086 /**
4087 Return the gtid type for this Gtid_log_event: this can be
4088 either ANONYMOUS_GTID, AUTOMATIC_GTID, or ASSIGNED_GTID.
4089 */
4090 enum_gtid_type get_type() const { return spec.type; }
4091
4092 /**
4093 Return the TSID for this GTID. The TSID is shared with the
4094 Log_event so it should not be modified.
4095 */
4096 const Tsid &get_tsid() const { return tsid; }
4097#ifdef MYSQL_SERVER
4098 /**
4099 Return the SIDNO relative to the global tsid_map for this GTID.
4100
4101 This requires a lookup and possibly even update of global_tsid_map,
4102 hence global_tsid_lock must be held. If global_tsid_lock is not
4103 held, the caller must pass need_lock=true. If there is an error
4104 (e.g. out of memory) while updating global_tsid_map, this function
4105 returns a negative number.
4106
4107 @param need_lock If true, the read lock on global_tsid_lock is
4108 acquired and released inside this function; if false, the read
4109 lock or write lock must be held prior to calling this function.
4110 @retval SIDNO if successful
4111 @retval negative if adding TSID to global_tsid_map causes an error.
4112 */
4113 rpl_sidno get_sidno(bool need_lock);
4114#endif
4115 /**
4116 Return the SIDNO relative to the given Tsid_map for this GTID.
4117
4118 This assumes that the Tsid_map is local to the thread, and thus
4119 does not use locks.
4120
4121 @param tsid_map The tsid_map to use.
4122 @retval SIDNO if successful.
4123 @retval negative if adding TSID to tsid_map causes an error.
4124 */
4125 rpl_sidno get_sidno(Tsid_map *tsid_map) { return tsid_map->add_tsid(tsid); }
4126 /// Return the GNO for this GTID.
4127 rpl_gno get_gno() const override { return spec.gtid.gno; }
4128
4129 /// @returns The GTID event specification
4132 /// string holding the text "SET @@GLOBAL.GTID_NEXT = '"
4133 static const char *SET_STRING_PREFIX;
4134
4135 private:
4136 /// Length of SET_STRING_PREFIX
4137 static const size_t SET_STRING_PREFIX_LENGTH = 26;
4138 /// The maximal length of the entire "SET ..." query.
4139 static const size_t MAX_SET_STRING_LENGTH = SET_STRING_PREFIX_LENGTH +
4142
4143 private:
4144 /**
4145 Internal representation of the GTID. The SIDNO will be
4146 uninitialized (value -1) until the first call to get_sidno(bool).
4147 */
4149 /// TSID for this GTID.
4150 Tsid tsid;
4151
4152 public:
4153 /**
4154 Set the transaction length information based on binlog cache size.
4155
4156 Note that is_checksum_enabled and event_counter are optional parameters.
4157 When not specified, the function will assume that no checksum will be used
4158 and the informed cache_size is the final transaction size without
4159 considering the GTID event size.
4160
4161 The high level formula that will be used by the function is:
4162
4163 trx_length = cache_size +
4164 cache_checksum_active * cache_events * CRC32_payload +
4165 gtid_length +
4166 cache_checksum_active * CRC32_payload; // For the GTID.
4167
4168 @param cache_size The size of the binlog cache in bytes.
4169 @param is_checksum_enabled If checksum will be added to events on flush.
4170 @param event_counter The amount of events in the cache.
4171 */
4173 bool is_checksum_enabled = false,
4174 int event_counter = 0);
4175
4176 /// @copydoc set_trx_length_by_cache_size
4177 /// @detail tagged version of event
4179 bool is_checksum_enabled = false,
4180 int event_counter = 0);
4181};
4182
4183/**
4184 @class Previous_gtids_log_event
4185
4186 This is the subclass of Previous_gtids_event and Log_event
4187 It is used to record the gtid_executed in the last binary log file,
4188 for ex after flush logs, or at the starting of the binary log file
4189
4190 @internal
4191 The inheritance structure is as follows
4192
4193 Binary_log_event
4194 ^
4195 |
4196 |
4197B_l:Previous_gtids_event Log_event
4198 \ /
4199 \ /
4200 \ /
4201 \ /
4202 Previous_gtids_log_event
4203
4204 B_l: Namespace Binary_log
4205 @endinternal
4206*/
4209 public Log_event {
4210 public:
4211 // disable copy-move semantics
4214 delete;
4217 delete;
4218
4219#ifdef MYSQL_SERVER
4221#endif
4222
4223#ifdef MYSQL_SERVER
4224 int pack_info(Protocol *) override;
4225#endif
4226
4228 const char *buf,
4229 const mysql::binlog::event::Format_description_event *description_event);
4230 ~Previous_gtids_log_event() override = default;
4231
4232 size_t get_data_size() override { return buf_size; }
4233
4234 void claim_memory_ownership(bool claim) override;
4235
4236#ifndef MYSQL_SERVER
4237 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
4238#endif
4239#ifdef MYSQL_SERVER
4240 bool write(Basic_ostream *ostream) override {
4241#ifndef NDEBUG
4242 if (DBUG_EVALUATE_IF("skip_writing_previous_gtids_log_event", 1, 0) &&
4243 /*
4244 The skip_writing_previous_gtids_log_event debug point was designed
4245 for skipping the writing of the previous_gtids_log_event on binlog
4246 files only.
4247 */
4248 !is_relay_log_event()) {
4249 DBUG_PRINT("info",
4250 ("skip writing Previous_gtids_log_event because of"
4251 "debug option 'skip_writing_previous_gtids_log_event'"));
4252 return false;
4253 }
4254
4255 if (DBUG_EVALUATE_IF("write_partial_previous_gtids_log_event", 1, 0) &&
4256 /*
4257 The write_partial_previous_gtids_log_event debug point was designed
4258 for writing a partial previous_gtids_log_event on binlog files only.
4259 */
4260 !is_relay_log_event()) {
4261 DBUG_PRINT("info",
4262 ("writing partial Previous_gtids_log_event because of"
4263 "debug option 'write_partial_previous_gtids_log_event'"));
4264 return (Log_event::write_header(ostream, get_data_size()) ||
4266 }
4267#endif
4268
4269 return (Log_event::write_header(ostream, get_data_size()) ||
4270 Log_event::write_data_header(ostream) || write_data_body(ostream) ||
4271 Log_event::write_footer(ostream));
4272 }
4273 bool write_data_body(Basic_ostream *ostream) override;
4274#endif
4276 /// Return the encoded buffer, or NULL on error.
4277 const uchar *get_buf() { return buf; }
4278 /**
4279 Return the formatted string, or NULL on error.
4280 The string is allocated using my_malloc and it is the
4281 responsibility of the caller to free it.
4282 */
4283 char *get_str(size_t *length,
4285 /// Add all GTIDs from this event to the given Gtid_set.
4286 int add_to_set(Gtid_set *gtid_set) const;
4287 /*
4288 Previous Gtid Log events should always be skipped
4289 there is nothing to apply there, whether it is
4290 relay log's (generated on Slave) or it is binary log's
4291 (generated on Master, copied to slave as relay log).
4292 Also, we should not increment slave_skip_counter
4293 for this event, hence return EVENT_SKIP_IGNORE.
4295#if defined(MYSQL_SERVER)
4297 {
4298 return EVENT_SKIP_IGNORE;
4300
4301 int do_apply_event(Relay_log_info const *) override { return 0; }
4302 int do_update_pos(Relay_log_info *rli) override;
4303#endif
4304};
4305
4306/**
4307 @class Transaction_context_log_event
4308
4309 This is the subclass of Transaction_context_event and Log_event
4310 This class encodes the transaction_context_log_event.
4311
4312 @internal
4313 The inheritance structure is as follows
4314
4315 Binary_log_event
4316 ^
4317 |
4318 |
4319B_l:Transaction_context_event Log_event
4320 \ /
4321 \ /
4322 \ /
4323 \ /
4324 Transaction_context_log_event
4325
4326 B_l: Namespace Binary_log
4327 @endinternal
4328*/
4331 public Log_event {
4332 private:
4333 /// The Tsid_map to use for creating the Gtid_set.
4335 /// A gtid_set which is used to store the transaction set used for
4336 /// conflict detection.
4338
4339#ifdef MYSQL_SERVER
4340 bool write_data_header(Basic_ostream *ostream) override;
4341
4342 bool write_data_body(Basic_ostream *ostream) override;
4343
4345
4346 bool write_data_set(Basic_ostream *ostream, std::list<const char *> *set);
4347#endif
4348
4350
4351 static int get_data_set_size(std::list<const char *> *set);
4352
4353 size_t to_string(char *buf, ulong len) const;
4354
4355 public:
4356#ifdef MYSQL_SERVER
4357
4358 Transaction_context_log_event(const char *server_uuid_arg, bool using_trans,
4359 my_thread_id thread_id_arg,
4360 bool is_gtid_specified);
4361
4362#endif
4363
4365 const char *buffer,
4367
4369
4370 void claim_memory_ownership(bool claim) override;
4371
4372 size_t get_data_size() override;
4373
4374 size_t get_event_length();
4375
4376#ifdef MYSQL_SERVER
4377 int pack_info(Protocol *protocol) override;
4378#endif
4379
4380#ifndef MYSQL_SERVER
4381 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
4382#endif
4384#if defined(MYSQL_SERVER)
4385 int do_apply_event(Relay_log_info const *) override { return 0; }
4386 int do_update_pos(Relay_log_info *rli) override;
4387#endif
4388
4389 /**
4390 Add a hash which identifies a inserted/updated/deleted row on the
4391 ongoing transaction.
4392
4393 @param[in] hash row identifier
4394 */
4395 void add_write_set(const char *hash);
4396
4397 /**
4398 Return a pointer to write-set list.
4399 */
4400 std::list<const char *> *get_write_set() { return &write_set; }
4401
4402 /**
4403 Add a hash which identifies a read row on the ongoing transaction.
4404
4405 @param[in] hash row identifier
4406 */
4407 void add_read_set(const char *hash);
4408
4409 /**
4410 Return a pointer to read-set list.
4411 */
4412 std::list<const char *> *get_read_set() { return &read_set; }
4413
4414#ifdef MYSQL_SERVER
4415 /**
4416 Read snapshot version from encoded buffers.
4417 Cannot be executed during data read from file (event constructor),
4418 since its required locks will collide with the server gtid state
4419 initialization procedure.
4420 */
4421 bool read_snapshot_version();
4422#endif
4423
4424 /**
4425 Return the transaction snapshot timestamp.
4426 */
4428
4429 /**
4430 Return the server uuid.
4431 */
4432 const char *get_server_uuid() { return server_uuid; }
4433
4434 /**
4435 Return the id of the committing thread.
4436 */
4437 my_thread_id get_thread_id() const {
4438 return static_cast<my_thread_id>(thread_id);
4439 }
4440
4441 /**
4442 Return true if transaction has GTID fully specified, false otherwise.
4443 */
4444 bool is_gtid_specified() const { return gtid_specified; }
4445};
4446
4447/**
4448 @class View_change_log_event
4449
4450 This is the subclass of View_change_log_event and Log_event
4451 This class created the view_change_log_event which is used as a marker in
4452 case a new node joins or leaves the group.
4453
4454 @internal
4455 The inheritance structure is as follows
4456
4457 Binary_log_event
4458 ^
4459 |
4460 |
4461B_l: View_change_event Log_event
4462 \ /
4463 \ /
4464 \ /
4465 \ /
4466 View_change_log_event
4467
4468 B_l: Namespace Binary_log
4469 @endinternal
4471
4473 public Log_event {
4474 private:
4475 size_t to_string(char *buf, ulong len) const;
4476
4477#ifdef MYSQL_SERVER
4478 bool write_data_header(Basic_ostream *ostream) override;
4479
4480 bool write_data_body(Basic_ostream *ostream) override;
4481
4482 bool write_data_map(Basic_ostream *ostream,
4483 std::map<std::string, std::string> *map);
4484#endif
4485
4486 size_t get_size_data_map(std::map<std::string, std::string> *map);
4487
4488 public:
4489 // disable copy-move semantics
4493 View_change_log_event &operator=(const View_change_log_event &) = delete;
4494
4495 View_change_log_event(const char *view_id);
4496
4498 const char *buffer,
4499 const mysql::binlog::event::Format_description_event *descr_event);
4500
4501 ~View_change_log_event() override;
4502
4503 void claim_memory_ownership(bool claim) override;
4504
4505 size_t get_data_size() override;
4506
4507#ifdef MYSQL_SERVER
4508 int pack_info(Protocol *protocol) override;
4509#endif
4510
4511#ifndef MYSQL_SERVER
4512 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
4513#endif
4514
4515#if defined(MYSQL_SERVER)
4516 int do_apply_event(Relay_log_info const *rli) override;
4517 int do_update_pos(Relay_log_info *rli) override;
4518#endif
4519
4520 /**
4521 Returns the view id.
4522 */
4523 char *get_view_id() { return view_id; }
4524
4525 /**
4526 Sets the certification info in the event
4527
4528 @note size is calculated on this method as the size of the data
4529 might render the log even invalid. Also due to its size doing it
4530 here avoid looping over the data multiple times.
4531
4532 @param[in] info certification info to be written
4533 @param[out] event_size the event size after this operation
4534 */
4535 void set_certification_info(std::map<std::string, std::string> *info,
4536 size_t *event_size);
4537
4538 /**
4539 Returns the certification info
4540 */
4541 std::map<std::string, std::string> *get_certification_info() {
4542 return &certification_info;
4543 }
4544
4545 /**
4546 Set the certification sequence number
4547
4548 @param number the sequence number
4549 */
4550 void set_seq_number(rpl_gno number) { seq_number = number; }
4551
4552 /**
4553 Returns the certification sequence number
4554 */
4555 rpl_gno get_seq_number() { return seq_number; }
4557
4558inline bool is_any_gtid_event(const Log_event *evt) {
4560 evt->get_type_code()));
4561}
4562
4563/**
4564 Check if the given event is a session control event, one of
4565 `User_var_event`, `Intvar_event` or `Rand_event`.
4566
4567 @param evt The event to check.
4568
4569 @return true if the given event is of type `User_var_event`,
4570 `Intvar_event` or `Rand_event`, false otherwise.
4571 */
4572inline bool is_session_control_event(Log_event *evt) {
4576}
4577
4578/**
4579 The function checks the argument event properties to deduce whether
4580 it represents an atomic DDL.
4581
4582 @param evt a reference to Log_event
4583 @return true when the DDL properties are found,
4584 false otherwise
4585*/
4586inline bool is_atomic_ddl_event(Log_event const *evt) {
4587 return evt != nullptr &&
4589 static_cast<Query_log_event const *>(evt)->ddl_xid !=
4591}
4592
4593/**
4594 The function lists all DDL instances that are supported
4595 for crash-recovery (WL9175).
4596 todo: the supported feature list is supposed to grow. Once
4597 a feature has been readied for 2pc through WL7743,9536(7141/7016) etc
4598 it needs registering in the function.
4599
4600 @param thd an Query-log-event creator thread handle
4601 @param using_trans
4602 The caller must specify the value according to the following
4603 rules:
4604 @c true when
4605 - on master the current statement is not processing
4606 a table in SE which does not support atomic DDL
4607 - on slave the relay-log repository is transactional.
4608 @c false otherwise.
4609 @return true when the being created (master) or handled (slave) event
4610 is 2pc-capable, @c false otherwise.
4611*/
4612bool is_atomic_ddl(THD *thd, bool using_trans);
4613
4614#ifdef MYSQL_SERVER
4615/**
4616 Serialize an binary event to the given output stream. It is more general
4617 than call ev->write() directly. The caller will not be affected if any
4618 change happens in serialization process. For example, serializing the
4619 event in different format.
4621template <class EVENT>
4622bool binary_event_serialize(EVENT *ev, Basic_ostream *ostream) {
4623 return ev->write(ostream);
4624}
4625
4626/*
4627 This is an utility function that adds a quoted identifier into the a buffer.
4628 This also escapes any existence of the quote string inside the identifier.
4629 */
4630size_t my_strmov_quoted_identifier(THD *thd, char *buffer,
4631 const char *identifier, size_t length);
4632#else
4633size_t my_strmov_quoted_identifier(char *buffer, const char *identifier);
4634#endif
4636 const char *identifier,
4637 size_t length);
4638
4639/**
4640 Read an integer in net_field_length format, guarding against read out of
4641 bounds and advancing the position.
4642
4643 @param[in,out] packet Pointer to buffer to read from. On successful
4644 return, the buffer position will be incremented to point to the next
4645 byte after what was read.
4646
4647 @param[in,out] max_length Pointer to the number of bytes in the
4648 buffer. If the function would need to look at more than *max_length
4649 bytes in order to decode the number, the function will do nothing
4650 and return true.
4651
4652 @param[out] out Pointer where the value will be stored.
4653
4654 @retval false Success.
4655 @retval true Failure, i.e., reached end of buffer.
4656*/
4657template <typename T>
4658bool net_field_length_checked(const uchar **packet, size_t *max_length, T *out);
4659
4660/**
4661 Extract basic info about an event: type, query, is it ignorable
4662
4663 @param log_event the event to extract info from
4664 @return a pair first param is true if an error occurred, false otherwise
4665 second param is the event info
4666 */
4667std::pair<bool, mysql::binlog::event::Log_event_basic_info>
4669
4670/**
4671 Extract basic info about an event: type, query, is it ignorable
4672
4673 @param buf The event info buffer
4674 @param length The length of the buffer
4675 @param fd_event The Format description event associated
4676 @return a pair first param is true if an error occurred, false otherwise
4677 second param is the event info
4678 */
4679std::pair<bool, mysql::binlog::event::Log_event_basic_info>
4681 const char *buf, size_t length,
4683
4684/**
4685 @} (end of group Replication)
4686*/
4687
4688#endif /* _log_event_h */
Kerberos Client Authentication nullptr
Definition: auth_kerberos_client_plugin.cc:247
int64 query_id_t
Definition: binlog.h:72
Contains the classes representing events occurring in the replication stream.
#define LOG_EVENT_HEADER_LEN
Definition: binlog_event.h:436
This event is created to contain the file data.
Definition: log_event.h:2103
bool write(Basic_ostream *ostream) override
Definition: log_event.cc:6929
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:6956
virtual int get_create_or_append() const
Definition: log_event.cc:6979
bool is_sbr_logging_format() const override
Return true if the event has to be logged using SBR for DMLs.
Definition: log_event.h:2137
size_t get_data_size() override
Definition: log_event.h:2128
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:6966
~Append_block_log_event() override=default
const char * get_db() override
Definition: log_event.h:2134
Append_block_log_event(Append_block_log_event &&) noexcept=delete
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:7009
The abstract class for basic output streams which provides write operation.
Definition: basic_ostream.h:36
Event for the first block of file to be loaded, its only difference from Append_block event is that t...
Definition: log_event.h:2253
enum_skip_reason do_shall_skip(Relay_log_info *rli) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.cc:7230
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:7220
~Begin_load_query_log_event() override=default
Begin_load_query_log_event(THD *thd)
Begin_load_query_log_event(Begin_load_query_log_event &&) noexcept=delete
int get_create_or_append() const override
Definition: log_event.cc:7226
Delete_file_log_event is created when the LOAD_DATA query fails on the master for some reason,...
Definition: log_event.h:2175
Delete_file_log_event(const Delete_file_log_event &)=delete
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:7170
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:7148
size_t get_data_size() override
Definition: log_event.h:2198
~Delete_file_log_event() override=default
bool is_sbr_logging_format() const override
Return true if the event has to be logged using SBR for DMLs.
Definition: log_event.h:2206
bool write(Basic_ostream *ostream) override
Definition: log_event.cc:7125
const char * get_db() override
Definition: log_event.h:2203
Delete_file_log_event(Delete_file_log_event &&) noexcept=delete
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:7158
Log row deletions.
Definition: log_event.h:3538
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 aft...
Definition: log_event.h:3559
static bool binlog_row_logging_function(THD *thd, TABLE *table, bool is_transactional, const uchar *before_record, const uchar *after_record)
Definition: log_event.cc:12408
int do_after_row_operations(const Relay_log_info *const, int) override
Definition: log_event.cc:12461
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:12428
Delete_rows_log_event(THD *, TABLE *, const mysql::binlog::event::Table_id &, bool is_transactional, const unsigned char *extra_row_ndb_info)
Definition: log_event.cc:12397
mysql::binlog::event::Log_event_type get_general_type_code() override
Definition: log_event.h:3567
int do_exec_row(const Relay_log_info *const) override
Definition: log_event.cc:12468
@ TYPE_CODE
Definition: log_event.h:3542
int do_before_row_operations(const Relay_log_info *const) override
Definition: log_event.cc:12435
Event responsible for LOAD DATA execution, it similar to Query_log_event but before executing the que...
Definition: log_event.h:2320
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:7384
bool is_sbr_logging_format() const override
When a query log event contains a non-transaction control statement, we assume that it is changing da...
Definition: log_event.h:2345
bool write_post_header_for_derived(Basic_ostream *ostream) override
Definition: log_event.cc:7294
int pack_info(Protocol *protocol) override
This (which is used only for SHOW BINLOG EVENTS) could be updated to print SET @session_var=.
Definition: log_event.cc:7353
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:7288
ulong get_post_header_size_for_derived() override
Definition: log_event.cc:7284
Execute_load_query_log_event(THD *thd, const char *query_arg, ulong query_length, uint fn_pos_start_arg, uint fn_pos_end_arg, mysql::binlog::event::enum_load_dup_handling dup_handling_arg, bool using_trans, bool immediate, bool suppress_use, int errcode)
Definition: log_event.cc:7243
~Execute_load_query_log_event() override=default
Definition: field.h:573
For binlog version 4.
Definition: log_event.h:1536
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:5245
std::atomic< int32 > atomic_usage_counter
Definition: log_event.h:1554
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:5251
enum_skip_reason do_shall_skip(Relay_log_info *rli) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.cc:5424
size_t get_data_size() override
Definition: log_event.h:1567
bool write(Basic_ostream *ostream) override
Definition: log_event.cc:5261
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:5395
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:5344
Format_description_log_event()
Format_description_log_event 1st ctor.
Definition: log_event.cc:5136
This is a subclass if Gtid_event and Log_event.
Definition: log_event.h:3955
void set_trx_length_by_cache_size_tagged(ulonglong cache_size, bool is_checksum_enabled=false, int event_counter=0)
Set the transaction length information based on binlog cache size.
Definition: log_event.cc:13598
rpl_gno get_gno() const override
Return the GNO for this GTID.
Definition: log_event.h:4125
rpl_sidno get_sidno(bool need_lock)
Return the SIDNO relative to the global tsid_map for this GTID.
Definition: log_event.cc:13630
~Gtid_log_event() override=default
bool write_data_header(Basic_ostream *ostream) override
Writes the post-header to the given output stream.
Definition: log_event.cc:13312
Gtid_log_event(Gtid_log_event &&) noexcept=delete
size_t get_event_length()
Definition: log_event.h:4020
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:13579
enum_gtid_type get_type() const
Return the gtid type for this Gtid_log_event: this can be either ANONYMOUS_GTID, AUTOMATIC_GTID,...
Definition: log_event.h:4088
uint32 write_body_to_memory(uchar *buff)
Writes the body to the given memory buffer.
Definition: log_event.cc:13349
Gtid_log_event(const Gtid_log_event &)=delete
uint32 write_tagged_event_body_to_memory(uchar *buffer)
Writes the body to the given memory buffer.
Definition: log_event.cc:13322
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:13423
uint32 write_post_header_to_memory(uchar *buffer)
Writes the post-header to the given memory buffer.
Definition: log_event.cc:13252
static const size_t SET_STRING_PREFIX_LENGTH
Length of SET_STRING_PREFIX.
Definition: log_event.h:4135
Tsid tsid
TSID for this GTID.
Definition: log_event.h:4148
const Tsid & get_tsid() const
Return the TSID for this GTID.
Definition: log_event.h:4094
Gtid_specification get_gtid_spec()
Definition: log_event.cc:13644
bool write_data_body(Basic_ostream *ostream) override
Definition: log_event.cc:13414
void set_trx_length_by_cache_size(ulonglong cache_size, bool is_checksum_enabled=false, int event_counter=0)
Set the transaction length information based on binlog cache size.
Definition: log_event.cc:13608
static const size_t MAX_SET_STRING_LENGTH
The maximal length of the entire "SET ..." query.
Definition: log_event.h:4137
void update_parent_gtid_info()
Updates parent tsid and gtid info structure.
Definition: log_event.cc:13077
static const char * SET_STRING_PREFIX
string holding the text "SET @@GLOBAL.GTID_NEXT = '"
Definition: log_event.h:4131
void clear_gtid_and_spec()
Clears tsid and spec.
Definition: log_event.cc:13083
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:13167
Gtid_specification spec
Internal representation of the GTID.
Definition: log_event.h:4146
int pack_info(Protocol *) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:13148
size_t get_data_size() override
Definition: log_event.h:4001
size_t to_string(char *buf) const
Used internally by both print() and pack_info().
Definition: log_event.cc:13156
enum_skip_reason do_shall_skip(Relay_log_info *rli) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.cc:13593
Represents a set of GTIDs.
Definition: rpl_gtid.h:1557
Definition: rpl_utility.h:110
Definition: log_event.h:3858
Heartbeat_log_event_v2(const char *buf, const mysql::binlog::event::Format_description_event *description_event)
Definition: log_event.cc:14467
Definition: log_event.h:3850
Heartbeat_log_event(const char *buf, const mysql::binlog::event::Format_description_event *description_event)
Definition: log_event.cc:14460
Base class for ignorable log events is Ignorable_event.
Definition: log_event.h:3704
int pack_info(Protocol *) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:12849
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:12842
size_t get_data_size() override
Definition: log_event.h:3737
Ignorable_log_event(Ignorable_log_event &&) noexcept=delete
~Ignorable_log_event() override
Ignorable_log_event(const Ignorable_log_event &)=delete
Class representing an incident, an occurrence out of the ordinary, that happened on the master.
Definition: log_event.h:3613
Incident_log_event(const Incident_log_event &)=delete
bool write_data_header(Basic_ostream *ostream) override
Definition: log_event.cc:12794
size_t get_data_size() override
Definition: log_event.h:3666
bool write_data_body(Basic_ostream *ostream) override
Definition: log_event.cc:12820
~Incident_log_event() override
Definition: log_event.cc:12708
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:12754
int pack_info(Protocol *) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:12727
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:12721
const char * description() const
Definition: log_event.cc:12712
bool ends_group() const override
Definition: log_event.h:3671
Incident_log_event(Incident_log_event &&) noexcept=delete
The class derives from the class Intvar_event in Binlog API, defined in the header binlog_event....
Definition: log_event.h:1612
bool write(Basic_ostream *ostream) override
Definition: log_event.cc:5740
~Intvar_log_event() override=default
Intvar_log_event(Intvar_log_event &&) noexcept=delete
size_t get_data_size() override
Definition: log_event.h:1641
enum_skip_reason do_shall_skip(Relay_log_info *rli) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.cc:5819
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:5750
Intvar_log_event(const Intvar_log_event &)=delete
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:5715
bool is_sbr_logging_format() const override
Return true if the event has to be logged using SBR for DMLs.
Definition: log_event.h:1649
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:5794
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:5814
Base class that is used to represent any kind of expression in a relational query.
Definition: item.h:929
Definition: key.h:113
Definition: sql_list.h:494
Definition: log_event.h:2356
bool has_replace
Definition: log_event.h:2376
const size_t BUF_SIZE
Definition: log_event.h:2365
const char * table_name
Definition: log_event.h:2372
const char * fname
Definition: log_event.h:2373
const sql_exchange * sql_ex
Definition: log_event.h:2370
THD * thd
Definition: log_event.h:2369
bool has_ignore
Definition: log_event.h:2377
String str
Definition: log_event.h:2366
const char * db
Definition: log_event.h:2371
bool is_concurrent
Definition: log_event.h:2375
const String * generate(size_t *fn_start, size_t *fn_end)
Definition: log_event.cc:7493
Load_query_generator(THD *thd_arg, const sql_exchange *ex, const char *db_arg, const char *table_name_arg, bool is_concurrent_arg, bool replace, bool ignore)
Definition: log_event.cc:7476
This is the abstract base class for binary log events.
Definition: log_event.h:539
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.
Definition: log_event.cc:1257
ulong mts_group_idx
Index in rli->gaq array to indicate a group that this event is purging.
Definition: log_event.h:694
bool is_using_stmt_cache() const
Definition: log_event.h:840
enum_skip_reason continue_group(Relay_log_info *rli)
Helper function to ignore an event w.r.t.
Definition: log_event.cc:2475
bool is_no_filter_event() const
Definition: log_event.h:834
int apply_event(Relay_log_info *rli)
Apply the event to the database.
Definition: log_event.cc:2882
virtual int do_apply_event(Relay_log_info const *rli)
Primitive to apply an event to the database.
Definition: log_event.h:1169
virtual const char * get_db()
Definition: log_event.cc:1060
static enum enum_mts_event_exec_mode get_mts_execution_mode(bool mts_in_group, mysql::binlog::event::Log_event_type type_code, uint32 server_id, uint32 log_pos)
Definition: log_event.h:953
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.
Definition: log_event.h:677
int net_send(Protocol *protocol, const char *log_name, my_off_t pos)
Only called by SHOW BINLOG EVENTS.
Definition: log_event.cc:1065
uint32 write_header_to_memory(uchar *buf)
Writes the common header of this event to the given memory buffer.
Definition: log_event.cc:1218
virtual mysql::binlog::event::Log_event_type get_type_code() const
Definition: log_event.h:798
virtual bool starts_group() const
Events of a certain type can start or end a group of events treated transactionally wrt binlog.
Definition: log_event.h:1101
uint32 server_id
Definition: log_event.h:665
enum_mts_event_exec_mode
Definition: log_event.h:934
@ EVENT_EXEC_PARALLEL
Definition: log_event.h:938
@ EVENT_EXEC_SYNC
Definition: log_event.h:946
@ EVENT_EXEC_CAN_NOT
Definition: log_event.h:950
@ EVENT_EXEC_ASYNC
Definition: log_event.h:942
enum_skip_reason shall_skip(Relay_log_info *rli)
Decide if the event shall be skipped, and the reason for skipping it.
Definition: log_event.h:1144
bool is_valid()
Definition: log_event.cc:1310
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.
Definition: log_event.h:1068
ha_checksum crc
Placeholder for event checksum while writing to binlog.
Definition: log_event.h:687
virtual size_t get_data_size()
Definition: log_event.h:880
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.
Definition: log_event.cc:1196
enum_event_cache_type
Definition: log_event.h:568
@ EVENT_CACHE_COUNT
Definition: log_event.h:590
@ EVENT_INVALID_CACHE
Definition: log_event.h:569
@ EVENT_NO_CACHE
Definition: log_event.h:586
@ EVENT_STMT_CACHE
Definition: log_event.h:575
@ EVENT_TRANSACTIONAL_CACHE
Definition: log_event.h:581
enum_skip_reason
Enumeration of what kinds of skipping (and non-skipping) that can occur when the slave executes an ev...
Definition: log_event.h:548
@ EVENT_SKIP_IGNORE
Skip event by ignoring it.
Definition: log_event.h:559
@ EVENT_SKIP_COUNT
Skip event and decrease skip counter.
Definition: log_event.h:564
@ EVENT_SKIP_NOT
Don't skip event.
Definition: log_event.h:552
bool is_mts_sequential_exec() const
Is called from get_mts_execution_mode() to.
Definition: log_event.h:910
bool m_free_temp_buf_in_destructor
Definition: log_event.h:656
bool is_relay_log_event() const
Definition: log_event.h:828
bool is_ignorable_event() const
Definition: log_event.h:831
ulonglong future_event_relay_log_pos
A copy of the main rli value stored into event to pass to MTS worker rli.
Definition: log_event.h:717
int update_pos(Relay_log_info *rli)
Update the relay log position.
Definition: log_event.h:1136
virtual int do_apply_event_worker(Slave_worker *w)
Definition: log_event.cc:984
void set_artificial_event()
Definition: log_event.h:816
const char * get_type_str() const
Returns the human readable name of this event's type.
Definition: log_event.cc:900
time_t get_time()
Prints a "session_var=value" string.
Definition: log_event.cc:877
bool write_footer(Basic_ostream *ostream)
Definition: log_event.cc:1205
Relay_log_info * worker
MTS: associating the event with either an assigned Worker or Coordinator.
Definition: log_event.h:712
bool is_using_trans_cache() const
Definition: log_event.h:837
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli)
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.cc:1006
db_worker_hash_entry * mts_assigned_partitions[MAX_DBS_IN_EVENT_MTS]
Partition info associate with event to deliver to MTS event applier.
Definition: log_event.h:724
virtual bool write(Basic_ostream *ostream)
Definition: log_event.h:786
ulong rbr_exec_mode
A storage to cache the global system variable's value.
Definition: log_event.h:671
mysql::binlog::event::Log_event_header * common_header
The Log_event_header class contains the variable present in the common header.
Definition: log_event.h:700
virtual void set_mts_isolate_group()
Definition: log_event.h:1047
THD * thd
Definition: log_event.h:720
int apply_gtid_event(Relay_log_info *rli)
Apply the GTID event in curr_group_data to the database.
Definition: log_event.cc:2839
mysql::binlog::event::Log_event_footer * common_footer
The Log_event_footer class contains the variable present in the common footer.
Definition: log_event.h:706
virtual bool write_data_body(Basic_ostream *)
Definition: log_event.h:795
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.
Definition: log_event.cc:936
void register_temp_buf(char *buf, bool free_in_destructor=true)
Definition: log_event.h:866
virtual uint8 mts_number_dbs()
Definition: log_event.h:1080
void free_temp_buf()
Definition: log_event.h:870
bool is_mts_group_isolated()
Definition: log_event.h:1087
ulong exec_time
Definition: log_event.h:659
virtual bool is_rbr_logging_format() const
Return true if the event has to be logged using RBR for DMLs.
Definition: log_event.h:809
virtual ~Log_event()
Definition: log_event.h:865
enum_event_logging_type event_logging_type
Defines when information, i.e.
Definition: log_event.h:683
enum_event_logging_type
Definition: log_event.h:593
@ EVENT_NORMAL_LOGGING
Definition: log_event.h:599
@ EVENT_IMMEDIATE_LOGGING
Definition: log_event.h:604
@ EVENT_INVALID_LOGGING
Definition: log_event.h:594
@ EVENT_CACHE_LOGGING_COUNT
Definition: log_event.h:608
char * temp_buf
Definition: log_event.h:649
virtual bool is_sbr_logging_format() const
Return true if the event has to be logged using SBR for DMLs.
Definition: log_event.h:805
virtual int pack_info(Protocol *protocol)
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:1055
bool is_using_immediate_logging() const
Definition: log_event.h:843
void set_relay_log_event()
Definition: log_event.h:824
virtual bool write_data_header(Basic_ostream *)
Definition: log_event.h:794
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 i...
Definition: log_event.cc:1088
bool is_artificial_event() const
Definition: log_event.h:825
virtual int do_update_pos(Relay_log_info *rli)
Advance relay log coordinates.
Definition: log_event.cc:998
virtual bool ends_group() const
Definition: log_event.h:1106
bool need_checksum()
A decider of whether to trigger checksum computation or not.
Definition: log_event.cc:1117
virtual void claim_memory_ownership(bool claim)
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.h:863
Slave_worker * get_slave_worker(Relay_log_info *rli)
The method maps the event to a Worker and return a pointer to it.
Definition: log_event.cc:2580
This is the subclass of Previous_gtids_event and Log_event It is used to record the gtid_executed in ...
Definition: log_event.h:4207
bool write_data_body(Basic_ostream *ostream) override
Definition: log_event.cc:13735
Previous_gtids_log_event(Previous_gtids_log_event &&) noexcept=delete
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:13742
char * get_str(size_t *length, const Gtid_set::String_format *string_format) const
Return the formatted string, or NULL on error.
Definition: log_event.cc:13716
int pack_info(Protocol *) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:13679
int do_apply_event(Relay_log_info const *) override
Primitive to apply an event to the database.
Definition: log_event.h:4299
int add_to_set(Gtid_set *gtid_set) const
Add all GTIDs from this event to the given Gtid_set.
Definition: log_event.cc:13705
size_t get_data_size() override
Definition: log_event.h:4230
enum_skip_reason do_shall_skip(Relay_log_info *) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.h:4294
bool write(Basic_ostream *ostream) override
Definition: log_event.h:4238
~Previous_gtids_log_event() override=default
const uchar * get_buf()
Return the encoded buffer, or NULL on error.
Definition: log_event.h:4275
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:13653
Definition: protocol.h:33
A Query event is written to the binary log whenever the database is modified on the master,...
Definition: log_event.h:1292
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:5017
bool need_sql_require_primary_key
Whether or not the statement represented by this event requires Q_SQL_REQUIRE_PRIMARY_KEY to be logge...
Definition: log_event.h:1498
bool is_sbr_logging_format() const override
When a query log event contains a non-transaction control statement, we assume that it is changing da...
Definition: log_event.h:1468
Query_log_event(const Query_log_event &)=delete
bool is_trans_keyword() const
Definition: log_event.h:1436
mysql::binlog::event::Log_event_header::Byte * data_buf
Definition: log_event.h:1294
bool m_skip_temp_tables_handling_by_worker
Instructs the applier to skip temporary tables handling.
Definition: log_event.h:1336
static size_t get_query(const char *buf, size_t length, const mysql::binlog::event::Format_description_event *fd_event, const char **query_arg)
Return the query string pointer (and its size) from a Query log event using only the event buffer (we...
Definition: log_event.cc:5067
Query_log_event()
The simplest constructor that could possibly work.
Definition: log_event.cc:3452
enum_skip_reason do_shall_skip(Relay_log_info *rli) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.cc:5031
virtual ulong get_post_header_size_for_derived()
Definition: log_event.h:1420
bool need_enable_cascade_triggers
Whether or not the statement represented by this event requires Q_ENABLE_CASCADE_TRIGGERS to be logge...
Definition: log_event.h:1506
bool starts_group() const override
Notice, DDL queries are logged without BEGIN/COMMIT parentheses and identification of such single-que...
Definition: log_event.h:1476
uchar mts_number_dbs() override
Definition: log_event.h:1387
my_thread_id slave_proxy_id
Definition: log_event.h:1309
void set_skip_temp_tables_handling_by_worker()
Definition: log_event.h:1338
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:5120
bool has_ddl_committed
The flag indicates whether the DDL query has been (already) committed or not.
Definition: log_event.h:1329
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:4236
~Query_log_event() override
Definition: log_event.h:1405
void attach_temp_tables_worker(THD *, const Relay_log_info *)
Associating slave Worker thread to a subset of temporary tables.
Definition: log_event.cc:4213
bool write(Basic_ostream *ostream) override
Query_log_event::write().
Definition: log_event.cc:3142
bool rollback_injected_by_coord
True if this is a ROLLBACK event injected by the mts coordinator to finish a group corresponding to a...
Definition: log_event.h:1317
bool is_query_prefix_match(const char *pattern, uint p_len)
Definition: log_event.h:1492
uint8 get_mts_dbs(Mts_db_names *arg, Rpl_filter *rpl_filter) override
Definition: log_event.h:1362
bool needs_default_table_encryption
Whether or not the statement represented by this event requires Q_DEFAULT_TABLE_ENCRYPTION to be logg...
Definition: log_event.h:1502
const char * get_db() override
Definition: log_event.h:1349
int pack_info(Protocol *protocol) override
This (which is used only for SHOW BINLOG EVENTS) could be updated to print SET @session_var=.
Definition: log_event.cc:3091
bool ends_group() const override
Definition: log_event.h:1481
bool is_skip_temp_tables_handling_by_worker()
Definition: log_event.h:1342
virtual bool write_post_header_for_derived(Basic_ostream *)
Definition: log_event.h:1413
void detach_temp_tables_worker(THD *, const Relay_log_info *)
Dissociating slave Worker thread from its thd->temporary_tables to possibly update the involved entri...
Definition: log_event.cc:4227
Logs random seed used by the next RAND(), and by PASSWORD() in 4.1.0.
Definition: log_event.h:1685
bool write(Basic_ostream *ostream) override
Definition: log_event.cc:5860
bool is_sbr_logging_format() const override
Return true if the event has to be logged using SBR for DMLs.
Definition: log_event.h:1719
~Rand_log_event() override=default
size_t get_data_size() override
Definition: log_event.h:1714
Rand_log_event(const Rand_log_event &)=delete
Rand_log_event(Rand_log_event &&) noexcept=delete
enum_skip_reason do_shall_skip(Relay_log_info *rli) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.cc:5905
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:5886
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:5836
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:5900
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:5854
Definition: rpl_rli.h:205
This will be deprecated when we move to using sequence ids.
Definition: log_event.h:2038
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:5549
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:5437
enum_skip_reason do_shall_skip(Relay_log_info *rli) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.cc:5691
~Rotate_log_event() override=default
Rotate_log_event(Rotate_log_event &&) noexcept=delete
Rotate_log_event(const Rotate_log_event &)=delete
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:5510
bool write(Basic_ostream *ostream) override
Definition: log_event.cc:5520
size_t get_data_size() override
Definition: log_event.h:2058
Definition: log_event.h:2668
bool is_enabled()
If instrumentation is enabled this member function SHALL return true.
Definition: log_event.h:2695
Rows_applier_psi_stage & operator=(const Rows_applier_psi_stage &rhs)
void inc_n_rows_applied(ulonglong delta)
Updates the counter of processed rows.
Definition: log_event.h:2741
ulonglong m_n_rows_applied
Counter that is unconditionally incremented on each row that is processed.
Definition: log_event.h:2683
ulonglong get_n_rows_applied()
Gets the value of the counter of rows that have been processed.
Definition: log_event.h:2747
Rows_applier_psi_stage()
Definition: log_event.h:2686
void update_work_estimated_and_completed(const uchar *cursor, const uchar *begin, const uchar *end)
This member function shall update the progress and reestimate the remaining work needed.
Definition: log_event.h:2708
void set_progress(PSI_stage_progress *progress)
Definition: log_event.h:2688
void end_work()
Resets this object.
Definition: log_event.h:2732
PSI_stage_progress * m_progress
A cached pointer to this stage PSI_stage_progress.
Definition: log_event.h:2676
Definition: log_event.h:2967
KEY ** m_key_info
Definition: log_event.h:2987
Key_compare(KEY **ki=nullptr)
Definition: log_event.h:2980
bool operator()(uchar *k1, uchar *k2) const
Definition: log_event.h:2981
Common base class for all row-containing log events.
Definition: log_event.h:2785
MY_BITMAP write_set_backup
This bitmap is used as a backup for the write set while we calculate the values for any hidden genera...
Definition: log_event.h:3289
uint32 m_bitbuf[128/(sizeof(uint32) *8)]
Definition: log_event.h:2948
uchar * m_rows_end
Definition: log_event.h:2957
int close_record_scan()
Does the cleanup.
Definition: log_event.cc:8755
virtual mysql::binlog::event::Log_event_type get_general_type_code()=0
int handle_idempotent_and_ignored_errors(Relay_log_info const *rli, int *err)
Private member function called while handling idempotent errors.
Definition: log_event.cc:8700
bool write_data_header(Basic_ostream *ostream) override
Definition: log_event.cc:10306
virtual int do_before_row_operations(const Relay_log_info *const log)=0
uchar * m_rows_buf
Definition: log_event.h:2955
void decide_row_lookup_algorithm_and_key()
Definition: log_event.cc:8308
uint m_rows_lookup_algorithm
The algorithm to use while searching for rows using the before image.
Definition: log_event.h:2929
TABLE * m_table
Definition: log_event.h:2908
ColumnViewPtr m_column_view
Wrapper around TABLE *m_table that abstracts the table field set iteration logic, since it is not man...
Definition: log_event.h:3089
bool is_rbr_logging_format() const override
Return true if the event has to be logged using RBR for DMLs.
Definition: log_event.h:3076
int do_hash_row(Relay_log_info const *rli)
Populates the m_hash when using HASH_SCAN.
Definition: log_event.cc:9137
@ RLE_NO_FLAGS
Definition: log_event.h:2821
Hash_slave_rows m_hash
Hash table that will hold the entries for while using HASH_SCAN algorithm to search and update/delete...
Definition: log_event.h:2923
uchar * m_distinct_key_spare_buf
A spare buffer which will be used when saving the distinct keys for doing an index scan with HASH_SCA...
Definition: log_event.h:2995
int do_hash_scan_and_update(Relay_log_info const *rli)
Implementation of the hash_scan and update algorithm.
Definition: log_event.cc:9381
int add_row_data(uchar *data, size_t length)
Definition: log_event.h:2846
uint m_key_index
Definition: log_event.h:2965
int do_apply_row(Relay_log_info const *rli)
Commodity wrapper around do_exec_row(), that deals with resetting the thd reference in the table.
Definition: log_event.cc:8730
int row_operations_scan_and_key_setup()
Definition: log_event.cc:8406
MY_BITMAP const * get_cols_ai() const
Definition: log_event.h:2855
enum_skip_reason do_shall_skip(Relay_log_info *rli) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.cc:10168
Rows_log_event(const Rows_log_event &)=delete
MY_BITMAP m_local_cols_ai
Bitmap denoting columns available in the after-image as they appear in the table setup.
Definition: log_event.h:2945
uchar * m_key
Definition: log_event.h:2964
int do_index_scan_and_update(Relay_log_info const *rli)
Implementation of the index scan and update algorithm.
Definition: log_event.cc:8906
int do_scan_and_update(Relay_log_info const *rli)
This member function scans the table and applies the changes that had been previously hashed.
Definition: log_event.cc:9205
virtual int do_add_row_data(uchar *data, size_t length)
Definition: log_event.cc:8041
Rows_applier_psi_stage m_psi_progress
Definition: log_event.h:2788
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...
Definition: log_event.cc:8497
size_t get_data_size() override
Definition: log_event.cc:8008
const char * get_db() override
Definition: log_event.h:2879
uint16 flag_set
Definition: log_event.h:2798
row_lookup_mode
Definition: log_event.h:2800
@ ROW_LOOKUP_INDEX_SCAN
Definition: log_event.h:2803
@ ROW_LOOKUP_UNDEFINED
Definition: log_event.h:2801
@ ROW_LOOKUP_NOT_NEEDED
Definition: log_event.h:2802
@ ROW_LOOKUP_TABLE_SCAN
Definition: log_event.h:2804
@ ROW_LOOKUP_HASH_SCAN
Definition: log_event.h:2805
virtual bool read_write_bitmaps_cmp(const TABLE *table) const =0
Compares the table's read/write_set with the columns included in this event's before-image and/or aft...
virtual int skip_after_image_for_update_event(const Relay_log_info *rli, const uchar *curr_bi_start)
Seek past the after-image of an update event, in case a row was processed without reading the after-i...
Definition: log_event.h:3214
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...
Definition: log_event.cc:8479
uchar * m_rows_cur
Definition: log_event.h:2956
const mysql::binlog::event::Table_id & get_table_id() const
Definition: log_event.h:2856
uint m_row_count
Definition: log_event.h:2882
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:9485
int next_record_scan(bool first_read)
Fetches next row.
Definition: log_event.cc:8768
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:10412
int do_table_scan_and_update(Relay_log_info const *rli)
Implementation of the legacy table_scan and update algorithm.
Definition: log_event.cc:9402
MY_BITMAP m_local_cols
Bitmap denoting columns available in the image as they appear in the table setup.
Definition: log_event.h:2917
int open_record_scan()
Initializes scanning of rows.
Definition: log_event.cc:8830
void clear_flags(flag_set flags_arg)
Definition: log_event.h:2826
virtual int do_exec_row(const Relay_log_info *const rli)=0
std::set< uchar *, Key_compare >::iterator m_itr
Definition: log_event.h:2990
enum_error
Enumeration of the errors that can be returned.
Definition: log_event.h:2811
@ ERR_TABLE_LIMIT_EXCEEDED
No more room for tables.
Definition: log_event.h:2814
@ ERR_BAD_TABLE_DEF
Table definition does not match.
Definition: log_event.h:2816
@ ERR_OPEN_FAILURE
Failure to open table.
Definition: log_event.h:2812
@ ERR_RBR_TO_SBR
daisy-chanining RBR to SBR not allowed
Definition: log_event.h:2817
@ ERR_OUT_OF_MEM
Out of memory.
Definition: log_event.h:2815
@ ERR_OK
No error.
Definition: log_event.h:2813
int row_operations_scan_and_key_teardown(int error)
Definition: log_event.cc:8449
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 t...
Definition: log_event.cc:7985
virtual int do_after_row_operations(const Relay_log_info *const log, int error)=0
MY_BITMAP const * get_cols() const
Definition: log_event.h:2854
std::set< uchar *, Key_compare > m_distinct_keys
Definition: log_event.h:2989
void do_post_row_operations(Relay_log_info const *rli, int err)
Private member function called after updating/deleting a row.
Definition: log_event.cc:8612
Rows_log_event(Rows_log_event &&) noexcept=delete
const uchar * m_curr_row
Definition: log_event.h:2962
MY_BITMAP m_cols_ai
Bitmap for columns available in the after image, if present.
Definition: log_event.h:2938
int add_key_to_distinct_keyset()
Populates the m_distinct_keys with unique keys to be modified during HASH_SCAN over keys.
Definition: log_event.cc:8886
KEY * m_key_info
Definition: log_event.h:2966
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].
Definition: log_event.cc:7892
int do_update_pos(Relay_log_info *rli) override
The method either increments the relay log position or commits the current statement and increments t...
Definition: log_event.cc:10274
~Rows_log_event() override
Definition: log_event.cc:7872
void set_flags(flag_set flags_arg)
Definition: log_event.h:2825
friend class Old_rows_log_event
Definition: log_event.h:3281
const uchar * m_curr_row_end
Definition: log_event.h:2963
bool write_data_body(Basic_ostream *ostream) override
Definition: log_event.cc:10379
uint32 m_bitbuf_ai[128/(sizeof(uint32) *8)]
Definition: log_event.h:2949
MY_BITMAP m_cols
Definition: log_event.h:2910
It is used to record the original query for the rows events in RBR.
Definition: log_event.h:3776
size_t get_data_size() override
Definition: log_event.h:3825
~Rows_query_log_event() override
Definition: log_event.h:3818
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:12981
bool write_data_body(Basic_ostream *ostream) override
Definition: log_event.cc:12964
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:12879
int pack_info(Protocol *) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:12886
Rows_query_log_event(THD *thd_arg, const char *query, size_t query_len)
Definition: log_event.h:3779
Rpl_filter.
Definition: rpl_filter.h:214
const char * get_rewrite_db(const char *db, size_t *new_len)
Definition: rpl_filter.cc:1176
bool is_rewrite_empty()
Definition: rpl_filter.cc:571
Mix-in to handle the message logging and reporting for relay log info and master log info structures.
Definition: rpl_reporting.h:54
Definition: rpl_rli_pdb.h:468
Definition: log_event.h:1962
mysql::binlog::event::Log_event_type get_type_code() const override
Definition: log_event.h:1991
Stop_log_event()
Definition: log_event.h:1971
~Stop_log_event() override=default
Stop_log_event(const Stop_log_event &)=delete
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:6850
enum_skip_reason do_shall_skip(Relay_log_info *) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.h:2000
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:6870
String class wrapper with a preallocated buffer of size buff_sz.
Definition: sql_string.h:672
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:169
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
Table_map_log_event which maps a table definition to a number.
Definition: log_event.h:2440
Table_map_log_event(Table_map_log_event &&) noexcept=delete
enum_skip_reason do_shall_skip(Relay_log_info *rli) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.cc:10938
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:10803
Table_map_log_event(const Table_map_log_event &)=delete
uint8 mts_number_dbs() override
Definition: log_event.h:2532
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:10947
const char * get_db_name() const
Definition: log_event.h:2524
virtual int save_field_metadata()
Save the field metadata based on the real_type of the field.
Definition: log_event.cc:10500
bool init_set_str_value_field()
Definition: log_event.cc:11255
flag_set get_flags(flag_set flag) const
Definition: log_event.h:2486
~Table_map_log_event() override
bool init_geometry_type_field()
Definition: log_event.cc:11303
bool init_charset_field(std::function< bool(const Field *)> include_type, Optional_metadata_field_type default_charset_type, Optional_metadata_field_type column_charset_type)
Capture and serialize character sets.
Definition: log_event.cc:11149
bool init_primary_key_field()
Definition: log_event.cc:11334
enum_flag
Definition: log_event.h:2463
@ ENUM_FLAG_COUNT
Nothing here right now, but the flags support is there in preparation for changes that are coming.
Definition: log_event.h:2470
bool is_rbr_logging_format() const override
Return true if the event has to be logged using RBR for DMLs.
Definition: log_event.h:2594
const mysql::binlog::event::Table_id & get_table_id() const
Definition: log_event.h:2520
bool init_column_visibility_field()
Definition: log_event.cc:11382
const char * get_table_name() const
Definition: log_event.h:2523
uint8 get_mts_dbs(Mts_db_names *arg, Rpl_filter *rpl_filter) override
Definition: log_event.h:2544
@ TYPE_CODE
Definition: log_event.h:2449
bool write_data_header(Basic_ostream *ostream) override
Definition: log_event.cc:10952
bool write_data_body(Basic_ostream *ostream) override
Definition: log_event.cc:10966
bool init_enum_str_value_field()
Definition: log_event.cc:11282
bool init_column_name_field()
Definition: log_event.cc:11243
ColumnViewPtr m_column_view
Wrapper around TABLE *m_table that abstracts the table field set iteration logic, since it is not man...
Definition: log_event.h:2618
const char * get_db() override
Definition: log_event.h:2531
size_t get_data_size() override
Definition: log_event.h:2526
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:11414
TABLE * m_table
Definition: log_event.h:2604
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:10684
void init_metadata_fields()
Capture the optional metadata fields which should be logged into table_map_log_event and serialize th...
Definition: log_event.cc:11095
enum_error
Enumeration of the errors that can be returned.
Definition: log_event.h:2454
@ ERR_OK
No error.
Definition: log_event.h:2456
@ ERR_TABLE_LIMIT_EXCEEDED
No more room for tables.
Definition: log_event.h:2457
@ ERR_OPEN_FAILURE
Failure to open table.
Definition: log_event.h:2455
@ ERR_OUT_OF_MEM
Out of memory.
Definition: log_event.h:2458
@ ERR_BAD_TABLE_DEF
Table definition does not match.
Definition: log_event.h:2459
@ ERR_RBR_TO_SBR
daisy-chanining RBR to SBR not allowed
Definition: log_event.h:2460
bool has_generated_invisible_primary_key() const
Definition: log_event.cc:10680
bool init_vector_dimensionality_field()
Definition: log_event.cc:11320
StringBuffer< 1024 > m_metadata_buf
Definition: log_event.h:2607
@ TM_GENERATED_INVISIBLE_PK_F
Table has generated invisible primary key.
Definition: log_event.h:2483
@ TM_BIT_LEN_EXACT_F
Definition: log_event.h:2476
@ TM_NO_FLAGS
Definition: log_event.h:2475
@ TM_REFERRED_FK_DB_F
Definition: log_event.h:2477
bool init_signedness_field()
Definition: log_event.cc:11118
This is the subclass of Transaction_context_event and Log_event This class encodes the transaction_co...
Definition: log_event.h:4329
static int get_data_set_size(std::list< const char * > *set)
Definition: log_event.cc:13977
void add_write_set(const char *hash)
Add a hash which identifies a inserted/updated/deleted row on the ongoing transaction.
Definition: log_event.cc:13989
my_thread_id get_thread_id() const
Return the id of the committing thread.
Definition: log_event.h:4435
Transaction_context_log_event(const char *server_uuid_arg, bool using_trans, my_thread_id thread_id_arg, bool is_gtid_specified)
Definition: log_event.cc:13751
void add_read_set(const char *hash)
Add a hash which identifies a read row on the ongoing transaction.
Definition: log_event.cc:13994
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:13869
Gtid_set * get_snapshot_version()
Return the transaction snapshot timestamp.
Definition: log_event.h:4425
size_t get_data_size() override
Definition: log_event.cc:13876
int do_apply_event(Relay_log_info const *) override
Primitive to apply an event to the database.
Definition: log_event.h:4383
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:13844
bool read_snapshot_version()
Read snapshot version from encoded buffers.
Definition: log_event.cc:13956
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:13836
Gtid_set * snapshot_version
A gtid_set which is used to store the transaction set used for conflict detection.
Definition: log_event.h:4335
size_t get_event_length()
Definition: log_event.cc:13888
Tsid_map * tsid_map
The Tsid_map to use for creating the Gtid_set.
Definition: log_event.h:4332
std::list< const char * > * get_read_set()
Return a pointer to read-set list.
Definition: log_event.h:4410
size_t get_snapshot_version_size()
Definition: log_event.cc:13971
bool write_data_header(Basic_ostream *ostream) override
Definition: log_event.cc:13893
bool is_gtid_specified() const
Return true if transaction has GTID fully specified, false otherwise.
Definition: log_event.h:4442
~Transaction_context_log_event() override
Definition: log_event.cc:13819
bool write_data_set(Basic_ostream *ostream, std::list< const char * > *set)
Definition: log_event.cc:13937
std::list< const char * > * get_write_set()
Return a pointer to write-set list.
Definition: log_event.h:4398
bool write_data_body(Basic_ostream *ostream) override
Definition: log_event.cc:13909
size_t to_string(char *buf, ulong len) const
Definition: log_event.cc:13830
const char * get_server_uuid()
Return the server uuid.
Definition: log_event.h:4430
bool write_snapshot_version(Basic_ostream *ostream)
Definition: log_event.cc:13921
Definition: log_event.h:3879
size_t get_event_length()
Definition: log_event.h:3915
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:14221
bool apply_payload_event(Relay_log_info const *rli, const uchar *event_buf)
Definition: log_event.cc:14278
enum_skip_reason do_shall_skip(Relay_log_info *rli) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.cc:14366
bool ends_group() const override
Definition: log_event.cc:14413
bool write(Basic_ostream *ostream) override
Definition: log_event.cc:14371
~Transaction_payload_log_event() override=default
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:14403
size_t get_data_size() override
Definition: log_event.cc:14213
Transaction_payload_log_event(THD *thd_arg, const char *payload, uint64_t payload_size, uint16_t compression_type, uint64_t uncompressed_size)
Definition: log_event.h:3883
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:14227
Represents a bidirectional map between TSID and SIDNO.
Definition: rpl_gtid.h:750
rpl_sidno add_tsid(const Tsid &tsid)
Add the given TSID to this map if it does not already exist.
Definition: rpl_gtid_tsid_map.cc:61
Log row updates with a before image.
Definition: log_event.h:3418
int do_exec_row(const Relay_log_info *const) override
Definition: log_event.cc:12627
static mysql::binlog::event::Log_event_type get_update_rows_event_type(const THD *thd_arg)
Auxiliary function used in the (THD*, ...) constructor to determine the type code based on configurat...
Definition: log_event.cc:12514
static bool binlog_row_logging_function(THD *thd, TABLE *table, bool is_transactional, const uchar *before_record, const uchar *after_record)
Definition: log_event.cc:12542
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 aft...
Definition: log_event.h:3451
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:12587
int do_after_row_operations(const Relay_log_info *const, int) override
Definition: log_event.cc:12620
@ TYPE_CODE
Definition: log_event.h:3422
Update_rows_log_event(THD *, TABLE *, const mysql::binlog::event::Table_id &table_id, MY_BITMAP const *cols_bi, MY_BITMAP const *cols_ai, bool is_transactional, const unsigned char *extra_row_ndb_info)
int do_before_row_operations(const Relay_log_info *const) override
Definition: log_event.cc:12594
mysql::binlog::event::Log_event_type get_general_type_code() override
Definition: log_event.h:3460
~Update_rows_log_event() override
Definition: log_event.cc:12565
int skip_after_image_for_update_event(const Relay_log_info *rli, const uchar *curr_bi_start) override
Seek past the after-image of an update event, in case a row was processed without reading the after-i...
Definition: log_event.cc:9079
void init(MY_BITMAP const *cols)
Definition: log_event.cc:12549
Every time a query uses the value of a user variable, a User_var_log_event is written before the Quer...
Definition: log_event.h:1893
~User_var_log_event() override=default
bool is_sbr_logging_format() const override
Return true if the event has to be logged using SBR for DMLs.
Definition: log_event.h:1947
bool is_deferred()
Definition: log_event.h:1936
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:6798
query_id_t query_id
Definition: log_event.h:1903
void set_deferred(query_id_t qid)
Definition: log_event.h:1941
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:6419
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:6688
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:6817
User_var_log_event(const User_var_log_event &)=delete
User_var_log_event(User_var_log_event &&) noexcept=delete
enum_skip_reason do_shall_skip(Relay_log_info *rli) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.cc:6803
bool deferred
Definition: log_event.h:1902
bool write(Basic_ostream *ostream) override
Definition: log_event.cc:6517
This is the subclass of View_change_log_event and Log_event This class created the view_change_log_ev...
Definition: log_event.h:4471
std::map< std::string, std::string > * get_certification_info()
Returns the certification info.
Definition: log_event.h:4539
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:14134
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:14061
bool write_data_body(Basic_ostream *ostream) override
Definition: log_event.cc:14151
void set_seq_number(rpl_gno number)
Set the certification sequence number.
Definition: log_event.h:4548
char * get_view_id()
Returns the view id.
Definition: log_event.h:4521
size_t get_size_data_map(std::map< std::string, std::string > *map)
Definition: log_event.cc:14042
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:14067
size_t get_data_size() override
Definition: log_event.cc:14033
bool write_data_header(Basic_ostream *ostream) override
Definition: log_event.cc:14140
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:14093
rpl_gno get_seq_number()
Returns the certification sequence number.
Definition: log_event.h:4553
bool write_data_map(Basic_ostream *ostream, std::map< std::string, std::string > *map)
Definition: log_event.cc:14159
void set_certification_info(std::map< std::string, std::string > *info, size_t *event_size)
Sets the certification info in the event.
Definition: log_event.cc:14195
View_change_log_event(const View_change_log_event &)=delete
size_t to_string(char *buf, ulong len) const
Definition: log_event.cc:14056
Log row insertions and updates.
Definition: log_event.h:3329
int do_before_row_operations(const Relay_log_info *const) override
Definition: log_event.cc:11900
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:12383
mysql::binlog::event::Log_event_type get_general_type_code() override
Definition: log_event.h:3362
@ TYPE_CODE
Definition: log_event.h:3333
Write_rows_log_event(THD *, TABLE *, const mysql::binlog::event::Table_id &table_id, bool is_transactional, const unsigned char *extra_row_ndb_info)
Definition: log_event.cc:11870
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 aft...
Definition: log_event.h:3351
int do_exec_row(const Relay_log_info *const) override
Definition: log_event.cc:12360
int write_row(const Relay_log_info *const, const bool)
Write the current row into event's table.
Definition: log_event.cc:12089
int do_after_row_operations(const Relay_log_info *const, int) override
Definition: log_event.cc:12008
static bool binlog_row_logging_function(THD *thd, TABLE *table, bool is_transactional, const uchar *before_record, const uchar *after_record)
Definition: log_event.cc:11880
Similar to Xid_log_event except that.
Definition: log_event.h:1832
static const int xid_bufs_size
Definition: log_event.h:1835
bool do_commit(THD *thd) override
Differs from Xid_log_event::do_commit in that it carries out XA prepare (not the commit).
Definition: log_event.cc:6375
XA_prepare_log_event(THD *thd_arg, XID *xid_arg, bool one_phase_arg=false)
Definition: log_event.h:1839
size_t get_data_size() override
Definition: log_event.h:1855
bool write(Basic_ostream *ostream) override
Definition: log_event.cc:6313
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:6341
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:6299
mysql::binlog::event::Log_event_type get_type_code() const override
Definition: log_event.h:1852
Definition: log_event.h:1758
enum_skip_reason do_shall_skip(Relay_log_info *rli) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.cc:6285
bool ends_group() const override
Definition: log_event.h:1771
Xid_apply_log_event(THD *thd_arg, mysql::binlog::event::Log_event_header *header_arg, mysql::binlog::event::Log_event_footer *footer_arg)
Definition: log_event.h:1761
virtual bool do_commit(THD *thd_arg)=0
int do_apply_event_worker(Slave_worker *rli) override
Worker commits Xid transaction and in case of its transactional info table marks the current group as...
Definition: log_event.cc:6040
~Xid_apply_log_event() override=default
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:6113
This is the subclass of Xid_event defined in libbinlogevent, An XID event is generated for a commit o...
Definition: log_event.h:1781
~Xid_log_event() override=default
bool write(Basic_ostream *ostream) override
Definition: log_event.cc:5966
Xid_log_event(const Xid_log_event &)=delete
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:5943
size_t get_data_size() override
Definition: log_event.h:1807
bool do_commit(THD *thd_arg) override
The methods combines few commit actions to make it usable as in the single- so multi- threaded case.
Definition: log_event.cc:5999
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:5960
Xid_log_event(Xid_log_event &&) noexcept=delete
A (partial) implementation of std::deque allocating its blocks on a MEM_ROOT.
Definition: mem_root_deque.h:172
This event is created to contain the file data.
Definition: load_data_events.h:274
const char * db
'db' is filled when the event is created in mysql_load() (the event needs to have a 'db' member to be...
Definition: load_data_events.h:311
unsigned int block_len
Definition: load_data_events.h:298
Event for the first block of file to be loaded, its only difference from Append_block event is that t...
Definition: load_data_events.h:358
@ APPEND_BLOCK_HEADER_LEN
Definition: binlog_event.h:875
@ IGNORABLE_HEADER_LEN
Definition: binlog_event.h:889
@ FORMAT_DESCRIPTION_HEADER_LEN
Definition: binlog_event.h:879
@ INCIDENT_HEADER_LEN
Definition: binlog_event.h:887
@ DELETE_FILE_HEADER_LEN
Definition: binlog_event.h:876
@ ROTATE_HEADER_LEN
Definition: binlog_event.h:873
const Log_event_header * header() const
Return a const pointer to the header of the log event.
Definition: binlog_event.h:952
Binary_log_event & operator=(const Binary_log_event &)=default
const Log_event_footer * footer() const
Return a const pointer to the footer of the log event.
Definition: binlog_event.h:960
DELETE_FILE_EVENT occurs when the LOAD DATA failed on the master.
Definition: load_data_events.h:202
const char * db
Definition: load_data_events.h:215
Log row deletions.
Definition: rows_event.h:1141
Event responsible for LOAD DATA execution, it similar to Query_event but before executing the query i...
Definition: load_data_events.h:119
For binlog version 4.
Definition: control_events.h:240
GTID stands for Global Transaction IDentifier It is composed of two parts:
Definition: control_events.h:1017
int get_server_version_length() const
We only store the immediate_server_version if both server versions are the same.
Definition: control_events.h:1237
int get_commit_timestamp_length() const
Definition: control_events.h:1227
int get_commit_group_ticket_length() const
Returns the length of the packed commit_group_ticket field.
Definition: control_events.cpp:620
bool is_tagged() const
Checks whether this Gtid log event contains a tag.
Definition: control_events.cpp:650
unsigned long long get_trx_length() const
Definition: control_events.h:1316
static const int POST_HEADER_LENGTH
Total length of post header.
Definition: control_events.h:1255
Replication event to ensure to replica that source is alive.
Definition: control_events.h:1670
Replication event to ensure to replica that source is alive.
Definition: control_events.h:1744
Base class for ignorable log events.
Definition: control_events.h:675
Class representing an incident, an occurrence out of the ordinary, that happened on the master.
Definition: control_events.h:441
char * message
Definition: control_events.h:492
Incident_event(enum_incident incident_arg)
This will create an Incident_event with an empty message and set the type_code as INCIDENT_EVENT in t...
Definition: control_events.h:462
size_t message_length
Definition: control_events.h:493
enum_incident
Enumeration of the incidents that can occur for the server.
Definition: control_events.h:446
@ INCIDENT_NONE
No incident.
Definition: control_events.h:448
@ INCIDENT_COUNT
Shall be last event of the enumeration.
Definition: control_events.h:452
An Intvar_event will be created just before a Query_event, if the query uses one of the variables LAS...
Definition: statement_events.h:935
Intvar_event(const char *buf, const Format_description_event *fde)
Constructor receives a packet from the MySQL master or the binary log and decodes it to create an Int...
Definition: statement_events.cpp:488
The Common-Header always has the same form and length within one version of MySQL.
Definition: binlog_event.h:678
unsigned long long log_pos
Definition: binlog_event.h:709
unsigned char Byte
The following type definition is to be used whenever data is placed and manipulated in a common buffe...
Definition: binlog_event.h:724
Log_event_type type_code
Event type extracted from the header.
Definition: binlog_event.h:694
void set_is_valid(bool is_valid)
Set if the event object shall be considered valid or not.
Definition: binlog_event.h:758
uint16_t flags
Definition: binlog_event.h:717
Definition: control_events.h:1381
size_t buf_size
Definition: control_events.h:1409
const unsigned char * buf
Definition: control_events.h:1410
A Query_event is created for each query that modifies the database, unless the query is logged row-ba...
Definition: statement_events.h:458
const char * db
Definition: statement_events.h:547
const char * query
Definition: statement_events.h:546
unsigned char mts_accessed_dbs
Definition: statement_events.h:652
char mts_accessed_db_names[MAX_DBS_IN_EVENT_MTS][NAME_LEN]
Definition: statement_events.h:653
size_t q_len
Definition: statement_events.h:599
Logs random seed used by the next RAND(), and by PASSWORD() in 4.1.0.
Definition: statement_events.h:1047
Rand_event(unsigned long long seed1_arg, unsigned long long seed2_arg)
Definition: statement_events.h:1057
When a binary log file exceeds a size limit, a ROTATE_EVENT is written at the end of the file that po...
Definition: control_events.h:117
unsigned int flags
Definition: control_events.h:121
size_t ident_len
Definition: control_events.h:120
Common base class for all row-containing binary log events.
Definition: rows_event.h:882
Table_id m_table_id
Actual event type.
Definition: rows_event.h:956
enum_flag get_flags() const
Definition: rows_event.h:1036
uint16_t m_flags
Definition: rows_event.h:957
Rows query event type, which is a subclass of the Ignorable_event, to record the original query for t...
Definition: rows_event.h:1182
char * m_rows_query
Definition: rows_event.h:1212
size_t m_rows_query_length
Definition: rows_event.h:1213
A stop event is written to the log files under these circumstances:
Definition: control_events.h:380
Stop_event()
It is the minimal constructor, and all it will do is set the type_code as STOP_EVENT in the header ob...
Definition: control_events.h:386
Each table share has a table id, it is mainly used for row based replication.
Definition: table_id.h:42
In row-based mode, every row operation event is preceded by a Table_map_event which maps a table defi...
Definition: rows_event.h:525
unsigned char * m_coltype
Definition: rows_event.h:686
std::string m_tblnam
Definition: rows_event.h:683
uint16_t flag_set
Definition: rows_event.h:534
unsigned char * m_null_bits
field metadata
Definition: rows_event.h:693
Optional_metadata_field_type
DEFAULT_CHARSET and COLUMN_CHARSET don't appear together, and ENUM_AND_SET_DEFAULT_CHARSET and ENUM_A...
Definition: rows_event.h:548
unsigned long m_colcnt
Definition: rows_event.h:685
unsigned char * m_field_metadata
Definition: rows_event.h:692
unsigned long m_field_metadata_size
The size of field metadata buffer set by calling save_field_metadata()
Definition: rows_event.h:691
size_t m_data_size
Definition: rows_event.h:678
std::string m_dbnam
event data size
Definition: rows_event.h:681
flag_set m_flags
Definition: rows_event.h:676
unsigned int m_optional_metadata_len
Definition: rows_event.h:694
Table_id m_table_id
Event post header contents.
Definition: rows_event.h:675
unsigned char * m_optional_metadata
Definition: rows_event.h:695
This class is used to combine the information of the ongoing transaction including the write set and ...
Definition: control_events.h:1469
bool gtid_specified
Definition: control_events.h:1505
uint32_t thread_id
Definition: control_events.h:1504
std::list< const char * > read_set
Definition: control_events.h:1509
const char * server_uuid
Definition: control_events.h:1503
std::list< const char * > write_set
Definition: control_events.h:1508
Event that encloses all the events of a transaction.
Definition: control_events.h:736
Transaction_payload_event(const Transaction_payload_event &)=delete
An unknown event should never occur.
Definition: binlog_event.h:990
Log row updates with a before image.
Definition: rows_event.h:1122
Written every time a statement uses a user variable; precedes other events for the statement.
Definition: statement_events.h:818
const char * name
Definition: statement_events.h:867
User_var_event(const char *name_arg, unsigned int name_len_arg, char *val_arg, unsigned long val_len_arg, Value_type type_arg, unsigned int charset_number_arg, unsigned char flags_arg)
This constructor will initialize the instance variables and the type_code, it will be used only by th...
Definition: statement_events.h:834
This class is used to add view change markers in the binary log when a member of the group enters or ...
Definition: control_events.h:1569
long long int seq_number
Definition: control_events.h:1623
std::map< std::string, std::string > certification_info
Definition: control_events.h:1625
char view_id[ENCODED_VIEW_ID_MAX_LEN]
Definition: control_events.h:1621
Log row insertions.
Definition: rows_event.h:1104
An XA_prepare event is generated for a XA prepared transaction.
Definition: control_events.h:589
XA_prepare_event(void *xid_arg, bool oph_arg)
The minimal constructor of XA_prepare_event, it initializes the instance variable xid and set the typ...
Definition: control_events.h:618
void * xid
Definition: control_events.h:609
An XID event is generated for a commit of a transaction that modifies one or more tables of an XA-cap...
Definition: control_events.h:524
Xid_event(uint64_t xid_arg)
The minimal constructor of Xid_event, it initializes the instance variable xid and set the type_code ...
Definition: control_events.h:531
uint64_t xid
Definition: control_events.h:541
Represents Transaction Source Identifier which is composed of source UUID and transaction tag.
Definition: tsid.h:44
static std::size_t get_size(const T &arg)
Definition: serializer_impl.hpp:70
Definition: partition_info.h:209
Definition: sql_exchange.h:196
A table definition from the master.
Definition: rpl_utility.h:249
static uint vector_column_count(const unsigned char *types, ulong size)
Return the number of VECTOR columns.
Definition: rpl_utility.h:315
Maps table id's (integers) to table pointers.
Definition: rpl_tblmap.h:51
static char buf[MAX_BUF]
Definition: conf_to_src.cc:74
Contains the classes representing events operating in the replication stream properties.
#define U
Definition: ctype-tis620.cc:73
uint64_t sql_mode_t
Definition: dd_event.h:39
#define MAX_DBS_IN_EVENT_MTS
The maximum number of updated databases that a status of Query-log-event can carry.
Definition: binlog_event.h:109
#define MAX_TIME_ZONE_NAME_LENGTH
Maximum length of time zone name that we support (Time zone name is char(64) in db).
Definition: binlog_event.h:122
#define OVER_MAX_DBS_IN_EVENT_MTS
When the actual number of databases exceeds MAX_DBS_IN_EVENT_MTS the value of OVER_MAX_DBS_IN_EVENT_M...
Definition: binlog_event.h:116
void close_cached_file(IO_CACHE *cache)
Definition: mf_cache.cc:87
bool my_b_inited(const IO_CACHE *info)
Definition: my_sys.h:488
#define MY_WME
Definition: my_sys.h:133
int my_b_copy_to_file(IO_CACHE *cache, FILE *file)
Definition: mf_iocache2.cc:73
bool reinit_io_cache(IO_CACHE *info, enum cache_type type, my_off_t seek_offset, bool use_async_io, bool clear_cache)
Definition: mf_iocache.cc:321
@ WRITE_CACHE
Definition: my_sys.h:290
std::pair< bool, mysql::binlog::event::Log_event_basic_info > extract_log_event_basic_info(Log_event *log_event)
Extract basic info about an event: type, query, is it ignorable.
Definition: log_event.cc:14527
size_t my_strmov_quoted_identifier(THD *thd, char *buffer, const char *identifier, size_t length)
Definition: log_event.cc:14487
bool is_atomic_ddl_event(Log_event const *evt)
The function checks the argument event properties to deduce whether it represents an atomic DDL.
Definition: log_event.h:4584
char * str_to_hex(char *to, const char *from, size_t len)
Transforms a string into "" or its expression in 0x... form.
Definition: log_event.cc:803
bool binary_event_serialize(EVENT *ev, Basic_ostream *ostream)
Serialize an binary event to the given output stream.
Definition: log_event.h:4620
bool net_field_length_checked(const uchar **packet, size_t *max_length, T *out)
Read an integer in net_field_length format, guarding against read out of bounds and advancing the pos...
Definition: log_event.cc:763
TYPELIB binlog_checksum_typelib
Definition: log_event.cc:223
bool is_atomic_ddl(THD *thd, bool using_trans)
The function lists all DDL instances that are supported for crash-recovery (WL9175).
Definition: log_event.cc:3546
int ignored_error_code(int err_code)
Ignore error code specified on command line.
Definition: log_event.cc:609
MYSQL_PLUGIN_IMPORT char server_version[SERVER_VERSION_LENGTH]
Definition: log_event.h:125
std::unique_ptr< cs::util::ReplicatedColumnsView > ColumnViewPtr
Definition: log_event.h:121
bool is_any_gtid_event(const Log_event *evt)
Definition: log_event.h:4556
size_t my_strmov_quoted_identifier_helper(int q, char *buffer, const char *identifier, size_t length)
Definition: log_event.cc:14500
bool is_session_control_event(Log_event *evt)
Check if the given event is a session control event, one of User_var_event, Intvar_event or Rand_even...
Definition: log_event.h:4570
PSI_memory_key key_memory_Rows_query_log_event_rows_query
Definition: log_event.cc:198
const int64 SEQ_MAX_TIMESTAMP
Maximum value of binlog logical timestamp.
Definition: log_event.h:355
MYSQL_PLUGIN_IMPORT ulong server_id
Definition: log_event.h:118
static bool copy_event_cache_to_file_and_reinit(IO_CACHE *cache, FILE *file, bool flush_stream)
Definition: log_event.h:3831
PSI_memory_key key_memory_Incident_log_event_message
Definition: log_event.cc:197
bool slave_execute_deferred_events(THD *thd)
The function is called by slave applier in case there are active table filtering rules to force gathe...
Definition: log_event.cc:5925
int append_query_string(const THD *thd, const CHARSET_INFO *csinfo, String const *from, String *to)
Append a version of the 'from' string suitable for use in a query to the 'to' string.
Definition: log_event.cc:821
int get_rpl_part_id(partition_info *part_info)
This method is used to extract the partition_id from a partitioned table.
Definition: log_event.cc:7646
#define LOG_EVENT_RELAY_LOG_F
Events with this flag set are created by slave IO thread and written to relay log.
Definition: log_event.h:283
#define LOG_EVENT_NO_FILTER_F
Events with this flag are not filtered (e.g.
Definition: log_event.h:303
#define LOG_EVENT_IGNORABLE_F
For an event, 'e', carrying a type code, that a slave, 's', does not recognize, 's' will check 'e' fo...
Definition: log_event.h:294
#define LOG_EVENT_ARTIFICIAL_F
Artificial events are created arbitrarily and not written to binary log.
Definition: log_event.h:275
#define LOG_EVENT_MTS_ISOLATE_F
MTS: group of events can be marked to force its execution in isolation from any other Workers.
Definition: log_event.h:314
unsigned int PSI_memory_key
Instrumented memory key.
Definition: psi_memory_bits.h:49
#define mysql_stage_set_work_completed(P1, P2)
Definition: mysql_stage.h:115
#define mysql_stage_get_work_estimated(P1)
Definition: mysql_stage.h:143
#define mysql_stage_set_work_estimated(P1, P2)
Definition: mysql_stage.h:140
static int flag
Definition: hp_test1.cc:40
#define T
Definition: jit_executor_value.cc:373
int key_cmp2(KEY_PART_INFO *key_part, const uchar *key1, uint key1_length, const uchar *key2, uint key2_length)
Compare two given keys.
Definition: key.cc:856
#define free(A)
Definition: lexyy.cc:915
LOAD DATA INFILE is not written to the binary log like other statements.
static int native_strncasecmp(const char *s1, const char *s2, size_t n)
Definition: m_string.h:216
static bool bitmap_cmp(const MY_BITMAP *map1, const MY_BITMAP *map2)
Quite unlike other C comparison functions ending with 'cmp', e.g.
Definition: my_bitmap.h:108
Abstraction functions over zlib/intrinsics.
std::uint32_t ha_checksum
Definition: my_checksum.h:106
Header for compiler-dependent features.
#define DBUG_EXECUTE_IF(keyword, a1)
Definition: my_dbug.h:171
#define DBUG_PRINT(keyword, arglist)
Definition: my_dbug.h:181
#define DBUG_EVALUATE_IF(keyword, a1, a2)
Definition: my_dbug.h:179
#define DBUG_TRACE
Definition: my_dbug.h:146
Some integer typedefs for easier portability.
unsigned long long int ulonglong
Definition: my_inttypes.h:56
uint8_t uint8
Definition: my_inttypes.h:63
ulonglong my_off_t
Definition: my_inttypes.h:72
unsigned char uchar
Definition: my_inttypes.h:52
int64_t int64
Definition: my_inttypes.h:68
#define MYF(v)
Definition: my_inttypes.h:97
uint16_t uint16
Definition: my_inttypes.h:65
uint32_t uint32
Definition: my_inttypes.h:67
#define FN_REFLEN
Definition: my_io.h:87
void * my_malloc(PSI_memory_key key, size_t size, int flags)
Allocates size bytes of memory.
Definition: my_memory.cc:57
void my_free(void *ptr)
Frees the memory pointed by the ptr.
Definition: my_memory.cc:81
Defines various enable/disable and HAVE_ macros related to the performance schema instrumentation sys...
Functions related to handling of plugins and other dynamically loaded libraries.
#define MYSQL_PLUGIN_IMPORT
Definition: my_sharedlib.h:71
Common header for many mysys elements.
static my_thread_id thread_id
Definition: my_thr_init.cc:60
uint32 my_thread_id
Definition: my_thread_local.h:34
static char * query
Definition: myisam_ftdump.cc:47
Common definition between mysql server & client.
unsigned int net_length_size(unsigned long long num)
#define SERVER_VERSION_LENGTH
Definition: mysql_com.h:74
Instrumentation helpers for stages.
static void print_header(MYSQL_RES *result)
Definition: mysqladmin.cc:1285
bool short_form
static uint verbose
Definition: mysqlcheck.cc:66
static bool replace
Definition: mysqlimport.cc:70
static bool ignore
Definition: mysqlimport.cc:70
static const char * sql_mode
Definition: mysqlslap.cc:200
const char * delimiter
Definition: mysqlslap.cc:161
static PFS_engine_table_share_proxy table
Definition: pfs.cc:61
Definition: pfs.cc:38
Definition: buf0block_hint.cc:30
const std::string charset("charset")
const std::string FILE("FILE")
Definition: os0file.h:89
bool length(const dd::Spatial_reference_system *srs, const Geometry *g1, double *length, bool *null) noexcept
Computes the length of linestrings and multilinestrings.
Definition: length.cc:76
bool is_valid(const dd::Spatial_reference_system *srs, const Geometry *g, const char *func_name, bool *is_valid) noexcept
Decides if a geometry is valid.
Definition: is_valid.cc:95
static Value err()
Create a Value object that represents an error condition.
Definition: json_binary.cc:943
void print(trx_t *trx, dict_index_t *index, std::ostream &out, ref_t ref, bool fatal)
Print information about the given LOB.
Definition: lob0impl.cc:1333
The namespace contains classes representing events that can occur in a replication stream.
Definition: binlog_event.cpp:38
Log_event_type
Enumeration type for the different types of log events.
Definition: binlog_event.h:279
@ INCIDENT_EVENT
Something out of the ordinary happened on the master.
Definition: binlog_event.h:323
@ FORMAT_DESCRIPTION_EVENT
Definition: binlog_event.h:305
@ EXECUTE_LOAD_QUERY_EVENT
Definition: binlog_event.h:308
@ ROWS_QUERY_LOG_EVENT
Definition: binlog_event.h:338
@ WRITE_ROWS_EVENT
Version 2 of the Row events.
Definition: binlog_event.h:341
@ DELETE_ROWS_EVENT
Definition: binlog_event.h:343
@ XA_PREPARE_LOG_EVENT
Definition: binlog_event.h:355
@ QUERY_EVENT
Definition: binlog_event.h:293
@ UNKNOWN_EVENT
Every time you add a type, you have to.
Definition: binlog_event.h:287
@ PREVIOUS_GTIDS_LOG_EVENT
Definition: binlog_event.h:348
@ UPDATE_ROWS_EVENT
Definition: binlog_event.h:342
@ RAND_EVENT
Definition: binlog_event.h:303
@ TABLE_MAP_EVENT
Definition: binlog_event.h:310
@ STOP_EVENT
Definition: binlog_event.h:294
@ INTVAR_EVENT
Definition: binlog_event.h:296
@ USER_VAR_EVENT
Definition: binlog_event.h:304
@ ROTATE_EVENT
Definition: binlog_event.h:295
@ SLAVE_EVENT
Definition: binlog_event.h:298
const uint64_t INVALID_XID
The following constant represents the maximum of MYSQL_XID domain.
Definition: statement_events.h:49
enum_load_dup_handling
Elements of this enum describe how LOAD DATA handles duplicates.
Definition: load_data_events.h:64
constexpr auto tsid_max_length
Maximum TSID text length (without null character)
Definition: tsid.h:38
noexcept
The return type for any call_and_catch(f, args...) call where f(args...) returns Type.
Definition: call_and_catch.h:76
HARNESS_EXPORT std::string string_format(const char *format,...)
Definition: utilities.cc:64
Definition: instrumented_condition_variable.h:32
const char * begin(const char *const c)
Definition: base64.h:44
size_t size(const char *const c)
Definition: base64.h:46
mutable_buffer buffer(void *p, size_t n) noexcept
Definition: buffer.h:418
Cursor end()
A past-the-end Cursor.
Definition: rules_table_service.cc:192
const char * db_name
Definition: rules_table_service.cc:55
static void log_event(const std::string &msg, loglevel lvl)
Helper function that calls the logging API to log errors.
Definition: handler.cc:59
std::set< Key, Compare, ut::allocator< Key > > set
Specialization of set which uses ut_allocator.
Definition: ut0new.h:2888
std::map< Key, Value, Compare, ut::allocator< std::pair< const Key, Value > > > map
Specialization of map which uses ut_allocator.
Definition: ut0new.h:2898
Performance schema instrumentation interface.
required string type
Definition: replication_group_member_actions.proto:34
required string event
Definition: replication_group_member_actions.proto:32
Contains the classes representing events which are used for row based replication.
Rpl_filter * rpl_filter
mysql::gtid::gno_t rpl_gno
GNO, the second (numeric) component of a GTID, is an alias of mysql::gtid::gno_t.
Definition: rpl_gtid.h:113
const int MAX_GNO_TEXT_LENGTH
The length of MAX_GNO when printed in decimal.
Definition: rpl_gtid.h:287
enum_gtid_type
Enumeration of different types of values for Gtid_specification, i.e, the different internal states t...
Definition: rpl_gtid.h:3883
cs::index::rpl_sidno rpl_sidno
Type of SIDNO (source ID number, first component of GTID)
Definition: rpl_gtid.h:109
mysql::gtid::Tsid Tsid
Definition: rpl_gtid_state.cc:56
enum_row_image_type
Definition: rpl_record.h:40
ulonglong my_xid
Definition: handler.h:1258
File containing constants that can be used throughout the server.
Our own string classes, used pervasively throughout the executor.
Contains the classes representing statement events occurring in the replication stream.
#define STRING_WITH_LEN(X)
Definition: string_with_len.h:29
char * strmake(char *dst, const char *src, size_t length)
Definition: strmake.cc:42
Definition: m_ctype.h:421
Class Gtid_set::String_format defines the separators used by Gtid_set::to_string.
Definition: rpl_gtid.h:1903
This struct represents a specification of a GTID for a statement to be executed: either "AUTOMATIC",...
Definition: rpl_gtid.h:4000
enum_gtid_type type
The type of this GTID.
Definition: rpl_gtid.h:4013
Gtid gtid
The GTID: { SIDNO, GNO } if type == GTID; { 0, 0 } if type == AUTOMATIC or ANONYMOUS.
Definition: rpl_gtid.h:4019
rpl_gno gno
GNO of this Gtid.
Definition: rpl_gtid.h:1107
Definition: my_sys.h:339
const char * str
Definition: mysql_lex_string.h:41
Definition: my_bitmap.h:43
Definition: log_event.h:508
const char * name[MAX_DBS_IN_EVENT_MTS]
Definition: log_event.h:509
int num
Definition: log_event.h:510
Mts_db_names()=default
void reset_and_dispose()
Definition: log_event.h:514
Interface for an instrumented stage progress.
Definition: psi_stage_bits.h:63
LEX_CSTRING db
Definition: table.h:809
Definition: table.h:1456
TABLE_SHARE * s
Definition: table.h:1457
Definition: typelib.h:35
static bool is_any_gtid_event(const Log_event_type &type)
Helps to identify any GTID event - returns true for GTID_LOG_EVENT, GTID_TAGGED_LOG_EVENT and ANONYMO...
Definition: binlog_event.h:392
Metadata_fields organizes m_optional_metadata into a structured format which is easy to access.
Definition: rows_event.h:579
struct xid_t is binary compatible with the XID structure as in the X/Open CAE Specification,...
Definition: xa.h:83
Include file for Sun RPC to compile out of the box.
Item_result
Type of the user defined function return slot and arguments.
Definition: udf_registration_types.h:39
Definition: dtoa.cc:595
synode_no q[FIFO_SIZE]
Definition: xcom_base.cc:4113
static uint64_t cache_size
Definition: xcom_cache.cc:363