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
bool is_using_trans_cache() const
Definition: log_event.h:836
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli)
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.cc:1004
db_worker_hash_entry * mts_assigned_partitions[MAX_DBS_IN_EVENT_MTS]
Partition info associate with event to deliver to MTS event applier.
Definition: log_event.h:723
virtual bool write(Basic_ostream *ostream)
Definition: log_event.h:785
ulong rbr_exec_mode
A storage to cache the global system variable's value.
Definition: log_event.h:670
mysql::binlog::event::Log_event_header * common_header
The Log_event_header class contains the variable present in the common header.
Definition: log_event.h:699
virtual void set_mts_isolate_group()
Definition: log_event.h:1046
THD * thd
Definition: log_event.h:719
int apply_gtid_event(Relay_log_info *rli)
Apply the GTID event in curr_group_data to the database.
Definition: log_event.cc:3044
mysql::binlog::event::Log_event_footer * common_footer
The Log_event_footer class contains the variable present in the common footer.
Definition: log_event.h:705
virtual bool write_data_body(Basic_ostream *)
Definition: log_event.h:794
Log_event(mysql::binlog::event::Log_event_header *header, mysql::binlog::event::Log_event_footer *footer, enum_event_cache_type cache_type_arg, enum_event_logging_type logging_type_arg)
This minimal constructor is for when you are not even sure that there is a valid THD.
Definition: log_event.cc:934
void register_temp_buf(char *buf, bool free_in_destructor=true)
Definition: log_event.h:865
virtual uint8 mts_number_dbs()
Definition: log_event.h:1084
void free_temp_buf()
Definition: log_event.h:869
bool is_mts_group_isolated()
Definition: log_event.h:1091
ulong exec_time
Definition: log_event.h:658
virtual bool is_rbr_logging_format() const
Return true if the event has to be logged using RBR for DMLs.
Definition: log_event.h:808
virtual ~Log_event()
Definition: log_event.h:864
enum_event_logging_type event_logging_type
Defines when information, i.e.
Definition: log_event.h:682
enum_event_logging_type
Definition: log_event.h:592
@ EVENT_NORMAL_LOGGING
Definition: log_event.h:598
@ EVENT_IMMEDIATE_LOGGING
Definition: log_event.h:603
@ EVENT_INVALID_LOGGING
Definition: log_event.h:593
@ EVENT_CACHE_LOGGING_COUNT
Definition: log_event.h:607
char * temp_buf
Definition: log_event.h:648
virtual bool is_sbr_logging_format() const
Return true if the event has to be logged using SBR for DMLs.
Definition: log_event.h:804
virtual int pack_info(Protocol *protocol)
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:1053
bool is_using_immediate_logging() const
Definition: log_event.h:842
void set_relay_log_event()
Definition: log_event.h:823
virtual bool write_data_header(Basic_ostream *)
Definition: log_event.h:793
static void init_show_field_list(mem_root_deque< Item * > *field_list)
init_show_field_list() prepares the column names and types for the output of SHOW BINLOG EVENTS; it i...
Definition: log_event.cc:1086
bool is_artificial_event() const
Definition: log_event.h:824
virtual int do_update_pos(Relay_log_info *rli)
Advance relay log coordinates.
Definition: log_event.cc:996
virtual bool ends_group() const
Definition: log_event.h:1110
bool need_checksum()
A decider of whether to trigger checksum computation or not.
Definition: log_event.cc:1115
virtual void claim_memory_ownership(bool claim)
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.h:862
Slave_worker * get_slave_worker(Relay_log_info *rli)
The method maps the event to a Worker and return a pointer to it.
Definition: log_event.cc:2621
This is the subclass of Previous_gtids_event and Log_event It is used to record the gtid_executed in ...
Definition: log_event.h:4223
bool write_data_body(Basic_ostream *ostream) override
Definition: log_event.cc:13756
Previous_gtids_log_event(Previous_gtids_log_event &&) noexcept=delete
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:13763
char * get_str(size_t *length, const Gtid_set::String_format *string_format) const
Return the formatted string, or NULL on error.
Definition: log_event.cc:13737
int pack_info(Protocol *) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:13700
int do_apply_event(Relay_log_info const *) override
Primitive to apply an event to the database.
Definition: log_event.h:4315
int add_to_set(Gtid_set *gtid_set) const
Add all GTIDs from this event to the given Gtid_set.
Definition: log_event.cc:13726
size_t get_data_size() override
Definition: log_event.h:4246
enum_skip_reason do_shall_skip(Relay_log_info *) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.h:4310
bool write(Basic_ostream *ostream) override
Definition: log_event.h:4254
~Previous_gtids_log_event() override=default
const uchar * get_buf()
Return the encoded buffer, or NULL on error.
Definition: log_event.h:4291
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:13674
Definition: protocol.h:33
A Query event is written to the binary log whenever the database is modified on the master,...
Definition: log_event.h:1296
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:5142
bool need_sql_require_primary_key
Whether or not the statement represented by this event requires Q_SQL_REQUIRE_PRIMARY_KEY to be logge...
Definition: log_event.h:1502
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:1472
Query_log_event(const Query_log_event &)=delete
bool is_trans_keyword() const
Definition: log_event.h:1440
mysql::binlog::event::Log_event_header::Byte * data_buf
Definition: log_event.h:1298
bool m_skip_temp_tables_handling_by_worker
Instructs the applier to skip temporary tables handling.
Definition: log_event.h:1340
static size_t get_query(const char *buf, size_t length, const mysql::binlog::event::Format_description_event *fd_event, const char **query_arg)
Return the query string pointer (and its size) from a Query log event using only the event buffer (we...
Definition: log_event.cc:5192
Query_log_event()
The simplest constructor that could possibly work.
Definition: log_event.cc:3676
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:5156
virtual ulong get_post_header_size_for_derived()
Definition: log_event.h:1424
bool starts_group() const override
Notice, DDL queries are logged without BEGIN/COMMIT parentheses and identification of such single-que...
Definition: log_event.h:1480
uchar mts_number_dbs() override
Definition: log_event.h:1391
my_thread_id slave_proxy_id
Definition: log_event.h:1313
void set_skip_temp_tables_handling_by_worker()
Definition: log_event.h:1342
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:5245
bool has_ddl_committed
The flag indicates whether the DDL query has been (already) committed or not.
Definition: log_event.h:1333
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:4422
~Query_log_event() override
Definition: log_event.h:1409
void attach_temp_tables_worker(THD *, const Relay_log_info *)
Associating slave Worker thread to a subset of temporary tables.
Definition: log_event.cc:4399
bool write(Basic_ostream *ostream) override
Query_log_event::write().
Definition: log_event.cc:3383
bool rollback_injected_by_coord
True if this is a ROLLBACK event injected by the mts coordinator to finish a group corresponding to a...
Definition: log_event.h:1321
bool is_query_prefix_match(const char *pattern, uint p_len)
Definition: log_event.h:1496
uint8 get_mts_dbs(Mts_db_names *arg, Rpl_filter *rpl_filter) override
Definition: log_event.h:1366
bool needs_default_table_encryption
Whether or not the statement represented by this event requires Q_DEFAULT_TABLE_ENCRYPTION to be logg...
Definition: log_event.h:1506
const char * get_db() override
Definition: log_event.h:1353
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:3332
bool ends_group() const override
Definition: log_event.h:1485
bool is_skip_temp_tables_handling_by_worker()
Definition: log_event.h:1346
virtual bool write_post_header_for_derived(Basic_ostream *)
Definition: log_event.h:1417
void detach_temp_tables_worker(THD *, const Relay_log_info *)
Dissociating slave Worker thread from its thd->temporary_tables to possibly update the involved entri...
Definition: log_event.cc:4413
Logs random seed used by the next RAND(), and by PASSWORD() in 4.1.0.
Definition: log_event.h:1685
bool write(Basic_ostream *ostream) override
Definition: log_event.cc:5986
bool is_sbr_logging_format() const override
Return true if the event has to be logged using SBR for DMLs.
Definition: log_event.h:1719
~Rand_log_event() override=default
size_t get_data_size() override
Definition: log_event.h:1714
Rand_log_event(const Rand_log_event &)=delete
Rand_log_event(Rand_log_event &&) noexcept=delete
enum_skip_reason do_shall_skip(Relay_log_info *rli) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.cc:6031
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:6012
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:5962
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:6026
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:5980
Definition: rpl_rli.h:206
This will be deprecated when we move to using sequence ids.
Definition: log_event.h:2038
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:5674
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:5562
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:5817
~Rotate_log_event() override=default
Rotate_log_event(Rotate_log_event &&) noexcept=delete
Rotate_log_event(const Rotate_log_event &)=delete
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:5635
bool write(Basic_ostream *ostream) override
Definition: log_event.cc:5645
size_t get_data_size() override
Definition: log_event.h:2058
Definition: log_event.h:2668
bool is_enabled()
If instrumentation is enabled this member function SHALL return true.
Definition: log_event.h:2695
Rows_applier_psi_stage & operator=(const Rows_applier_psi_stage &rhs)
void inc_n_rows_applied(ulonglong delta)
Updates the counter of processed rows.
Definition: log_event.h:2741
ulonglong m_n_rows_applied
Counter that is unconditionally incremented on each row that is processed.
Definition: log_event.h:2683
ulonglong get_n_rows_applied()
Gets the value of the counter of rows that have been processed.
Definition: log_event.h:2747
Rows_applier_psi_stage()
Definition: log_event.h:2686
void update_work_estimated_and_completed(const uchar *cursor, const uchar *begin, const uchar *end)
This member function shall update the progress and reestimate the remaining work needed.
Definition: log_event.h:2708
void set_progress(PSI_stage_progress *progress)
Definition: log_event.h:2688
void end_work()
Resets this object.
Definition: log_event.h:2732
PSI_stage_progress * m_progress
A cached pointer to this stage PSI_stage_progress.
Definition: log_event.h:2676
Definition: log_event.h:2967
KEY ** m_key_info
Definition: log_event.h:2987
Key_compare(KEY **ki=nullptr)
Definition: log_event.h:2980
bool operator()(uchar *k1, uchar *k2) const
Definition: log_event.h:2981
Common base class for all row-containing log events.
Definition: log_event.h:2785
MY_BITMAP write_set_backup
This bitmap is used as a backup for the write set while we calculate the values for any hidden genera...
Definition: log_event.h:3289
uint32 m_bitbuf[128/(sizeof(uint32) *8)]
Definition: log_event.h:2948
uchar * m_rows_end
Definition: log_event.h:2957
int close_record_scan()
Does the cleanup.
Definition: log_event.cc:8880
virtual mysql::binlog::event::Log_event_type get_general_type_code()=0
int handle_idempotent_and_ignored_errors(Relay_log_info const *rli, int *err)
Private member function called while handling idempotent errors.
Definition: log_event.cc:8825
bool write_data_header(Basic_ostream *ostream) override
Definition: log_event.cc:10409
virtual int do_before_row_operations(const Relay_log_info *const log)=0
uchar * m_rows_buf
Definition: log_event.h:2955
void decide_row_lookup_algorithm_and_key()
Definition: log_event.cc:8433
uint m_rows_lookup_algorithm
The algorithm to use while searching for rows using the before image.
Definition: log_event.h:2929
TABLE * m_table
Definition: log_event.h:2908
ColumnViewPtr m_column_view
Wrapper around TABLE *m_table that abstracts the table field set iteration logic, since it is not man...
Definition: log_event.h:3089
bool is_rbr_logging_format() const override
Return true if the event has to be logged using RBR for DMLs.
Definition: log_event.h:3076
int do_hash_row(Relay_log_info const *rli)
Populates the m_hash when using HASH_SCAN.
Definition: log_event.cc:9262
@ RLE_NO_FLAGS
Definition: log_event.h:2821
Hash_slave_rows m_hash
Hash table that will hold the entries for while using HASH_SCAN algorithm to search and update/delete...
Definition: log_event.h:2923
uchar * m_distinct_key_spare_buf
A spare buffer which will be used when saving the distinct keys for doing an index scan with HASH_SCA...
Definition: log_event.h:2995
int do_hash_scan_and_update(Relay_log_info const *rli)
Implementation of the hash_scan and update algorithm.
Definition: log_event.cc:9505
int add_row_data(uchar *data, size_t length)
Definition: log_event.h:2846
uint m_key_index
Definition: log_event.h:2965
int do_apply_row(Relay_log_info const *rli)
Commodity wrapper around do_exec_row(), that deals with resetting the thd reference in the table.
Definition: log_event.cc:8855
int row_operations_scan_and_key_setup()
Definition: log_event.cc:8531
MY_BITMAP const * get_cols_ai() const
Definition: log_event.h:2855
enum_skip_reason do_shall_skip(Relay_log_info *rli) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.cc:10271
Rows_log_event(const Rows_log_event &)=delete
MY_BITMAP m_local_cols_ai
Bitmap denoting columns available in the after-image as they appear in the table setup.
Definition: log_event.h:2945
uchar * m_key
Definition: log_event.h:2964
int do_index_scan_and_update(Relay_log_info const *rli)
Implementation of the index scan and update algorithm.
Definition: log_event.cc:9031
int do_scan_and_update(Relay_log_info const *rli)
This member function scans the table and applies the changes that had been previously hashed.
Definition: log_event.cc:9330
virtual int do_add_row_data(uchar *data, size_t length)
Definition: log_event.cc:8166
Rows_applier_psi_stage m_psi_progress
Definition: log_event.h:2788
static bool is_trx_retryable_upon_engine_error(int error)
Helper function to check whether the storage engine error allows for the transaction to be retried or...
Definition: log_event.cc:8622
size_t get_data_size() override
Definition: log_event.cc:8133
const char * get_db() override
Definition: log_event.h:2879
uint16 flag_set
Definition: log_event.h:2798
row_lookup_mode
Definition: log_event.h:2800
@ ROW_LOOKUP_INDEX_SCAN
Definition: log_event.h:2803
@ ROW_LOOKUP_UNDEFINED
Definition: log_event.h:2801
@ ROW_LOOKUP_NOT_NEEDED
Definition: log_event.h:2802
@ ROW_LOOKUP_TABLE_SCAN
Definition: log_event.h:2804
@ ROW_LOOKUP_HASH_SCAN
Definition: log_event.h:2805
virtual bool read_write_bitmaps_cmp(const TABLE *table) const =0
Compares the table's read/write_set with the columns included in this event's before-image and/or aft...
virtual int skip_after_image_for_update_event(const Relay_log_info *rli, const uchar *curr_bi_start)
Seek past the after-image of an update event, in case a row was processed without reading the after-i...
Definition: log_event.h:3214
bool is_auto_inc_in_extra_columns(const Relay_log_info *const rli)
Helper function to check whether there is an auto increment column on the table where the event is to...
Definition: log_event.cc:8604
uchar * m_rows_cur
Definition: log_event.h:2956
const mysql::binlog::event::Table_id & get_table_id() const
Definition: log_event.h:2856
uint m_row_count
Definition: log_event.h:2882
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:9609
int next_record_scan(bool first_read)
Fetches next row.
Definition: log_event.cc:8893
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:10515
int do_table_scan_and_update(Relay_log_info const *rli)
Implementation of the legacy table_scan and update algorithm.
Definition: log_event.cc:9526
MY_BITMAP m_local_cols
Bitmap denoting columns available in the image as they appear in the table setup.
Definition: log_event.h:2917
int open_record_scan()
Initializes scanning of rows.
Definition: log_event.cc:8955
void clear_flags(flag_set flags_arg)
Definition: log_event.h:2826
virtual int do_exec_row(const Relay_log_info *const rli)=0
std::set< uchar *, Key_compare >::iterator m_itr
Definition: log_event.h:2990
enum_error
Enumeration of the errors that can be returned.
Definition: log_event.h:2811
@ ERR_TABLE_LIMIT_EXCEEDED
No more room for tables.
Definition: log_event.h:2814
@ ERR_BAD_TABLE_DEF
Table definition does not match.
Definition: log_event.h:2816
@ ERR_OPEN_FAILURE
Failure to open table.
Definition: log_event.h:2812
@ ERR_RBR_TO_SBR
daisy-chanining RBR to SBR not allowed
Definition: log_event.h:2817
@ ERR_OUT_OF_MEM
Out of memory.
Definition: log_event.h:2815
@ ERR_OK
No error.
Definition: log_event.h:2813
int row_operations_scan_and_key_teardown(int error)
Definition: log_event.cc:8574
int update_generated_columns(MY_BITMAP const &fields_to_update)
Updates the generated columns of the TABLE object referenced by m_table, that have an active bit in t...
Definition: log_event.cc:8110
virtual int do_after_row_operations(const Relay_log_info *const log, int error)=0
MY_BITMAP const * get_cols() const
Definition: log_event.h:2854
std::set< uchar *, Key_compare > m_distinct_keys
Definition: log_event.h:2989
void do_post_row_operations(Relay_log_info const *rli, int err)
Private member function called after updating/deleting a row.
Definition: log_event.cc:8737
Rows_log_event(Rows_log_event &&) noexcept=delete
const uchar * m_curr_row
Definition: log_event.h:2962
MY_BITMAP m_cols_ai
Bitmap for columns available in the after image, if present.
Definition: log_event.h:2938
int add_key_to_distinct_keyset()
Populates the m_distinct_keys with unique keys to be modified during HASH_SCAN over keys.
Definition: log_event.cc:9011
KEY * m_key_info
Definition: log_event.h:2966
int unpack_current_row(const Relay_log_info *const rli, MY_BITMAP const *cols, bool is_after_image, bool only_seek=false)
Unpack the current row image from the event into m_table->record[0].
Definition: log_event.cc:8017
int do_update_pos(Relay_log_info *rli) override
The method either increments the relay log position or commits the current statement and increments t...
Definition: log_event.cc:10377
~Rows_log_event() override
Definition: log_event.cc:7997
void set_flags(flag_set flags_arg)
Definition: log_event.h:2825
friend class Old_rows_log_event
Definition: log_event.h:3281
const uchar * m_curr_row_end
Definition: log_event.h:2963
bool write_data_body(Basic_ostream *ostream) override
Definition: log_event.cc:10482
uint32 m_bitbuf_ai[128/(sizeof(uint32) *8)]
Definition: log_event.h:2949
MY_BITMAP m_cols
Definition: log_event.h:2910
It is used to record the original query for the rows events in RBR.
Definition: log_event.h:3776
size_t get_data_size() override
Definition: log_event.h:3825
~Rows_query_log_event() override
Definition: log_event.h:3818
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:13004
bool write_data_body(Basic_ostream *ostream) override
Definition: log_event.cc:12987
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:12902
int pack_info(Protocol *) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:12909
Rows_query_log_event(THD *thd_arg, const char *query, size_t query_len)
Definition: log_event.h:3779
Rpl_filter.
Definition: rpl_filter.h:214
const char * get_rewrite_db(const char *db, size_t *new_len)
Definition: rpl_filter.cc:1176
bool is_rewrite_empty()
Definition: rpl_filter.cc:571
Mix-in to handle the message logging and reporting for relay log info and master log info structures.
Definition: rpl_reporting.h:54
Definition: rpl_rli_pdb.h:501
Definition: log_event.h:1962
mysql::binlog::event::Log_event_type get_type_code() const override
Definition: log_event.h:1991
Stop_log_event()
Definition: log_event.h:1971
~Stop_log_event() override=default
Stop_log_event(const Stop_log_event &)=delete
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:6976
enum_skip_reason do_shall_skip(Relay_log_info *) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.h:2000
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:6996
String class wrapper with a preallocated buffer of size buff_sz.
Definition: sql_string.h:685
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:167
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
Table_map_log_event which maps a table definition to a number.
Definition: log_event.h:2440
@ TM_GENERATED_INVISIBLE_PK_F
Table has generated invisible primary key.
Definition: log_event.h:2483
@ TM_BIT_LEN_EXACT_F
Definition: log_event.h:2476
@ TM_NO_FLAGS
Definition: log_event.h:2475
@ TM_REFERRED_FK_DB_F
Definition: log_event.h:2477
Table_map_log_event(Table_map_log_event &&) noexcept=delete
enum_skip_reason do_shall_skip(Relay_log_info *rli) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.cc:11041
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:10906
Table_map_log_event(const Table_map_log_event &)=delete
uint8 mts_number_dbs() override
Definition: log_event.h:2532
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:11050
const char * get_db_name() const
Definition: log_event.h:2524
virtual int save_field_metadata()
Save the field metadata based on the real_type of the field.
Definition: log_event.cc:10603
bool init_set_str_value_field()
Definition: log_event.cc:11358
flag_set get_flags(flag_set flag) const
Definition: log_event.h:2486
~Table_map_log_event() override
bool init_geometry_type_field()
Definition: log_event.cc:11406
bool init_charset_field(std::function< bool(const Field *)> include_type, Optional_metadata_field_type default_charset_type, Optional_metadata_field_type column_charset_type)
Capture and serialize character sets.
Definition: log_event.cc:11252
bool init_primary_key_field()
Definition: log_event.cc:11437
enum_flag
Definition: log_event.h:2463
@ ENUM_FLAG_COUNT
Nothing here right now, but the flags support is there in preparation for changes that are coming.
Definition: log_event.h:2470
bool is_rbr_logging_format() const override
Return true if the event has to be logged using RBR for DMLs.
Definition: log_event.h:2594
const mysql::binlog::event::Table_id & get_table_id() const
Definition: log_event.h:2520
bool init_column_visibility_field()
Definition: log_event.cc:11485
const char * get_table_name() const
Definition: log_event.h:2523
uint8 get_mts_dbs(Mts_db_names *arg, Rpl_filter *rpl_filter) override
Definition: log_event.h:2544
bool write_data_header(Basic_ostream *ostream) override
Definition: log_event.cc:11055
bool write_data_body(Basic_ostream *ostream) override
Definition: log_event.cc:11069
@ TYPE_CODE
Definition: log_event.h:2449
bool init_enum_str_value_field()
Definition: log_event.cc:11385
bool init_column_name_field()
Definition: log_event.cc:11346
ColumnViewPtr m_column_view
Wrapper around TABLE *m_table that abstracts the table field set iteration logic, since it is not man...
Definition: log_event.h:2618
const char * get_db() override
Definition: log_event.h:2531
size_t get_data_size() override
Definition: log_event.h:2526
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:11517
TABLE * m_table
Definition: log_event.h:2604
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:10787
void init_metadata_fields()
Capture the optional metadata fields which should be logged into table_map_log_event and serialize th...
Definition: log_event.cc:11198
enum_error
Enumeration of the errors that can be returned.
Definition: log_event.h:2454
@ ERR_OK
No error.
Definition: log_event.h:2456
@ ERR_TABLE_LIMIT_EXCEEDED
No more room for tables.
Definition: log_event.h:2457
@ ERR_OPEN_FAILURE
Failure to open table.
Definition: log_event.h:2455
@ ERR_OUT_OF_MEM
Out of memory.
Definition: log_event.h:2458
@ ERR_BAD_TABLE_DEF
Table definition does not match.
Definition: log_event.h:2459
@ ERR_RBR_TO_SBR
daisy-chanining RBR to SBR not allowed
Definition: log_event.h:2460
bool has_generated_invisible_primary_key() const
Definition: log_event.cc:10783
bool init_vector_dimensionality_field()
Definition: log_event.cc:11423
StringBuffer< 1024 > m_metadata_buf
Definition: log_event.h:2607
bool init_signedness_field()
Definition: log_event.cc:11221
This is the subclass of Transaction_context_event and Log_event This class encodes the transaction_co...
Definition: log_event.h:4345
static int get_data_set_size(std::list< const char * > *set)
Definition: log_event.cc:13998
void add_write_set(const char *hash)
Add a hash which identifies a inserted/updated/deleted row on the ongoing transaction.
Definition: log_event.cc:14010
my_thread_id get_thread_id() const
Return the id of the committing thread.
Definition: log_event.h:4449
Transaction_context_log_event(const char *server_uuid_arg, bool using_trans, my_thread_id thread_id_arg, bool is_gtid_specified)
Definition: log_event.cc:13772
void add_read_set(const char *hash)
Add a hash which identifies a read row on the ongoing transaction.
Definition: log_event.cc:14015
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:13890
Gtid_set * get_snapshot_version()
Return the transaction snapshot timestamp.
Definition: log_event.h:4439
size_t get_data_size() override
Definition: log_event.cc:13897
int do_apply_event(Relay_log_info const *) override
Primitive to apply an event to the database.
Definition: log_event.h:4399
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:13865
bool read_snapshot_version()
Read snapshot version from encoded buffers.
Definition: log_event.cc:13978
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:13857
Gtid_set * snapshot_version
A gtid_set which is used to store the transaction set used for conflict detection.
Definition: log_event.h:4351
size_t get_event_length()
Definition: log_event.cc:13909
Tsid_map * tsid_map
The Tsid_map to use for creating the Gtid_set.
Definition: log_event.h:4348
std::list< const char * > * get_read_set()
Return a pointer to read-set list.
Definition: log_event.h:4426
size_t get_snapshot_version_size()
Definition: log_event.cc:13992
bool write_data_header(Basic_ostream *ostream) override
Definition: log_event.cc:13914
bool is_gtid_specified() const
Return true if transaction has GTID fully specified, false otherwise.
Definition: log_event.h:4456
~Transaction_context_log_event() override
Definition: log_event.cc:13840
bool write_data_set(Basic_ostream *ostream, std::list< const char * > *set)
Definition: log_event.cc:13958
std::list< const char * > * get_write_set()
Return a pointer to write-set list.
Definition: log_event.h:4414
bool write_data_body(Basic_ostream *ostream) override
Definition: log_event.cc:13930
size_t to_string(char *buf, ulong len) const
Definition: log_event.cc:13851
const char * get_server_uuid()
Return the server uuid.
Definition: log_event.h:4444
bool write_snapshot_version(Basic_ostream *ostream)
Definition: log_event.cc:13942
Mts_db_names & get_mts_db_names()
Definition: log_event.h:3892
Mts_db_names m_mts_db_names
Definition: log_event.h:3886
void reset()
Definition: log_event.h:3891
virtual ~Applier_context()
Definition: log_event.h:3890
Definition: log_event.h:3879
size_t get_event_length()
Definition: log_event.h:3927
void set_mts_dbs(Mts_db_names &arg)
Definition: log_event.cc:14263
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:14242
uint8 get_mts_dbs(Mts_db_names *arg, Rpl_filter *rpl_filter) override
The method fills in pointers to event's database name c-strings to a supplied array.
Definition: log_event.cc:14248
bool apply_payload_event(Relay_log_info const *rli, const uchar *event_buf)
Definition: log_event.cc:14334
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:14422
bool ends_group() const override
Definition: log_event.cc:14469
bool write(Basic_ostream *ostream) override
Definition: log_event.cc:14427
~Transaction_payload_log_event() override=default
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:14459
size_t get_data_size() override
Definition: log_event.cc:14234
Transaction_payload_log_event(THD *thd_arg, const char *payload, uint64_t payload_size, uint16_t compression_type, uint64_t uncompressed_size)
Definition: log_event.h:3895
Applier_context m_applier_ctx
Definition: log_event.h:3932
uint8 mts_number_dbs() override
Definition: log_event.cc:14279
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:14283
Represents a bidirectional map between TSID and SIDNO.
Definition: rpl_gtid.h:750
rpl_sidno add_tsid(const Tsid &tsid)
Add the given TSID to this map if it does not already exist.
Definition: rpl_gtid_tsid_map.cc:61
Log row updates with a before image.
Definition: log_event.h:3418
@ TYPE_CODE
Definition: log_event.h:3422
int do_exec_row(const Relay_log_info *const) override
Definition: log_event.cc:12673
static mysql::binlog::event::Log_event_type get_update_rows_event_type(const THD *thd_arg)
Auxiliary function used in the (THD*, ...) constructor to determine the type code based on configurat...
Definition: log_event.cc:12560
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:12588
bool read_write_bitmaps_cmp(const TABLE *table) const override
Compares the table's read/write_set with the columns included in this event's before-image and/or aft...
Definition: log_event.h:3451
void claim_memory_ownership(bool claim) override
Allow thread to CLAIM or DISCLAIM the ownership of this object depends on the parameter value passed.
Definition: log_event.cc:12633
int do_after_row_operations(const Relay_log_info *const, int) override
Definition: log_event.cc:12666
Update_rows_log_event(THD *, TABLE *, const mysql::binlog::event::Table_id &table_id, MY_BITMAP const *cols_bi, MY_BITMAP const *cols_ai, bool is_transactional, const unsigned char *extra_row_ndb_info)
int do_before_row_operations(const Relay_log_info *const) override
Definition: log_event.cc:12640
mysql::binlog::event::Log_event_type get_general_type_code() override
Definition: log_event.h:3460
~Update_rows_log_event() override
Definition: log_event.cc:12611
int skip_after_image_for_update_event(const Relay_log_info *rli, const uchar *curr_bi_start) override
Seek past the after-image of an update event, in case a row was processed without reading the after-i...
Definition: log_event.cc:9204
void init(MY_BITMAP const *cols)
Definition: log_event.cc:12595
Every time a query uses the value of a user variable, a User_var_log_event is written before the Quer...
Definition: log_event.h:1893
~User_var_log_event() override=default
bool is_sbr_logging_format() const override
Return true if the event has to be logged using SBR for DMLs.
Definition: log_event.h:1947
bool is_deferred()
Definition: log_event.h:1936
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:6924
query_id_t query_id
Definition: log_event.h:1903
void set_deferred(query_id_t qid)
Definition: log_event.h:1941
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:6545
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:6814
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:6943
User_var_log_event(const User_var_log_event &)=delete
User_var_log_event(User_var_log_event &&) noexcept=delete
enum_skip_reason do_shall_skip(Relay_log_info *rli) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.cc:6929
bool deferred
Definition: log_event.h:1902
bool write(Basic_ostream *ostream) override
Definition: log_event.cc:6643
This is the subclass of View_change_log_event and Log_event This class created the view_change_log_ev...
Definition: log_event.h:4485
std::map< std::string, std::string > * get_certification_info()
Returns the certification info.
Definition: log_event.h:4553
int do_update_pos(Relay_log_info *rli) override
Advance relay log coordinates.
Definition: log_event.cc:14155
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:14082
bool write_data_body(Basic_ostream *ostream) override
Definition: log_event.cc:14172
void set_seq_number(rpl_gno number)
Set the certification sequence number.
Definition: log_event.h:4562
char * get_view_id()
Returns the view id.
Definition: log_event.h:4535
size_t get_size_data_map(std::map< std::string, std::string > *map)
Definition: log_event.cc:14063
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:14088
size_t get_data_size() override
Definition: log_event.cc:14054
bool write_data_header(Basic_ostream *ostream) override
Definition: log_event.cc:14161
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:14114
rpl_gno get_seq_number()
Returns the certification sequence number.
Definition: log_event.h:4567
bool write_data_map(Basic_ostream *ostream, std::map< std::string, std::string > *map)
Definition: log_event.cc:14180
void set_certification_info(std::map< std::string, std::string > *info, size_t *event_size)
Sets the certification info in the event.
Definition: log_event.cc:14216
View_change_log_event(const View_change_log_event &)=delete
size_t to_string(char *buf, ulong len) const
Definition: log_event.cc:14077
Log row insertions and updates.
Definition: log_event.h:3329
int do_before_row_operations(const Relay_log_info *const) override
Definition: log_event.cc:12003
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:12450
mysql::binlog::event::Log_event_type get_general_type_code() override
Definition: log_event.h:3362
Write_rows_log_event(THD *, TABLE *, const mysql::binlog::event::Table_id &table_id, bool is_transactional, const unsigned char *extra_row_ndb_info)
Definition: log_event.cc:11973
bool read_write_bitmaps_cmp(const TABLE *table) const override
Compares the table's read/write_set with the columns included in this event's before-image and/or aft...
Definition: log_event.h:3351
int do_exec_row(const Relay_log_info *const) override
Definition: log_event.cc:12427
int write_row(const Relay_log_info *const, const bool)
Write the current row into event's table.
Definition: log_event.cc:12192
@ TYPE_CODE
Definition: log_event.h:3333
int do_after_row_operations(const Relay_log_info *const, int) override
Definition: log_event.cc:12111
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:11983
Similar to Xid_log_event except that.
Definition: log_event.h:1832
static const int xid_bufs_size
Definition: log_event.h:1835
bool do_commit(THD *thd) override
Differs from Xid_log_event::do_commit in that it carries out XA prepare (not the commit).
Definition: log_event.cc:6501
XA_prepare_log_event(THD *thd_arg, XID *xid_arg, bool one_phase_arg=false)
Definition: log_event.h:1839
size_t get_data_size() override
Definition: log_event.h:1855
bool write(Basic_ostream *ostream) override
Definition: log_event.cc:6439
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:6467
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:6425
mysql::binlog::event::Log_event_type get_type_code() const override
Definition: log_event.h:1852
Definition: log_event.h:1758
enum_skip_reason do_shall_skip(Relay_log_info *rli) override
Decide if this event shall be skipped or not and the reason for skipping it.
Definition: log_event.cc:6411
bool ends_group() const override
Definition: log_event.h:1771
Xid_apply_log_event(THD *thd_arg, mysql::binlog::event::Log_event_header *header_arg, mysql::binlog::event::Log_event_footer *footer_arg)
Definition: log_event.h:1761
virtual bool do_commit(THD *thd_arg)=0
int do_apply_event_worker(Slave_worker *rli) override
Worker commits Xid transaction and in case of its transactional info table marks the current group as...
Definition: log_event.cc:6166
~Xid_apply_log_event() override=default
int do_apply_event(Relay_log_info const *rli) override
Primitive to apply an event to the database.
Definition: log_event.cc:6239
This is the subclass of Xid_event defined in libbinlogevent, An XID event is generated for a commit o...
Definition: log_event.h:1781
~Xid_log_event() override=default
bool write(Basic_ostream *ostream) override
Definition: log_event.cc:6092
Xid_log_event(const Xid_log_event &)=delete
int pack_info(Protocol *protocol) override
Stores a string representation of this event in the Protocol.
Definition: log_event.cc:6069
size_t get_data_size() override
Definition: log_event.h:1807
bool do_commit(THD *thd_arg) override
The methods combines few commit actions to make it usable as in the single- so multi- threaded case.
Definition: log_event.cc:6125
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:6086
Xid_log_event(Xid_log_event &&) noexcept=delete
A (partial) implementation of std::deque allocating its blocks on a MEM_ROOT.
Definition: mem_root_deque.h:111
This event is created to contain the file data.
Definition: load_data_events.h:274
const char * db
'db' is filled when the event is created in mysql_load() (the event needs to have a 'db' member to be...
Definition: load_data_events.h:311
unsigned int block_len
Definition: load_data_events.h:298
Event for the first block of file to be loaded, its only difference from Append_block event is that t...
Definition: load_data_events.h:358
@ APPEND_BLOCK_HEADER_LEN
Definition: binlog_event.h:874
@ IGNORABLE_HEADER_LEN
Definition: binlog_event.h:888
@ FORMAT_DESCRIPTION_HEADER_LEN
Definition: binlog_event.h:878
@ INCIDENT_HEADER_LEN
Definition: binlog_event.h:886
@ DELETE_FILE_HEADER_LEN
Definition: binlog_event.h:875
@ ROTATE_HEADER_LEN
Definition: binlog_event.h:872
const Log_event_header * header() const
Return a const pointer to the header of the log event.
Definition: binlog_event.h:951
Binary_log_event & operator=(const Binary_log_event &)=default
const Log_event_footer * footer() const
Return a const pointer to the footer of the log event.
Definition: binlog_event.h:959
DELETE_FILE_EVENT occurs when the LOAD DATA failed on the master.
Definition: load_data_events.h:202
const char * db
Definition: load_data_events.h:215
Log row deletions.
Definition: rows_event.h:1136
Event responsible for LOAD DATA execution, it similar to Query_event but before executing the query i...
Definition: load_data_events.h:119
For binlog version 4.
Definition: control_events.h:240
GTID stands for Global Transaction IDentifier It is composed of two parts:
Definition: control_events.h:1017
int get_server_version_length() const
We only store the immediate_server_version if both server versions are the same.
Definition: control_events.h:1237
int get_commit_timestamp_length() const
Definition: control_events.h:1227
int get_commit_group_ticket_length() const
Returns the length of the packed commit_group_ticket field.
Definition: control_events.cpp:620
bool is_tagged() const
Checks whether this Gtid log event contains a tag.
Definition: control_events.cpp:650
unsigned long long get_trx_length() const
Definition: control_events.h:1316
static const int POST_HEADER_LENGTH
Total length of post header.
Definition: control_events.h:1255
Replication event to ensure to replica that source is alive.
Definition: control_events.h:1670
Replication event to ensure to replica that source is alive.
Definition: control_events.h:1744
Base class for ignorable log events.
Definition: control_events.h:675
Class representing an incident, an occurrence out of the ordinary, that happened on the master.
Definition: control_events.h:441
char * message
Definition: control_events.h:492
Incident_event(enum_incident incident_arg)
This will create an Incident_event with an empty message and set the type_code as INCIDENT_EVENT in t...
Definition: control_events.h:462
size_t message_length
Definition: control_events.h:493
enum_incident
Enumeration of the incidents that can occur for the server.
Definition: control_events.h:446
@ INCIDENT_NONE
No incident.
Definition: control_events.h:448
@ INCIDENT_COUNT
Shall be last event of the enumeration.
Definition: control_events.h:452
An Intvar_event will be created just before a Query_event, if the query uses one of the variables LAS...
Definition: statement_events.h:921
Intvar_event(const char *buf, const Format_description_event *fde)
Constructor receives a packet from the MySQL master or the binary log and decodes it to create an Int...
Definition: statement_events.cpp:483
The Common-Header always has the same form and length within one version of MySQL.
Definition: binlog_event.h:677
unsigned long long log_pos
Definition: binlog_event.h:708
unsigned char Byte
The following type definition is to be used whenever data is placed and manipulated in a common buffe...
Definition: binlog_event.h:723
Log_event_type type_code
Event type extracted from the header.
Definition: binlog_event.h:693
void set_is_valid(bool is_valid)
Set if the event object shall be considered valid or not.
Definition: binlog_event.h:757
uint16_t flags
Definition: binlog_event.h:716
Definition: control_events.h:1381
size_t buf_size
Definition: control_events.h:1409
const unsigned char * buf
Definition: control_events.h:1410
A Query_event is created for each query that modifies the database, unless the query is logged row-ba...
Definition: statement_events.h:451
const char * db
Definition: statement_events.h:535
const char * query
Definition: statement_events.h:534
unsigned char mts_accessed_dbs
Definition: statement_events.h:640
char mts_accessed_db_names[MAX_DBS_IN_EVENT_MTS][NAME_LEN]
Definition: statement_events.h:641
size_t q_len
Definition: statement_events.h:587
Logs random seed used by the next RAND(), and by PASSWORD() in 4.1.0.
Definition: statement_events.h:1033
Rand_event(unsigned long long seed1_arg, unsigned long long seed2_arg)
Definition: statement_events.h:1043
When a binary log file exceeds a size limit, a ROTATE_EVENT is written at the end of the file that po...
Definition: control_events.h:117
unsigned int flags
Definition: control_events.h:121
size_t ident_len
Definition: control_events.h:120
Common base class for all row-containing binary log events.
Definition: rows_event.h:882
Table_id m_table_id
Actual event type.
Definition: rows_event.h:954
enum_flag get_flags() const
Definition: rows_event.h:1034
uint16_t m_flags
Definition: rows_event.h:955
Rows query event type, which is a subclass of the Ignorable_event, to record the original query for t...
Definition: rows_event.h:1177
char * m_rows_query
Definition: rows_event.h:1207
size_t m_rows_query_length
Definition: rows_event.h:1208
A stop event is written to the log files under these circumstances:
Definition: control_events.h:380
Stop_event()
It is the minimal constructor, and all it will do is set the type_code as STOP_EVENT in the header ob...
Definition: control_events.h:386
Each table share has a table id, it is mainly used for row based replication.
Definition: table_id.h:42
In row-based mode, every row operation event is preceded by a Table_map_event which maps a table defi...
Definition: rows_event.h:525
unsigned char * m_coltype
Definition: rows_event.h:686
std::string m_tblnam
Definition: rows_event.h:683
uint16_t flag_set
Definition: rows_event.h:534
unsigned char * m_null_bits
field metadata
Definition: rows_event.h:693
Optional_metadata_field_type
DEFAULT_CHARSET and COLUMN_CHARSET don't appear together, and ENUM_AND_SET_DEFAULT_CHARSET and ENUM_A...
Definition: rows_event.h:548
unsigned long m_colcnt
Definition: rows_event.h:685
unsigned char * m_field_metadata
Definition: rows_event.h:692
unsigned long m_field_metadata_size
The size of field metadata buffer set by calling save_field_metadata()
Definition: rows_event.h:691
size_t m_data_size
Definition: rows_event.h:678
std::string m_dbnam
event data size
Definition: rows_event.h:681
flag_set m_flags
Definition: rows_event.h:676
unsigned int m_optional_metadata_len
Definition: rows_event.h:694
Table_id m_table_id
Event post header contents.
Definition: rows_event.h:675
unsigned char * m_optional_metadata
Definition: rows_event.h:695
This class is used to combine the information of the ongoing transaction including the write set and ...
Definition: control_events.h:1469
bool gtid_specified
Definition: control_events.h:1505
uint32_t thread_id
Definition: control_events.h:1504
std::list< const char * > read_set
Definition: control_events.h:1509
const char * server_uuid
Definition: control_events.h:1503
std::list< const char * > write_set
Definition: control_events.h:1508
Event that encloses all the events of a transaction.
Definition: control_events.h:736
Transaction_payload_event(const Transaction_payload_event &)=delete
An unknown event should never occur.
Definition: binlog_event.h:989
Log row updates with a before image.
Definition: rows_event.h:1117
Written every time a statement uses a user variable; precedes other events for the statement.
Definition: statement_events.h:804
const char * name
Definition: statement_events.h:853
User_var_event(const char *name_arg, unsigned int name_len_arg, char *val_arg, unsigned long val_len_arg, Value_type type_arg, unsigned int charset_number_arg, unsigned char flags_arg)
This constructor will initialize the instance variables and the type_code, it will be used only by th...
Definition: statement_events.h:820
This class is used to add view change markers in the binary log when a member of the group enters or ...
Definition: control_events.h:1569
long long int seq_number
Definition: control_events.h:1623
std::map< std::string, std::string > certification_info
Definition: control_events.h:1625
char view_id[ENCODED_VIEW_ID_MAX_LEN]
Definition: control_events.h:1621
Log row insertions.
Definition: rows_event.h:1099
An XA_prepare event is generated for a XA prepared transaction.
Definition: control_events.h:589
XA_prepare_event(void *xid_arg, bool oph_arg)
The minimal constructor of XA_prepare_event, it initializes the instance variable xid and set the typ...
Definition: control_events.h:618
void * xid
Definition: control_events.h:609
An XID event is generated for a commit of a transaction that modifies one or more tables of an XA-cap...
Definition: control_events.h:524
Xid_event(uint64_t xid_arg)
The minimal constructor of Xid_event, it initializes the instance variable xid and set the type_code ...
Definition: control_events.h:531
uint64_t xid
Definition: control_events.h:541
Represents Transaction Source Identifier which is composed of source UUID and transaction tag.
Definition: tsid.h:44
static std::size_t get_size(const T &arg)
Definition: serializer_impl.hpp:70
Definition: partition_info.h:209
Used to hold information about file and file structure in exchange via non-DB file (....
Definition: sql_exchange.h:79
A table definition from the master.
Definition: rpl_utility.h:249
static uint vector_column_count(const unsigned char *types, ulong size)
Return the number of VECTOR columns.
Definition: rpl_utility.h:315
Maps table id's (integers) to table pointers.
Definition: rpl_tblmap.h:51
static char buf[MAX_BUF]
Definition: conf_to_src.cc:73
Contains the classes representing events operating in the replication stream properties.
#define U
Definition: ctype-tis620.cc:74
uint64_t sql_mode_t
Definition: dd_event.h:39
#define MAX_DBS_IN_EVENT_MTS
The maximum number of updated databases that a status of Query-log-event can carry.
Definition: binlog_event.h:109
#define MAX_TIME_ZONE_NAME_LENGTH
Maximum length of time zone name that we support (Time zone name is char(64) in db).
Definition: binlog_event.h:122
#define OVER_MAX_DBS_IN_EVENT_MTS
When the actual number of databases exceeds MAX_DBS_IN_EVENT_MTS the value of OVER_MAX_DBS_IN_EVENT_M...
Definition: binlog_event.h:116
void close_cached_file(IO_CACHE *cache)
Definition: mf_cache.cc:87
bool my_b_inited(const IO_CACHE *info)
Definition: my_sys.h:483
#define MY_WME
Definition: my_sys.h:130
int my_b_copy_to_file(IO_CACHE *cache, FILE *file)
Definition: mf_iocache2.cc:72
bool reinit_io_cache(IO_CACHE *info, enum cache_type type, my_off_t seek_offset, bool use_async_io, bool clear_cache)
Definition: mf_iocache.cc:328
@ WRITE_CACHE
Definition: my_sys.h:286
std::pair< bool, mysql::binlog::event::Log_event_basic_info > extract_log_event_basic_info(Log_event *log_event)
Extract basic info about an event: type, query, is it ignorable.
Definition: log_event.cc:14582
size_t my_strmov_quoted_identifier(THD *thd, char *buffer, const char *identifier, size_t length)
Definition: log_event.cc:14542
bool is_atomic_ddl_event(Log_event const *evt)
The function checks the argument event properties to deduce whether it represents an atomic DDL.
Definition: log_event.h:4598
char * str_to_hex(char *to, const char *from, size_t len)
Transforms a string into "" or its expression in 0x... form.
Definition: log_event.cc:801
bool binary_event_serialize(EVENT *ev, Basic_ostream *ostream)
Serialize an binary event to the given output stream.
Definition: log_event.h:4634
bool net_field_length_checked(const uchar **packet, size_t *max_length, T *out)
Read an integer in net_field_length format, guarding against read out of bounds and advancing the pos...
Definition: log_event.cc:761
TYPELIB binlog_checksum_typelib
Definition: log_event.cc:221
bool is_atomic_ddl(THD *thd, bool using_trans)
The function lists all DDL instances that are supported for crash-recovery (WL9175).
Definition: log_event.cc:3749
int ignored_error_code(int err_code)
Ignore error code specified on command line.
Definition: log_event.cc:607
MYSQL_PLUGIN_IMPORT char server_version[SERVER_VERSION_LENGTH]
Definition: log_event.h:125
std::unique_ptr< cs::util::ReplicatedColumnsView > ColumnViewPtr
Definition: log_event.h:121
bool is_any_gtid_event(const Log_event *evt)
Definition: log_event.h:4570
size_t my_strmov_quoted_identifier_helper(int q, char *buffer, const char *identifier, size_t length)
Definition: log_event.cc:14555
bool is_session_control_event(Log_event *evt)
Check if the given event is a session control event, one of User_var_event, Intvar_event or Rand_even...
Definition: log_event.h:4584
PSI_memory_key key_memory_Rows_query_log_event_rows_query
Definition: log_event.cc:196
const int64 SEQ_MAX_TIMESTAMP
Maximum value of binlog logical timestamp.
Definition: log_event.h:355
MYSQL_PLUGIN_IMPORT ulong server_id
Definition: log_event.h:118
static bool copy_event_cache_to_file_and_reinit(IO_CACHE *cache, FILE *file, bool flush_stream)
Definition: log_event.h:3831
PSI_memory_key key_memory_Incident_log_event_message
Definition: log_event.cc:195
bool slave_execute_deferred_events(THD *thd)
The function is called by slave applier in case there are active table filtering rules to force gathe...
Definition: log_event.cc:6051
int append_query_string(const THD *thd, const CHARSET_INFO *csinfo, String const *from, String *to)
Append a version of the 'from' string suitable for use in a query to the 'to' string.
Definition: log_event.cc:819
int get_rpl_part_id(partition_info *part_info)
This method is used to extract the partition_id from a partitioned table.
Definition: log_event.cc:7772
#define LOG_EVENT_RELAY_LOG_F
Events with this flag set are created by slave IO thread and written to relay log.
Definition: log_event.h:283
#define LOG_EVENT_NO_FILTER_F
Events with this flag are not filtered (e.g.
Definition: log_event.h:303
#define LOG_EVENT_IGNORABLE_F
For an event, 'e', carrying a type code, that a slave, 's', does not recognize, 's' will check 'e' fo...
Definition: log_event.h:294
#define LOG_EVENT_ARTIFICIAL_F
Artificial events are created arbitrarily and not written to binary log.
Definition: log_event.h:275
#define LOG_EVENT_MTS_ISOLATE_F
MTS: group of events can be marked to force its execution in isolation from any other Workers.
Definition: log_event.h:314
unsigned int PSI_memory_key
Instrumented memory key.
Definition: psi_memory_bits.h:49
#define mysql_stage_set_work_completed(P1, P2)
Definition: mysql_stage.h:115
#define mysql_stage_get_work_estimated(P1)
Definition: mysql_stage.h:143
#define mysql_stage_set_work_estimated(P1, P2)
Definition: mysql_stage.h:140
static int flag
Definition: hp_test1.cc:40
int key_cmp2(KEY_PART_INFO *key_part, const uchar *key1, uint key1_length, const uchar *key2, uint key2_length)
Compare two given keys.
Definition: key.cc:505
#define free(A)
Definition: lexyy.cc:915
LOAD DATA INFILE is not written to the binary log like other statements.
static int native_strncasecmp(const char *s1, const char *s2, size_t n)
Definition: m_string.h:216
static bool bitmap_cmp(const MY_BITMAP *map1, const MY_BITMAP *map2)
Quite unlike other C comparison functions ending with 'cmp', e.g.
Definition: my_bitmap.h:108
Abstraction functions over zlib/intrinsics.
std::uint32_t ha_checksum
Definition: my_checksum.h:106
Header for compiler-dependent features.
#define DBUG_EXECUTE_IF(keyword, a1)
Definition: my_dbug.h:171
#define DBUG_PRINT(keyword, arglist)
Definition: my_dbug.h:181
#define DBUG_EVALUATE_IF(keyword, a1, a2)
Definition: my_dbug.h:179
#define DBUG_TRACE
Definition: my_dbug.h:146
Some integer typedefs for easier portability.
unsigned long long int ulonglong
Definition: my_inttypes.h:56
uint8_t uint8
Definition: my_inttypes.h:63
ulonglong my_off_t
Definition: my_inttypes.h:72
unsigned char uchar
Definition: my_inttypes.h:52
int64_t int64
Definition: my_inttypes.h:68
#define MYF(v)
Definition: my_inttypes.h:97
uint16_t uint16
Definition: my_inttypes.h:65
uint32_t uint32
Definition: my_inttypes.h:67
#define FN_REFLEN
Definition: my_io.h:83
void * my_malloc(PSI_memory_key key, size_t size, int flags)
Allocates size bytes of memory.
Definition: my_memory.cc:57
void my_free(void *ptr)
Frees the memory pointed by the ptr.
Definition: my_memory.cc:81
Defines various enable/disable and HAVE_ macros related to the performance schema instrumentation sys...
Functions related to handling of plugins and other dynamically loaded libraries.
#define MYSQL_PLUGIN_IMPORT
Definition: my_sharedlib.h:71
Common header for many mysys elements.
static my_thread_id thread_id
Definition: my_thr_init.cc:63
uint32 my_thread_id
Definition: my_thread_local.h:34
static char * query
Definition: myisam_ftdump.cc:47
Common definition between mysql server & client.
unsigned int net_length_size(unsigned long long num)
#define SERVER_VERSION_LENGTH
Definition: mysql_com.h:74
Instrumentation helpers for stages.
static void print_header(MYSQL_RES *result)
Definition: mysqladmin.cc:1279
bool short_form
static uint verbose
Definition: mysqlcheck.cc:66
static bool replace
Definition: mysqlimport.cc:70
static bool ignore
Definition: mysqlimport.cc:70
static const char * sql_mode
Definition: mysqlslap.cc:199
const char * delimiter
Definition: mysqlslap.cc:160
static PFS_engine_table_share_proxy table
Definition: pfs.cc:61
Definition: pfs.cc:38
Definition: buf0block_hint.cc:30
const std::string charset("charset")
const std::string FILE("FILE")
Definition: os0file.h:89
bool length(const dd::Spatial_reference_system *srs, const Geometry *g1, double *length, bool *null) noexcept
Computes the length of linestrings and multilinestrings.
Definition: length.cc:76
bool is_valid(const dd::Spatial_reference_system *srs, const Geometry *g, const char *func_name, bool *is_valid) noexcept
Decides if a geometry is valid.
Definition: is_valid.cc:95
static Value err()
Create a Value object that represents an error condition.
Definition: json_binary.cc:908
void print(trx_t *trx, dict_index_t *index, std::ostream &out, ref_t ref, bool fatal)
Print information about the given LOB.
Definition: lob0impl.cc:1333
The namespace contains classes representing events that can occur in a replication stream.
Definition: binlog_event.cpp:38
Log_event_type
Enumeration type for the different types of log events.
Definition: binlog_event.h:278
@ INCIDENT_EVENT
Something out of the ordinary happened on the master.
Definition: binlog_event.h:322
@ FORMAT_DESCRIPTION_EVENT
Definition: binlog_event.h:304
@ EXECUTE_LOAD_QUERY_EVENT
Definition: binlog_event.h:307
@ ROWS_QUERY_LOG_EVENT
Definition: binlog_event.h:337
@ WRITE_ROWS_EVENT
Version 2 of the Row events.
Definition: binlog_event.h:340
@ DELETE_ROWS_EVENT
Definition: binlog_event.h:342
@ XA_PREPARE_LOG_EVENT
Definition: binlog_event.h:354
@ QUERY_EVENT
Definition: binlog_event.h:292
@ UNKNOWN_EVENT
Every time you add a type, you have to.
Definition: binlog_event.h:286
@ PREVIOUS_GTIDS_LOG_EVENT
Definition: binlog_event.h:347
@ UPDATE_ROWS_EVENT
Definition: binlog_event.h:341
@ RAND_EVENT
Definition: binlog_event.h:302
@ TABLE_MAP_EVENT
Definition: binlog_event.h:309
@ STOP_EVENT
Definition: binlog_event.h:293
@ INTVAR_EVENT
Definition: binlog_event.h:295
@ USER_VAR_EVENT
Definition: binlog_event.h:303
@ ROTATE_EVENT
Definition: binlog_event.h:294
@ SLAVE_EVENT
Definition: binlog_event.h:297
const uint64_t INVALID_XID
The following constant represents the maximum of MYSQL_XID domain.
Definition: statement_events.h:49
enum_load_dup_handling
Elements of this enum describe how LOAD DATA handles duplicates.
Definition: load_data_events.h:64
constexpr auto tsid_max_length
Maximum TSID text length (without null character)
Definition: tsid.h:38
HARNESS_EXPORT std::string string_format(const char *format,...)
Definition: utilities.cc:64
Definition: instrumented_condition_variable.h:32
const char * begin(const char *const c)
Definition: base64.h:44
size_t size(const char *const c)
Definition: base64.h:46
mutable_buffer buffer(void *p, size_t n) noexcept
Definition: buffer.h:418
Cursor end()
A past-the-end Cursor.
Definition: rules_table_service.cc:192
const char * db_name
Definition: rules_table_service.cc:55
std::set< Key, Compare, ut::allocator< Key > > set
Specialization of set which uses ut_allocator.
Definition: ut0new.h:2884
std::map< Key, Value, Compare, ut::allocator< std::pair< const Key, Value > > > map
Specialization of map which uses ut_allocator.
Definition: ut0new.h:2894
Performance schema instrumentation interface.
required string type
Definition: replication_group_member_actions.proto:34
required string event
Definition: replication_group_member_actions.proto:32
Contains the classes representing events which are used for row based replication.
Rpl_filter * rpl_filter
mysql::gtid::gno_t rpl_gno
GNO, the second (numeric) component of a GTID, is an alias of mysql::gtid::gno_t.
Definition: rpl_gtid.h:113
const int MAX_GNO_TEXT_LENGTH
The length of MAX_GNO when printed in decimal.
Definition: rpl_gtid.h:287
enum_gtid_type
Enumeration of different types of values for Gtid_specification, i.e, the different internal states t...
Definition: rpl_gtid.h:3882
cs::index::rpl_sidno rpl_sidno
Type of SIDNO (source ID number, first component of GTID)
Definition: rpl_gtid.h:109
mysql::gtid::Tsid Tsid
Definition: rpl_gtid_state.cc:56
enum_row_image_type
Definition: rpl_record.h:40
ulonglong my_xid
Definition: handler.h:1235
File containing constants that can be used throughout the server.
Our own string classes, used pervasively throughout the executor.
Contains the classes representing statement events occurring in the replication stream.
#define STRING_WITH_LEN(X)
Definition: string_with_len.h:29
char * strmake(char *dst, const char *src, size_t length)
Definition: strmake.cc:42
Definition: m_ctype.h:421
Class Gtid_set::String_format defines the separators used by Gtid_set::to_string.
Definition: rpl_gtid.h:1903
This struct represents a specification of a GTID for a statement to be executed: either "AUTOMATIC",...
Definition: rpl_gtid.h:3999
enum_gtid_type type
The type of this GTID.
Definition: rpl_gtid.h:4012
Gtid gtid
The GTID: { SIDNO, GNO } if type == GTID; { 0, 0 } if type == AUTOMATIC or ANONYMOUS.
Definition: rpl_gtid.h:4018
rpl_gno gno
GNO of this Gtid.
Definition: rpl_gtid.h:1107
Definition: my_sys.h:334
const char * str
Definition: mysql_lex_string.h:41
Definition: my_bitmap.h:43
Definition: log_event.h:507
const char * name[MAX_DBS_IN_EVENT_MTS]
Definition: log_event.h:508
int num
Definition: log_event.h:509
Mts_db_names()=default
void reset_and_dispose()
Definition: log_event.h:513
Interface for an instrumented stage progress.
Definition: psi_stage_bits.h:63
LEX_CSTRING db
Definition: table.h:782
Definition: table.h:1421
TABLE_SHARE * s
Definition: table.h:1422
Definition: typelib.h:35
Legends running throughout the module:
Definition: rpl_rli_pdb.h:77
static bool is_any_gtid_event(const Log_event_type &type)
Helps to identify any GTID event - returns true for GTID_LOG_EVENT, GTID_TAGGED_LOG_EVENT and ANONYMO...
Definition: binlog_event.h:391
Metadata_fields organizes m_optional_metadata into a structured format which is easy to access.
Definition: rows_event.h:579
struct xid_t is binary compatible with the XID structure as in the X/Open CAE Specification,...
Definition: xa.h:83
Include file for Sun RPC to compile out of the box.
Item_result
Type of the user defined function return slot and arguments.
Definition: udf_registration_types.h:39
Definition: dtoa.cc:595
synode_no q[FIFO_SIZE]
Definition: xcom_base.cc:4086
static uint64_t cache_size
Definition: xcom_cache.cc:362