MySQL 9.1.0
Source Code Documentation
log_event.h
Go to the documentation of this file.
1/* Copyright (c) 2000, 2024, 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;
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
431 PRINT_EVENT_INFO();
432
433 ~PRINT_EVENT_INFO() {
434 close_cached_file(&head_cache);
435 close_cached_file(&body_cache);
436 close_cached_file(&footer_cache);
437 }
438 bool init_ok() /* tells if construction was successful */
439 {
440 return my_b_inited(&head_cache) && my_b_inited(&body_cache) &&
441 my_b_inited(&footer_cache);
442 }
443
444 /* Settings on how to print the events */
445 // True if the --short-form flag was specified
446 bool short_form;
447 // The X in --base64-output=X
448 enum_base64_output_mode base64_output_mode;
449 // True if the --skip-gtids flag was specified.
450 bool skip_gtids;
451
452 /*
453 This is set whenever a Format_description_event is printed.
454 Later, when an event is printed in base64, this flag is tested: if
455 no Format_description_event has been seen, it is unsafe to print
456 the base64 event, so an error message is generated.
457 */
458 bool printed_fd_event;
459 my_off_t hexdump_from;
460 uint8 common_header_len;
461 char delimiter[16];
462
463 uint verbose;
464 table_mapping m_table_map;
465 table_mapping m_table_map_ignored;
466
467 /*
468 These three caches are used by the row-based replication events to
469 collect the header information and the main body of the events
470 making up a statement and in footer section any verbose related details
471 or comments related to the statement.
472 */
473 IO_CACHE head_cache;
474 IO_CACHE body_cache;
475 IO_CACHE footer_cache;
476 /* Indicate if the body cache has unflushed events */
477 bool have_unflushed_events;
478
479 /*
480 True if an event was skipped while printing the events of
481 a transaction and no COMMIT statement or XID event was ever
482 output (ie, was filtered out as well). This can be triggered
483 by the --database option of mysqlbinlog.
484
485 False, otherwise.
486 */
487 bool skipped_event_in_transaction;
488
489 bool print_table_metadata;
490
491 /**
492 True if --require_row_format is passed.
493 If true
494 It prints at start SET @@session.require_row_format = 1
495 It omits the SET @@session.pseudo_thread_id printed on Query events
496 */
497 bool require_row_format;
498
499 /**
500 The version of the last server that sent the transaction
501 */
502 uint32_t immediate_server_version;
503};
504#endif
505
506/*
507 A specific to the database-scheduled MTS type.
510 const char *name[MAX_DBS_IN_EVENT_MTS]{nullptr};
511 int num{0};
512
513 Mts_db_names() = default;
514
515 void reset_and_dispose() {
516 for (int i = 0; i < MAX_DBS_IN_EVENT_MTS; i++) {
517 free(const_cast<char *>(name[i]));
518 name[i] = nullptr;
519 }
520 num = 0;
521 }
522};
523
524/**
525 @class Log_event
526
527 This is the abstract base class for binary log events.
528
529 @section Log_event_binary_format Binary Format
530
531 The format of the event is described @ref Binary_log_event_format "here".
532
533 @subsection Log_event_format_of_atomic_primitives Format of Atomic Primitives
534
535 - All numbers, whether they are 16-, 24-, 32-, or 64-bit numbers,
536 are stored in little endian, i.e., the least significant byte first,
537 unless otherwise specified.
539*/
540class Log_event {
541 public:
542 /**
543 Enumeration of what kinds of skipping (and non-skipping) that can
544 occur when the slave executes an event.
545
546 @see shall_skip
547 @see do_shall_skip
548 */
549 enum enum_skip_reason {
550 /**
551 Don't skip event.
552 */
554
555 /**
556 Skip event by ignoring it.
557
558 This means that the slave skip counter will not be changed.
559 */
561
562 /**
563 Skip event and decrease skip counter.
564 */
566 };
568 protected:
571 /*
572 If possible the event should use a non-transactional cache before
573 being flushed to the binary log. This means that it must be flushed
574 right after its correspondent statement is completed.
575 */
577 /*
578 The event should use a transactional cache before being flushed to
579 the binary log. This means that it must be flushed upon commit or
580 rollback.
581 */
583 /*
584 The event must be written directly to the binary log without going
585 through any cache.
586 */
588 /*
589 If there is a need for different types, introduce them before this.
590 */
592 };
596 /*
597 The event must be written to a cache and upon commit or rollback
598 written to the binary log.
599 */
601 /*
602 The event must be written to an empty cache and immediately written
603 to the binary log without waiting for any other event.
604 */
606 /*
607 If there is a need for different types, introduce them before this.
608 */
610 };
611
612 /**
613 Writes the common header of this event to the given memory buffer.
614
615 This does not update the checksum.
616
617 @note This has the following form:
618
619 +---------+---------+---------+------------+-----------+-------+
620 |timestamp|type code|server_id|event_length|end_log_pos|flags |
621 |4 bytes |1 byte |4 bytes |4 bytes |4 bytes |2 bytes|
622 +---------+---------+---------+------------+-----------+-------+
623
624 @param buf Memory buffer to write to. This must be at least
625 LOG_EVENT_HEADER_LEN bytes long.
626
627 @return The number of bytes written, i.e., always
628 LOG_EVENT_HEADER_LEN.
629 */
631 /**
632 Writes the common-header of this event to the given output stream and
633 updates the checksum.
634
635 @param ostream The event will be written to this output stream.
636
637 @param data_length The length of the post-header section plus the
638 length of the data section; i.e., the length of the event minus
639 the common-header and the checksum.
640 */
641 bool write_header(Basic_ostream *ostream, size_t data_length);
642 bool write_footer(Basic_ostream *ostream);
643 bool need_checksum();
644
645 public:
646 /*
647 A temp buffer for read_log_event; it is later analysed according to the
648 event's type, and its content is distributed in the event-specific fields.
649 */
650 char *temp_buf;
651
652 /*
653 This variable determines whether the event is responsible for deallocating
654 the memory pointed by temp_buf. When set to true temp_buf is deallocated
655 and when it is set to false just make temp_buf point to NULL.
656 */
659 /* The number of seconds the query took to run on the master. */
660 ulong exec_time;
661
662 /*
663 The master's server id (is preserved in the relay log; used to
664 prevent from infinite loops in circular replication).
665 */
667
668 /**
669 A storage to cache the global system variable's value.
670 Handling of a separate event will be governed its member.
671 */
672 ulong rbr_exec_mode;
673
674 /**
675 Defines the type of the cache, if any, where the event will be
676 stored before being flushed to disk.
677 */
679
680 /**
681 Defines when information, i.e. event or cache, will be flushed
682 to disk.
683 */
685 /**
686 Placeholder for event checksum while writing to binlog.
687 */
689 /**
690 Index in @c rli->gaq array to indicate a group that this event is
691 purging. The index is set by Coordinator to a group terminator
692 event is checked by Worker at the event execution. The indexed
693 data represent the Worker progress status.
694 */
695 ulong mts_group_idx;
696
697 /**
698 The Log_event_header class contains the variable present
699 in the common header
700 */
702
703 /**
704 The Log_event_footer class contains the variable present
705 in the common footer. Currently, footer contains only the checksum_alg.
706 */
708 /**
709 MTS: associating the event with either an assigned Worker or Coordinator.
710 Additionally the member serves to tag deferred (IRU) events to avoid
711 the event regular time destruction.
712 */
714
715 /**
716 A copy of the main rli value stored into event to pass to MTS worker rli
717 */
720#ifdef MYSQL_SERVER
721 THD *thd;
722 /**
723 Partition info associate with event to deliver to MTS event applier
724 */
726
729 enum_event_cache_type cache_type_arg,
730 enum_event_logging_type logging_type_arg);
731 Log_event(THD *thd_arg, uint16 flags_arg,
732 enum_event_cache_type cache_type_arg,
733 enum_event_logging_type logging_type_arg,
736 /*
737 init_show_field_list() prepares the column names and types for the
738 output of SHOW BINLOG EVENTS; it is used only by SHOW BINLOG
739 EVENTS.
740 */
741 static void init_show_field_list(mem_root_deque<Item *> *field_list);
742
743 int net_send(Protocol *protocol, const char *log_name, my_off_t pos);
744
745 /**
746 Stores a string representation of this event in the Protocol.
747 This is used by SHOW BINLOG EVENTS.
748
749 @retval 0 success
750 @retval nonzero error
751 */
752 virtual int pack_info(Protocol *protocol);
753
754 virtual const char *get_db();
755#else // ifdef MYSQL_SERVER
756 /* print*() functions are used by mysqlbinlog */
757 virtual void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const = 0;
758 void print_timestamp(IO_CACHE *file, time_t *ts) const;
759 void print_header(IO_CACHE *file, PRINT_EVENT_INFO *print_event_info,
760 bool is_more) const;
761 void print_base64(IO_CACHE *file, PRINT_EVENT_INFO *print_event_info,
762 bool is_more) const;
763#endif // ifdef MYSQL_SERVER ... else
764
765 void *operator new(size_t size);
766
767 static void operator delete(void *ptr, size_t) { my_free(ptr); }
769 /* Placement version of the above operators */
770 static void *operator new(size_t, void *ptr) { return ptr; }
771 static void operator delete(void *, void *) {}
772 /**
773 Write the given buffer to the given output stream, updating the
774 checksum if checksums are enabled.
775
776 @param ostream The output stream to write to.
777 @param buf The buffer to write.
778 @param data_length The number of bytes to write.
779
780 @retval false Success.
781 @retval true Error.
782 */
783 bool wrapper_my_b_safe_write(Basic_ostream *ostream, const uchar *buf,
784 size_t data_length);
786#ifdef MYSQL_SERVER
787 virtual bool write(Basic_ostream *ostream) {
788 return (write_header(ostream, get_data_size()) ||
789 write_data_header(ostream) || write_data_body(ostream) ||
790 write_footer(ostream));
791 }
792
793 time_t get_time();
795 virtual bool write_data_header(Basic_ostream *) { return false; }
796 virtual bool write_data_body(Basic_ostream *) { return false; }
797#endif
798
800 return common_header->type_code;
801 }
802
803 /**
804 Return true if the event has to be logged using SBR for DMLs.
805 */
806 virtual bool is_sbr_logging_format() const { return false; }
807 /**
808 Return true if the event has to be logged using RBR for DMLs.
809 */
810 virtual bool is_rbr_logging_format() const { return false; }
811
812 /*
813 is_valid is event specific sanity checks to determine that the
814 object is correctly initialized.
815 */
816 bool is_valid();
817 void set_artificial_event() {
819 /*
820 Artificial events are automatically generated and do not exist
821 in master's binary log, so log_pos should be set to 0.
822 */
826 bool is_artificial_event() const {
828 }
829 bool is_relay_log_event() const {
831 }
832 bool is_ignorable_event() const {
834 }
835 bool is_no_filter_event() const {
837 }
838 inline bool is_using_trans_cache() const {
840 }
841 inline bool is_using_stmt_cache() const {
843 }
844 inline bool is_using_immediate_logging() const {
846 }
847
848 /*
849 For the events being decoded in BAPI, common_header should
850 point to the header object which is contained within the class
851 Binary_log_event.
852 */
855
856 /**
857 Allow thread to CLAIM or DISCLAIM the ownership of this object
858 depends on the parameter value passed
859
860 @param claim
861 True - claim ownership of the memory
862 False - disclaim ownership of the memory
863 */
864 virtual void claim_memory_ownership([[maybe_unused]] bool claim) {}
866 virtual ~Log_event() { free_temp_buf(); }
867 void register_temp_buf(char *buf, bool free_in_destructor = true) {
868 m_free_temp_buf_in_destructor = free_in_destructor;
870 }
871 void free_temp_buf() {
872 if (temp_buf) {
874 temp_buf = nullptr;
875 }
876 }
877 /*
878 Get event length for simple events. For complicated events the length
879 is calculated during write()
880 */
881 virtual size_t get_data_size() { return 0; }
882 /**
883 Returns the human readable name of the given event type.
884 */
886 /// Get the name of an event type, or "Unknown" if out of range.
887 /// @param type The type as an int
888 /// @retval name of an event type, if it is one
889 /// @retval "Unknown" if the value is out of range
890 static const char *get_type_str(uint type);
891 /**
892 Returns the human readable name of this event's type.
893 */
894 const char *get_type_str() const;
895 /* Return start of query time or current time */
896
897#if defined(MYSQL_SERVER)
898 /**
899 Is called from get_mts_execution_mode() to
900
901 @return true if the event needs applying with synchronization
902 against Workers, otherwise
903 false
904
905 @note There are incompatile combinations such as referred further events
906 are wrapped with BEGIN/COMMIT. Such cases should be identified
907 by the caller and treats correspondingly.
908
909 todo: to mts-support Old master Load-data related events
910 */
911 bool is_mts_sequential_exec() const {
914
915 static bool is_mts_sequential_exec(
917 switch (type_code) {
923 return true;
924 default:
925 return false;
926 }
927 }
928
929 /*
930 possible decisions by get_mts_execution_mode().
931 The execution mode can be PARALLEL or not (thereby sequential
932 unless impossible at all). When it's sequential it further breaks into
933 ASYNChronous and SYNChronous.
934 */
936 /*
937 Event is run by a Worker.
938 */
940 /*
941 Event is run by Coordinator.
942 */
944 /*
945 Event is run by Coordinator and requires synchronization with Workers.
946 */
948 /*
949 Event can't be executed neither by Workers nor Coordinator.
950 */
952 };
953
955 bool mts_in_group, mysql::binlog::event::Log_event_type type_code,
956 uint32 server_id, uint32 log_pos) {
957 /*
958 Slave workers are unable to handle Format_description_log_event,
959 Rotate_log_event and Previous_gtids_log_event correctly.
960 However, when a transaction spans multiple relay logs, these
961 events occur in the middle of a transaction. The way we handle
962 this is by marking the events as 'ASYNC', meaning that the
963 coordinator thread will handle the events without stopping the
964 worker threads.
965
966 @todo Refactor this: make Log_event::get_slave_worker handle
967 transaction boundaries in a more robust way, so that it is able
968 to process Format_description_log_event, Rotate_log_event, and
969 Previous_gtids_log_event. Then, when these events occur in the
970 middle of a transaction, make them part of the transaction so
971 that the worker that handles the transaction handles these
972 events too. /Sven
973 */
974 if (
975 /*
976 When a Format_description_log_event occurs in the middle of
977 a transaction, it either has the slave's server_id, or has
978 end_log_pos==0.
979
980 @todo This does not work when master and slave have the same
981 server_id and replicate-same-server-id is enabled, since
982 events that are not in the middle of a transaction will be
983 executed in ASYNC mode in that case.
984 */
986 ((server_id == (uint32)::server_id) || (log_pos == 0))) ||
987 /*
988 All Previous_gtids_log_events in the relay log are generated
989 by the slave. They don't have any meaning to the applier, so
990 they can always be ignored by the applier. So we can process
991 them asynchronously by the coordinator. It is also important
992 to not feed them to workers because that confuses
993 get_slave_worker.
994 */
996 /*
997 Rotate_log_event can occur in the middle of a transaction.
998 When this happens, either it is a Rotate event generated on
999 the slave which has the slave's server_id, or it is a Rotate
1000 event that originates from a master but has end_log_pos==0.
1001 */
1002 (type_code == mysql::binlog::event::ROTATE_EVENT &&
1003 ((server_id == (uint32)::server_id) ||
1004 (log_pos == 0 && mts_in_group))))
1005 return EVENT_EXEC_ASYNC;
1006 else if (is_mts_sequential_exec(type_code))
1007 return EVENT_EXEC_SYNC;
1008 else
1009 return EVENT_EXEC_PARALLEL;
1010 }
1011
1012 private:
1013 /**
1014 MTS Coordinator finds out a way how to execute the current event.
1015
1016 Besides the parallelizable case, some events have to be applied by
1017 Coordinator concurrently with Workers and some to require synchronization
1018 with Workers (@c see wait_for_workers_to_finish) before to apply them.
1019
1020 @param mts_in_group the being group parsing status, true
1021 means inside the group
1022
1023 @retval EVENT_EXEC_PARALLEL if event is executed by a Worker
1024 @retval EVENT_EXEC_ASYNC if event is executed by Coordinator
1025 @retval EVENT_EXEC_SYNC if event is executed by Coordinator
1026 with synchronization against the Workers
1027 */
1028 enum enum_mts_event_exec_mode get_mts_execution_mode(bool mts_in_group) {
1029 return get_mts_execution_mode(mts_in_group, get_type_code(), server_id,
1031 }
1032
1033 /**
1034 @return index in [0, M] range to indicate
1035 to be assigned worker;
1036 M is the max index of the worker pool.
1037 */
1039
1040 /*
1041 Group of events can be marked to force its execution
1042 in isolation from any other Workers.
1043 Typically that is done for a transaction that contains
1044 a query accessing more than OVER_MAX_DBS_IN_EVENT_MTS databases.
1045 Factually that's a sequential mode where a Worker remains to
1046 be the applier.
1047 */
1048 virtual void set_mts_isolate_group() {
1049 assert(ends_group() ||
1053 }
1054
1055 public:
1056 /**
1057 The method fills in pointers to event's database name c-strings
1058 to a supplied array.
1059 In other than Query-log-event case the returned array contains
1060 just one item.
1061 @param[out] arg pointer to a struct containing char* array
1062 pointers to be filled in and the number
1063 of filled instances.
1064 @param rpl_filter pointer to a replication filter.
1065
1066 @return number of the filled instances indicating how many
1067 databases the event accesses.
1068 */
1069 virtual uint8 get_mts_dbs(Mts_db_names *arg,
1070 Rpl_filter *rpl_filter [[maybe_unused]]) {
1071 arg->name[0] = get_db();
1072
1073 return arg->num = mts_number_dbs();
1074 }
1075
1076 /**
1077 @return true if events carries partitioning data (database names).
1078 */
1079 bool contains_partition_info(bool);
1080
1081 /*
1082 @return the number of updated by the event databases.
1083
1084 @note In other than Query-log-event case that's one.
1085 */
1086 virtual uint8 mts_number_dbs() { return 1; }
1087
1088 /**
1089 @return true if the terminal event of a group is marked to
1090 execute in isolation from other Workers,
1091 false otherwise
1092 */
1093 bool is_mts_group_isolated() {
1095 }
1096
1097 /**
1098 Events of a certain type can start or end a group of events treated
1099 transactionally wrt binlog.
1100
1101 Public access is required by implementation of recovery + skip.
1102
1103 @return true if the event starts a group (transaction)
1104 false otherwise
1106#endif
1107 virtual bool starts_group() const { return false; }
1108 /**
1109 @return true if the event ends a group (transaction)
1110 false otherwise
1111 */
1112 virtual bool ends_group() const { return false; }
1113#ifdef MYSQL_SERVER
1114 /**
1115 Apply the event to the database.
1116
1117 This function represents the public interface for applying an
1118 event.
1119
1120 @see do_apply_event
1121 */
1122 int apply_event(Relay_log_info *rli);
1123
1124 /**
1125 Apply the GTID event in curr_group_data to the database.
1126
1127 @param rli Pointer to coordinato's relay log info.
1128
1129 @retval 0 success
1130 @retval 1 error
1131 */
1132 inline int apply_gtid_event(Relay_log_info *rli);
1133
1134 /**
1135 Update the relay log position.
1136
1137 This function represents the public interface for "stepping over"
1138 the event and will update the relay log information.
1139
1140 @see do_update_pos
1141 */
1142 int update_pos(Relay_log_info *rli) { return do_update_pos(rli); }
1143
1144 /**
1145 Decide if the event shall be skipped, and the reason for skipping
1146 it.
1147
1148 @see do_shall_skip
1149 */
1151 DBUG_TRACE;
1153 DBUG_PRINT("info", ("skip reason=%d=%s", ret,
1154 ret == EVENT_SKIP_NOT ? "NOT"
1155 : ret == EVENT_SKIP_IGNORE ? "IGNORE"
1156 : "COUNT"));
1157 return ret;
1158 }
1159
1160 /**
1161 Primitive to apply an event to the database.
1162
1163 This is where the change to the database is made.
1164
1165 @note The primitive is protected instead of private, since there
1166 is a hierarchy of actions to be performed in some cases.
1167
1168 @see Format_description_log_event::do_apply_event()
1169
1170 @param rli Pointer to relay log info structure
1171
1172 @retval 0 Event applied successfully
1173 @retval errno Error code if event application failed
1174 */
1175 virtual int do_apply_event(Relay_log_info const *rli [[maybe_unused]]) {
1176 return 0; /* Default implementation does nothing */
1177 }
1178
1179 virtual int do_apply_event_worker(Slave_worker *w);
1180
1181 protected:
1182 /**
1183 Helper function to ignore an event w.r.t. the slave skip counter.
1184
1185 This function can be used inside do_shall_skip() for functions
1186 that cannot end a group. If the slave skip counter is 1 when
1187 seeing such an event, the event shall be ignored, the counter
1188 left intact, and processing continue with the next event.
1189
1190 A typical usage is:
1191 @code
1192 enum_skip_reason do_shall_skip(Relay_log_info *rli) {
1193 return continue_group(rli);
1194 }
1195 @endcode
1196
1197 @return Skip reason
1198 */
1200
1201 /**
1202 Advance relay log coordinates.
1203
1204 This function is called to advance the relay log coordinates to
1205 just after the event. It is essential that both the relay log
1206 coordinate and the group log position is updated correctly, since
1207 this function is used also for skipping events.
1208
1209 Normally, each implementation of do_update_pos() shall:
1210
1211 - Update the event position to refer to the position just after
1212 the event.
1213
1214 - Update the group log position to refer to the position just
1215 after the event <em>if the event is last in a group</em>
1216
1217 @param rli Pointer to relay log info structure
1218
1219 @retval 0 Coordinates changed successfully
1220 @retval errno Error code if advancing failed (usually just
1221 1). Observe that handler errors are returned by the
1222 do_apply_event() function, and not by this one.
1223 */
1224 virtual int do_update_pos(Relay_log_info *rli);
1225
1226 /**
1227 Decide if this event shall be skipped or not and the reason for
1228 skipping it.
1229
1230 The default implementation decide that the event shall be skipped
1231 if either:
1232
1233 - the server id of the event is the same as the server id of the
1234 server and <code>rli->replicate_same_server_id</code> is true,
1235 or
1236
1237 - if <code>rli->slave_skip_counter</code> is greater than zero.
1238
1239 @see do_apply_event
1240 @see do_update_pos
1241
1242 @retval Log_event::EVENT_SKIP_NOT
1243 The event shall not be skipped and should be applied.
1244
1245 @retval Log_event::EVENT_SKIP_IGNORE
1246 The event shall be skipped by just ignoring it, i.e., the slave
1247 skip counter shall not be changed. This happends if, for example,
1248 the originating server id of the event is the same as the server
1249 id of the slave.
1250
1251 @retval Log_event::EVENT_SKIP_COUNT
1252 The event shall be skipped because the slave skip counter was
1253 non-zero. The caller shall decrease the counter by one.
1254 */
1256#endif
1257};
1258
1259/*
1260 One class for each type of event.
1261 Two constructors for each class:
1262 - one to create the event for logging (when the server acts as a master),
1263 called after an update to the database is done,
1264 which accepts parameters like the query, the database, the options for LOAD
1265 DATA INFILE...
1266 - one to create the event from a packet (when the server acts as a slave),
1267 called before reproducing the update, which accepts parameters (like a
1268 buffer). Used to read from the master, from the relay log, and in
1269 mysqlbinlog. This constructor must be format-tolerant.
1270*/
1271
1272/**
1273 A Query event is written to the binary log whenever the database is
1274 modified on the master, unless row based logging is used.
1275
1276 Query_log_event is created for logging, and is called after an update to the
1277 database is done. It is used when the server acts as the master.
1278
1279 Virtual inheritance is required here to handle the diamond problem in
1280 the class @c Execute_load_query_log_event.
1281 The diamond structure is explained in @c Excecute_load_query_log_event
1282
1283 @internal
1284 The inheritance structure is as follows:
1285
1286 Binary_log_event
1287 ^
1288 |
1289 |
1290 Query_event Log_event
1291 \ /
1292 <<virtual>>\ /
1293 \ /
1294 Query_log_event
1295 @endinternal
1296*/
1298 public Log_event {
1299 protected:
1301
1302 public:
1303 // disable copy-move semantics
1304 Query_log_event(Query_log_event &&) noexcept = delete;
1305 Query_log_event &operator=(Query_log_event &&) noexcept = delete;
1306 Query_log_event(const Query_log_event &) = delete;
1307 Query_log_event &operator=(const Query_log_event &) = delete;
1308
1309 /*
1310 For events created by Query_log_event::do_apply_event (and
1311 Load_log_event::do_apply_event()) we need the *original* thread
1312 id, to be able to log the event with the original (=master's)
1313 thread id (fix for BUG#1686).
1314 */
1316
1317 /**
1318 True if this is a ROLLBACK event injected by the mts coordinator to finish a
1319 group corresponding to a partial transaction in the relay log.
1320 False otherwise and by default, as it must be explicitly set to true by the
1321 coordinator.
1322 */
1323 bool rollback_injected_by_coord = false;
1324
1325 /**
1326 The flag indicates whether the DDL query has been (already)
1327 committed or not. It's initialized as OFF at the event instantiation,
1328 flips ON when the DDL transaction has been committed with
1329 all its possible extra statement due to replication or GTID.
1330
1331 The flag status is also checked in few places to catch uncommitted
1332 transactions which can normally happen due to filtering out. In
1333 such a case the commit is deferred to @c Log_event::do_update_pos().
1334 */
1335 bool has_ddl_committed;
1336
1337#ifdef MYSQL_SERVER
1338
1339 /**
1340 Instructs the applier to skip temporary tables handling.
1341 */
1343
1347
1350 }
1351
1352 Query_log_event(THD *thd_arg, const char *query_arg, size_t query_length,
1353 bool using_trans, bool immediate, bool suppress_use,
1354 int error, bool ignore_command = false);
1355 const char *get_db() override { return db; }
1356
1357 /**
1358 @param[out] arg pointer to a struct containing char* array
1359 pointers be filled in and the number of
1360 filled instances.
1361 In case the number exceeds MAX_DBS_IN_EVENT_MTS,
1362 the overfill is indicated with assigning the number to
1363 OVER_MAX_DBS_IN_EVENT_MTS.
1364 @param rpl_filter pointer to a replication filter.
1365
1366 @return number of databases in the array or OVER_MAX_DBS_IN_EVENT_MTS.
1367 */
1370 // the empty string db name is special to indicate sequential applying
1371 mts_accessed_db_names[0][0] = 0;
1372 } else {
1373 for (uchar i = 0; i < mts_accessed_dbs; i++) {
1374 const char *db_name = mts_accessed_db_names[i];
1375
1376 // Only default database is rewritten.
1377 if (!rpl_filter->is_rewrite_empty() && !strcmp(get_db(), db_name)) {
1378 size_t dummy_len;
1379 const char *db_filtered =
1380 rpl_filter->get_rewrite_db(db_name, &dummy_len);
1381 // db_name != db_filtered means that db_name is rewritten.
1382 if (strcmp(db_name, db_filtered)) db_name = db_filtered;
1383 }
1384 arg->name[i] = db_name;
1385 }
1386 }
1387 return arg->num = mts_accessed_dbs;
1388 }
1389
1392
1393 uchar mts_number_dbs() override { return mts_accessed_dbs; }
1394
1395 int pack_info(Protocol *protocol) override;
1396#else
1397 void print_query_header(IO_CACHE *file,
1398 PRINT_EVENT_INFO *print_event_info) const;
1399 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
1400 static bool rewrite_db_in_buffer(
1401 char **buf, ulong *event_len,
1403#endif
1404
1406
1408 const char *buf,
1411 ~Query_log_event() override {
1413 }
1414
1415 void claim_memory_ownership(bool claim) override;
1416
1417#ifdef MYSQL_SERVER
1418 bool write(Basic_ostream *ostream) override;
1419 virtual bool write_post_header_for_derived(Basic_ostream *) { return false; }
1420#endif
1421
1422 /*
1423 Returns number of bytes additionally written to post header by derived
1424 events (so far it is only Execute_load_query event).
1425 */
1426 virtual ulong get_post_header_size_for_derived() { return 0; }
1427 /* Writes derived event-specific part of post header. */
1428
1429 public: /* !!! Public in this patch to allow old usage */
1430#if defined(MYSQL_SERVER)
1432 int do_apply_event(Relay_log_info const *rli) override;
1433 int do_update_pos(Relay_log_info *rli) override;
1434
1435 int do_apply_event(Relay_log_info const *rli, const char *query_arg,
1436 size_t q_len_arg);
1437#endif /* MYSQL_SERVER */
1438 /*
1439 If true, the event always be applied by slave SQL thread or be printed by
1440 mysqlbinlog
1441 */
1442 bool is_trans_keyword() const {
1443 /*
1444 Before the patch for bug#50407, The 'SAVEPOINT and ROLLBACK TO'
1445 queries input by user was written into log events directly.
1446 So the keywords can be written in both upper case and lower case
1447 together, strncasecmp is used to check both cases. they also could be
1448 binlogged with comments in the front of these keywords. for examples:
1449 / * bla bla * / SAVEPOINT a;
1450 / * bla bla * / ROLLBACK TO a;
1451 but we don't handle these cases and after the patch, both quiries are
1452 binlogged in upper case with no comments.
1453 */
1454 return !strncmp(query, "BEGIN", q_len) ||
1455 !strncmp(query, "COMMIT", q_len) ||
1456 !native_strncasecmp(query, "SAVEPOINT", 9) ||
1457 !native_strncasecmp(query, "ROLLBACK", 8) ||
1458 !native_strncasecmp(query, STRING_WITH_LEN("XA START")) ||
1460 !native_strncasecmp(query, STRING_WITH_LEN("XA PREPARE")) ||
1461 !native_strncasecmp(query, STRING_WITH_LEN("XA COMMIT")) ||
1462 !native_strncasecmp(query, STRING_WITH_LEN("XA ROLLBACK"));
1463 }
1464
1465 /**
1466 When a query log event contains a non-transaction control statement, we
1467 assume that it is changing database content (DML) and was logged using
1468 binlog_format=statement.
1469
1470 @return True the event represents a statement that was logged using SBR
1471 that can change database content.
1472 False for transaction control statements.
1473 */
1474 bool is_sbr_logging_format() const override { return !is_trans_keyword(); }
1475
1476 /**
1477 Notice, DDL queries are logged without BEGIN/COMMIT parentheses
1478 and identification of such single-query group
1479 occurs within logics of @c get_slave_worker().
1481
1482 bool starts_group() const override {
1483 return !strncmp(query, "BEGIN", q_len) ||
1484 !strncmp(query, STRING_WITH_LEN("XA START"));
1486
1487 bool ends_group() const override {
1488 return !strncmp(query, "COMMIT", q_len) ||
1489 (!native_strncasecmp(query, STRING_WITH_LEN("ROLLBACK")) &&
1490 native_strncasecmp(query, STRING_WITH_LEN("ROLLBACK TO "))) ||
1491 !strncmp(query, STRING_WITH_LEN("XA ROLLBACK"));
1492 }
1493 static size_t get_query(
1494 const char *buf, size_t length,
1496 const char **query_arg);
1497
1498 bool is_query_prefix_match(const char *pattern, uint p_len) {
1499 return !strncmp(query, pattern, p_len);
1500 }
1501
1502 /** Whether or not the statement represented by this event requires
1503 `Q_SQL_REQUIRE_PRIMARY_KEY` to be logged along aside. */
1504 bool need_sql_require_primary_key{false};
1505
1506 /** Whether or not the statement represented by this event requires
1507 `Q_DEFAULT_TABLE_ENCRYPTION` to be logged along aside. */
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
1617 Intvar_log_event(Intvar_log_event &&) noexcept = delete;
1618 Intvar_log_event &operator=(Intvar_log_event &&) noexcept = delete;
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
1690 Rand_log_event(Rand_log_event &&) noexcept = delete;
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
1786 Xid_log_event(Xid_log_event &&) noexcept = delete;
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
1899 User_var_log_event &operator=(User_var_log_event &&) noexcept = delete;
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
1967 Stop_log_event(Stop_log_event &&) noexcept = delete;
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
2043 Rotate_log_event(Rotate_log_event &&) noexcept = delete;
2044 Rotate_log_event &operator=(Rotate_log_event &&) noexcept = delete;
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
2108 Append_block_log_event(Append_block_log_event &&) noexcept = delete;
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
2181 Delete_file_log_event &operator=(Delete_file_log_event &&) noexcept = delete;
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
2260 Begin_load_query_log_event &&) noexcept = delete;
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
2446 Table_map_log_event &operator=(Table_map_log_event &&) noexcept = delete;
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
2795 Rows_log_event(Rows_log_event &&) noexcept = delete;
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
3619 Incident_log_event &operator=(Incident_log_event &&) noexcept = delete;
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
3710 Ignorable_log_event &operator=(Ignorable_log_event &&) noexcept = delete;
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 class Applier_context {
3886 private:
3887 // context for the applier (to remove if we remove the DATABASE scheduler)
3890 public:
3891 Applier_context() = default;
3892 virtual ~Applier_context() { reset(); }
3896
3897 Transaction_payload_log_event(THD *thd_arg, const char *payload,
3898 uint64_t payload_size,
3899 uint16_t compression_type,
3900 uint64_t uncompressed_size)
3901 : Transaction_payload_event(payload, payload_size, compression_type,
3902 uncompressed_size),
3903 Log_event(thd_arg, 0 /* flags */, Log_event::EVENT_TRANSACTIONAL_CACHE,
3905
3906 Transaction_payload_log_event(THD *thd_arg, const char *payload,
3907 uint64_t payload_size)
3909 thd_arg, payload, payload_size,
3910 mysql::binlog::event::compression::type::NONE, payload_size) {}
3911
3913 : Transaction_payload_log_event(thd_arg, nullptr, (uint64_t)0) {}
3914#endif
3915
3917 const char *buf,
3920
3921 ~Transaction_payload_log_event() override = default;
3922
3923 void claim_memory_ownership(bool claim) override;
3924
3925#ifndef MYSQL_SERVER
3926 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
3927#endif
3928
3929 size_t get_event_length() { return LOG_EVENT_HEADER_LEN + get_data_size(); }
3930 size_t get_data_size() override;
3931
3932#if defined(MYSQL_SERVER)
3933 private:
3935
3936 public:
3937 int do_apply_event(Relay_log_info const *rli) override;
3938 bool apply_payload_event(Relay_log_info const *rli, const uchar *event_buf);
3940 int pack_info(Protocol *protocol) override;
3941 bool ends_group() const override;
3942 bool write(Basic_ostream *ostream) override;
3944 void set_mts_dbs(Mts_db_names &arg);
3945 uint8 mts_number_dbs() override;
3946#endif
3947};
3948
3949/**
3950 @class Gtid_log_event
3951
3952 This is a subclass if Gtid_event and Log_event. It contains
3953 per-transaction fields, including the GTID and logical timestamps
3954 used by MTS.
3955
3956 @internal
3957 The inheritance structure is as follows
3958
3959 Binary_log_event
3960 ^
3961 |
3962 |
3963 B_l:Gtid_event Log_event
3964 \ /
3965 \ /
3966 \ /
3967 \ /
3968 Gtid_log_event
3969
3970 B_l: Namespace Binary_log
3971 @endinternal
3972*/
3974 public Log_event {
3975 public:
3976 // disable copy-move semantics
3977 Gtid_log_event(Gtid_log_event &&) noexcept = delete;
3978 Gtid_log_event &operator=(Gtid_log_event &&) noexcept = delete;
3979 Gtid_log_event(const Gtid_log_event &) = delete;
3980 Gtid_log_event &operator=(const Gtid_log_event &) = delete;
3981
3982#ifdef MYSQL_SERVER
3983 /**
3984 Create a new event using the GTID owned by the given thread.
3985 */
3986 Gtid_log_event(THD *thd_arg, bool using_trans, int64 last_committed_arg,
3987 int64 sequence_number_arg, bool may_have_sbr_stmts_arg,
3988 ulonglong original_commit_timestamp_arg,
3989 ulonglong immediate_commit_timestamp_arg,
3990 uint32_t original_server_version_arg,
3991 uint32_t immediate_server_version_arg);
3992
3993 /**
3994 Create a new event using the GTID from the given Gtid_specification
3995 without a THD object.
3996 */
3997 Gtid_log_event(uint32 server_id_arg, bool using_trans,
3998 int64 last_committed_arg, int64 sequence_number_arg,
3999 bool may_have_sbr_stmts_arg,
4000 ulonglong original_commit_timestamp_arg,
4001 ulonglong immediate_commit_timestamp_arg,
4002 const Gtid_specification spec_arg,
4003 uint32_t original_server_version_arg,
4004 uint32_t immediate_server_version_arg);
4005#endif
4006
4007#ifdef MYSQL_SERVER
4008 int pack_info(Protocol *) override;
4009#endif
4011 const char *buffer,
4013
4014 ~Gtid_log_event() override = default;
4015
4016 void claim_memory_ownership(bool claim) override;
4017
4019
4020 size_t get_data_size() override {
4021 if (is_tagged()) {
4022 auto size_calculated = Encoder_type::get_size(*this);
4023 DBUG_EXECUTE_IF("add_unknown_ignorable_fields_to_gtid_log_event",
4024 { size_calculated += 2; });
4025 return size_calculated;
4026 }
4027 DBUG_EXECUTE_IF("do_not_write_rpl_timestamps", return POST_HEADER_LENGTH;);
4031 }
4032
4033 /// @brief Clears tsid and spec
4034 void clear_gtid_and_spec();
4035
4036 /// @brief Updates parent tsid and gtid info structure
4038
4039 size_t get_event_length() { return LOG_EVENT_HEADER_LEN + get_data_size(); }
4040
4041 /// Used internally by both print() and pack_info().
4042 size_t to_string(char *buf) const;
4043
4044 private:
4045#ifdef MYSQL_SERVER
4046 /**
4047 Writes the post-header to the given output stream.
4048
4049 This is an auxiliary function typically used by the write() member
4050 function.
4051
4052 @param ostream The output stream to write to.
4053
4054 @retval true Error.
4055 @retval false Success.
4056 */
4057 bool write_data_header(Basic_ostream *ostream) override;
4058 bool write_data_body(Basic_ostream *ostream) override;
4059 /**
4060 Writes the post-header to the given memory buffer.
4061
4062 This is an auxiliary function used by write_to_memory.
4063
4064 @param[in,out] buffer Buffer to which the post-header will be written.
4065
4066 @return The number of bytes written, i.e., always
4067 Gtid_log_event::POST_HEADER_LENGTH.
4068 */
4070
4071 /**
4072 Writes the body to the given memory buffer.
4073
4074 This is an auxiliary function used by write_to_memory.
4075
4076 @param [in,out] buff Buffer to which the data will be written.
4077
4078 @return The number of bytes written, i.e.,
4079 If the transaction did not originated on this server
4080 Gtid_event::IMMEDIATE_COMMIT_TIMESTAMP_LENGTH.
4081 else
4082 FULL_COMMIT_TIMESTAMP_LENGTH.
4083 */
4085
4086 /// @copydoc write_body_to_memory
4087 /// @details Version for tagged Gtid log event
4089
4090#endif
4091
4092 public:
4093#ifndef MYSQL_SERVER
4094 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
4095#endif
4096
4097#if defined(MYSQL_SERVER)
4098 int do_apply_event(Relay_log_info const *rli) override;
4099 int do_update_pos(Relay_log_info *rli) override;
4101#endif
4102
4103 /**
4104 Return the gtid type for this Gtid_log_event: this can be
4105 either ANONYMOUS_GTID, AUTOMATIC_GTID, or ASSIGNED_GTID.
4106 */
4107 enum_gtid_type get_type() const { return spec.type; }
4108
4109 /**
4110 Return the TSID for this GTID. The TSID is shared with the
4111 Log_event so it should not be modified.
4112 */
4113 const Tsid &get_tsid() const { return tsid; }
4114 /**
4115 Return the SIDNO relative to the global tsid_map for this GTID.
4116
4117 This requires a lookup and possibly even update of global_tsid_map,
4118 hence global_tsid_lock must be held. If global_tsid_lock is not
4119 held, the caller must pass need_lock=true. If there is an error
4120 (e.g. out of memory) while updating global_tsid_map, this function
4121 returns a negative number.
4122
4123 @param need_lock If true, the read lock on global_tsid_lock is
4124 acquired and released inside this function; if false, the read
4125 lock or write lock must be held prior to calling this function.
4126 @retval SIDNO if successful
4127 @retval negative if adding TSID to global_tsid_map causes an error.
4128 */
4129 rpl_sidno get_sidno(bool need_lock);
4130
4131 /**
4132 Return the SIDNO relative to the given Tsid_map for this GTID.
4133
4134 This assumes that the Tsid_map is local to the thread, and thus
4135 does not use locks.
4136
4137 @param tsid_map The tsid_map to use.
4138 @retval SIDNO if successful.
4139 @retval negative if adding TSID to tsid_map causes an error.
4140 */
4141 rpl_sidno get_sidno(Tsid_map *tsid_map) { return tsid_map->add_tsid(tsid); }
4142 /// Return the GNO for this GTID.
4143 rpl_gno get_gno() const override { return spec.gtid.gno; }
4144
4145 /// @returns The GTID event specification
4148 /// string holding the text "SET @@GLOBAL.GTID_NEXT = '"
4149 static const char *SET_STRING_PREFIX;
4150
4151 private:
4152 /// Length of SET_STRING_PREFIX
4153 static const size_t SET_STRING_PREFIX_LENGTH = 26;
4154 /// The maximal length of the entire "SET ..." query.
4155 static const size_t MAX_SET_STRING_LENGTH = SET_STRING_PREFIX_LENGTH +
4158
4159 private:
4160 /**
4161 Internal representation of the GTID. The SIDNO will be
4162 uninitialized (value -1) until the first call to get_sidno(bool).
4163 */
4165 /// TSID for this GTID.
4166 Tsid tsid;
4167
4168 public:
4169 /**
4170 Set the transaction length information based on binlog cache size.
4171
4172 Note that is_checksum_enabled and event_counter are optional parameters.
4173 When not specified, the function will assume that no checksum will be used
4174 and the informed cache_size is the final transaction size without
4175 considering the GTID event size.
4176
4177 The high level formula that will be used by the function is:
4178
4179 trx_length = cache_size +
4180 cache_checksum_active * cache_events * CRC32_payload +
4181 gtid_length +
4182 cache_checksum_active * CRC32_payload; // For the GTID.
4183
4184 @param cache_size The size of the binlog cache in bytes.
4185 @param is_checksum_enabled If checksum will be added to events on flush.
4186 @param event_counter The amount of events in the cache.
4187 */
4189 bool is_checksum_enabled = false,
4190 int event_counter = 0);
4191
4192 /// @copydoc set_trx_length_by_cache_size
4193 /// @detail tagged version of event
4195 bool is_checksum_enabled = false,
4196 int event_counter = 0);
4197};
4198
4199/**
4200 @class Previous_gtids_log_event
4201
4202 This is the subclass of Previous_gtids_event and Log_event
4203 It is used to record the gtid_executed in the last binary log file,
4204 for ex after flush logs, or at the starting of the binary log file
4205
4206 @internal
4207 The inheritance structure is as follows
4208
4209 Binary_log_event
4210 ^
4211 |
4212 |
4213B_l:Previous_gtids_event Log_event
4214 \ /
4215 \ /
4216 \ /
4217 \ /
4218 Previous_gtids_log_event
4219
4220 B_l: Namespace Binary_log
4221 @endinternal
4222*/
4225 public Log_event {
4226 public:
4227 // disable copy-move semantics
4230 delete;
4233 delete;
4234
4235#ifdef MYSQL_SERVER
4237#endif
4238
4239#ifdef MYSQL_SERVER
4240 int pack_info(Protocol *) override;
4241#endif
4242
4244 const char *buf,
4245 const mysql::binlog::event::Format_description_event *description_event);
4246 ~Previous_gtids_log_event() override = default;
4247
4248 size_t get_data_size() override { return buf_size; }
4249
4250 void claim_memory_ownership(bool claim) override;
4251
4252#ifndef MYSQL_SERVER
4253 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
4254#endif
4255#ifdef MYSQL_SERVER
4256 bool write(Basic_ostream *ostream) override {
4257#ifndef NDEBUG
4258 if (DBUG_EVALUATE_IF("skip_writing_previous_gtids_log_event", 1, 0) &&
4259 /*
4260 The skip_writing_previous_gtids_log_event debug point was designed
4261 for skipping the writing of the previous_gtids_log_event on binlog
4262 files only.
4263 */
4264 !is_relay_log_event()) {
4265 DBUG_PRINT("info",
4266 ("skip writing Previous_gtids_log_event because of"
4267 "debug option 'skip_writing_previous_gtids_log_event'"));
4268 return false;
4269 }
4270
4271 if (DBUG_EVALUATE_IF("write_partial_previous_gtids_log_event", 1, 0) &&
4272 /*
4273 The write_partial_previous_gtids_log_event debug point was designed
4274 for writing a partial previous_gtids_log_event on binlog files only.
4275 */
4276 !is_relay_log_event()) {
4277 DBUG_PRINT("info",
4278 ("writing partial Previous_gtids_log_event because of"
4279 "debug option 'write_partial_previous_gtids_log_event'"));
4280 return (Log_event::write_header(ostream, get_data_size()) ||
4282 }
4283#endif
4284
4285 return (Log_event::write_header(ostream, get_data_size()) ||
4286 Log_event::write_data_header(ostream) || write_data_body(ostream) ||
4287 Log_event::write_footer(ostream));
4288 }
4289 bool write_data_body(Basic_ostream *ostream) override;
4290#endif
4292 /// Return the encoded buffer, or NULL on error.
4293 const uchar *get_buf() { return buf; }
4294 /**
4295 Return the formatted string, or NULL on error.
4296 The string is allocated using my_malloc and it is the
4297 responsibility of the caller to free it.
4298 */
4299 char *get_str(size_t *length,
4301 /// Add all GTIDs from this event to the given Gtid_set.
4302 int add_to_set(Gtid_set *gtid_set) const;
4303 /*
4304 Previous Gtid Log events should always be skipped
4305 there is nothing to apply there, whether it is
4306 relay log's (generated on Slave) or it is binary log's
4307 (generated on Master, copied to slave as relay log).
4308 Also, we should not increment slave_skip_counter
4309 for this event, hence return EVENT_SKIP_IGNORE.
4311#if defined(MYSQL_SERVER)
4313 {
4314 return EVENT_SKIP_IGNORE;
4316
4317 int do_apply_event(Relay_log_info const *) override { return 0; }
4318 int do_update_pos(Relay_log_info *rli) override;
4319#endif
4320};
4321
4322/**
4323 @class Transaction_context_log_event
4324
4325 This is the subclass of Transaction_context_event and Log_event
4326 This class encodes the transaction_context_log_event.
4327
4328 @internal
4329 The inheritance structure is as follows
4330
4331 Binary_log_event
4332 ^
4333 |
4334 |
4335B_l:Transaction_context_event Log_event
4336 \ /
4337 \ /
4338 \ /
4339 \ /
4340 Transaction_context_log_event
4341
4342 B_l: Namespace Binary_log
4343 @endinternal
4344*/
4347 public Log_event {
4348 private:
4349 /// The Tsid_map to use for creating the Gtid_set.
4351 /// A gtid_set which is used to store the transaction set used for
4352 /// conflict detection.
4354
4355#ifdef MYSQL_SERVER
4356 bool write_data_header(Basic_ostream *ostream) override;
4357
4358 bool write_data_body(Basic_ostream *ostream) override;
4359
4361
4362 bool write_data_set(Basic_ostream *ostream, std::list<const char *> *set);
4363#endif
4364
4366
4367 static int get_data_set_size(std::list<const char *> *set);
4368
4369 size_t to_string(char *buf, ulong len) const;
4370
4371 public:
4372#ifdef MYSQL_SERVER
4373
4374 Transaction_context_log_event(const char *server_uuid_arg, bool using_trans,
4375 my_thread_id thread_id_arg,
4376 bool is_gtid_specified);
4377
4378#endif
4379
4381 const char *buffer,
4383
4385
4386 void claim_memory_ownership(bool claim) override;
4387
4388 size_t get_data_size() override;
4389
4390 size_t get_event_length();
4391
4392#ifdef MYSQL_SERVER
4393 int pack_info(Protocol *protocol) override;
4394#endif
4395
4396#ifndef MYSQL_SERVER
4397 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
4398#endif
4400#if defined(MYSQL_SERVER)
4401 int do_apply_event(Relay_log_info const *) override { return 0; }
4402 int do_update_pos(Relay_log_info *rli) override;
4403#endif
4404
4405 /**
4406 Add a hash which identifies a inserted/updated/deleted row on the
4407 ongoing transaction.
4408
4409 @param[in] hash row identifier
4410 */
4411 void add_write_set(const char *hash);
4412
4413 /**
4414 Return a pointer to write-set list.
4415 */
4416 std::list<const char *> *get_write_set() { return &write_set; }
4417
4418 /**
4419 Add a hash which identifies a read row on the ongoing transaction.
4420
4421 @param[in] hash row identifier
4422 */
4423 void add_read_set(const char *hash);
4424
4425 /**
4426 Return a pointer to read-set list.
4427 */
4428 std::list<const char *> *get_read_set() { return &read_set; }
4429
4430 /**
4431 Read snapshot version from encoded buffers.
4432 Cannot be executed during data read from file (event constructor),
4433 since its required locks will collide with the server gtid state
4434 initialization procedure.
4435 */
4436 bool read_snapshot_version();
4437
4438 /**
4439 Return the transaction snapshot timestamp.
4440 */
4442
4443 /**
4444 Return the server uuid.
4445 */
4446 const char *get_server_uuid() { return server_uuid; }
4447
4448 /**
4449 Return the id of the committing thread.
4450 */
4451 my_thread_id get_thread_id() const {
4452 return static_cast<my_thread_id>(thread_id);
4453 }
4454
4455 /**
4456 Return true if transaction has GTID fully specified, false otherwise.
4457 */
4458 bool is_gtid_specified() const { return gtid_specified; }
4459};
4460
4461/**
4462 @class View_change_log_event
4463
4464 This is the subclass of View_change_log_event and Log_event
4465 This class created the view_change_log_event which is used as a marker in
4466 case a new node joins or leaves the group.
4467
4468 @internal
4469 The inheritance structure is as follows
4470
4471 Binary_log_event
4472 ^
4473 |
4474 |
4475B_l: View_change_event Log_event
4476 \ /
4477 \ /
4478 \ /
4479 \ /
4480 View_change_log_event
4481
4482 B_l: Namespace Binary_log
4483 @endinternal
4485
4487 public Log_event {
4488 private:
4489 size_t to_string(char *buf, ulong len) const;
4490
4491#ifdef MYSQL_SERVER
4492 bool write_data_header(Basic_ostream *ostream) override;
4493
4494 bool write_data_body(Basic_ostream *ostream) override;
4495
4496 bool write_data_map(Basic_ostream *ostream,
4497 std::map<std::string, std::string> *map);
4498#endif
4499
4500 size_t get_size_data_map(std::map<std::string, std::string> *map);
4501
4502 public:
4503 // disable copy-move semantics
4505 View_change_log_event &operator=(View_change_log_event &&) noexcept = delete;
4507 View_change_log_event &operator=(const View_change_log_event &) = delete;
4508
4509 View_change_log_event(const char *view_id);
4510
4512 const char *buffer,
4513 const mysql::binlog::event::Format_description_event *descr_event);
4514
4515 ~View_change_log_event() override;
4516
4517 void claim_memory_ownership(bool claim) override;
4518
4519 size_t get_data_size() override;
4520
4521#ifdef MYSQL_SERVER
4522 int pack_info(Protocol *protocol) override;
4523#endif
4524
4525#ifndef MYSQL_SERVER
4526 void print(FILE *file, PRINT_EVENT_INFO *print_event_info) const override;
4527#endif
4528
4529#if defined(MYSQL_SERVER)
4530 int do_apply_event(Relay_log_info const *rli) override;
4531 int do_update_pos(Relay_log_info *rli) override;
4532#endif
4533
4534 /**
4535 Returns the view id.
4536 */
4537 char *get_view_id() { return view_id; }
4538
4539 /**
4540 Sets the certification info in the event
4541
4542 @note size is calculated on this method as the size of the data
4543 might render the log even invalid. Also due to its size doing it
4544 here avoid looping over the data multiple times.
4545
4546 @param[in] info certification info to be written
4547 @param[out] event_size the event size after this operation
4548 */
4549 void set_certification_info(std::map<std::string, std::string> *info,
4550 size_t *event_size);
4551
4552 /**
4553 Returns the certification info
4554 */
4555 std::map<std::string, std::string> *get_certification_info() {
4556 return &certification_info;
4557 }
4558
4559 /**
4560 Set the certification sequence number
4561
4562 @param number the sequence number
4563 */
4564 void set_seq_number(rpl_gno number) { seq_number = number; }
4565
4566 /**
4567 Returns the certification sequence number
4568 */
4569 rpl_gno get_seq_number() { return seq_number; }
4571
4572inline bool is_any_gtid_event(const Log_event *evt) {
4574 evt->get_type_code()));
4575}
4576
4577/**
4578 Check if the given event is a session control event, one of
4579 `User_var_event`, `Intvar_event` or `Rand_event`.
4580
4581 @param evt The event to check.
4582
4583 @return true if the given event is of type `User_var_event`,
4584 `Intvar_event` or `Rand_event`, false otherwise.
4585 */
4586inline bool is_session_control_event(Log_event *evt) {
4590}
4591
4592/**
4593 The function checks the argument event properties to deduce whether
4594 it represents an atomic DDL.
4595
4596 @param evt a reference to Log_event
4597 @return true when the DDL properties are found,
4598 false otherwise
4599*/
4600inline bool is_atomic_ddl_event(Log_event const *evt) {
4601 return evt != nullptr &&
4603 static_cast<Query_log_event const *>(evt)->ddl_xid !=
4605}
4606
4607/**
4608 The function lists all DDL instances that are supported
4609 for crash-recovery (WL9175).
4610 todo: the supported feature list is supposed to grow. Once
4611 a feature has been readied for 2pc through WL7743,9536(7141/7016) etc
4612 it needs registering in the function.
4613
4614 @param thd an Query-log-event creator thread handle
4615 @param using_trans
4616 The caller must specify the value according to the following
4617 rules:
4618 @c true when
4619 - on master the current statement is not processing
4620 a table in SE which does not support atomic DDL
4621 - on slave the relay-log repository is transactional.
4622 @c false otherwise.
4623 @return true when the being created (master) or handled (slave) event
4624 is 2pc-capable, @c false otherwise.
4625*/
4626bool is_atomic_ddl(THD *thd, bool using_trans);
4627
4628#ifdef MYSQL_SERVER
4629/**
4630 Serialize an binary event to the given output stream. It is more general
4631 than call ev->write() directly. The caller will not be affected if any
4632 change happens in serialization process. For example, serializing the
4633 event in different format.
4635template <class EVENT>
4636bool binary_event_serialize(EVENT *ev, Basic_ostream *ostream) {
4637 return ev->write(ostream);
4638}
4639
4640/*
4641 This is an utility function that adds a quoted identifier into the a buffer.
4642 This also escapes any existence of the quote string inside the identifier.
4643 */
4644size_t my_strmov_quoted_identifier(THD *thd, char *buffer,
4645 const char *identifier, size_t length);
4646#else
4647size_t my_strmov_quoted_identifier(char *buffer, const char *identifier);
4648#endif
4650 const char *identifier,
4651 size_t length);
4652
4653/**
4654 Read an integer in net_field_length format, guarding against read out of
4655 bounds and advancing the position.
4656
4657 @param[in,out] packet Pointer to buffer to read from. On successful
4658 return, the buffer position will be incremented to point to the next
4659 byte after what was read.
4660
4661 @param[in,out] max_length Pointer to the number of bytes in the
4662 buffer. If the function would need to look at more than *max_length
4663 bytes in order to decode the number, the function will do nothing
4664 and return true.
4665
4666 @param[out] out Pointer where the value will be stored.
4667
4668 @retval false Success.
4669 @retval true Failure, i.e., reached end of buffer.
4670*/
4671template <typename T>
4672bool net_field_length_checked(const uchar **packet, size_t *max_length, T *out);
4673
4674/**
4675 Extract basic info about an event: type, query, is it ignorable
4676
4677 @param log_event the event to extract info from
4678 @return a pair first param is true if an error occurred, false otherwise
4679 second param is the event info
4680 */
4681std::pair<bool, mysql::binlog::event::Log_event_basic_info>
4683
4684/**
4685 Extract basic info about an event: type, query, is it ignorable
4686
4687 @param buf The event info buffer
4688 @param length The length of the buffer
4689 @param fd_event The Format description event associated
4690 @return a pair first param is true if an error occurred, false otherwise
4691 second param is the event info
4692 */
4693std::pair<bool, mysql::binlog::event::Log_event_basic_info>
4695 const char *buf, size_t length,
4697
4698/**
4699 @} (end of group Replication)
4700*/
4701
4702#endif /* _log_event_h */
Kerberos Client Authentication nullptr
Definition: auth_kerberos_client_plugin.cc:251
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:435
This event is created to contain the file data.
Definition: log_event.h:2103
bool write(Basic_ostream *ostream) override
Definition: log_event.cc:7055
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:7082
virtual int get_create_or_append() const
Definition: log_event.cc:7105
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:7092
~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:7135
The abstract class for basic output streams which provides write operation.
Definition: basic_ostream.h:37
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:7356
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:7346
~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:7352
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:7296
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:7274
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:7251
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:7284
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:12475
int do_after_row_operations(const Relay_log_info *const, int) override
Definition: log_event.cc:12528
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:12495
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:12464
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:12535
@ TYPE_CODE
Definition: log_event.h:3542
int do_before_row_operations(const Relay_log_info *const) override
Definition: log_event.cc:12502
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:7510
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:7420
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:7479
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:7414
ulong get_post_header_size_for_derived() override
Definition: log_event.cc:7410
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:7369
~Execute_load_query_log_event() override=default
Definition: field.h:577
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:5370
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:5376
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:5549
size_t get_data_size() override
Definition: log_event.h:1567
bool write(Basic_ostream *ostream) override
Definition: log_event.cc:5386
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:5520
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:5469
Format_description_log_event()
Format_description_log_event 1st ctor.
Definition: log_event.cc:5261
This is a subclass if Gtid_event and Log_event.
Definition: log_event.h:3972
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:13621
rpl_gno get_gno() const override
Return the GNO for this GTID.
Definition: log_event.h:4141
rpl_sidno get_sidno(bool need_lock)
Return the SIDNO relative to the global tsid_map for this GTID.
Definition: log_event.cc:13652
~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:13335
Gtid_log_event(Gtid_log_event &&) noexcept=delete
size_t get_event_length()
Definition: log_event.h:4037
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:13602
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:4105
uint32 write_body_to_memory(uchar *buff)
Writes the body to the given memory buffer.
Definition: log_event.cc:13372
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:13345
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:13446
uint32 write_post_header_to_memory(uchar *buffer)
Writes the post-header to the given memory buffer.
Definition: log_event.cc:13275
static const size_t SET_STRING_PREFIX_LENGTH
Length of SET_STRING_PREFIX.
Definition: log_event.h:4151
Tsid tsid
TSID for this GTID.
Definition: log_event.h:4164
const Tsid & get_tsid() const
Return the TSID for this GTID.
Definition: log_event.h:4111
Gtid_specification get_gtid_spec()
Definition: log_event.cc:13665
bool write_data_body(Basic_ostream *ostream) override
Definition: log_event.cc:13437
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:13631
static const size_t MAX_SET_STRING_LENGTH
The maximal length of the entire "SET ..." query.
Definition: log_event.h:4153
void update_parent_gtid_info()
Updates parent tsid and gtid info structure.
Definition: log_event.cc:13100
static const char * SET_STRING_PREFIX
string holding the text "SET @@GLOBAL.GTID_NEXT = '"
Definition: log_event.h:4147
void clear_gtid_and_spec()
Clears tsid and spec.
Definition: log_event.cc:13106
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:13190
Gtid_specification spec
Internal representation of the GTID.
Definition: log_event.h:4162
int pack_info(Protocol *) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:13171
size_t get_data_size() override
Definition: log_event.h:4018
size_t to_string(char *buf) const
Used internally by both print() and pack_info().
Definition: log_event.cc:13179
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:13616
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:14522
Definition: log_event.h:3850
Heartbeat_log_event(const char *buf, const mysql::binlog::event::Format_description_event *description_event)
Definition: log_event.cc:14515
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:12872
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:12865
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:12817
size_t get_data_size() override
Definition: log_event.h:3666
bool write_data_body(Basic_ostream *ostream) override
Definition: log_event.cc:12843
~Incident_log_event() override
Definition: log_event.cc:12731
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:12777
int pack_info(Protocol *) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:12750
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:12744
const char * description() const
Definition: log_event.cc:12735
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:5866
~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:5945
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:5876
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:5841
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:5920
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:5940
Base class that is used to represent any kind of expression in a relational query.
Definition: item.h:930
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:7619
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:7602
This is the abstract base class for binary log events.
Definition: log_event.h:538
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:1255
ulong mts_group_idx
Index in rli->gaq array to indicate a group that this event is purging.
Definition: log_event.h:693
bool is_using_stmt_cache() const
Definition: log_event.h:839
enum_skip_reason continue_group(Relay_log_info *rli)
Helper function to ignore an event w.r.t.
Definition: log_event.cc:2473
bool is_no_filter_event() const
Definition: log_event.h:833
int apply_event(Relay_log_info *rli)
Apply the event to the database.
Definition: log_event.cc:3087
virtual int do_apply_event(Relay_log_info const *rli)
Primitive to apply an event to the database.
Definition: log_event.h:1173
virtual const char * get_db()
Definition: log_event.cc:1058
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:952
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:676
int net_send(Protocol *protocol, const char *log_name, my_off_t pos)
Only called by SHOW BINLOG EVENTS.
Definition: log_event.cc:1063
uint32 write_header_to_memory(uchar *buf)
Writes the common header of this event to the given memory buffer.
Definition: log_event.cc:1216
virtual mysql::binlog::event::Log_event_type get_type_code() const
Definition: log_event.h:797
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:1105
uint32 server_id
Definition: log_event.h:664
enum_mts_event_exec_mode
Definition: log_event.h:933
@ EVENT_EXEC_PARALLEL
Definition: log_event.h:937
@ EVENT_EXEC_SYNC
Definition: log_event.h:945
@ EVENT_EXEC_CAN_NOT
Definition: log_event.h:949
@ EVENT_EXEC_ASYNC
Definition: log_event.h:941
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:1148
bool is_valid()
Definition: log_event.cc:1308
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:1067
ha_checksum crc
Placeholder for event checksum while writing to binlog.
Definition: log_event.h:686
virtual size_t get_data_size()
Definition: log_event.h:879
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:1194
enum_event_cache_type
Definition: log_event.h:567
@ EVENT_CACHE_COUNT
Definition: log_event.h:589
@ EVENT_INVALID_CACHE
Definition: log_event.h:568
@ EVENT_NO_CACHE
Definition: log_event.h:585
@ EVENT_STMT_CACHE
Definition: log_event.h:574
@ EVENT_TRANSACTIONAL_CACHE
Definition: log_event.h:580
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:547
@ EVENT_SKIP_IGNORE
Skip event by ignoring it.
Definition: log_event.h:558
@ EVENT_SKIP_COUNT
Skip event and decrease skip counter.
Definition: log_event.h:563
@ EVENT_SKIP_NOT
Don't skip event.
Definition: log_event.h:551
bool is_mts_sequential_exec() const
Is called from get_mts_execution_mode() to.
Definition: log_event.h:909
bool m_free_temp_buf_in_destructor
Definition: log_event.h:655
bool contains_partition_info(bool)
Definition: log_event.cc:2493
bool is_relay_log_event() const
Definition: log_event.h:827
bool is_ignorable_event() const
Definition: log_event.h:830
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:716
int update_pos(Relay_log_info *rli)
Update the relay log position.
Definition: log_event.h:1140
virtual int do_apply_event_worker(Slave_worker *w)
Definition: log_event.cc:982
void set_artificial_event()
Definition: log_event.h:815
const char * get_type_str() const
Returns the human readable name of this event's type.
Definition: log_event.cc:898
time_t get_time()
Prints a "session_var=value" string.
Definition: log_event.cc:875
bool write_footer(Basic_ostream *ostream)
Definition: log_event.cc:1203
Relay_log_info * worker
MTS: associating the event with either an assigned Worker or Coordinator.
Definition: log_event.h:711